K8S v1.10 + Docker 17.09 集群部署:3个常见网络与证书问题深度排错
·
K8S v1.10 + Docker 17.09 集群部署:3个常见网络与证书问题深度排错
当你在二进制部署Kubernetes集群时,网络连通性和TLS证书配置往往是两个最令人头疼的问题。本文将深入剖析三个典型故障场景:etcd启动失败、kube-apiserver无法访问以及Node节点NotReady状态,并提供一套完整的诊断与修复方案。
1. 诊断工具箱准备
在开始排错前,建议准备以下基础检查工具:
# 网络连通性检查工具集
sudo yum install -y telnet nmap nc tcpdump iproute
# 证书检查工具
openssl version
cfssl version
连通性检查清单 应包含以下关键项:
| 检查项 | 命令示例 | 预期结果 |
|---|---|---|
| 节点间TCP连通性 |
telnet <IP> 6443
| 连接成功 |
| 端口监听状态 |
netstat -tulnp | grep 6443
| 服务监听指定端口 |
| 防火墙规则 |
iptables -L -n -v
| 无阻断关键端口的规则 |
| 路由表 |
ip route show
| 网络路由正常 |
| DNS解析 |
nslookup kubernetes.default
| 能解析集群内部域名 |
2. etcd启动失败:证书与集群初始化问题
etcd作为Kubernetes的数据存储核心,其启动失败通常表现为以下症状:
journalctl -u etcd -f
报错示例:x509: certificate signed by unknown authority
2.1 根因分析流程
graph TD
A[etcd启动失败] --> B{检查日志}
B --> C[证书错误]
B --> D[集群配置错误]
C --> E[验证证书链]
D --> F[检查成员列表]
E --> G[重新生成证书]
F --> H[重置集群]
2.2 具体修复步骤
证书问题修复 :
# 重新生成etcd证书(需在CA服务器操作)
cat > etcd-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"${MASTER_IP}"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai"
}]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem etcd-csr.json | cfssljson -bare etcd
集群初始化问题 :
# 备份数据后重置etcd集群
sudo systemctl stop etcd
sudo rm -rf /var/lib/etcd/*
sudo etcd --initial-cluster-token=etcd-cluster-new \
--initial-advertise-peer-urls=https://${MASTER_IP}:2380 \
--initial-cluster=default=https://${MASTER_IP}:2380
3. kube-apiserver无法访问:TLS与网络策略
当kubectl命令返回
The connection to the server was refused
时,通常意味着API Server不可达。
3.1 四层诊断法
-
物理层 :
ping ${APISERVER_IP} -
网络层 :
traceroute ${APISERVER_IP} -p 6443 -
传输层 :
nc -zv ${APISERVER_IP} 6443 -
应用层 :
curl -k https://${APISERVER_IP}:6443/version
3.2 常见修复方案
证书配置错误 :
# 检查证书有效期
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
# 更新证书(kubeadm环境)
kubeadm alpha certs renew all
服务启动参数检查 :
# 确认监听地址包含节点IP
ps aux | grep kube-apiserver | grep -- --advertise-address
4. Node节点NotReady:组件通信与网络插件
Node节点NotReady通常伴随以下组件问题:
kubectl describe node ${NODE_NAME}
显示原因:KubeletNotReady / NetworkPluginNotReady
4.1 组件状态检查表
| 组件 | 检查命令 | 健康标准 |
|---|---|---|
| kubelet |
systemctl status kubelet
| Active (running) |
| kube-proxy |
journalctl -u kube-proxy
| 无证书错误日志 |
| docker |
docker ps
| 能正常启动容器 |
| CNI插件 |
ls /etc/cni/net.d/
| 有正确配置文件 |
4.2 网络插件修复示例
以Flannel为例的典型修复流程:
# 清理旧网络配置
ip link delete cni0
ip link delete flannel.1
# 重新应用网络配置
kubectl delete -f kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
5. 高级排错技巧
对于复杂网络问题,可采用以下深度诊断方法:
数据包捕获分析 :
# 在Master节点捕获API Server流量
tcpdump -i any -nn -w apiserver.pcap port 6443
证书链验证 :
openssl verify -CAfile /etc/kubernetes/pki/ca.crt \
-untrusted /etc/kubernetes/pki/apiserver.crt \
/etc/kubernetes/pki/apiserver-kubelet-client.crt
etcd健康检查 :
ETCDCTL_API=3 etcdctl --endpoints=https://${ETCD_IP}:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
endpoint health
记住,在二进制部署环境中,每个组件的日志都是黄金信息源。养成第一时间检查
journalctl -u <service>
的习惯,能帮你快速定位80%的集群问题。
更多推荐
所有评论(0)