Kubeadm搭建K8S集群

  • Kubeadm搭建K8S集群

    搭建集群的方式有很多种:kubeadm、minikube、二进制安装 (利用 k8s 官方 github 仓库下载二进制包安装,安装过程较复杂,但相对较为稳定) 、命令行安装

    这里我们为了测试,就使用kubeadm的方式做一个搭建演示

    kubeadm搭建集群大致步骤

    1. CentOS7虚拟机三台即可,配置允许小幅度降低2C-2G-30GB

    2. 服务器初始化操作(修改必要配置文件,关闭防火墙......等等)

    3. 三个节点安装 Docker 、 Kubelet 、kubeadm 、 Kubectl

    4. 在Master 节点执行 kubeadm init 命令进行初始化

    5. 在Workder节点执行 kubeadm join命令将node节点添加到当前的集群里面

    6. 配置网络插件

    服务器初始化

    • 192.168.239.120 [ master ]

    • 192.168.239.130 [ node1 ]

    • 192.168.239.140 [ node2 ]

    • 检查操作系统的版本,kubeadm方式要求Centos版本要在7.5或之上

    [root@localhost ~]# cat /etc/redhat-release 
    CentOS Linux release 7.9.2009 (Core)
    • 永久关闭防火墙(所有节点)

    systemctl stop firewalld
    systemctl disable firewalld
    • 永久关闭selinux(所有节点)

      • selinux是linux系统下的一个安全服务,不关闭会抛出很多问题

    sed -i 's/enforcing/disabled/' /etc/selinux/config
    #或者: vim /etc/selinux/config , 设置SELINUX=disabled
    • 永久关闭swap分区(所有节点)

      • swap分区指的是虚拟内存分区,物理内存使用完,之后将磁盘空间虚拟成内存来使用

    vim /etc/fstab
    #/dev/mapper/centos-swap swap  #注释掉该行
    • 设置主机名(逐一设置)

      • hostnamectl set-hostname <hostname>

    hostnamectl set-hostname master
    hostnamectl set-hostname node1
    hostnamectl set-hostname node2
    • 添加主机名解析

      • 为了方便集群节点间的直接调用,在这个配置一下主机名解析:vim /etc/hosts

    192.168.239.120 master
    192.168.239.130 node1
    192.168.239.140 node2
    • 禁用iptable和firewalld服务

      • kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

      • 然后配置ipvs的方式替代iptable

    systemctl stop firewalld
    systemctl disable firewalld
    systemctl stop iptables  #可能部分系统没有自带iptables Server服务,没安装的话就不用管了
    systemctl disable iptables
    • 配置ipvs功能(所有节点)

      • 在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,

      • ipvs的性能要高一些,所以刚刚我们关了了iptabless服务,然后手动载入ipvs模块

    [root@localhost ~]# yum install ipset ipvsadm -y
    [root@localhost ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    EOF
    [root@localhost ~]# chmod +x /etc/sysconfig/modules/ipvs.modules    #给脚本赋予执行权限
    [root@localhost ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules   #执行脚本
    [root@localhost ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4      #查看模块加载状态
    • 集群所有节点时间同步

      • 这里我们统一使用宿主机的时间 , 也可以使用chronyd服务从网络同步时间

    yum install ntpdate -y
    ntpdate time.windows.com

    操作完以上步骤后 , 最好能重启一下服务器,使得所有设置生效 reboot now

    安装Docker

    • 所有节点安装Docker、kubeadm、kubelet,这个三个环境,我们依次安装

    • 因为kubenates默认的容器为Docker,所以首先我们安装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
    • 设置Docker的镜像地址为国内阿里云

    [root@localhost ~]# mkdir /etc/docker
    [root@localhost ~]# cat <<EOF> /etc/docker/daemon.json
    {
        "exec-opts": ["native.cgroupdriver=systemd"],
        "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
    }
    EOF
    [root@master ~]# systemctl restart docker  #重启并将docker设置为开机启动
    [root@master ~]# systemctl enable docker

    安装kubeadm,kubelet和kubectl(所有节点)

    • 由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源

    [root@localhost ~]# 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
    [root@localhost ~]# yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
    [root@localhost ~]# systemctl enable kubelet

    由于我们没有iptable转而使用的是ipvs,所以这里要配置一下kubelet如下

    [root@master ~]# vim /etc/sysconfig/kubelet
    KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
    KUBE_PROXY_MODE="ipvs"
    [root@node2 ~]# systemctl restart kubelet

    Maser节点初始化

    • 现在我们我们已经执行到大致步骤的第四步了,在master节点上初始化环境

    • 由于K8S默认拉去镜像的地址是国外的,无法访问,我们将其地址修改为国内的阿里云地址

    • 注意:--apiserver-advertise-address=192.168.239.120 这里得换成你自己的Master节点的IP地址

    #将下面的这个命令折成一行,在master节点中执行即可
    [root@master ~]# kubeadm init 
    --apiserver-advertise-address=192.168.239.120 
    --image-repository registry.aliyuncs.com/google_containers 
    --kubernetes-version v1.18.0 
    --service-cidr=10.96.0.0/12 
    --pod-network-cidr=10.244.0.0/16
    • 我们可以再开一个master节点的会话 , 可以看到Docker已经在开始工作了

    • 当我们看到以上镜像已经全部拉取完毕后,我们可以看到执行kubeadm init...的会话有下面的提示,按照下图执行即可

    • 在master节点执行这段代码

    [root@master ~]# mkdir -p $HOME/.kube
    [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
    • 然后通过kubectl get nodes 看到如下一幕

    [root@master ~]# kubectl get node
    NAME     STATUS     ROLES    AGE   VERSION
    master   NotReady   master   27m   v1.18.0

    Node节点加入集群

    • 可见master已经加入到集群中了,下面我们在其他非master节点执行下面提示的代码

    kubeadm join 192.168.239.120:6443 --token 3w6v9w.3w98bj8wkzobk1pc \
        --discovery-token-ca-cert-hash sha256:816a6dde1f6b72dc66de332648ed87a1d02a000a7c6a1e8aa31e223587144675
    • 然后我们再次在master节点通过执行 kubectl get nodes 看到如下一幕

    [root@master ~]# kubectl get node
    NAME     STATUS     ROLES    AGE   VERSION
    master   NotReady   master   29m   v1.18.0
    node1    NotReady   <none>   22s   v1.18.0
    node2    NotReady   <none>   13s   v1.18.0
    • 此时两个node节点也已经加入集群中,但是可以发现状态status全部显示为NotReady,此时还缺最后一步,即可完成k8s集群的搭建

    部署POD网络插件:CNI

    • 如果有梯子的话 ,从官网指定的仓库获取部署文件

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    • 如果没有梯子的话,下载kube-flannel.yml [提取码:sh2c]

      • 因为没有梯子的原因,kube-flannel.yml中的有个镜像也会下载失败

      • flannel:v0.13.0-amd64 [提取码mim4]

      • 提示:我已经将kube-flannel.yml中不能拉取的镜像替换为我们刚刚加载的flannel:v0.13.0-amd64了,可以直接部署

      #将该镜像下载后在所有节点的docker中载入
      [root@master /]# docker load < flanneld-v0.13.0-amd64.docker     # K8S所有节点都需要加载该镜像
      [root@master /]# kubectl apply -f ./kube-flannel.yml             # Master 节点执行即可
      • 然后获取系统命名空间下的pod运行情况

      #如果 STATUS 全部为 Running 的话,则搭建成功
      [root@master /]# kubectl get pod -n kube-system
      NAME                             READY   STATUS    RESTARTS   AGE
      coredns-7ff77c879f-n9wqz         1/1     Running   0          94m
      coredns-7ff77c879f-pvw5j         1/1     Running   0          94m
      etcd-master                      1/1     Running   0          95m
      kube-apiserver-master            1/1     Running   0          95m
      kube-controller-manager-master   1/1     Running   0          95m
      kube-flannel-ds-amd64-7f695      1/1     Running   0          50m
      kube-flannel-ds-amd64-q7d4j      1/1     Running   0          50m
      kube-flannel-ds-amd64-whwvx      1/1     Running   0          50m
      kube-proxy-4pc5n                 1/1     Running   0          65m
      kube-proxy-gw67r                 1/1     Running   0          94m
      kube-proxy-rqbgm                 1/1     Running   0          65m
      kube-scheduler-master            1/1     Running   0          95m
    • 我们再次获取节点信息,STATUS : Ready

    [root@master /]# kubectl get nodes
    NAME     STATUS   ROLES    AGE    VERSION
    master   Ready    master   120m   v1.18.0
    node1    Ready    <none>   91m    v1.18.0
    node2    Ready    <none>   91m    v1.18.0 

    集群节点维护常用命令

    • master 查看集群节点数 :kubectl get nodes

    • master查看集群系统组件的情况:kubectl get pods -n kube-system -o wide

    • master 删除集群某个节点 :kubectl delete nodes nodeName

    • node节点被抛弃出集群,重置节点:kubeadm reset

      • 如果是想重新搭建,master记得删除 $HOME/.kube 目录及其其下的所有数据

    • master欢迎新的节点,抛出橄榄枝:kubeadm token create --print-join-command

    测试Kubernetes集群

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

    [root@master /]# kubectl create deployment nginx --image=nginx
    [root@master /]# kubectl expose deployment nginx --port=80 --type=NodePort
    [root@master /]# kubectl get pod,svc

    然后访问该Nginx的服务,三台机器随意一台的ip : 31102 均可访问Nginx的服务

    • 192.168.239.120:31102

    • 192.168.239.130:31102

    • 192.168.239.140:31102


posted @ 2021-01-12 00:28  鞋破露脚尖儿  阅读(376)  评论(0编辑  收藏  举报