【k8s集群应用】kubeadm1.20高可用部署(3master)

文章目录

  • [Kubeadm - K8S1.20 - 高可用集群部署](#Kubeadm - K8S1.20 - 高可用集群部署)
    • [Kubernetes 环境准备](#Kubernetes 环境准备)
      • [1. 基础配置](#1. 基础配置)
      • [2. 修改主机名](#2. 修改主机名)
      • [3. 修改 hosts 文件](#3. 修改 hosts 文件)
      • [4. 时间同步](#4. 时间同步)
      • [5. Linux 资源限制](#5. Linux 资源限制)
      • [6. 升级内核](#6. 升级内核)
      • [7. 调整内核参数](#7. 调整内核参数)
      • [8. 加载 ip_vs 模块](#8. 加载 ip_vs 模块)
    • [Kubernetes 集群部署](#Kubernetes 集群部署)
      • [在所有节点上安装 Docker](#在所有节点上安装 Docker)
      • [在所有节点上安装 kubeadm、kubelet 和 kubectl](#在所有节点上安装 kubeadm、kubelet 和 kubectl)
      • [在所有 Master 节点上部署 Haproxy](#在所有 Master 节点上部署 Haproxy)
      • [在所有 Master 节点上部署 Keepalived](#在所有 Master 节点上部署 Keepalived)
    • k8集群部署
    • 问题解决
      • 重置集群(如果初始化失败)
      • 节点加入集群
        • [加入集群的 Token 过期](#加入集群的 Token 过期)
        • [生成 Master 节点加入集群的 `--certificate-key`](#生成 Master 节点加入集群的 --certificate-key)
      • [Master 节点污点管理](#Master 节点污点管理)
      • [修改 NodePort 的默认端口范围](#修改 NodePort 的默认端口范围)
        • [修改 kube-apiserver 配置](#修改 kube-apiserver 配置)
      • [外部 etcd 部署配置](#外部 etcd 部署配置)

Kubeadm - K8S1.20 - 高可用集群部署

注意

master节点cpu核心数要求大于2

  • 最新的版本不一定好,但相对于旧版本,核心功能稳定,但新增功能、接口相对不稳
  • 学会一个版本的 高可用部署,其他版本操作都差不多
  • 宿主机尽量升级到CentOS 7.9
  • 内核kernel升级到 4.19+ 这种稳定的内核
  • 部署k8s版本时,尽量找 1.xx.5 这种大于5的小版本(这种一般是比较稳定的版本)

Kubernetes 环境准备

1. 基础配置

  • 关闭防火墙

    bash 复制代码
    systemctl stop firewalld
    systemctl disable firewalld
  • 关闭 SELinux

    bash 复制代码
    setenforce 0
    sed -i 's/enforcing/disabled/' /etc/selinux/config
  • 清空 iptables 规则

    bash 复制代码
    iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
  • 关闭 swap 交换

    bash 复制代码
    swapoff -a
    sed -ri 's/.*swap.*/#&/' /etc/fstab

2. 修改主机名

  • 主机名设置

    bash 复制代码
    # 在 master01 上
    hostnamectl set-hostname master01
    # 在 master02 上
    hostnamectl set-hostname master02
    # 在 master03 上
    hostnamectl set-hostname master03
    # 在 node01 上
    hostnamectl set-hostname node01
    # 在 node02 上
    hostnamectl set-hostname node02

3. 修改 hosts 文件

  • 添加 IP 映射

    bash 复制代码
    vim /etc/hosts
    # 添加以下内容
    192.168.80.10 master01
    192.168.80.11 master02
    192.168.80.12 master03
    192.168.80.20 node01
    192.168.80.30 node02

4. 时间同步

  • 安装 ntpdate

    bash 复制代码
    yum -y install ntpdate
  • 设置时区

    bash 复制代码
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    echo 'Asia/Shanghai' >/etc/timezone
  • 同步时间

    bash 复制代码
    ntpdate time2.aliyun.com
  • 设置定时任务

    bash 复制代码
    systemctl enable --now crond
    crontab -e
    # 添加以下内容
    */30 * * * * /usr/sbin/ntpdate time2.aliyun.com

5. Linux 资源限制

  • 修改 limits.conf

    bash 复制代码
    vim /etc/security/limits.conf
    # 添加以下内容
    * soft nofile 65536
    * hard nofile 131072
    * soft nproc 65535
    * hard nproc 655350
    * soft memlock unlimited
    * hard memlock unlimited

6. 升级内核

  • 下载内核 RPM 包

    bash 复制代码
    wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm -O /opt/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm
    wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm -O /opt/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm
  • 安装内核

    bash 复制代码
    cd /opt/
    yum localinstall -y kernel-ml*
  • 设置默认内核并重启

    bash 复制代码
    grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
    grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
    grubby --default-kernel
    reboot

7. 调整内核参数

  • 创建 k8s.conf

    bash 复制代码
    cat > /etc/sysctl.d/k8s.conf <<EOF
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    fs.may_detach_mounts = 1
    vm.overcommit_memory=1
    vm.panic_on_oom=0
    fs.inotify.max_user_watches=89100
    fs.file-max=52706963
    fs.nr_open=52706963
    net.netfilter.nf_conntrack_max=2310720
    
    net.ipv4.tcp_keepalive_time = 600
    net.ipv4.tcp_keepalive_probes = 3
    net.ipv4.tcp_keepalive_intvl =15
    net.ipv4.tcp_max_tw_buckets = 36000
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_max_orphans = 327680
    net.ipv4.tcp_orphan_retries = 3
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_max_syn_backlog = 16384
    net.ipv4.ip_conntrack_max = 65536
    net.ipv4.tcp_max_syn_backlog = 16384
    net.ipv4.tcp_timestamps = 0
    net.core.somaxconn = 16384
    EOF
  • 生效参数

    bash 复制代码
    sysctl --system

8. 加载 ip_vs 模块

  • 加载模块

    bash 复制代码
    for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

Kubernetes 集群部署

在所有节点上安装 Docker

  1. 安装必要的依赖包

    bash 复制代码
    yum install -y yum-utils device-mapper-persistent-data lvm2
  2. 添加 Docker 仓库

    bash 复制代码
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  3. 安装 Docker

    bash 复制代码
    yum install -y docker-ce docker-ce-cli containerd.io
  4. 配置 Docker

    • 创建 Docker 配置文件目录:

      bash 复制代码
      mkdir /etc/docker
    • 编辑 daemon.json 文件以配置 Docker 镜像加速器和日志选项:

      bash 复制代码
      cat > /etc/docker/daemon.json <<EOF
      {
        "registry-mirrors": ["https://docker.m.daocloud.io", "https://docker.1panel.live"],
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
        "log-opts": {
          "max-size": "500m", "max-file": "3"
        }
      }
      EOF
  5. 重启 Docker 服务并设置开机自启

    bash 复制代码
    systemctl daemon-reload
    systemctl restart docker.service
    systemctl enable docker.service
  6. 验证 Cgroup Driver

    bash 复制代码
    docker info | grep "Cgroup Driver"
    # 应输出:Cgroup Driver: systemd

在所有节点上安装 kubeadm、kubelet 和 kubectl

  1. 定义 Kubernetes yum 仓库

    bash 复制代码
    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
  2. 安装 kubeadm、kubelet 和 kubectl

    bash 复制代码
    yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15
  3. 配置 Kubelet 使用阿里云的 pause 镜像

    • 编辑 /etc/sysconfig/kubelet 文件:

      bash 复制代码
      cat > /etc/sysconfig/kubelet <<EOF
      KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2"
      EOF
  4. 启动并设置 kubelet 开机自启

    bash 复制代码
    systemctl enable --now kubelet

在所有 Master 节点上部署 Haproxy

  1. 安装 Haproxy

    bash 复制代码
    yum -y install haproxy
  2. 配置 Haproxy

    • 编辑 /etc/haproxy/haproxy.cfg 文件,以配置 Haproxy 作为 Kubernetes API Server 的负载均衡器。

    • 配置示例如下:

      bash 复制代码
      # global 配置段
      global
          log         127.0.0.1 local0 info
          log         127.0.0.1 local1 warning
          chroot      /var/lib/haproxy
          pidfile     /var/run/haproxy.pid
          maxconn     4000
          user        haproxy
          group       haproxy
          daemon
          stats socket /var/lib/haproxy/stats
      
      # defaults 配置段
      defaults
          mode                    tcp
          log                     global
          option                  tcplog
          option                  dontlognull
          option                  redispatch
          retries                 3
          timeout queue           1m
          timeout connect         10s
          timeout client          1m
          timeout server          1m
          timeout check           10s
          maxconn                 3000
      
      # frontend 配置段:监控接口
      frontend monitor-in
          bind *:33305
          mode http
          option httplog
          monitor-uri /monitor
      
      # frontend 配置段:Kubernetes API Server 入口
      frontend k8s-master
          bind *:6443
          mode tcp
          option tcplog
          default_backend k8s-master
      
      # backend 配置段:Kubernetes Master 节点后端
      backend k8s-master
          mode tcp
          option tcplog
          option tcp-check
          balance roundrobin
          server k8s-master1 192.168.80.10:6443  check inter 10000 fall 2 rise 2 weight 1
          server k8s-master2 192.168.80.11:6443  check inter 10000 fall 2 rise 2 weight 1
          server k8s-master3 192.168.80.12:6443  check inter 10000 fall 2 rise 2 weight 1
  3. 启动并设置 Haproxy 开机自启

    bash 复制代码
    systemctl enable --now haproxy

在所有 Master 节点上部署 Keepalived

  1. 安装 Keepalived

    bash 复制代码
    yum -y install keepalived
  2. 配置 Keepalived

    • 创建并编辑 /etc/keepalived/keepalived.conf 文件,以配置 Keepalived 实现高可用性的 VRRP(虚拟路由冗余协议)。

    • 配置示例如下:

      bash 复制代码
      # global_defs 配置段
      global_defs {
          router_id LVS_HA1  # 每个节点的路由标识符应不同
      }
      
      # vrrp_script 配置段:检查 Haproxy 状态的脚本
      vrrp_script chk_haproxy {
          script "/etc/keepalived/check_haproxy.sh"
          interval 2
          weight 2
      }
      
      # vrrp_instance 配置段:定义 VRRP 实例
      vrrp_instance VI_1 {
          state MASTER  # 本机实例状态,MASTER/BACKUP,备机应配置为 BACKUP
          interface ens33  # 网络接口名
          virtual_router_id 51  # 虚拟路由器 ID,应保持一致
          priority 100  # 本机初始权重,备机应设置小于主机的值
          advert_int 1  # VRRP 广告间隔
          virtual_ipaddress {
              192.168.80.100  # 设置虚拟 IP(VIP)地址
          }
          track_script {
              chk_haproxy
          }
      }
    • 创建并编辑 /etc/keepalived/check_haproxy.sh 脚本,以检查 Haproxy 是否运行:

      bash 复制代码
      #!/bin/bash
      if ! killall -0 haproxy; then
          systemctl stop keepalived
      fi
      • 确保脚本具有可执行权限:

        bash 复制代码
        chmod +x /etc/keepalived/check_haproxy.sh
  3. 启动并设置 Keepalived 开机自启

    bash 复制代码
    systemctl enable --now keepalived

k8集群部署

配置 Master 节点初始化文件

  • 生成默认配置文件

    bash 复制代码
    kubeadm config print init-defaults > /opt/kubeadm-config.yaml
yaml 复制代码
cd /opt/
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12   advertiseAddress: 192.168.80.10		#指定当前master节点的IP地址
13   bindPort: 6443

21 apiServer:
22   certSANs:								#在apiServer属性下面添加一个certsSANs的列表,添加所有master节点的IP地址和集群VIP地址
23   - 192.168.80.100
24   - 192.168.80.10
25   - 192.168.80.11
26   - 192.168.80.12

30 clusterName: kubernetes
31 controlPlaneEndpoint: "192.168.80.100:6443"		#指定集群VIP地址
32 controllerManager: {}

38 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers			#指定镜像下载地址
39 kind: ClusterConfiguration
40 kubernetesVersion: v1.20.15				#指定kubernetes版本号
41 networking:
42   dnsDomain: cluster.local
43   podSubnet: "10.244.0.0/16"				#指定pod网段,10.244.0.0/16用于匹配flannel默认网段
44   serviceSubnet: 10.96.0.0/16			#指定service网段
45 scheduler: {}
#末尾再添加以下内容
--- 
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs									#把默认的kube-proxy调度方式改为ipvs模式
  • 编辑配置文件

    • 修改 localAPIEndpoint.advertiseAddress 为当前 Master 节点的 IP 地址。
    • apiServer.certSANs 中添加所有 Master 节点的 IP 地址和集群 VIP 地址。
    • 设置 controlPlaneEndpoint 为集群 VIP 地址。
    • 修改 imageRepository 为阿里云镜像仓库。
    • 设置 kubernetesVersion 为目标版本(例如 v1.20.15)。
    • 配置 networking 部分,指定 podSubnetserviceSubnet
    • 添加 KubeProxy 配置,将模式改为 ipvs
  • 迁移配置文件

    bash 复制代码
    kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml

拉取镜像

  • 拷贝配置文件到其他节点

    bash 复制代码
    for i in master02 master03 node01 node02; do scp /opt/new.yaml $i:/opt/; done
  • 在所有节点拉取镜像

    bash 复制代码
    kubeadm config images pull --config /opt/new.yaml

初始化 Master 节点

  • 执行初始化命令

    bash 复制代码
    kubeadm init --config new.yaml --upload-certs | tee kubeadm-init.log
#提示:
.........
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

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
 https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of the control-plane node running the following command on each as root:
#master节点加入使用的命令,记录!
 kubeadm join 192.168.80.100:6443 --token 7t2weq.bjbawausm0jaxury \
   --discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98 \
   --control-plane --certificate-key 0f2a7ff2c46ec172f834e237fcca8a02e7c29500746594c25d995b78c92dde96

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:
#node节点加入使用的命令。记录!
kubeadm join 192.168.80.100:6443 --token 7t2weq.bjbawausm0jaxury \
   --discovery-token-ca-cert-hash sha256:e76e4525ca29a9ccd5c24142a724bdb6ab86512420215242c4313fb830a4eb98
  • 配置 kubectl(master01节点):

    bash 复制代码
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 修改controller-manager 和 scheduler 的配置文件

    bash 复制代码
    vim /etc/kubernetes/manifests/kube-scheduler.yaml
    vim /etc/kubernetes/manifests/kube-controller-manager.yaml
    # 注释掉 - --port=0
    systemctl restart kubelet
  • 若初始化失败

    kubeadm reset -f
    ipvsadm --clear
    rm -rf ~/.kube
    再次进行初始化

部署网络插件

所有节点上传 flannel 镜像 flannel.tar 和网络插件 cni-plugins-linux-amd64-v0.8.6.tgz 到 /opt 目录,master节点上传 kube-flannel.yml 文件

  • 上传并加载 Flannel 镜像

    bash 复制代码
    cd /opt
    docker load < /opt/flannel.tar
  • 准备 CNI 插件

    bash 复制代码
    mv /opt/cni /opt/cni_bak
    mkdir -p /opt/cni/bin
    tar zxvf /opt/cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
  • 部署 Flannel 网络插件

    bash 复制代码
    kubectl apply -f /opt/kube-flannel.yml

其他节点加入集群

  • Master 节点加入

    bash 复制代码
    kubeadm join 192.168.80.100:6443 --token <token> --discovery-token-ca-cert-hash <hash> --control-plane --certificate-key <key>
  • 配置新加入的 Master 节点的 kubectl

    bash 复制代码
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • node节点加入

    bash 复制代码
    kubeadm join 192.168.80.100:6443 --token <token> --discovery-token-ca-cert-hash <hash>

验证集群状态

  • master01查看集群信息

    bash 复制代码
    kubectl get nodes

    NAME STATUS ROLES AGE VERSION
    master01 Ready control-plane,master 2h5m v1.20.15
    master02 Ready control-plane,master 2h5m v1.20.15
    master03 Ready control-plane,master 2h5m v1.20.15
    node01 Ready <none> 2h5m v1.20.15
    node02 Ready <none> 2h5m v1.20.15

  • 查看 Pod 状态

    bash 复制代码
    kubectl get pod -n kube-system

    NAME READY STATUS RESTARTS AGE
    coredns-74ff55c5b-4fg44 1/1 Running 2 2h5m
    coredns-74ff55c5b-jsdxz 1/1 Running 0 2h5m
    etcd-master01 1/1 Running 1 2h5m
    etcd-master02 1/1 Running 1 2h5m
    etcd-master03 1/1 Running 1 2h5m
    kube-apiserver-master01 1/1 Running 1 2h5m
    kube-apiserver-master02 1/1 Running 1 2h5m
    kube-apiserver-master03 1/1 Running 1 2h5m
    kube-controller-manager-master01 1/1 Running 3 2h5m
    kube-controller-manager-master02 1/1 Running 1 2h5m
    kube-controller-manager-master03 1/1 Running 2 2h5m
    kube-flannel-ds-8qtx6 1/1 Running 2 2h4m
    kube-flannel-ds-lmzdz 1/1 Running 0 2h4m
    kube-flannel-ds-nb9qx 1/1 Running 1 2h4m
    kube-flannel-ds-t4l4x 1/1 Running 1 2h4m
    kube-flannel-ds-v592x 1/1 Running 1 2h4m
    kube-proxy-6gd5j 1/1 Running 1 2h5m
    kube-proxy-f8k96 1/1 Running 3 2h5m
    kube-proxy-h7nrf 1/1 Running 1 2h5m
    kube-proxy-j96b6 1/1 Running 1 2h5m
    kube-proxy-mgmx6 1/1 Running 0 2h5m
    kube-scheduler-master01 1/1 Running 1 2h5m
    kube-scheduler-master02 1/1 Running 2 2h5m
    kube-scheduler-master03 1/1 Running 2 2h5m

问题解决

重置集群(如果初始化失败)

bash 复制代码
kubeadm reset -f
ipvsadm --clear
rm -rf ~/.kube

节点加入集群

加入集群的 Token 过期

Token值在集群初始化后,有效期为 24小时 ,过了24小时过期。进行重新生成Token,再次加入集群,新生成的Token为 2小时。

bash 复制代码
kubeadm token create --print-join-command

执行后,您将得到一个类似于以下的命令,用于新节点加入集群:

bash 复制代码
kubeadm join 192.168.80.100:6443 --token NEW_TOKEN --discovery-token-ca-cert-hash sha256:CA_CERT_HASH

记得将NEW_TOKENCA_CERT_HASH 替换为实际生成的值。

生成 Master 节点加入集群的 --certificate-key

当您需要将新的 master 节点加入到集群中时,需要获取 --certificate-key

bash 复制代码
kubeadm init phase upload-certs --upload-certs

该命令的输出中包含了新的 certificate key。使用这个 key 和之前生成的 token,可以执行类似于以下的命令来加入新的 master 节点

bash 复制代码
kubeadm join 192.168.80.100:6443 --token EXISTING_TOKEN --discovery-token-ca-cert-hash sha256:CA_CERT_HASH --control-plane --certificate-key CERTIFICATE_KEY

记得将 EXISTING_TOKENCA_CERT_HASHCERTIFICATE_KEY 替换为实际的值。

Master 节点污点管理

查看污点
bash 复制代码
kubectl describe node -l node-role.kubernetes.io/master= | grep Taints
2.2 取消污点

如果需要在测试环境中取消 master 节点的污点,以便能够部署非系统 Pod

bash 复制代码
kubectl taint node -l node-role.kubernetes.io/master node-role.kubernetes.io/master:NoSchedule-

或者,如果知道具体的节点名称,您可以针对单个节点执行:

bash 复制代码
kubectl taint node NODE_NAME node-role.kubernetes.io/master:NoSchedule-

记得将 NODE_NAME 替换为实际的节点名称。

修改 NodePort 的默认端口范围

默认k8s的使用端口的范围为30000左右,作为对外部提供的端口。我们也可以通过对配置文件的修改去指定默认的对外端口的范围。

  • 报错
bash 复制代码
The Service "nginx-svc" is invalid: spec.ports[0].nodePort: Invalid value: 80: provided port is not in the valid range. The range of valid ports is 30000-32767
修改 kube-apiserver 配置

要修改 NodePort 的默认端口范围,需要编辑 kube-apiserver 的配置文件(通常是 /etc/kubernetes/manifests/kube-apiserver.yaml)。找到 --service-node-port-range 参数,并将其设置为所需的端口范围。

bash 复制代码
vim /etc/kubernetes/manifests/kube-apiserver.yaml
yaml 复制代码
- --service-cluster-ip-range=10.96.0.0/16
- --service-node-port-range=1-65535    #找到后进行添加即可

无需重启,k8s会自动生效

外部 etcd 部署配置

生成 Kubeadm 配置文件

使用 kubeadm config print init-defaults 命令可以生成 Kubeadm 的默认初始化配置文件,并将其重定向到指定文件路径,例如 /opt/kubeadm-config.yaml

bash 复制代码
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
编辑 Kubeadm 配置文件
bash 复制代码
cd /opt/
vim kubeadm-config.yaml

示例配置文件的详细解读

  • InitConfiguration

    • bootstrapTokens:定义了用于节点加入的 token,包括其所属的组、token 值、有效期(ttl)以及用途(usages)。
    • localAPIEndpoint:指定了 API 服务器的广告地址(advertiseAddress)和绑定端口(bindPort)。
    • nodeRegistration:包含了节点注册的相关信息,如 CRI 套接字路径(criSocket)、节点名称(name)以及污点(taints)。
  • ClusterConfiguration

    • apiServer:配置了 API 服务器的相关参数,包括证书的主机名/IP 地址(certSANs)、控制平面超时时间(timeoutForControlPlane)。
    • certificatesDir:指定了存放证书的目录。
    • clusterName:集群的名称。
    • controlPlaneEndpoint:控制平面的端点地址,通常是 Kubernetes API 服务器的地址和端口。
    • controllerManagerdnsetcdimageRepositoryscheduler:分别配置了控制器管理器、DNS、etcd、镜像仓库和调度器的相关参数。其中,etcd 部分配置为外部 etcd 集群的访问方式,需要指定 etcd 集群的端点、CA 证书、服务器证书和私钥文件的路径。
    • kubernetesVersion:指定了 Kubernetes 的版本。
    • networking:配置了网络的 DNS 域(dnsDomain)、Pod 子网(podSubnet)和服务子网(serviceSubnet)。
  • KubeProxyConfiguration

    • 配置了 kube-proxy 的模式为 IPVS。
示例配置文件
yaml 复制代码
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
bootstrapTokens:
- token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
localAPIEndpoint:
  advertiseAddress: 192.168.80.14
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master

---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
apiServer:
  certSANs:
  - 10.96.0.1
  - 127.0.0.1
  - localhost
  - kubernetes
  - kubernetes.default
  - kubernetes.default.svc
  - kubernetes.default.svc.cluster.local
  - 192.168.80.100
  - 192.168.80.10-12
  - master01-03
  timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.80.100:6443
dns:
  type: CoreDNS
etcd:
  external:
    endpoints:
    - https://192.168.80.10:2379
    - https://192.168.80.11:2379
    - https://192.168.80.12:2379
    caFile: /opt/etcd/ssl/ca.pem
    certFile: /opt/etcd/ssl/server.pem
    keyFile: /opt/etcd/ssl/server-key.pem
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kubernetesVersion: v1.20.15
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/16

---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs

注意

  • certSANs 中,使用了范围表示法(192.168.80.10-12master01-03)来简化配置,但 Kubeadm 可能不支持这种表示法,根据实际情况替换为具体的 IP 地址和主机名。
  • 外部 etcd 的证书文件路径需要确保在所有 master 节点上都可访问。
应用配置并初始化集群
bash 复制代码
kubeadm init --config /opt/kubeadm-config.yaml
相关推荐
鸠摩智首席音效师26 分钟前
Docker 中如何限制CPU和内存的使用 ?
docker·容器
Michaelwubo34 分钟前
Docker dockerfile镜像编码 centos7
运维·docker·容器
jingyu飞鸟41 分钟前
centos-stream9系统安装docker
linux·docker·centos
好像是个likun1 小时前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
玖疯子3 小时前
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
docker
暴富的Tdy3 小时前
【快速上手Docker 简单配置方法】
docker·容器·eureka
cominglately4 小时前
centos单机部署seata
linux·运维·centos
魏 无羡4 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse4 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos