K8S集群搭建
使用官方centos7 镜像,使用虚拟机进行安装k8s集群:
1、初始化
1.1 hosts解析配置
# 每个节点进行配置
$ cat >> /etc/hosts << EOF
K8SHA0001 10.64.143.31
K8SHA0002 10.64.143.32
K8SMS0001 10.64.143.33
K8SMS0002 10.64.143.34
K8SMS0003 10.64.143.35
K8SWK0001 10.64.143.36
K8SWK0002 10.64.143.37
K8SWK0003 10.64.143.38
1.2 selinux、防火墙关闭
systemctl stop firewalld
firewall-cmd --state
setenforce 0
getenforce
sed -i 's/SELINUX=enforceing/SELINUX=disabled/g' /etc/selinux/config
1.3 时间同步
$ crontab -e
*/5 * * * * ntpdate time1.aliyun.com
$ ntpdate time1.aliyun.com
1.4 配置内核转发和网桥过滤
# 添加网桥过滤及内核转发配置文件
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 加载br_netfilter模块
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
# 查看是否加载
lsmod |grep br_netfilter
br_netfilter 28672 0
bridge 176128 1 br_netfilter
lsmod | grep overlay
overlay 118784 0
sysctl -a |grep 'bridge-nf-call-ip\|ip_forward = 1'
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
1.5 安装ipset和ipvsadm
yum install -y ipset ipvsadm
配置ipvsadm模块加载
cat >> /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 授权并加载模块
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod |grep -e ip_vs -e nf_conntrack
1.6 关闭SWAP分区
swappoff -a
2、容器运行时安装
2.1 下载cri-containerd
github containerd地址
cri-containerd-1.7.14版本下载
# 下载cri-containerd 1.7.14版本
cd /data/ && wget https://github.com/containerd/containerd/releases/download/v1.7.14/cri-containerd-1.7.14-linux-amd64.tar.gz
2.2 二进制安装cri-containerd
mkdir containerd && tar -zxf cri-containerd-1.7.14-linux-amd64.tar.gz -C /data/containerd/ && cp /data/containerd/usr/local/bin/* /usr/local/bin/ && cp /data/containerd/etc/systemd/system/containerd.service /usr/lib/systemd/system/ && systemctl daemon-reload && containerd --version
2.3 生成并配置containerd默认配置文件
# 生成containerd配置文件,然后/etc/containerd/config.toml中修改如下配置项:
mkdir /etc/containerd && containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
...... [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
......
SystemdCgroup = true #修改SystemdCgroup
[plugins."io.containerd.grpc.v1.cri"]
......
#修改pause镜像路径
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
......
runtime_type = 'io.containerd.runc.v2' #修改默认的runtime_type,否则后面crictl image存在报错信息
# 数据运行目录修改
sed -i 's#/var/lib/containerd#/data/containerd#g' /etc/containerd/config.toml
# 重启containerd服务
systemctl restart containerd
systemctl enable containerd
2.4 下载并安装runc
github runc下载地址
runc 1.1.12版本下载
wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64
mv runc.amd64 /usr/sbin/runc && chmod +x /usr/sbin/runc && runc -v
3、安装kubeadm、kubelet、kubectl
需要在每台机器上安装以下的软件包
- kubeadm:用来初始化集群的指令。
- kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
- kubectl:用来与集群通信的命令行工具。
kubeadm 无法进行安装或者管理 kubelet 或 kubectl, 所以需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。
3.1 增加阿里云的kubernetes源
# cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF
# yum clean all
# yum makecache
3.2 安装指定1.28.8版本kubeadm、kubectl、kubelet
yum --showduplicate list kubeadm kubectl kublet
yum install -y kubelet-1.30.3 kubeadm-1.30.3 kubectl-1.30.3
3.3 修改kubelet默认cgroup驱动
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
sed -i 's#KUBELET_EXTRA_ARGS=#KUBELET_EXTRA_ARGS=\"--cgroup-driver=systemd\"#g' /etc/sysconfig/kubelet
systemctl enable kubelet --now
4、初始化K8S集群
4.1 初始化master节点
执行命令:kubeadm init
kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 10.5.64.23 --pod-network-cidr=10.244.0.0/16 --token-ttl 0
4.2 关于报错
初始化过程中,不出意外的话意外要出现了:
- 如果报 container runtime is not running:的错误,此时需要执行下面命令:sh
rm -rf /etc/containerd/config.toml
systemctl restart containerd
- 如果报 Initial timeout of 40s passed,4分钟超时错误后需要执行:
执行命令:ctr
ctr -n k8s.io images pull -k registry.aliyuncs.com/google_containers/pause:3.6
ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
# 重命名镜像registry.aliyuncs.com/google_containers/pause:3.6的tag为registry.k8s.io/pause:3.6
kubeadm reset -f
然后继续执行上面kubeadm init命令。一切顺利的话:
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.147.133:6443 --token v2nbj9.n96aegm563ub38zt --discovery-token-ca-cert-hash sha256:1a6b394358789c92e09a55eb0ae8279d5054c89aef867d4dca9dae1cf4ccf859
根据提示,我们执行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看Master节点工作状态:
kubectl get nodes
此时是未准备状态。
5、安装网络插件(Calico)
# 执行命令
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml
然后执行:
# 下载到任意的文件夹:
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/custom-resources.yaml
vim custom-resources.yaml
这个是 custom-resources 文件内容,需要将cidr 网段的内容与 集群初始化时参数--pod-network-cidr 对应上。
# This section includes base Calico installation configuration.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.Installation
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
# Note: The ipPools section cannot be modified post-install.
ipPools:
- blockSize: 26
# cidr: 192.168.0.0/16
cidr: 10.244.0.0/16
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()
---
# This section configures the Calico API server.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
name: default
spec: {}
执行
kubectl create -f custom-resources.yaml
等待一段时间后,(大约4分钟)此时的Master节点已经准备就绪。
calico有一个pod不是ready状态,查看日志报错:BIRD is not ready: BGP not established
解决方案:https://juejin.cn/post/7257184836971053113
6、加入Node节点
如果没有改主机名,请先修改
hostnamectl --static set-hostname k8s-node1 #node1节点
hostname $hostname # 立刻生效
然后执行上述的命令:
kubeadm join 192.168.147.133:6443 --token v2nbj9.n96aegm563ub38zt --discovery-token-ca-cert-hash sha256:1a6b394358789c92e09a55eb0ae8279d5054c89aef867d4dca9dae1cf4ccf859
如果之前没有保存,可以再Master节点上执行:
kubeadm token create --print-join-command
显示下列内容证明已经加入k8s集群,但是在Master节点上查看当前的node节点的状态为notReady。
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
7、报错
如果报 container runtime is not running:的错误,此时需要执行下面命令:
rm -rf /etc/containerd/config.toml
systemctl restart containerd
# 再执行join命令
如果节点一直not Ready:
查看日志:
journalctl -f -u kubelet.service
执行命令:k8s.io images pull
ctr -n k8s.io images pull -k registry.aliyuncs.com/google_containers/pause:3.6
ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
等待一段时间后。会发现:集群已经成功运行
[root@k8s-master yum.repos.d]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 17h v1.28.11
k8s-node1 Ready <none> 17h v1.28.11
k8s-node2 Ready <none> 16h v1.28.11
8、重置k8s集群
当虚拟接的网络发生变更之后,发现整个集群都不可用了。因为k8s集群高度依赖网络进行通信。学习环境可以重置集群,使用 kubeadm 工具重置集群的基本步骤:
在控制面(Master)节点和工作节点(Worker Nodes)上执行:
- 停止 kubelet 服务:
sudo systemctl stop kubelet
- 使用 kubeadm 重置:
sudo kubeadm reset
这个命令会清除 kubelet 的配置,移除 Kubernetes 的相关容器,以及执行一些清理操作。
- 清理 iptables:
清理可能残留的 iptables 规则,这些规则可能会干扰集群的重新初始化。sh
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P FORWARD ACCEPT
(控制节点)重新初始化集群:
在控制面节点上,您可以使用 kubeadm init 命令来重新初始化集群。在执行此命令时,可以指定新的 IP 地址作为 API server 的地址。
新 IP 地址是 192.168.147.137
,执行命令:
kubeadm init --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 192.168.147.137 --pod-network-cidr=10.122.0.0/16 --token-ttl 0
完成初始化后,按照提示操作,配置 kubectl 工具的使用环境。
(控制节点)网络重新初始化
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml
kubectl create -f custom-resources.yaml
将工作节点加入集群:
使用命令:
kubeadm join 192.168.147.137:6443 --token 0c4gsd.ack5w3mvuyuauivl --discovery-token-ca-cert-hash sha256:0ebb75771d6616cca43750771263760f28f31044da103de93ac6a010fc5afff9
9、解决DNS不稳定的问题
安装nodelocaldns:【TKE】IPVS 转发模式下使用 NodeLocalDNSCache-腾讯云开发者社区-腾讯云
名词解释
kubeadm init:
这是一条用于初始化Kubernetes集群的`kubeadm`命令。
1. `kubeadm init`
- 这是`kubeadm`工具的子命令,用于初始化Kubernetes控制平面节点。
2. `--image-repository registry.aliyuncs.com/google_containers`
- 指定用于拉取Kubernetes镜像的仓库地址,这里使用的是阿里云的镜像仓库,因为国内无法直接访问Google的仓库。
3. `--apiserver-advertise-address 192.168.147.33`
- 设置Kubernetes API Server将要对外公布的IP地址,其他节点将使用该地址与API Server通信。
4. `--pod-network-cidr=10.122.0.0/16`
- 为Kubernetes集群指定Pod网络的IP地址范围,这个CIDR表示将使用10.122.0.0/16这个网段作为Pod网络。
5. `--token-ttl 0`
- 设置令牌的超时时间为0,即令牌永不过期。通常在测试环境中使用,生产环境应设置适当的过期时间。
执行这条命令后,它会在当前节点上部署必需的组件,如`kube-apiserver`、`kube-controller-manager`、`kube-scheduler`等,从而初始化一个Kubernetes控制平面。
在后续的步骤中,通过部署网络插件(如Flannel、Calico等)为集群提供Pod网络互通,然后再使用`kubeadm join`命令将其他节点加入集群,从而构建一个完整的Kubernetes集群。
ctr
这两条命令都涉及到容器镜像的拉取和标记,它们是在配置Kubernetes环境时可能会用到的。
ctr -n k8s.io images pull -k registry.aliyuncs.com/google_containers/pause:3.6
ctr
是 containerd 的命令行工具-n k8s.io
指定使用k8s.io
这个命名空间images pull
表示拉取镜像-k
选项允许从不受信任的镜像仓库拉取镜像registry.aliyuncs.com/google_containers/pause:3.6
是要拉取的pause镜像在阿里云镜像仓库中的地址和标签
这条命令的作用是从阿里云的镜像仓库中拉取Kubernetes使用的pause容器镜像的3.6版本。
ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
images tag
子命令用于给镜像打标签registry.aliyuncs.com/google_containers/pause:3.6
是第一步拉取的镜像registry.k8s.io/pause:3.6
是标准的Kubernetes pause镜像名称和标签
这条命令的目的是将从阿里云拉取的pause镜像重新打标签为Kubernetes标准的镜像名称和标签。
pause容器镜像是Kubernetes集群中非常重要的基础组件之一,它的作用是在每个Pod中作为唯一的无休止地运行的"pause"进程,其他容器则是通过共享技术与它共享PID namespace等资源。由于无法直接从Google镜像库拉取,所以需要先从其他镜像源拉取,再重新打标签。
这两条命令通常在部署Kubernetes集群的kubeadm init阶段会执行,以保证必需的pause镜像可用。
selinux
SELinux 全称为 Security-Enhanced Linux,是一种强制访问控制安全机制,它作为Linux内核的一个安全模块运行,限制程序只能访问它们授权的文件。
`setenforce 0` 这条命令的作用是临时将 SELinux 设置为 permissive 模式,也就是允许模式。在此模式下,SELinux 仅记录访问违规而不强制执行策略。
接下来的两条命令:
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
这两条命令是永久关闭 SELinux。
第一条:
- `sed` 是流编辑器,允许对文件进行修改
- `-i` 参数让 sed 直接修改文件内容
- 单引号里是替换命令, `s/查找内容/替换内容/`
- 将 /etc/sysconfig/selinux 文件中的 SELINUX=permissive 替换为 SELINUX=disabled
第二条:
- 同样使用 sed
- 双引号让 sed 可以识别 /
- `g` 表示全局替换,将该文件中所有 SELINUX=enforcing 改为 SELINUX=disabled
执行这两条命令后,SELinux 就被永久关闭了。关闭 SELinux 会降低系统安全性,但也消除了它可能带来的一些程序兼容性问题。在生产环境中还是建议开启并正确配置 SELinux。
swap分区
highlighter- JavaScript
这两条命令用于永久禁用Linux系统中的交换分区(swap)。
1. `swapoff -a`
- `swapoff`是用来关闭交换分区的命令
- `-a`选项表示关闭所有的交换分区
这条命令会立即关闭当前所有已启用的交换分区。
2. `sed -i 's/.*swap.*/#&/' /etc/fstab`
- `sed`是流编辑器,常用于文本替换
- `-i`选项让sed直接修改文件内容
- `'s/.*swap.*/#&/'`是替换命令
- `.*swap.*`是正则表达式,用于匹配包含"swap"的行
- `#&`是替换码,`#`号用于注释该行,`&`表示保留原来的内容
- `/etc/fstab`是系统启动时自动挂载分区和虚拟文件系统的配置文件
这条命令的作用是,用`#`号注释掉`/etc/fstab`文件中包含"swap"字样的行,从而阻止系统开机时自动挂载交换分区。
综合这两条命令的作用是:
1) 立即关闭当前的交换分区
2) 防止系统重启后自动启用交换分区
禁用交换分区通常是为了彻底利用系统物理内存,避免内存与交换分区之间的数据交换,从而获得更佳的性能表现,尤其对于需要大内存的任务非常有用。但也要权衡内存占用,避免内存不足导致系统崩溃。
kubectlcreate
highlighter- JavaScript
这条命令是在Kubernetes集群中创建Calico网络插件所需的Tigera Operator。
让我们分解一下命令中的各个部分:
1. `kubectl create`
- `kubectl`是Kubernetes的命令行工具
- `create`是其子命令,用于从文件或URL创建Kubernetes资源
2. `-f`
- 该标志指定要创建资源的文件源
3. `https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml`
- 这是Tigera Operator安装文件的原始URL
- Calico是一个广泛使用的开源容器网络插件
- Tigera Operator是部署和管理Calico的Kubernetes操作符
执行这条命令后,它会从给定的URL下载一个YAML文件,并根据其中的定义在集群中创建所需的资源。
Tigera Operator主要包含以下几个关键资源:
1. Namespace: 为Calico组件创建一个专用命名空间
2. RBAC资源: 为Operator分配所需的权限
3. Deployment: 部署Operator本身
4. CustomResourceDefinitions: 定义Calico的自定义资源
创建Tigera Operator是安装Calico的第一步。接下来还需要创建Calico自定义资源来启用和配置网络插件。Calico会自动在集群中部署需要的组件,并根据配置为容器提供网络连接和网络策略实施。
总的来说,这条命令启动了在Kubernetes集群中部署流行的Calico CNI插件的过程。
Master高可用如何做?
实现 Kubernetes(k8s)的 Master 高可用(High Availability, HA) 是确保集群控制平面稳定运行的关键。以下是分步指南及核心实现方案:
一、Master 高可用的核心目标
-
消除单点故障:确保 API Server、Controller Manager、Scheduler 和 etcd 等核心组件在多个节点冗余运行。
-
无缝故障转移:当某个 Master 节点宕机时,其他节点能自动接管服务。
-
负载均衡:外部请求通过负载均衡器分发到健康的 Master 节点。
二、实现高可用的关键组件
组件 | 作用 | 高可用实现方式 |
---|---|---|
API Server | 集群的入口,处理所有 REST 请求 | 多副本 + 负载均衡器(如 HAProxy、Nginx) |
etcd | 存储集群状态数据 | 独立集群(至少 3 节点,推荐 5 节点) |
Controller Manager | 执行集群控制循环(如节点状态、Pod 副本数) | 多副本 + Leader 选举(--leader-elect=true) |
Scheduler | 负责 Pod 调度 | 多副本 + Leader 选举(--leader-elect=true) |
三、主流实现方案
方案 1:Stacked etcd 拓扑(内置 etcd 集群)
-
架构特点:每个 Master 节点同时运行 API Server 和 etcd。
-
适用场景:中小规模集群,简化部署。
-
部署步骤:
-
准备至少 3 个 Master 节点。
-
使用
kubeadm
初始化首个 Master 节点。 -
添加其他 Master 节点到集群,自动扩展 etcd 和控制平面组件。
-
方案 2:External etcd 拓扑(独立 etcd 集群)
-
架构特点:etcd 集群与 Master 节点物理分离。
-
适用场景:大规模生产环境,提升 etcd 性能和稳定性。
-
部署步骤:
-
独立部署一个 3/5 节点的 etcd 集群。
-
配置每个 Master 节点连接外部 etcd。
-
使用负载均衡器暴露 API Server。
-
四、具体实现步骤(以 kubeadm 为例)
1. 前置条件
-
节点规划:至少 3 个 Master 节点,奇数节点避免脑裂。
-
网络要求:
-
所有节点时间同步(NTP)。
-
Pod 网络(如 Calico、Flannel)支持多节点互通。
-
负载均衡器(VIP)暴露
6443
端口(API Server)。
-
2. 部署负载均衡器(以 HAProxy + Keepalived 为例)
负载均衡器选型
-
外部负载均衡器:
-
使用云厂商提供的负载均衡服务(如 AWS ELB、GCP Load Balancer)。
-
-
内部负载均衡器:
-
使用 HAProxy、Keepalived 或 Nginx。
-
配置 VIP(虚拟 IP),通过 Keepalived 实现高可用的负载均衡服务。
-
-
作用:为 API Server 提供虚拟 IP(VIP),实现流量分发。
-
配置示例(HAProxy):
frontend k8s-api bind 192.168.1.100:6443 mode tcp default_backend k8s-masters backend k8s-masters mode tcp balance roundrobin server master1 192.168.1.101:6443 check server master2 192.168.1.102:6443 check server master3 192.168.1.103:6443 check
-
Keepalived:确保 VIP 在 Master 节点间漂移。
3. 初始化首个 Master 节点
kubeadm init \
--control-plane-endpoint "192.168.1.100:6443" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16
-
--control-plane-endpoint
:指向负载均衡器的 VIP 和端口。 -
--upload-certs
:自动生成并上传证书,供其他 Master 节点加入。
4. 添加其他 Master 节点
在其他节点执行 kubeadm join
命令(输出自首个节点初始化):
kubeadm join 192.168.1.100:6443 \
--token <token> \
--discovery-token-ca-cert-hash <hash> \
--control-plane \
--certificate-key <cert-key>
5. 验证高可用状态
-
检查 Master 节点状态:
kubectl get nodes -l node-role.kubernetes.io/control-plane=
-
检查 etcd 集群健康:
kubectl get pods -n kube-system -l component=etcd etcdctl --endpoints=https://192.168.1.101:2379,https://192.168.1.102:2379,https://192.168.1.103:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key endpoint health
五、核心问题排查与优化
1. 常见故障场景
场景 | 现象 | 解决方案 |
---|---|---|
API Server 不可用 | kubectl 命令超时 | 检查负载均衡器 VIP 和端口是否可达 |
etcd 集群分裂 | 节点间数据不一致 | 强制恢复 etcd 集群(需备份数据) |
Leader 选举失败 | Controller Manager/Scheduler 日志报选举错误 | 检查网络延迟和节点时钟同步 |
2. 优化建议
-
etcd 性能调优:
-
使用 SSD 存储,设置
--quota-backend-bytes
限制数据大小。 -
调整心跳间隔(
--heartbeat-interval
)和选举超时(--election-timeout
)。
-
-
API Server 负载均衡:
-
配置会话保持(若需要)或加权轮询。
-
启用 TLS 加密并定期轮换证书。
-
-
网络策略:
-
使用 CNI 插件支持网络隔离(如 Calico NetworkPolicy)。
-
避免 Pod 和 Service 网段与物理网络冲突。
-
六、云厂商高可用方案(补充)
-
AWS:使用 Elastic Load Balancer (ELB) 配合 Auto Scaling Group。
-
GCP:通过 GKE 自动托管 Master 节点,内置高可用。
-
Azure:使用 Azure Load Balancer 和 Availability Sets/Zones。
七、总结
实现 Kubernetes Master 高可用的核心步骤包括:
-
部署负载均衡器:确保 API Server 流量分发。
-
多 Master 节点部署:通过
kubeadm
扩展控制平面。 -
独立或内置 etcd 集群:保障数据一致性。
-
组件健康监控:定期检查 etcd、API Server 状态。
通过上述方案,可显著提升集群的容灾能力,确保生产环境稳定运行。