文章目录
- Kubeadm - K8S1.20 - 高可用集群部署
- Kubernetes 环境准备
- 1. 基础配置
- 2. 修改主机名
- 3. 修改 hosts 文件
- 4. 时间同步
- 5. Linux 资源限制
- 6. 升级内核
- 7. 调整内核参数
- 8. 加载 ip_vs 模块
- Kubernetes 集群部署
- 在所有节点上安装 Docker
- 在所有节点上安装 kubeadm、kubelet 和 kubectl
- 在所有 Master 节点上部署 Haproxy
- 在所有 Master 节点上部署 Keepalived
- k8集群部署
- 配置 Master 节点初始化文件
- 拉取镜像
- 初始化 Master 节点
- 部署网络插件
- 其他节点加入集群
- 验证集群状态
- 问题解决
- 重置集群(如果初始化失败)
- 节点加入集群
- 加入集群的 Token 过期
- 生成 Master 节点加入集群的 `--certificate-key`
- Master 节点污点管理
- 查看污点
- 2.2 取消污点
- 修改 NodePort 的默认端口范围
- 修改 kube-apiserver 配置
- 外部 etcd 部署配置
- 生成 Kubeadm 配置文件
- 编辑 Kubeadm 配置文件
- 示例配置文件
- 应用配置并初始化集群
Kubeadm - K8S1.20 - 高可用集群部署
注意:
master节点cpu核心数要求大于2
- 最新的版本不一定好,但相对于旧版本,核心功能稳定,但新增功能、接口相对不稳
- 学会一个版本的 高可用部署,其他版本操作都差不多
- 宿主机尽量升级到CentOS 7.9
- 内核kernel升级到 4.19+ 这种稳定的内核
- 部署k8s版本时,尽量找 1.xx.5 这种大于5的小版本(这种一般是比较稳定的版本)
Kubernetes 环境准备
1. 基础配置
- 关闭防火墙:
systemctl stop firewalld systemctl disable firewalld
- 关闭 SELinux:
setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config
- 清空 iptables 规则:
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
- 关闭 swap 交换:
swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab
2. 修改主机名
- 主机名设置:
# 在 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 映射:
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:
yum -y install ntpdate
- 设置时区:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo 'Asia/Shanghai' >/etc/timezone
- 同步时间:
ntpdate time2.aliyun.com
- 设置定时任务:
systemctl enable --now crond crontab -e # 添加以下内容 */30 * * * * /usr/sbin/ntpdate time2.aliyun.com
5. Linux 资源限制
- 修改 limits.conf:
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 包:
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
- 安装内核:
cd /opt/ yum localinstall -y kernel-ml*
- 设置默认内核并重启:
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:
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=2310720net.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
- 生效参数:
sysctl --system
8. 加载 ip_vs 模块
- 加载模块:
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
- 安装必要的依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加 Docker 仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io
- 配置 Docker
- 创建 Docker 配置文件目录:
mkdir /etc/docker
- 编辑
daemon.json
文件以配置 Docker 镜像加速器和日志选项: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
- 创建 Docker 配置文件目录:
- 重启 Docker 服务并设置开机自启
systemctl daemon-reload systemctl restart docker.service systemctl enable docker.service
- 验证 Cgroup Driver
docker info | grep "Cgroup Driver" # 应输出:Cgroup Driver: systemd
在所有节点上安装 kubeadm、kubelet 和 kubectl
- 定义 Kubernetes yum 仓库
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
- 安装 kubeadm、kubelet 和 kubectl
yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15
- 配置 Kubelet 使用阿里云的 pause 镜像
- 编辑
/etc/sysconfig/kubelet
文件: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
- 编辑
- 启动并设置 kubelet 开机自启
systemctl enable --now kubelet
在所有 Master 节点上部署 Haproxy
- 安装 Haproxy
yum -y install haproxy
- 配置 Haproxy
- 编辑
/etc/haproxy/haproxy.cfg
文件,以配置 Haproxy 作为 Kubernetes API Server 的负载均衡器。 - 配置示例如下:
# global 配置段 globallog 127.0.0.1 local0 infolog 127.0.0.1 local1 warningchroot /var/lib/haproxypidfile /var/run/haproxy.pidmaxconn 4000user haproxygroup haproxydaemonstats socket /var/lib/haproxy/stats# defaults 配置段 defaultsmode tcplog globaloption tcplogoption dontlognulloption redispatchretries 3timeout queue 1mtimeout connect 10stimeout client 1mtimeout server 1mtimeout check 10smaxconn 3000# frontend 配置段:监控接口 frontend monitor-inbind *:33305mode httpoption httplogmonitor-uri /monitor# frontend 配置段:Kubernetes API Server 入口 frontend k8s-masterbind *:6443mode tcpoption tcplogdefault_backend k8s-master# backend 配置段:Kubernetes Master 节点后端 backend k8s-mastermode tcpoption tcplogoption tcp-checkbalance roundrobinserver k8s-master1 192.168.80.10:6443 check inter 10000 fall 2 rise 2 weight 1server k8s-master2 192.168.80.11:6443 check inter 10000 fall 2 rise 2 weight 1server k8s-master3 192.168.80.12:6443 check inter 10000 fall 2 rise 2 weight 1
- 编辑
- 启动并设置 Haproxy 开机自启
systemctl enable --now haproxy
在所有 Master 节点上部署 Keepalived
- 安装 Keepalived
yum -y install keepalived
- 配置 Keepalived
- 创建并编辑
/etc/keepalived/keepalived.conf
文件,以配置 Keepalived 实现高可用性的 VRRP(虚拟路由冗余协议)。 - 配置示例如下:
# global_defs 配置段 global_defs {router_id LVS_HA1 # 每个节点的路由标识符应不同 }# vrrp_script 配置段:检查 Haproxy 状态的脚本 vrrp_script chk_haproxy {script "/etc/keepalived/check_haproxy.sh"interval 2weight 2 }# vrrp_instance 配置段:定义 VRRP 实例 vrrp_instance VI_1 {state MASTER # 本机实例状态,MASTER/BACKUP,备机应配置为 BACKUPinterface 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 是否运行:#!/bin/bash if ! killall -0 haproxy; thensystemctl stop keepalived fi
- 确保脚本具有可执行权限:
chmod +x /etc/keepalived/check_haproxy.sh
- 确保脚本具有可执行权限:
- 创建并编辑
- 启动并设置 Keepalived 开机自启
systemctl enable --now keepalived
k8集群部署
配置 Master 节点初始化文件
- 生成默认配置文件:
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
cd /opt/
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12 advertiseAddress: 192.168.80.10 #指定当前master节点的IP地址
13 bindPort: 644321 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.1230 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
。
- 修改
-
迁移配置文件:
kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
拉取镜像
- 拷贝配置文件到其他节点:
for i in master02 master03 node01 node02; do scp /opt/new.yaml $i:/opt/; done
- 在所有节点拉取镜像:
kubeadm config images pull --config /opt/new.yaml
初始化 Master 节点
- 执行初始化命令:
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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou 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 0f2a7ff2c46ec172f834e237fcca8a02e7c29500746594c25d995b78c92dde96Please 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节点):
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 的配置文件:
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 镜像:
cd /opt docker load < /opt/flannel.tar
-
准备 CNI 插件:
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 网络插件:
kubectl apply -f /opt/kube-flannel.yml
其他节点加入集群
-
Master 节点加入:
kubeadm join 192.168.80.100:6443 --token <token> --discovery-token-ca-cert-hash <hash> --control-plane --certificate-key <key>
-
配置新加入的 Master 节点的 kubectl:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
node节点加入:
kubeadm join 192.168.80.100:6443 --token <token> --discovery-token-ca-cert-hash <hash>
验证集群状态
- master01查看集群信息:
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 状态:
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
问题解决
重置集群(如果初始化失败)
kubeadm reset -f
ipvsadm --clear
rm -rf ~/.kube
节点加入集群
加入集群的 Token 过期
Token值在集群初始化后,有效期为 24小时 ,过了24小时过期。进行重新生成Token,再次加入集群,新生成的Token为 2小时。
kubeadm token create --print-join-command
执行后,您将得到一个类似于以下的命令,用于新节点加入集群:
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
kubeadm init phase upload-certs --upload-certs
该命令的输出中包含了新的 certificate key。使用这个 key 和之前生成的 token,可以执行类似于以下的命令来加入新的 master 节点
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 节点污点管理
查看污点
kubectl describe node -l node-role.kubernetes.io/master= | grep Taints
2.2 取消污点
如果需要在测试环境中取消 master 节点的污点,以便能够部署非系统 Pod
kubectl taint node -l node-role.kubernetes.io/master node-role.kubernetes.io/master:NoSchedule-
或者,如果知道具体的节点名称,您可以针对单个节点执行:
kubectl taint node NODE_NAME node-role.kubernetes.io/master:NoSchedule-
记得将 NODE_NAME
替换为实际的节点名称。
修改 NodePort 的默认端口范围
默认k8s的使用端口的范围为30000左右,作为对外部提供的端口。我们也可以通过对配置文件的修改去指定默认的对外端口的范围。
- 报错:
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
参数,并将其设置为所需的端口范围。
vim /etc/kubernetes/manifests/kube-apiserver.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
:
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
编辑 Kubeadm 配置文件
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。
示例配置文件
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
bootstrapTokens:
- token: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
localAPIEndpoint:advertiseAddress: 192.168.80.14bindPort: 6443
nodeRegistration:criSocket: /var/run/dockershim.sockname: master01taints:- effect: NoSchedulekey: 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-03timeoutForControlPlane: 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:2379caFile: /opt/etcd/ssl/ca.pemcertFile: /opt/etcd/ssl/server.pemkeyFile: /opt/etcd/ssl/server-key.pem
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kubernetesVersion: v1.20.15
networking:dnsDomain: cluster.localpodSubnet: "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 节点上都可访问。
应用配置并初始化集群
kubeadm init --config /opt/kubeadm-config.yaml