Kubernetes集群搭建

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 关于报错

初始化过程中,不出意外的话意外要出现了:

  1. 如果报 container runtime is not running:的错误,此时需要执行下面命令:sh

rm -rf /etc/containerd/config.toml
systemctl restart containerd

  1. 如果报 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)上执行:

  1. 停止 kubelet 服务
sudo systemctl stop kubelet
  1. 使用 kubeadm 重置
sudo kubeadm reset

这个命令会清除 kubelet 的配置,移除 Kubernetes 的相关容器,以及执行一些清理操作。

  1. 清理 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环境时可能会用到的。

  1. 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版本。

  1. 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 高可用的核心目标

  1. 消除单点故障:确保 API Server、Controller Manager、Scheduler 和 etcd 等核心组件在多个节点冗余运行。

  2. 无缝故障转移:当某个 Master 节点宕机时,其他节点能自动接管服务。

  3. 负载均衡:外部请求通过负载均衡器分发到健康的 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。

  • 适用场景:中小规模集群,简化部署。

  • 部署步骤

    1. 准备至少 3 个 Master 节点。

    2. 使用 kubeadm 初始化首个 Master 节点。

    3. 添加其他 Master 节点到集群,自动扩展 etcd 和控制平面组件。

方案 2:External etcd 拓扑(独立 etcd 集群)
  • 架构特点:etcd 集群与 Master 节点物理分离。

  • 适用场景:大规模生产环境,提升 etcd 性能和稳定性。

  • 部署步骤

    1. 独立部署一个 3/5 节点的 etcd 集群。

    2. 配置每个 Master 节点连接外部 etcd。

    3. 使用负载均衡器暴露 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 高可用的核心步骤包括:

  1. 部署负载均衡器:确保 API Server 流量分发。

  2. 多 Master 节点部署:通过 kubeadm 扩展控制平面。

  3. 独立或内置 etcd 集群:保障数据一致性。

  4. 组件健康监控:定期检查 etcd、API Server 状态。

通过上述方案,可显著提升集群的容灾能力,确保生产环境稳定运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值