文章目录
- [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 节点污点管理)
-
- 查看污点
- [2.2 取消污点](#2.2 取消污点)
- [修改 NodePort 的默认端口范围](#修改 NodePort 的默认端口范围)
-
- [修改 kube-apiserver 配置](#修改 kube-apiserver 配置)
- [外部 etcd 部署配置](#外部 etcd 部署配置)
-
- [生成 Kubeadm 配置文件](#生成 Kubeadm 配置文件)
- [编辑 Kubeadm 配置文件](#编辑 Kubeadm 配置文件)
- 示例配置文件
- 应用配置并初始化集群
Kubeadm - K8S1.20 - 高可用集群部署
注意 :
master节点cpu核心数要求大于2
- 最新的版本不一定好,但相对于旧版本,核心功能稳定,但新增功能、接口相对不稳
- 学会一个版本的 高可用部署,其他版本操作都差不多
- 宿主机尽量升级到CentOS 7.9
- 内核kernel升级到 4.19+ 这种稳定的内核
- 部署k8s版本时,尽量找 1.xx.5 这种大于5的小版本(这种一般是比较稳定的版本)
Kubernetes 环境准备
1. 基础配置
-
关闭防火墙 :
bashsystemctl stop firewalld systemctl disable firewalld
-
关闭 SELinux :
bashsetenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config
-
清空 iptables 规则 :
bashiptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
-
关闭 swap 交换 :
bashswapoff -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 映射 :
bashvim /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 :
bashyum -y install ntpdate
-
设置时区 :
bashln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo 'Asia/Shanghai' >/etc/timezone
-
同步时间 :
bashntpdate time2.aliyun.com
-
设置定时任务 :
bashsystemctl enable --now crond crontab -e # 添加以下内容 */30 * * * * /usr/sbin/ntpdate time2.aliyun.com
5. Linux 资源限制
-
修改 limits.conf :
bashvim /etc/security/limits.conf # 添加以下内容 * soft nofile 65536 * hard nofile 131072 * soft nproc 65535 * hard nproc 655350 * soft memlock unlimited * hard memlock unlimited
6. 升级内核
-
下载内核 RPM 包 :
bashwget 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
-
安装内核 :
bashcd /opt/ yum localinstall -y kernel-ml*
-
设置默认内核并重启 :
bashgrub2-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 :
bashcat > /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
-
生效参数 :
bashsysctl --system
8. 加载 ip_vs 模块
-
加载模块 :
bashfor 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
-
安装必要的依赖包
bashyum install -y yum-utils device-mapper-persistent-data lvm2
-
添加 Docker 仓库
bashyum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
安装 Docker
bashyum install -y docker-ce docker-ce-cli containerd.io
-
配置 Docker
-
创建 Docker 配置文件目录:
bashmkdir /etc/docker
-
编辑
daemon.json
文件以配置 Docker 镜像加速器和日志选项:bashcat > /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
-
-
重启 Docker 服务并设置开机自启
bashsystemctl daemon-reload systemctl restart docker.service systemctl enable docker.service
-
验证 Cgroup Driver
bashdocker info | grep "Cgroup Driver" # 应输出:Cgroup Driver: systemd
在所有节点上安装 kubeadm、kubelet 和 kubectl
-
定义 Kubernetes yum 仓库
bashcat > /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
-
安装 kubeadm、kubelet 和 kubectl
bashyum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15
-
配置 Kubelet 使用阿里云的 pause 镜像
-
编辑
/etc/sysconfig/kubelet
文件:bashcat > /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
-
-
启动并设置 kubelet 开机自启
bashsystemctl enable --now kubelet
在所有 Master 节点上部署 Haproxy
-
安装 Haproxy
bashyum -y install haproxy
-
配置 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
-
-
启动并设置 Haproxy 开机自启
bashsystemctl enable --now haproxy
在所有 Master 节点上部署 Keepalived
-
安装 Keepalived
bashyum -y install keepalived
-
配置 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
-
确保脚本具有可执行权限:
bashchmod +x /etc/keepalived/check_haproxy.sh
-
-
-
启动并设置 Keepalived 开机自启
bashsystemctl enable --now keepalived
k8集群部署
配置 Master 节点初始化文件
-
生成默认配置文件 :
bashkubeadm 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
部分,指定podSubnet
和serviceSubnet
。 - 添加 KubeProxy 配置,将模式改为
ipvs
。
- 修改
-
迁移配置文件:
bashkubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
拉取镜像
-
拷贝配置文件到其他节点 :
bashfor i in master02 master03 node01 node02; do scp /opt/new.yaml $i:/opt/; done
-
在所有节点拉取镜像 :
bashkubeadm config images pull --config /opt/new.yaml
初始化 Master 节点
-
执行初始化命令 :
bashkubeadm 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节点):
bashmkdir -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 的配置文件:
bashvim /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 镜像:
bashcd /opt docker load < /opt/flannel.tar
-
准备 CNI 插件:
bashmv /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 网络插件:
bashkubectl apply -f /opt/kube-flannel.yml
其他节点加入集群
-
Master 节点加入:
bashkubeadm join 192.168.80.100:6443 --token <token> --discovery-token-ca-cert-hash <hash> --control-plane --certificate-key <key>
-
配置新加入的 Master 节点的 kubectl:
bashmkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
node节点加入:
bashkubeadm join 192.168.80.100:6443 --token <token> --discovery-token-ca-cert-hash <hash>
验证集群状态
-
master01查看集群信息 :
bashkubectl 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 状态 :
bashkubectl 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_TOKEN
和 CA_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_TOKEN
、CA_CERT_HASH
和 CERTIFICATE_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 服务器的地址和端口。
- controllerManager 、dns 、etcd 、imageRepository 、scheduler:分别配置了控制器管理器、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-12
和master01-03
)来简化配置,但 Kubeadm 可能不支持这种表示法,根据实际情况替换为具体的 IP 地址和主机名。 - 外部 etcd 的证书文件路径需要确保在所有 master 节点上都可访问。
应用配置并初始化集群
bash
kubeadm init --config /opt/kubeadm-config.yaml