Kubernetes-01

Kubernetes

摘要:

  • 需要掌握前置知识:linux操作系统、Docker

  1. k8s概念和架构

  2. 从零基础搭建k8s集群

    • 基于客户端工具kubeadm

    • 基于二进制包方式安装

  3. k8s核心概念

    • pod、Controller、Service、Ingress

    • RABC、 Helm、持久存储等。

  4. 搭建集群监控平台系统

  5. 从零开始搭建高可用k8s集群

  6. 在集群环境中部署项目

 

概念和架构

k8s的概述和特性

  • k8s是谷歌在214年开源的容器化集群管理系统

  • 使用k8s进行容器应用管理

  • 使用k8s利于应用管理

  • k8s目标是让部署容器化应用更加简洁和高效

官网介绍https://baike.baidu.com/item/kubernetes/22864162?fr=aladdin

特性(功能)

  • 自动装箱

    基于容器对应用运行环境的资源配置要求自动部署应用容器。

  • 自我修复(自愈能力)

    当容器失败时,会对容器进行重启

    当所部署的Node节点有问题时,会对容器进行重新部署和重新调度。

    当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务。

  • 水平扩展

    通过简单的命令,对应用容器进行规模扩大和规模剪裁。高峰期副本自动增加等

  • 服务发现(负载均衡)

    对外提供统一的入口,节点调度,负载均衡

  • 滚动更新

    可以根据应用变化,对应用容器进行的应用,进行一次或批量更新。

  • 版本回退

    根据应用部署情况,对应用容器运行的应用,进行历史版本及时回退。

  • 密码和配置管理

    在不需要重新构建镜像的情况下,可以部署和更新秘钥和应用配置,类似于热部署。

  • 存储编排

    自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要,存储系统可以来自于本地目录,网络存储(NFS、Gluster、Ceph等)、公共云存储服务。

  • 批处理

    提供一次性任务,定时任务;满足批量数据处理和分析的场景。

k8s架构组件

image-20200921143452824

Master(主控节点)和node(工作节点)

  • Master组件:

    • API server:集群统一入口,以restful方式,交给etcd存储

    • scheduler:节点调度、选择node节点应用部署

    • controller-manager:处理集群中常规后台任务,一个资源对应一个控制器

    • etcd:存储系统,用于保存集群相关的数据

  • Node组件

    • kubelet:master派到node节点的代表,管理本机容器

    • kube-proxy:提供网络代理,负载均衡等操作

k8s核心概念

  • pod

    • 最小部署单元

    • 一组容器的集合

    • 一个pod中的容器是共享网络的

    • 生命周期是短暂的

  • controller:(创建pod)

    • 确保预期的pod副本数量

    • 无状态应用部署

    • 有状态应用部署

    • 确保所有的node运行同一个pod

    • 一次性任务、定时任务

  • Service:(入口)

    • 定义一组pod的访问规则


 

搭建k8s

搭建k8s环境平台规划

  • 单master集群

  • 多master集群

服务器硬件配置要求

  1. 测试环境:

    • master:cpu两核 4G 20G

    • node:4核 8G 40G

  2. 生产环境:

    • 更高硬件要求

搭建k8s集群部署方式

  1. kubeadm:

  2. 二进制包:(推荐)

    • 从GitHub下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

    • 虽然手动部署麻烦点。期间可以学习很多工作原理,利于后期维护。


 

kubeadm方式搭建

Kubeadm是官方社区推出的一个用于快速部署Kubernetes集群的工具,这个工具能通过两条指令完成一个Kubernetes集群的部署:

  1. 创建一个Master节点 Kubeadm init

  2. 将node节点加入到当前集群中 $ kubeadm join < Master 节点的IP和端口>

官网安装地址:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

准备工作:
  • 一台或多台机器,操作系统:Centos7.x-86_x64

  • 硬件配置:2G或更多,2核+,30G+

  • 集群中所以机器可以ping通

  • 可访问外网,拉取镜像

  • 禁止swap分区

三台服务器进行初始化配置:

#关闭防火墙(三台)
[root@Docker-01 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@Docker-01 ~]# setenforce 0
sed -i 's/enforcing/disabled/g' /etc/selinux/config #永久关闭

#关闭swap(三台)
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久

#配置主机名
[root@Docker-01 ~]# hostnamectl set-hostname k8smaster
[root@Docker-02 ~]# hostnamectl set-hostname k8snode1
[root@Docker-03 ~]# hostnamectl set-hostname k8snode2

#在master添加hosts
[root@k8smaster ~]# cat >> /etc/hosts << EOF
192.168.1.7 k8smaster
192.168.1.8 k8snode1
192.168.1.9 k8snode2
EOF

#将桥接的IPv4流量传递到iptables的链(三台)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # 生效

#时间同步
yum -y install ntpdate
ntpdate time.windows.com

初始化完成。

  1. 所有节点安装Docker/kubeadm/kubelet

    kubernetes默认CRI(容器运行时)为docker,因此先安装Docker。

    1. 安装docker

      yum install -y wget && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
      yum -y install docker-ce-18.06.1.ce-3.el7  #版本太新可能会不兼容
      systemctl enable docker && systemctl start docker
      docker --version
      #配置阿里云镜像仓库
      cat > /etc/docker/daemon.json << EOF
      {
      "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
      }
      EOF
      #或者:
      "registry-mirrors":["https://alzgoonw.mirror.aliyuncs.com"]
  2. 添加阿里云yum软件源

    [root@k8smaster yum.repos.d]# cat > /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
  3. 安装kubeadm,kubelet和kubectl

    [root@k8snode2 yum.repos.d]# yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
    [root@k8snode2 yum.repos.d]# systemctl enable kubelet
  4. 部署Kubernetes Master

    #在master节点执行
    [root@k8smaster ~]# kubeadm init \
    --apiserver-advertise-address=192.168.1.7 \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version v1.15.0 \
    --service-cidr=10.1.0.0/16 \
    --pod-network-cidr=10.244.0.0/16
    #初始化成功显示:
    Your Kubernetes control-plane has initialized successfully!
    To start using your cluster, you need to run the following as a regular user:
     mkdir -p $HOME/.kube
     sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
     sudo chown $(id -u):$(id -g) $HOME/.kube/config
    kubeadm join 192.168.1.99:6443 --token gasyov.co3ca4g3priwa8wr \
       --discovery-token-ca-cert-hash sha256:dcce1ca3a1c38a3d153a1eb1994489a4550ead5676e0a7306e4544df264cc5ec
    #查看到 拉取很多镜像
    [root@k8smaster ~]# docker images
    REPOSITORY                                                       TAG                 IMAGE ID           CREATED             SIZE
    registry.aliyuncs.com/google_containers/etcd                      3.4.13-0           0369cf4303ff        3 weeks ago         253MB
    registry.aliyuncs.com/google_containers/kube-proxy               v1.19.0             bc9c328f379c        3 weeks ago         118MB
    registry.aliyuncs.com/google_containers/kube-apiserver           v1.19.0             1b74e93ece2f        3 weeks ago         119MB
    registry.aliyuncs.com/google_containers/kube-controller-manager   v1.19.0             09d665d529d0        3 weeks ago         111MB
    registry.aliyuncs.com/google_containers/kube-scheduler           v1.19.0             cbdc8369d8b1        3 weeks ago         45.7MB
    registry.aliyuncs.com/google_containers/coredns                   1.7.0               bfe3a36ebd25        3 months ago        45.2MB
    registry.aliyuncs.com/google_containers/pause                     3.2                 80d28bedfe5d        7 months ago       683kB

    根据提示执行以下操作:

    [root@k8smaster ~]# mkdir -p $HOME/.kube
    [root@k8smaster ~]#   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    [root@k8smaster ~]#   sudo chown $(id -u):$(id -g) $HOME/.kube/config

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  5. 加入Kubernetes Node

    #查看集群
    [root@k8smaster ~]# kubectl get nodes
    NAME       STATUS     ROLES   AGE   VERSION
    k8smaster   NotReady   master   10m   v1.19.2
    #node加入集群(在node节点上执行)
    kubeadm join 192.168.1.7:6443 --token gasyov.co3ca4g3priwa8wr \
       --discovery-token-ca-cert-hash sha256:dcce1ca3a1c38a3d153a1eb1994489a4550ead5676e0a7306e4544df264cc5ec
       
    #默认token有效期为24小时,过期后,就需要重新创建token:
    kubeadm token create --print-join-command

    #查看集群
    [root@k8smaster ~]# kubectl get nodes
    NAME         STATUS     ROLES   AGE   VERSION
    k8smaster     NotReady   master   12m   v1.19.2
    k8snode1     NotReady   <none>   30s   v1.19.2
    k8snode2cat   NotReady   <none>   4s   v1.19.2
  6. 部署CNI网络插件:

    要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。

    wget https://raw.githubsercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

    默认镜像地址无法访问,sed命令修改为docker hub镜像仓库。

    #执行如下命令部署 flannel:
    [root@k8smaster k8s]# kubectl apply -f https://raw.githubsercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    #部署完成后,可以通过 kubectl get 重新检查 Pod 的状态:
    [root@k8smaster k8s]# kubectl get pods -n kube-system
    NAME                               READY   STATUS   RESTARTS   AGE
    coredns-bccdc95cf-7pm5h             1/1     Running   0         8m9s
    coredns-bccdc95cf-xhx7j             1/1     Running   0         8m9s
    etcd-k8smaster                      1/1     Running   0         7m37s
    kube-apiserver-k8smaster            1/1     Running   0         7m27s
    kube-controller-manager-k8smaster   1/1     Running   0         7m31s
    kube-flannel-ds-amd64-nq58v         1/1     Running   0         4m46s
    kube-flannel-ds-amd64-wmzw2         1/1     Running   0         4m46s
    kube-flannel-ds-amd64-zmr86         1/1     Running   0         4m46s
    kube-proxy-8xc47                    1/1     Running   0         8m9s
    kube-proxy-9xd9b                    1/1     Running   0         5m59s
    kube-proxy-fhpb9                    1/1     Running   0         6m51s
    kube-scheduler-k8smaster            1/1     Running   0         7m21s
    [root@k8smaster k8s]# kubectl get nodes
    NAME       STATUS   ROLES   AGE   VERSION
    k8smaster   Ready   master   23m   v1.15.0
    k8snode1   Ready   <none>   21m   v1.15.0
    k8snode2   Ready   <none>   20m   v1.15.0

     

  7. 测试Kubernetes集群

    在Kubernetes集群中创建一个pod,验证是否正常运行:

     #创建一个nginx镜像服务(pod)
    [root@k8smaster ~]# kubectl create deployment nginx --image=nginx
    deployment.apps/nginx created
    #配置端口
    [root@k8smaster ~]# kubectl expose deployment nginx --port=80 --type=NodePort
    service/nginx exposed
    #查看端口信息
    [root@k8smaster ~]# kubectl get pod,svc
    NAME                         READY   STATUS   RESTARTS   AGE
    pod/nginx-554b9c67f9-c2gdm   1/1     Running   0         5m28s

    NAME                 TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)       AGE
    service/kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP       35m
    service/nginx       NodePort    10.1.94.131   <none>        80:31383/TCP   3m33s

    #访问测试成功;
    ip:31383

    #拓展:扩容三个nginx副本
    kubectl scale deployment nginx --replicas=3

    image-20200922172052054


posted @ 2020-09-21 18:36  nice的  阅读(105)  评论(0编辑  收藏  举报