教你一次性成功安装K8S集群(基于一主两从模式)

云计算
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。

[[354882]]

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:

https://github.com/sunshinelyz/mykit-delay

PS: 欢迎各位Star源码,也可以pr你牛逼哄哄的代码。

写在前面

研究K8S有一段时间了,最开始学习K8S时,根据网上的教程安装K8S环境总是报错。所以,我就改变了学习策略,先不搞环境搭建了。先通过官网学习了K8S的整体架构,底层原理,又硬啃了一遍K8S源码。别问我为哈这样学,只是我觉得对我个人来说,这样学能让我更好的理解整套云原生体系。这不,这次,我总结了如何一次性成功安装K8S集群的方法。我们今天先来说说如何基于一主两从模式搭建K8S集群。后面,我们再上如何完全无坑搭建K8S高可用集群的方案。

文章和搭建环境所需要的yml文件已收录到:https://github.com/sunshinelyz/technology-binghe 和 https://gitee.com/binghe001/technology-binghe 。如果文件对你有点帮助,别忘记给个Star哦!

集群规划

IP 主机名 节点 操作系统版本
192.168.175.101 binghe101 Master CentOS 8.0.1905
192.168.175.102 binghe102 Worker CentOS 8.0.1905
192.168.175.103 binghe103 Worker CentOS 8.0.1905

基础配置

在三台服务器上的/etc/hosts文件中添加如下配置项。

  1. 192.168.175.101  binghe101 
  2. 192.168.175.102  binghe102 
  3. 192.168.175.103  binghe103 

检查系统环境

分别在三台服务器上检查系统的环境。

1.查看服务器操作系统版本

  1. cat /etc/redhat-release 

安装Docker和K8S集群的服务器操作系统版本需要在CentOS 7以上。

2.查看服务器的主机名

  1. hostname 

注意:集群中服务器的主机名不能是localhost。

3.查看服务器的CPU核数

  1. lscpu 

注意:集群中服务器的CPU核数不能少于2个。

4.查看服务器网络

以binghe101(Master)服务器为例。在服务器上执行 ip route show 命令来查看服务器的默认网卡,如下所示。

  1. [root@binghe101 ~]# ip route show 
  2. default via 192.168.175.2 dev ens33 proto static metric 100  
  3. 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown  
  4. 192.168.175.0/24 dev ens33 proto kernel scope link src 192.168.175.101 metric 100  

在上面的输出信息中有如下一行标注了binghe101服务器所使用的默认网卡。

  1. default via 192.168.175.2 dev ens33 proto static metric 100  

可以看到,binghe101服务器使用的默认网卡为ens33。

接下来,使用ip address命令查看服务器的IP地址,如下所示。

  1. [root@binghe101 ~]# ip address 
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
  3.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  4.     inet 127.0.0.1/8 scope host lo 
  5.        valid_lft forever preferred_lft forever 
  6.     inet6 ::1/128 scope host  
  7.        valid_lft forever preferred_lft forever 
  8. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 
  9.     link/ether 00:0c:29:68:06:63 brd ff:ff:ff:ff:ff:ff 
  10.     inet 192.168.175.101/24 brd 192.168.175.255 scope global noprefixroute ens33 
  11.        valid_lft forever preferred_lft forever 
  12.     inet6 fe80::890f:5a92:4171:2a11/64 scope link noprefixroute  
  13.        valid_lft forever preferred_lft forever 

可以看到,binghe101服务器上的默认网卡的IP地址为192.168.175.101,K8S将使用此 IP 地址与集群内的其他节点通信。集群中所有K8S所使用的IP地址必须可以互通。

Docker安装

分别在三台服务器上安装Docker并配置阿里云镜像加速器。

1.安装Docker

新建auto_install_docker.sh脚本文件

  1. vim auto_install_docker.sh 

文件的内容如下所示。

  1. export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com 
  2. dnf install yum* 
  3. yum install -y yum-utils  device-mapper-persistent-data  lvm2 
  4. yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
  5. dnf install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm 
  6. yum install docker-ce docker-ce-cli -y 
  7. systemctl enable docker.service 
  8. systemctl start docker.service 
  9. docker version 

或者指定Docker的版本进行安装,此时auto_install_docker.sh脚本文件的内容如下所示。

  1. export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com 
  2. dnf install yum* 
  3. yum install -y yum-utils device-mapper-persistent-data lvm2 
  4. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
  5. yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io 
  6. systemctl enable docker.service 
  7. systemctl start docker.service 
  8. docker version 

使用如下命令赋予auto_install_docker.sh文件可执行权限。

  1. chmod a+x ./auto_install_docker.sh 

接下来,直接运行auto_install_docker.sh脚本文件安装Docker即可。

  1. ./auto_install_docker.sh 

2.配置阿里云镜像加速器

新建脚本文件aliyun_docker_images.sh。

  1. vim aliyun_docker_images.sh 

文件内容如下所示。

  1. mkdir -p /etc/docker 
  2. tee /etc/docker/daemon.json <<-'EOF' 
  3.   "registry-mirrors": ["https://zz3sblpi.mirror.aliyuncs.com"
  4. EOF 
  5. systemctl daemon-reload 
  6. systemctl restart docker 

为aliyun_docker_images.sh脚本文件赋予可执行权限,如下所示。

  1. chmod a+x ./aliyun_docker_images.sh 

执行aliyun_docker_images.sh脚本文件配置阿里云镜像加速器。

  1. ./aliyun_docker_images.sh 

系统设置

分别在三台服务器上进行系统设置。

1.安装nfs-utils

  1. yum install -y nfs-utils 
  2. yum install -y wget 

2.关闭防火墙

  1. systemctl stop firewalld 
  2. systemctl disable firewalld 

3.关闭 SeLinux

  1. setenforce 0 
  2. sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config 

4.关闭 swap

  1. swapoff -a 
  2. yes | cp /etc/fstab /etc/fstab_bak 
  3. cat /etc/fstab_bak |grep -v swap > /etc/fstab 

5.修改 /etc/sysctl.conf

新建sys_config.sh脚本文件。

  1. vim sys_config.sh 

sys_config.sh脚本文件的内容如下所示,

  1. # 如果有配置,则修改 
  2. sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g"  /etc/sysctl.conf 
  3. sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g"  /etc/sysctl.conf 
  4. sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g"  /etc/sysctl.conf 
  5. sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g"  /etc/sysctl.conf 
  6. sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g"  /etc/sysctl.conf 
  7. sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g"  /etc/sysctl.conf 
  8. sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g"  /etc/sysctl.conf 
  9. # 可能没有,追加 
  10. echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
  11. echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf 
  12. echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf 
  13. echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf 
  14. echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf 
  15. echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf 
  16. echo "net.ipv6.conf.all.forwarding = 1"  >> /etc/sysctl.conf 
  17. # 执行命令以应用 
  18. sysctl -p 

执行如下命令赋予sys_config.sh文件可执行权限。

  1. chmod a+x ./sys_config.sh 

执行sys_config.sh脚本文件。

  1. ./sys_config.sh 

安装K8S

分别在三台服务器上安装K8S。

1.配置K8S yum源

新建k8s_yum.sh脚本文件。

  1. vim k8s_yum.sh 

文件的内容如下所示。

  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo 
  2. [kubernetes] 
  3. name=Kubernetes 
  4. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 
  5. enabled=1 
  6. gpgcheck=0 
  7. repo_gpgcheck=0 
  8. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 
  9.        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 
  10. EOF 

赋予k8s_yum.sh脚本文件的可执行权限。

  1. chmod a+x ./k8s_yum.sh 

执行k8s_yum.sh文件。

  1. ./k8s_yum.sh 

2.卸载旧版本的K8S

  1. yum remove -y kubelet kubeadm kubectl 

3.安装kubelet、kubeadm、kubectl

  1. yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2 

4.修改docker Cgroup Driver为systemd

  1. sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service 

5.重启 docker,并启动 kubelet

  1. systemctl daemon-reload 
  2. systemctl restart docker 
  3. systemctl enable kubelet && systemctl start kubelet 

综合安装脚本

综上,上述安装Docker、进行系统设置,安装K8S的操作可以统一成auto_install_docker_k8s.sh脚本。脚本的内容如下所示。

  1. #安装Docker 19.03.8 
  2. export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com 
  3. dnf install yum* 
  4. yum install -y yum-utils device-mapper-persistent-data lvm2 
  5. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
  6. yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io 
  7. systemctl enable docker.service 
  8. systemctl start docker.service 
  9. docker version 
  10.  
  11. #配置阿里云镜像加速器 
  12. mkdir -p /etc/docker 
  13. tee /etc/docker/daemon.json <<-'EOF' 
  14.   "registry-mirrors": ["https://zz3sblpi.mirror.aliyuncs.com"
  15. EOF 
  16. systemctl daemon-reload 
  17. systemctl restart docker 
  18.  
  19. #安装nfs-utils 
  20. yum install -y nfs-utils 
  21. yum install -y wget 
  22.  
  23. #关闭防火墙 
  24. systemctl stop firewalld 
  25. systemctl disable firewalld 
  26.  
  27. #关闭SeLinux 
  28. setenforce 0 
  29. sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config 
  30.  
  31. # 关闭 swap 
  32. swapoff -a 
  33. yes | cp /etc/fstab /etc/fstab_bak 
  34. cat /etc/fstab_bak |grep -v swap > /etc/fstab 
  35.  
  36. #修改 /etc/sysctl.conf 
  37. # 如果有配置,则修改 
  38. sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g"  /etc/sysctl.conf 
  39. sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g"  /etc/sysctl.conf 
  40. sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g"  /etc/sysctl.conf 
  41. sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g"  /etc/sysctl.conf 
  42. sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g"  /etc/sysctl.conf 
  43. sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g"  /etc/sysctl.conf 
  44. sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g"  /etc/sysctl.conf 
  45. # 可能没有,追加 
  46. echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
  47. echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf 
  48. echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf 
  49. echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf 
  50. echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf 
  51. echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf 
  52. echo "net.ipv6.conf.all.forwarding = 1"  >> /etc/sysctl.conf 
  53. # 执行命令以应用 
  54. sysctl -p 
  55.  
  56. # 配置K8S的yum源 
  57. cat <<EOF > /etc/yum.repos.d/kubernetes.repo 
  58. [kubernetes] 
  59. name=Kubernetes 
  60. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 
  61. enabled=1 
  62. gpgcheck=0 
  63. repo_gpgcheck=0 
  64. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 
  65.        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 
  66. EOF 
  67.  
  68. # 卸载旧版本K8S 
  69. yum remove -y kubelet kubeadm kubectl 
  70.  
  71. # 安装kubelet、kubeadm、kubectl,这里我安装的是1.18.2版本,你也可以安装1.17.2版本 
  72. yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2 
  73.  
  74. # 修改docker Cgroup Driver为systemd 
  75. # # 将/usr/lib/systemd/system/docker.service文件中的这一行 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 
  76. # # 修改为 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd 
  77. # 如果不修改,在添加 worker 节点时可能会碰到如下错误 
  78. # [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".  
  79. # Please follow the guide at https://kubernetes.io/docs/setup/cri/ 
  80. sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service 
  81.  
  82. # 设置 docker 镜像,提高 docker 镜像下载速度和稳定性 
  83. # 如果您访问 https://hub.docker.io 速度非常稳定,亦可以跳过这个步骤 
  84. # curl -sSL https://kuboard.cn/install-script/set_mirror.sh | sh -s ${REGISTRY_MIRROR} 
  85.  
  86. # 重启 docker,并启动 kubelet 
  87. systemctl daemon-reload 
  88. systemctl restart docker 
  89. systemctl enable kubelet && systemctl start kubelet 
  90.  
  91. docker version 

注意:我安装的K8S版本是1.18.2,大家在安装K8S时,也可以选择其他版本进行安装

赋予auto_install_docker_k8s.sh脚本文件可执行权限。

  1. chmod a+x ./auto_install_docker_k8s.sh 

执行auto_install_docker_k8s.sh脚本文件。

  1. ./auto_install_docker_k8s.sh 

注意:需要在每台服务器上执行auto_install_docker_k8s.sh脚本文件。

初始化Master节点

只在binghe101服务器上执行的操作。

1.初始化Master节点的网络环境

  1. # 只在 master 节点执行 
  2. # export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令 
  3. export MASTER_IP=192.168.175.101 
  4. # 替换 k8s.master 为 您想要的 dnsName 
  5. export APISERVER_NAME=k8s.master 
  6. # Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中 
  7. export POD_SUBNET=172.18.0.1/16 
  8. echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts 

2.初始化Master节点

在binghe101服务器上创建init_master.sh脚本文件,文件内容如下所示。

  1. #!/bin/bash 
  2. # 脚本出错时终止执行 
  3. set -e 
  4.  
  5. if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then 
  6.   echo -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m" 
  7.   echo 当前POD_SUBNET=$POD_SUBNET 
  8.   echo 当前APISERVER_NAME=$APISERVER_NAME 
  9.   exit 1 
  10. fi 
  11.  
  12.  
  13. # 查看完整配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2 
  14. rm -f ./kubeadm-config.yaml 
  15. cat <<EOF > ./kubeadm-config.yaml 
  16. apiVersion: kubeadm.k8s.io/v1beta2 
  17. kind: ClusterConfiguration 
  18. kubernetesVersion: v1.18.2 
  19. imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers 
  20. controlPlaneEndpoint: "${APISERVER_NAME}:6443" 
  21. networking: 
  22.   serviceSubnet: "10.96.0.0/16" 
  23.   podSubnet: "${POD_SUBNET}" 
  24.   dnsDomain: "cluster.local" 
  25. EOF 
  26.  
  27. # kubeadm init 
  28. # 根据您服务器网速的情况,您需要等候 3 - 10 分钟 
  29. kubeadm init --config=kubeadm-config.yaml --upload-certs 
  30.  
  31. # 配置 kubectl 
  32. rm -rf /root/.kube/ 
  33. mkdir /root/.kube/ 
  34. cp -i /etc/kubernetes/admin.conf /root/.kube/config 
  35.  
  36. # 安装 calico 网络插件 
  37. # 参考文档 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises 
  38. echo "安装calico-3.13.1" 
  39. rm -f calico-3.13.1.yaml 
  40. wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml 
  41. kubectl apply -f calico-3.13.1.yaml 

赋予init_master.sh脚本文件可执行权限。

  1. chmod a+x ./init_master.sh 

执行init_master.sh脚本文件。

  1. ./init_master.sh 

3.查看Master节点的初始化结果

(1)确保所有容器组处于Running状态

  1. # 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态 
  2. watch kubectl get pod -n kube-system -o wide 

如下所示。

  1. [root@binghe101 ~]# watch kubectl get pod -n kube-system -o wide 
  2. Every 2.0s: kubectl get pod -n kube-system -o wide                                                                                                                          binghe101: Sat May  2 23:40:33 2020 
  3.  
  4. NAME                                       READY   STATUS    RESTARTS   AGE     IP                NODE        NOMINATED NODE   READINESS GATES 
  5. calico-kube-controllers-5b8b769fcd-l2tmm   1/1     Running   0          3m59s   172.18.203.67     binghe101   <none>           <none> 
  6. calico-node-8krsl                          1/1     Running   0          3m59s   192.168.175.101   binghe101   <none>           <none> 
  7. coredns-546565776c-rd2zr                   1/1     Running   0          3m59s   172.18.203.66     binghe101   <none>           <none> 
  8. coredns-546565776c-x8r7l                   1/1     Running   0          3m59s   172.18.203.65     binghe101   <none>           <none> 
  9. etcd-binghe101                             1/1     Running   0          4m14s   192.168.175.101   binghe101   <none>           <none> 
  10. kube-apiserver-binghe101                   1/1     Running   0          4m14s   192.168.175.101   binghe101   <none>           <none> 
  11. kube-controller-manager-binghe101          1/1     Running   0          4m14s   192.168.175.101   binghe101   <none>           <none> 
  12. kube-proxy-qnffb                           1/1     Running   0          3m59s   192.168.175.101   binghe101   <none>           <none> 
  13. kube-scheduler-binghe101                   1/1     Running   0          4m14s   192.168.175.101   binghe101   <none>           <none> 

(2) 查看 Master 节点初始化结果

  1. kubectl get nodes -o wide 

如下所示。

  1. [root@binghe101 ~]# kubectl get nodes -o wide 
  2. NAME        STATUS   ROLES    AGE     VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION         CONTAINER-RUNTIME 
  3. binghe101   Ready    master   5m43s   v1.18.2   192.168.175.101   <none>        CentOS Linux 8 (Core)   4.18.0-80.el8.x86_64   docker://19.3.8 

初始化Worker节点

1.获取join命令参数

在Master节点上执行如下命令获取join命令参数。

  1. kubeadm token create --print-join-command 

具体执行如下所示。

  1. [root@binghe101 ~]# kubeadm token create --print-join-command 
  2. W0502 23:44:55.218947   59318 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io] 
  3. kubeadm join k8s.master:6443 --token s0hoh1.2cwyf1fyyjl2h04a     --discovery-token-ca-cert-hash sha256:6d78e360dc64d84762611ac6beec8ac0f0fe9f72a5c2cca008df949e07827c19 

其中,有如下一行输出。

  1. kubeadm join k8s.master:6443 --token s0hoh1.2cwyf1fyyjl2h04a     --discovery-token-ca-cert-hash sha256:6d78e360dc64d84762611ac6beec8ac0f0fe9f72a5c2cca008df949e07827c19 

这行代码就是获取到的join命令。

注意:join命令中的token的有效时间为 2 个小时,2小时内,可以使用此 token 初始化任意数量的 worker 节点。

2.初始化Worker节点

针对所有的 worker 节点执行,在这里,就是在binghe102服务器和binghe103服务器上执行。

创建init_worker.sh脚本文件,文件内容如下所示。

  1. # 只在 worker 节点执行 
  2. # 192.168.175.101 为 master 节点的内网 IP 
  3. export MASTER_IP=192.168.175.101 
  4. # 替换 k8s.master 为初始化 master 节点时所使用的 APISERVER_NAME 
  5. export APISERVER_NAME=k8s.master 
  6. echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts 
  7.  
  8. # 替换为 master 节点上 kubeadm token create 命令输出的join 
  9. kubeadm join k8s.master:6443 --token s0hoh1.2cwyf1fyyjl2h04a     --discovery-token-ca-cert-hash sha256:6d78e360dc64d84762611ac6beec8ac0f0fe9f72a5c2cca008df949e07827c19 

其中,kubeadm join...就是master 节点上 kubeadm token create 命令输出的join。

赋予init_worker.sh脚本文件文件可执行权限,并执行init_worker.sh脚本文件。

  1. chmod a+x ./init_worker.sh 
  2. ./init_worker.sh 

3.查看初始化结果

在Master节点执行如下命令查看初始化结果。

  1. kubectl get nodes -o wide 

如下所示。

  1. [root@binghe101 ~]# kubectl get nodes 
  2. NAME        STATUS   ROLES    AGE     VERSION 
  3. binghe101   Ready    master   20m     v1.18.2 
  4. binghe102   Ready    <none>   2m46s   v1.18.2 
  5. binghe103   Ready    <none>   2m46s   v1.18.2 

注意:kubectl get nodes命令后面加上-o wide参数可以输出更多的信息。

重启K8S集群引起的问题

1.Worker节点故障不能启动

Master 节点的 IP 地址发生变化,导致 worker 节点不能启动。需要重新安装K8S集群,并确保所有节点都有固定的内网 IP 地址。

2.Pod崩溃或不能正常访问

重启服务器后使用如下命令查看Pod的运行状态。

  1. kubectl get pods --all-namespaces 

发现很多 Pod 不在 Running 状态,此时,需要使用如下命令删除运行不正常的Pod。

  1. kubectl delete pod <pod-name> -n <pod-namespece> 

注意:如果Pod 是使用 Deployment、StatefulSet 等控制器创建的,K8S 将创建新的 Pod 作为替代,重新启动的 Pod 通常能够正常工作。

本文转载自微信公众号「冰河技术」,可以通过以下二维码关注。转载本文请联系冰河技术公众号。

 

责任编辑:武晓燕 来源: 冰河技术
相关推荐

2020-11-02 13:44:56

CentOSK8SLinux

2020-09-23 10:40:50

Centos7k8sJava

2011-04-18 13:36:42

2024-04-03 09:00:10

2014-08-04 14:38:25

LinuxToken

2013-04-17 09:16:37

2024-02-28 08:18:13

Java日志项目

2023-12-05 08:33:44

滴滴故障k8s

2019-08-06 09:21:45

2023-09-26 07:11:15

KubernetesJob节点

2021-08-12 09:48:21

Webpack Loa工具Webpack

2021-08-20 11:35:04

服务运维 故障

2009-12-25 14:46:53

Windows 7文件关联

2010-11-24 16:32:50

2014-03-06 15:16:18

安全管理linux安全

2021-11-04 07:49:58

K8SStatefulSetMySQL

2012-09-18 15:04:31

Office 2013微软

2019-08-12 08:36:33

K8S网络Pod

2022-06-02 14:18:44

kubeadm云原生

2022-02-23 08:01:04

KubernetesK8sPod
点赞
收藏

51CTO技术栈公众号