k8s-01-组件容器时区修改

本文详细介绍了如何在Kubernetes环境中修改各关键组件(etcd、kube-controller-manager、kube-scheduler、kube-apiserver、kube-proxy和coredns)的时区设置,确保整个集群的时间同步和正确运行。

# 挂在主机时区文件模版

...
      volumeMounts:
        - mountPath: /etc/localtime
          name: host-time
          readOnly: true
...
    volumes:
      - hostPath:
          path: /etc/localtime
          type: ""
        name: host-time


# 修改etcd

vi /etc/kubernetes/manifests/etcd.yaml
...
    - mountPath: /etc/localtime
      name: host-time
      readOnly: true
...
  - hostPath:
      path: /etc/localtime
      type: ""
    name: host-time


# 修改kube-control

<think>我们当前的任务是检查Kubernetes集群状态及排查节点加入失败的原因。根据用户提供的日志,节点在加入过程中在etcd步骤失败,错误信息为"etcdserver: can only promote a learner member which is in sync with leader"。 这个错误通常表示新加入的etcd成员(learner)还没有完成与leader的数据同步,因此不能被提升为投票成员。我们需要检查etcd集群的状态,确保新节点能够与现有etcd集群正常通信,并且数据同步能够完成。 以下是解决步骤: 1. **检查现有etcd集群状态**:在已经正常运行的control plane节点上执行命令,查看etcd成员的状态。 2. **检查新节点的etcd日志**:在新节点上,查看etcd容器的日志,确认同步过程是否在进行,是否有错误。 3. **检查网络连接**:确保新节点与现有etcd集群节点之间的网络连通性,特别是2379(etcd客户端)和2380(etcd peer)端口。 4. **检查时间同步**:确保所有节点的时间同步,时间不同步可能导致etcd出现问题。 5. **手动干预**:如果同步一直无法完成,可以考虑将新节点从etcd集群中移除,然后重新加入。 由于用户没有提供集群的kubeconfig,我们假设可以在控制节点上执行命令。 具体操作: 步骤1:检查etcd集群成员状态 在已有的控制节点上执行: ```bash kubectl exec -it -n kube-system etcd-<existing-control-plane-node> -- etcdctl --write-out=table --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key member list ``` 注意:将`<existing-control-plane-node>`替换为已有的etcd pod所在的节点名称。 步骤2:检查新节点的etcd日志 在新节点上,由于etcd是以静态pod运行的,我们可以通过以下命令查看日志: ```bash journalctl -u kubelet -f | grep etcd ``` 或者直接查看etcd容器的日志(如果使用docker): ```bash docker logs $(docker ps | grep etcd | awk '{print $1}') ``` 步骤3:检查网络连通性 在新节点上,使用telnet或nc检查与现有etcd节点端口的连通性: ```bash nc -zv <existing-etcd-node-ip> 2379 nc -zv <existing-etcd-node-ip> 2380 ``` 步骤4:检查时间同步 在所有节点上运行: ```bash timedatectl ``` 确保时区和时间一致。 步骤5:如果发现新节点在etcd成员列表中处于learner状态且长时间未同步,可以尝试将其移除然后重新加入。但注意,移除操作需要谨慎,因为可能会影响集群。 移除成员(在etcd集群中的一个正常节点上执行): 首先,获取新节点的etcd成员ID(通过步骤1中的命令获取)。 然后,移除该成员: ```bash etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key member remove <member-id> ``` 然后,在新节点上清理etcd数据目录(通常为/var/lib/etcd),并重新运行kubeadm join命令。 但是,请注意,重新运行kubeadm join之前,需要确保之前加入过程中生成的文件被清除。可以执行: ```bash kubeadm reset ``` 然后再次尝试加入。 另外,用户提供的日志中,使用了`--cri-socket=unix:///var/run/cri-dockerd.sock`,说明使用的是docker作为容器运行时。需要确保docker服务正常运行。 根据引用[2]中的情况,coredns处于CrashLoopBackOff状态,可能也是因为etcd集群不正常导致。因此,解决etcd问题后,coredns可能会恢复正常。 总结:当前主要问题是etcd新成员同步失败,需要按照上述步骤进行排查。 由于用户的问题描述中,在加入控制平面节点时出现了etcd同步问题,我们将重点放在etcd集群的排查上。 现在,我们生成相关的操作步骤和命令,供用户执行以排查问题。</think>### Kubernetes 集群状态检查与节点加入失败排查指南 #### 1. 检查集群核心组件状态 ```bash # 在正常控制节点执行 kubectl get pods -n kube-system -o wide ``` **关键检查点**: - `etcd` Pod 状态:应全部为 `Running`(如引用[2]所示) - `kube-apiserver` 是否正常运行 - `coredns` 状态:避免 `CrashLoopBackOff`(如引用[2]中的问题) - 节点分布:确保组件均匀分布在多个控制平面节点 #### 2. 诊断 etcd 集群健康 ```bash # 在正常控制节点执行 ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ endpoint health --cluster ``` **预期输出**: ```plaintext https://10.32.11.221:2379 is healthy: successfully committed proposal... https://10.32.11.222:2379 is healthy: successfully committed proposal... ``` #### 3. 检查节点加入失败原因 根据您的日志,核心问题是: ```plaintext etcdserver: can only promote a learner member which is in sync with leader ``` **解决步骤**: 1. **检查新节点时间同步**: ```bash timedatectl status chronyc tracking # 确保所有节点时间偏差 < 1s ``` 2. **验证证书有效性**(如引用[1]要求): ```bash # 新节点上检查 kubelet 客户端证书 openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text -noout | grep -E "Issuer:|Extended Key Usage" ``` 3. **检查网络连通性**: ```bash # 在新节点执行 telnet 10.32.11.221 6443 # API Server 端口 nc -zv 10.32.11.221 2379 # etcd 客户端端口 ``` 4. **查看详细日志**: ```bash journalctl -u kubelet -f | grep -i etcd docker logs $(docker ps | grep etcd | awk '{print $1}') # 容器运行时日志 ``` #### 4. 强制重置并重试加入 ```bash # 在故障节点执行 sudo kubeadm reset -f sudo rm -rf /etc/kubernetes/pki sudo systemctl restart docker cri-dockerd kubelet # 重新加入(增加详细日志) sudo kubeadm join 10.32.11.221:6444 \ --v=5 \ --control-plane \ --token n4xnoa.efsdi56ftehzm3ip \ --discovery-token-ca-cert-hash sha256:eff4c9ab391f809edb6a5733e3b9a1e242202366a8320bba1d89303d7ccc2e38 \ --certificate-key 14002b9dfb4729ac68ed37fa84d0562de57db462b5beba7de813cb451f40227b \ --cri-socket=unix:///var/run/cri-dockerd.sock ``` #### 5. 验证修复效果 ```bash # 成功加入后检查 kubectl get nodes kubectl describe node k8s-control-2 | grep -i ready etcdctl endpoint status --cluster -w table ``` > **关键点**:etcd 数据同步速度取决于集群数据量,1GB 数据量可能需要 10-15 分钟。期间避免中断操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多懂一些

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值