电脑内存最好32G以上。

1 高可用集群规划图

k8s高可用架构解析.png

2 主机规划

角色 IP地址 操作系统 配置 主机名称
Master1 192.168.18.100 CentOS7.x,基础设施服务器 2核CPU,3G内存,50G硬盘 k8s-master01
Master2 192.168.18.101 CentOS7.x,基础设施服务器 2核CPU,3G内存,50G硬盘 k8s-master02
Master3 192.168.18.102 CentOS7.x,基础设施服务器 2核CPU,3G内存,50G硬盘 k8s-master03
Node1 192.168.18.103 CentOS7.x,基础设施服务器 2核CPU,3G内存,50G硬盘 k8s-node01
Node1 192.168.18.104 CentOS7.x,基础设施服务器 2核CPU,3G内存,50G硬盘 k8s-node02

3 环境搭建

3.1 前言

  • 本次搭建的环境需要五台CentOS服务器(三主二从),然后在每台服务器中分别安装Docker、kubeadm和kubectl以及kubelet。

没有特殊说明,就是所有机器都需要执行。

3.2 环境初始化

3.2.1 检查操作系统的版本

  • 检查操作系统的版本(要求操作系统的版本至少在7.5以上):
  1. cat /etc/redhat-release

检查操作系统的版本.png

3.2.2 关闭防火墙并禁止防火墙开机启动

  • 关闭防火墙:
  1. systemctl stop firewalld
  • 禁止防火墙开机启动:
  1. systemctl disable firewalld

3.2.3 设置主机名

  • 设置主机名:
  1. hostnamectl set-hostname <hostname>
  • 设置192.168.18.100的主机名:
  1. hostnamectl set-hostname k8s-master01
  • 设置192.168.18.101的主机名:
  1. hostnamectl set-hostname k8s-master02
  • 设置192.168.18.102的主机名:
  1. hostnamectl set-hostname k8s-master03
  • 设置192.168.18.103的主机名:
  1. hostnamectl set-hostname k8s-node01
  • 设置192.168.18.104的主机名:
  1. hostnamectl set-hostname k8s-node02

3.2.4 主机名解析

  • 为了方便后面集群节点间的直接调用,需要配置一下主机名解析,企业中推荐使用内部的DNS服务器。
  1. cat >> /etc/hosts << EOF
  2. 192.168.18.100 k8s-master01
  3. 192.168.18.101 k8s-master02
  4. 192.168.18.102 k8s-master03
  5. 192.168.18.103 k8s-node01
  6. 192.168.18.104 k8s-node02
  7. 192.168.18.110 k8s-master-lb # VIP(虚拟IP)用于LoadBalance,如果不是高可用集群,该IP可以是k8s-master01的IP
  8. EOF

3.2.5 时间同步

  • kubernetes要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步:
  1. yum install ntpdate -y
  1. ntpdate time.windows.com

3.2.6 关闭selinux

  • 查看selinux是否开启:
  1. getenforce
  • 永久关闭selinux,需要重启:
  1. sed -i 's/enforcing/disabled/' /etc/selinux/config
  • 临时关闭selinux,重启之后,无效:
  1. setenforce 0

3.2.7 关闭swap分区

  • 永久关闭swap分区,需要重启:
  1. sed -ri 's/.*swap.*/#&/' /etc/fstab
  • 临时关闭swap分区,重启之后,无效::
  1. swapoff -a

3.2.8 将桥接的IPv4流量传递到iptables的链

  • 在每个节点上将桥接的IPv4流量传递到iptables的链:
  1. cat > /etc/sysctl.d/k8s.conf << EOF
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. net.ipv4.ip_forward = 1
  5. vm.swappiness = 0
  6. EOF
  1. # 加载br_netfilter模块
  2. modprobe br_netfilter
  1. # 查看是否加载
  2. lsmod | grep br_netfilter
  1. # 生效
  2. sysctl --system

3.2.9 开启ipvs

  • 在kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块。
  • 在每个节点安装ipset和ipvsadm:
  1. yum -y install ipset ipvsadm
  • 在所有节点执行如下脚本:
  1. cat > /etc/sysconfig/modules/ipvs.modules <<EOF
  2. #!/bin/bash
  3. modprobe -- ip_vs
  4. modprobe -- ip_vs_rr
  5. modprobe -- ip_vs_wrr
  6. modprobe -- ip_vs_sh
  7. modprobe -- nf_conntrack_ipv4
  8. EOF
  • 授权、运行、检查是否加载:
  1. chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
  • 检查是否加载:
  1. lsmod | grep -e ipvs -e nf_conntrack_ipv4

3.2.10 所有节点配置limit

  • 临时生效:
  1. ulimit -SHn 65536
  • 永久生效:
  1. vim /etc/security/limits.conf
  1. # 末尾追加如下的内容
  2. * soft nofile 65536
  3. * hard nofile 65536
  4. * soft nproc 4096
  5. * hard nproc 4096
  6. * soft memlock unlimited
  7. * soft memlock unlimited

3.2.11 在k8s-master01节点设置免密钥登录到其他节点

  • 在k8s-master01节点生成配置文件和整数,并传输到其他节点上。
  1. # 遇到输入,直接Enter即可
  2. ssh-keygen -t rsa
  1. for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02;do ssh-copy-id -i .ssh/id_rsa.pub $i;done

3.2.12 所有节点升级系统并重启

  • 所有节点升级系统并重启,此处没有升级内核:
  1. yum -y --exclude=kernel* update && reboot

3.3 内核配置

3.3.1 查看默认的内核

  • 查看默认的内核:
  1. uname -r

查看默认的内核配置.png

3.3.2 升级内核配置

  • CentOS7需要升级内核到4.18+。
  • 在 CentOS 7 上启用 ELRepo 仓库:
  1. rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
  1. rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
  • 仓库启用后,你可以使用下面的命令列出可用的内核相关包:
  1. yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
  • 安装最新的主线稳定内核:
  1. yum -y --enablerepo=elrepo-kernel install kernel-ml
  • 设置 GRUB 默认的内核版本:
  1. vim /etc/default/grub
  1. # 修改部分, GRUB 初始化页面的第一个内核将作为默认内核
  2. GRUB_DEFAULT=0
  1. # 重新创建内核配置
  2. grub2-mkconfig -o /boot/grub2/grub.cfg
  • 重启机器应用最新内核:
  1. reboot
  • 查看最新内核版本:
  1. uname -sr

3.4 每个节点安装Docker、kubeadm、kubelete和kubectl

3.4.1 安装Docker

  • 安装Docker:
  1. wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  1. yum -y install docker-ce-20.10.2
  1. systemctl enable docker && systemctl start docker
  1. docker version
  • 设置Docker镜像加速器:
  1. sudo mkdir -p /etc/docker
  1. sudo tee /etc/docker/daemon.json <<-'EOF'
  2. {
  3. "exec-opts": ["native.cgroupdriver=systemd"],
  4. "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
  5. "live-restore": true,
  6. "log-driver":"json-file",
  7. "log-opts": {"max-size":"500m", "max-file":"3"}
  8. }
  9. EOF
  1. sudo systemctl daemon-reload
  1. sudo systemctl restart docker

3.4.2 添加阿里云的YUM软件源

  • 由于kubernetes的镜像源在国外,非常慢,这里切换成国内的阿里云镜像源:
  1. cat > /etc/yum.repos.d/kubernetes.repo << EOF
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5. enabled=1
  6. gpgcheck=0
  7. repo_gpgcheck=0
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF

3.4.3 安装kubeadm、kubelet和kubectl

  • 查看kubeadm的版本:
  1. yum list kubeadm.x86_64 --showduplicates | sort -r
  • 由于版本更新频繁,这里指定版本号部署:
  1. yum install -y kubelet-1.20.2 kubeadm-1.20.2 kubectl-1.20.2
  • 为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改”/etc/sysconfig/kubelet”文件的内容:
  1. vim /etc/sysconfig/kubelet
  1. # 修改
  2. KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
  3. KUBE_PROXY_MODE="ipvs"
  • 所有的节点设置为开机自启动即可,由于没有生成配置文件,集群初始化后会自动启动:
  1. systemctl enable kubelet

3.5 高可用组件安装

注意:如果不是高可用集群,haproxy和keepalived无需安装。

  • k8s-master01、k8s-master02、k8s-master03节点通过yum安装HAProxy和keepAlived。
  1. yum -y install keepalived haproxy
  • k8s-master01、k8s-master02、k8s-master03节点配置HAProxy:
  1. mkdir -pv /etc/haproxy
  1. vim /etc/haproxy/haproxy.cfg
  1. global
  2. maxconn 2000
  3. ulimit-n 16384
  4. log 127.0.0.1 local0 err
  5. stats timeout 30s
  6. defaults
  7. log global
  8. mode http
  9. option httplog
  10. timeout connect 5000
  11. timeout client 50000
  12. timeout server 50000
  13. timeout http-request 15s
  14. timeout http-keep-alive 15s
  15. frontend monitor-in
  16. bind *:33305
  17. mode http
  18. option httplog
  19. monitor-uri /monitor
  20. listen stats
  21. bind *:8006
  22. mode http
  23. stats enable
  24. stats hide-version
  25. stats uri /stats
  26. stats refresh 30s
  27. stats realm Haproxy\ Statistics
  28. stats auth admin:admin
  29. frontend k8s-master
  30. bind 0.0.0.0:16443
  31. bind 127.0.0.1:16443
  32. mode tcp
  33. option tcplog
  34. tcp-request inspect-delay 5s
  35. default_backend k8s-master
  36. backend k8s-master
  37. mode tcp
  38. option tcplog
  39. option tcp-check
  40. balance roundrobin
  41. default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
  42. # 下面的配置根据实际情况修改
  43. server k8s-master01 192.168.18.100:6443 check
  44. server k8s-master02 192.168.18.101:6443 check
  45. server k8s-master03 192.168.18.102:6443 check
  • k8s-master01配置Keepalived:
  1. vim /etc/keepalived/keepalived.conf
  1. ! Configuration File for keepalived
  2. global_defs {
  3. ## 标识本节点的字条串,通常为 hostname
  4. router_id k8s-master01
  5. script_user root
  6. enable_script_security
  7. }
  8. ## 检测脚本
  9. ## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
  10. vrrp_script chk_apiserver {
  11. script "/etc/keepalived/check_apiserver.sh"
  12. # 每2秒检查一次
  13. interval 2
  14. # 一旦脚本执行成功,权重减少5
  15. weight -5
  16. fall 3
  17. rise 2
  18. }
  19. ## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
  20. vrrp_instance VI_1 {
  21. ## 主节点为 MASTER,对应的备份节点为 BACKUP
  22. state MASTER
  23. ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同
  24. interface ens33
  25. # 主机的IP地址
  26. mcast_src_ip 192.168.18.100
  27. # 虚拟路由id
  28. virtual_router_id 100
  29. ## 节点优先级,值范围 0-254,MASTER 要比 BACKUP 高
  30. priority 100
  31. ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
  32. nopreempt
  33. ## 组播信息发送间隔,所有节点设置必须一样,默认 1s
  34. advert_int 2
  35. ## 设置验证信息,所有节点必须一致
  36. authentication {
  37. auth_type PASS
  38. auth_pass K8SHA_KA_AUTH
  39. }
  40. ## 虚拟 IP 池, 所有节点设置必须一样
  41. virtual_ipaddress {
  42. ## 虚拟 ip,可以定义多个
  43. 192.168.18.110
  44. }
  45. track_script {
  46. chk_apiserver
  47. }
  48. }
  • k8s-master02配置Keepalived:
  1. vim /etc/keepalived/keepalived.conf
  1. ! Configuration File for keepalived
  2. global_defs {
  3. router_id k8s-master02
  4. script_user root
  5. enable_script_security
  6. }
  7. vrrp_script chk_apiserver {
  8. script "/etc/keepalived/check_apiserver.sh"
  9. interval 2
  10. weight -5
  11. fall 3
  12. rise 2
  13. }
  14. vrrp_instance VI_1 {
  15. state BACKUP
  16. interface ens33
  17. mcast_src_ip 192.168.18.101
  18. virtual_router_id 101
  19. priority 99
  20. advert_int 2
  21. authentication {
  22. auth_type PASS
  23. auth_pass K8SHA_KA_AUTH
  24. }
  25. virtual_ipaddress {
  26. 192.168.18.110
  27. }
  28. track_script {
  29. chk_apiserver
  30. }
  31. }
  • k8s-master02配置Keepalived:
  1. vim /etc/keepalived/keepalived.conf
  1. ! Configuration File for keepalived
  2. global_defs {
  3. router_id k8s-master03
  4. script_user root
  5. enable_script_security
  6. }
  7. vrrp_script chk_apiserver {
  8. script "/etc/keepalived/check_apiserver.sh"
  9. interval 2
  10. weight -5
  11. fall 3
  12. rise 2
  13. }
  14. vrrp_instance VI_1 {
  15. state BACKUP
  16. interface ens33
  17. mcast_src_ip 192.168.18.102
  18. virtual_router_id 102
  19. priority 98
  20. advert_int 2
  21. authentication {
  22. auth_type PASS
  23. auth_pass K8SHA_KA_AUTH
  24. }
  25. virtual_ipaddress {
  26. 192.168.18.110
  27. }
  28. track_script {
  29. chk_apiserver
  30. }
  31. }
  • 在k8s-master01、k8s-master02、k8s-master03上新建监控脚本,并设置权限:
  1. vim /etc/keepalived/check_apiserver.sh
  1. #!/bin/bash
  2. err=0
  3. for k in $(seq 1 5)
  4. do
  5. check_code=$(pgrep kube-apiserver)
  6. if [[ $check_code == "" ]]; then
  7. err=$(expr $err + 1)
  8. sleep 5
  9. continue
  10. else
  11. err=0
  12. break
  13. fi
  14. done
  15. if [[ $err != "0" ]]; then
  16. echo "systemctl stop keepalived"
  17. /usr/bin/systemctl stop keepalived
  18. exit 1
  19. else
  20. exit 0
  21. fi
  1. chmod +x /etc/keepalived/check_apiserver.sh
  • 在k8s-master01、k8s-master02、k8s-master03上启动haproxy和keepalived:
  1. systemctl daemon-reload
  1. systemctl enable --now haproxy
  1. systemctl enable --now keepalived
  • 测试VIP(虚拟IP):
  1. ping 192.168.18.110 -c 4

3.6 部署k8s的Master节点

3.6.1 yaml配置文件的方式部署k8s的Master节点

  • 在k8s-master01创建kubeadm-config.yaml,内容如下:
  1. apiVersion: kubeadm.k8s.io/v1beta2
  2. bootstrapTokens:
  3. - groups:
  4. - system:bootstrappers:kubeadm:default-node-token
  5. token: abcdef.0123456789abcdef
  6. ttl: 24h0m0s
  7. usages:
  8. - signing
  9. - authentication
  10. kind: InitConfiguration
  11. localAPIEndpoint:
  12. advertiseAddress: 192.168.18.100 # 本机IP
  13. bindPort: 6443
  14. nodeRegistration:
  15. criSocket: /var/run/dockershim.sock
  16. name: k8s-master01 # 本主机名
  17. taints:
  18. - effect: NoSchedule
  19. key: node-role.kubernetes.io/master
  20. ---
  21. apiServer:
  22. timeoutForControlPlane: 4m0s
  23. apiVersion: kubeadm.k8s.io/v1beta2
  24. certificatesDir: /etc/kubernetes/pki
  25. clusterName: kubernetes
  26. controlPlaneEndpoint: "192.168.18.110:16443" # 虚拟IP和haproxy端口
  27. controllerManager: {}
  28. dns:
  29. type: CoreDNS
  30. etcd:
  31. local:
  32. dataDir: /var/lib/etcd
  33. imageRepository: registry.aliyuncs.com/google_containers # 镜像仓库源
  34. kind: ClusterConfiguration
  35. kubernetesVersion: v1.20.2 # k8s版本
  36. networking:
  37. dnsDomain: cluster.local
  38. podSubnet: "10.244.0.0/16"
  39. serviceSubnet: "10.96.0.0/12"
  40. scheduler: {}
  41. ---
  42. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  43. kind: KubeProxyConfiguration
  44. featureGates:
  45. SupportIPVSProxyMode: true
  46. mode: ipvs
  • 可以使用如下的命令更新kubeadm-config.yaml文件,需要将k8s设置到对应的版本:
  1. kubeadm config migrate --old-config kubeadm-config.yaml --new-config "new.yaml"
  • 将new.yaml文件复制到所有的master节点
  1. scp new.yaml k8s-master02:/root/new.yaml
  1. scp new.yaml k8s-master03:/root/new.yaml
  • 所有的master节点提前下载镜像,可以节省初始化时间:
  1. kubeadm config images pull --config /root/new.yaml
  • k8s-master01节点初始化后,会在/etc/kubernetes目录下生成对应的证书和配置文件,之后其他的Master节点加入到k8s-master01节点即可。
  1. kubeadm init --config /root/new.yaml --upload-certs

k8s-master01节点初始化.png

  • 如果初始化失败,重置后再次初始化,命令如下:
  1. kubeadm reset -f;ipvsadm --clear;rm -rf ~/.kube
  • 初始化成功后,会产生token值,用于其他节点加入时使用,
  1. Your Kubernetes control-plane has initialized successfully!
  2. To start using your cluster, you need to run the following as a regular user:
  3. mkdir -p $HOME/.kube
  4. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  6. Alternatively, if you are the root user, you can run:
  7. export KUBECONFIG=/etc/kubernetes/admin.conf
  8. You should now deploy a pod network to the cluster.
  9. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  10. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  11. You can now join any number of the control-plane node running the following command on each as root:
  12. kubeadm join 192.168.18.110:16443 --token abcdef.0123456789abcdef \
  13. --discovery-token-ca-cert-hash sha256:505e373bae6123fc3e27e778c5fedbccbf0f91a51efdcc11b32c4573605b8e71 \
  14. --control-plane --certificate-key 70aef5f76111a5824085c644b3f34cf830efad00c1b16b878701166bf069664e
  15. Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
  16. As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
  17. "kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
  18. Then you can join any number of worker nodes by running the following on each as root:
  19. kubeadm join 192.168.18.110:16443 --token abcdef.0123456789abcdef \
  20. --discovery-token-ca-cert-hash sha256:505e373bae6123fc3e27e778c5fedbccbf0f91a51efdcc11b32c4573605b8e71
  • k8s-master01节点配置环境变量,用于访问kubernetes集群:

    • 如果是root用户:

      1. cat > /root/.bashrc <<EOF
      2. export KUBECONFIG=/etc/kubernetes/admin.conf
      3. EOF
      1. source ~/.bash_profile
    • 如果是普通用户:

      1. mkdir -p $HOME/.kube
      2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • k8s-master01中查看节点的状态:

  1. kubectl get nodes

k8s-master01查看节点状态.png

  • 采用初始化安装方式,所有的系统组件均以容器的方式运行并且在kube-system命名空间内,此时可以在k8s-master01节点查看Pod的状态:
  1. kubectl get pod -n kube-system -o wide

k8s-master01查看Pod状态.png

3.6.2 命令行的方式部署k8s的Master节点

  • 在k8s-master01、k8s-master02以及k8s-master03节点输入如下的命令:
  1. kubeadm config images pull --kubernetes-version=v1.20.2 --image-repository=registry.aliyuncs.com/google_containers
  • 在k8s-master01节点输入如下的命令:
  1. kubeadm init \
  2. --apiserver-advertise-address=192.168.18.100 \
  3. --image-repository registry.aliyuncs.com/google_containers \
  4. --control-plane-endpoint=192.168.18.110:16443 \
  5. --kubernetes-version v1.20.2 \
  6. --service-cidr=10.96.0.0/12 \
  7. --pod-network-cidr=10.244.0.0/16 \
  8. --upload-certs

3.7 高可用Master

  • 将k8s-master02节点加入到集群中:
  1. kubeadm join 192.168.18.110:16443 --token abcdef.0123456789abcdef \
  2. --discovery-token-ca-cert-hash sha256:505e373bae6123fc3e27e778c5fedbccbf0f91a51efdcc11b32c4573605b8e71 \
  3. --control-plane --certificate-key 70aef5f76111a5824085c644b3f34cf830efad00c1b16b878701166bf069664e
  1. # 防止不能在此节点中不能使用kubectl命令
  2. mkdir -p $HOME/.kube
  3. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  4. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 将k8s-master03节点加入到集群中:
  1. kubeadm join 192.168.18.110:16443 --token abcdef.0123456789abcdef \
  2. --discovery-token-ca-cert-hash sha256:505e373bae6123fc3e27e778c5fedbccbf0f91a51efdcc11b32c4573605b8e71 \
  3. --control-plane --certificate-key 70aef5f76111a5824085c644b3f34cf830efad00c1b16b878701166bf069664e
  1. # 防止不能在此节点中不能使用kubectl命令
  2. mkdir -p $HOME/.kube
  3. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  4. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 如果token过期了,需要生成新的token(在k8s-master01节点):
  1. kubeadm token create --print-join-command
  • Master节点如果要加入到集群中,需要生成--certificate-key(在k8s-master01节点):
  1. kubeadm init phase upload-certs --upload-certs
  • 然后将其他Master节点加入到集群中:
  1. # 需要做对应的修改
  2. kubeadm join 192.168.18.110:16443 --token abcdef.0123456789abcdef \
  3. --discovery-token-ca-cert-hash sha256:505e373bae6123fc3e27e778c5fedbccbf0f91a51efdcc11b32c4573605b8e71 \
  4. --control-plane --certificate-key 70aef5f76111a5824085c644b3f34cf830efad00c1b16b878701166bf069664e

3.8 Node 节点的配置

  • 将k8s-node1加入到集群中:
  1. kubeadm join 192.168.18.110:16443 --token abcdef.0123456789abcdef \
  2. --discovery-token-ca-cert-hash sha256:505e373bae6123fc3e27e778c5fedbccbf0f91a51efdcc11b32c4573605b8e71
  • 将k8s-node2加入到集群中:
  1. kubeadm join 192.168.18.110:16443 --token abcdef.0123456789abcdef \
  2. --discovery-token-ca-cert-hash sha256:505e373bae6123fc3e27e778c5fedbccbf0f91a51efdcc11b32c4573605b8e71

3.9 部署CNI网络插件

  • 根据提示,在Master节点上使用kubectl工具查看节点状态:
  1. kubectl get node

根据提示,在Master节点上使用kubectl工具查看节点状态.png

  • kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择flannel。
  • 在所有Master节点上获取flannel配置文件(可能会失败,如果失败,请下载到本地,然后安装,如果网速不行,请点这里kube-flannel.yml,当然,你也可以安装calico,请点这里calico.yaml,推荐安装calico):
  1. wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 在所有Master节点使用配置文件启动flannel:
  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 在所有Master节点查看部署CNI网络插件进度:
  1. kubectl get pods -n kube-system

查看部署CNI网络插件进度.png

  • 在所有Master节点再次使用kubectl工具查看节点状态:
  1. kubectl get nodes

在所有Master节点再次使用kubectl工具查看节点状态.png

  • 在所有Master节点查看集群健康状况:
  1. kubectl get cs

在所有Master节点查看集群健康状况.png

  • 发现集群不健康,那么需要注释掉etc/kubernetes/manifests下的kube-controller-manager.yamlkube-scheduler.yaml--port=0
  1. vim /etc/kubernetes/manifests/kube-controller-manager.yaml
  1. spec:
  2. containers:
  3. - command:
  4. - kube-controller-manager
  5. - --allocate-node-cidrs=true
  6. - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
  7. - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
  8. - --bind-address=127.0.0.1
  9. - --client-ca-file=/etc/kubernetes/pki/ca.crt
  10. - --cluster-cidr=10.244.0.0/16
  11. - --cluster-name=kubernetes
  12. - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
  13. - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
  14. - --controllers=*,bootstrapsigner,tokencleaner
  15. - --kubeconfig=/etc/kubernetes/controller-manager.conf
  16. - --leader-elect=true
  17. # 修改部分
  18. # - --port=0
  19. - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
  20. - --root-ca-file=/etc/kubernetes/pki/ca.crt
  21. - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
  22. - --service-cluster-ip-range=10.96.0.0/12
  23. - --use-service-account-credentials=true
  1. vim /etc/kubernetes/manifests/kube-scheduler.yaml
  1. spec:
  2. containers:
  3. - command:
  4. - kube-scheduler
  5. - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
  6. - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
  7. - --bind-address=127.0.0.1
  8. - --kubeconfig=/etc/kubernetes/scheduler.conf
  9. - --leader-elect=true
  10. # 修改部分
  11. # - --port=0
  • 在所有Master节点再次查看集群健康状况:
  1. kubectl get cs

在所有Master节点再次查看集群健康状况.png

转载 https://www.yuque.com/fairy-era/yg511q/gf89ub