k8s 集群 etcd 扩容

kubeadm k8s 集群扩容

该文档基于具体需求编写,标为斜体的部分以及所有的 ip 值都是依赖具体环境的,参考时需要做修改

风险评估时放弃了该方案,所以该文档并没有写完,只是写完了 etcd 的扩容和控制平面扩容的一部分准备工作,且没有真正实操。该文全局的前置工作是基于全部扩容写的,所以会有一部分 kubeadm 等的校验及配置,如果只是 etcd 的扩容的话可以忽略相关配置校验及警告

总的来说我不建议这么干,最好是搭建一个新的集群然后迁移服务

场景

现有集群包含一个 master 和一个 node,无法满足基础的高可用需求

需求

  1. etcd 扩容,将单点 etcd 扩容为三节点集群,由于推举机制,至少需要有三个节点(本文仅完成了该部分
  2. 控制平面扩容,将单 master 升级为多 master,由于推举机制,至少需要有三个 master 节点
  3. 节点扩容,为确保单个服务器不可用后服务整体不受影响,至少需要两个 node 节点

扩容

前置工作

扩容操作本身比从零搭建一个集群更复杂,因此一个详尽的前置工作必不可少
该部分操作均为安全操作,不会对现有集群的运行状态产生任何副作用

1. 环境确认
  1. 确认安装方式与版本

登录 master 节点服务器 10.198.32.206

确认集群安装方式是否为 kubeadm 并记录版本

kubeadm version
  1. 获取并分析核心配置
# 保存集群核心配置文件,该文件包含了集群的CIDR(Pod和Service的IP段)、controlPlaneEndpoint(当前可能为空或指向单Master)、证书信息,需要作为后续操作的参考
kubectl get configmap -n kube-system kubeadm-config -o yaml > kubeadm-config.yaml

10.198.32.206 服务器的 kubeadm-config.yaml 需关注并记录标注了注释的配置

apiVersion: v1  
data:  
  ClusterConfiguration: |  
    apiServer:  
      certSANs:  
      - 10.198.32.206  
      - wfk8smaster1  
      extraArgs:  
        authorization-mode: Node,RBAC  
      timeoutForControlPlane: 4m0s  
    apiVersion: kubeadm.k8s.io/v1beta2  
    certificatesDir: /etc/kubernetes/pki # 证书存放路径
    clusterName: kubernetes  
    controlPlaneEndpoint: 10.198.32.206:16443 # 控制平面统一访问入口 
    controllerManager: {}  
    dns:  
      type: CoreDNS  
    etcd:  
      external:  
        caFile: ""  
        certFile: ""  
        endpoints:  
        - http://10.198.32.206:2379 # etcd 集群地址
        keyFile: ""  
    imageRepository: docker.repos.cscec81.com:4433/kubectl # 所有 Kubernetes 镜像仓库地址
    kind: ClusterConfiguration  
    kubernetesVersion: v1.20.15 # 【关键】集群版本,新节点必须安装相同版本
    networking:  
      dnsDomain: cluster.local  
      podSubnet: 10.244.0.0/16 # Pod 网段
      serviceSubnet: 10.96.0.0/12 # Service 网段
    scheduler: {}  
  ClusterStatus: |  
    apiEndpoints:  
      wfk8smaster1:  
        advertiseAddress: 10.198.32.206  
        bindPort: 6443  
    apiVersion: kubeadm.k8s.io/v1beta2  
    kind: ClusterStatus  
kind: ConfigMap  
metadata:  
  creationTimestamp: "2024-07-02T01:42:00Z"  
  managedFields:  
  - apiVersion: v1  
    fieldsType: FieldsV1  
    fieldsV1:  
      f:data:  
        .: {
   
   }  
        f:ClusterConfiguration: {
   
   }  
        f:ClusterStatus: {
   
   }  
    manager: kubeadm  
    operation: Update  
    time: "2024-07-02T01:42:00Z"  
  name: kubeadm-config  
  namespace: kube-system  
  resourceVersion: "301"  
  uid: 92e389d5-4a74-48c9-937b-b9f1fb12fc9b

分析 kubeadm-config.yaml 文件,记录以下关键信息:

kubernetesVersion: v1.20.15
controlPlaneEndpoint: 10.198.32.206:16443
certificatesDir: /etc/kubernetes/pki
imageRepository: docker.repos.cscec81.com:4433/kubectl
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
Etcd模式: 外部Etcd,单点,端点为 http://10.198.32.206:2379

  1. 确认容器运行时版本
# 查看 docker 版本
yum list installed | grep docker

docker-buildx-plugin.x86_64 0.11.2-1.el7 installed
docker-ce.x86_64 3:19.03.15-3.el7 installed
docker-ce-cli.x86_64 1:19.03.15-3.el7 installed
docker-compose-plugin.x86_64 2.21.0-1.el7 installed

  1. 确认控制平面入口服务
# 查看该端口进程id
ss -tulnp | grep 16443
# 查看该端口进程详情
ps -aux | grep 1161

经确认该端口运行的是一个 HAProxy 服务负责负载均衡

# 查看服务详情,同时该命令会返回服务配置文件的位置
systemctl status haproxy
# 查看配置文件
cat /usr/lib/systemd/system/haproxy.service
## /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target

[Service]
EnvironmentFile=/etc/sysconfig/haproxy # 配置文件位置
ExecStart=/usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid $OPTIONS
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed

[Install]
WantedBy=multi-user.target

##----------------------------------------------------------------
## /etc/sysconfig/haproxy
OPTIONS=""

##----------------------------------------------------------------
## /etc/haproxy/haproxy.cfg
global
    log       
<think>好的,用户现在的问题是在Kubernetes中如何检查etcd的运行状态。我需要结合用户之前的问题和之前的回答来思考如何解决这个问题。 首先回顾一下用户之前的对话。用户之前询问了如何在服务端检查Xftp服务的状态,我给出了使用systemctl、检查进程、验证安装、查看端口等方法。现在用户的问题转向了Kubernetes中的etcd状态检查,虽然主题不同,但可能有类似的思路,比如检查服务状态、查看日志、验证健康状态等。 用户提供的站内引用提到了etcd的compact指令导致的问题,以及备份恢复的重要性。这可能意味着用户不仅想检查状态,还可能关心etcd的数据完整性和恢复策略。不过当前问题集中在状态检查,需要先解决基本方法。 接下来思考,在Kubernetes中,etcd通常作为控制平面的关键组件运行。如果是使用kubeadm部署的集群etcd可能以静态Pod的形式运行,因此检查其状态可以通过kubectl工具。如果是外部etcd集群,可能需要直接访问etcd的端点。 用户可能需要知道多种方法来检查etcd的状态,包括使用etcdctl命令行工具、kubectl查看Pod状态、检查日志,以及验证集群健康等。同时,用户可能对权限问题或证书路径不太熟悉,需要提供具体的命令示例,特别是如何处理证书和端点的问题。 还要注意,用户可能在生产环境中操作,所以需要强调谨慎操作,避免影响集群运行。此外,用户可能对etcd的备份恢复有兴趣,但当前问题集中在状态检查,可以最后在相关问题中提及。 需要确保提供的步骤清晰,涵盖不同部署方式(内置Pod和外部集群),命令准确,特别是证书路径可能需要根据具体安装方式调整。同时,可能需要提醒用户如果使用托管Kubernetes服务(如EKS、GKE),检查etcd状态的方式可能有所不同,可能没有直接访问权限。 总结回答结构: 1. 检查etcd Pod状态(使用kubectl) 2. 使用etcdctl检查端点健康 3. 查看etcd日志 4. 验证集群状态 5. 检查服务端口监听情况 6. 其他注意事项(如备份、权限等) 确保每个步骤都有具体的命令示例,特别是处理证书和端点参数的部分,因为这是常见的容易出错的地方。同时,在相关问题中引导用户到备份恢复、性能优化等方面,以提供进一步帮助。</think>### 在 Kubernetes 中检查 etcd 运行状态的详细步骤 --- #### 1. **确认 etcd 部署方式** - **内置 Pod(kubeadm 部署)**: etcd 通常以静态 Pod 形式运行在控制平面节点上,默认位于 `/etc/kubernetes/manifests/etcd.yaml`。 ```bash # 查看 etcd Pod 状态 kubectl get pods -n kube-system -l component=etcd ``` - 若输出状态为 `Running` 且 `READY` 为 `1/1`,则 Pod 运行正常[^1]。 - **外部独立集群**: 需通过 etcd 客户端工具 `etcdctl` 直接连接外部 etcd 端点: ```bash export ETCDCTL_ENDPOINTS="https://<etcd-ip>:2379" ``` --- #### 2. **使用 `etcdctl` 检查健康状态** - **前提条件**: - 安装 `etcdctl` 工具(与 etcd 版本匹配)。 - 提供证书文件(若启用了 TLS),证书路径通常在 Kubernetes 控制平面节点的 `/etc/kubernetes/pki/etcd` 目录下。 - **执行健康检查**: ```bash # 内置 Pod 场景(自动加载证书) kubectl exec -n kube-system etcd-<node-name> -- etcdctl endpoint health \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --write-out=table # 外部集群场景(手动指定证书) etcdctl --endpoints=$ETCDCTL_ENDPOINTS \ --cacert=ca.crt --cert=client.crt --key=client.key \ endpoint health --write-out=table ``` - **输出说明**: - `healthy`:节点状态正常。 - `unhealthy`:节点不可达或数据同步异常。 --- #### 3. **查看 etcd 日志** - **通过 kubectl 直接查看**: ```bash kubectl logs -n kube-system etcd-<node-name> --tail=50 ``` - 关注关键日志: - `ready to serve client requests`:成功启动。 - `compacting kv store`:触发数据压缩(可能与引用[1]中的 `compact` 操作相关)。 - `lost leader` 或 `heartbeat timeout`:集群选举异常。 --- #### 4. **验证集群成员状态** ```bash # 列出所有成员及其状态 etcdctl --endpoints=$ETCDCTL_ENDPOINTS \ --cacert=ca.crt --cert=client.crt --key=client.key \ member list -w table # 检查 Leader 选举状态 etcdctl --endpoints=$ETCDCTL_ENDPOINTS \ endpoint status -w table ``` - **关键指标**: - `isLeader`:标记当前节点是否为 Leader。 - `dbSize`:数据库大小(异常增长可能需清理或扩容)。 --- #### 5. **检查端口监听状态** ```bash # 在控制平面节点执行 netstat -tuln | grep 2379 # etcd 客户端默认端口 netstat -tuln | grep 2380 # etcd 节点间通信端口 ``` - 若端口未处于 `LISTEN` 状态,说明 etcd 服务未启动或配置错误。 --- #### 6. **其他注意事项** - **备份检查**: 根据引用[2],定期验证 etcd 备份有效性(尤其是执行 `compact` 操作前): ```bash etcdctl snapshot status backup.db -w table ``` - **权限问题**: Kubernetes 内置 etcd 需通过 `kubectl exec` 操作,直接访问可能因证书路径错误失败。 --- ### 相关问题 1. 如何修复 etcd 的 `mvcc: required revision has been compacted` 错误? 2. 如何优化 Kubernetesetcd 的存储性能? 3. 如何安全地扩展 etcd 集群节点? --- ### 附:关键操作示意图 ```bash # 健康检查输出示例 +-------------------+------------------+---------+---------+-----------+-----------+------------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX | +-------------------+------------------+---------+---------+-----------+-----------+------------+ | https://10.0.0.1 | 6e3a7b1d4e8c2a0f | 3.5.0 | 352 kB | true | 3 | 128 | +-------------------+------------------+---------+---------+-----------+-----------+------------+ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值