文章目录
- 1. HAProxy 安装问题汇总
- 1.1 绑定vip启动失败
- 2. ETCD 安装问题汇总集群无法启动
- 2.1 etcd 节点重启失败
- 3. Kubernetes 安装问题汇总
- 3.1 namespace 无法删除
- 3.2 大量Pod 状态为 Terminating
- 3.3 Pod 日志无法查看
- 3.4 Pod容器初始化失败
- 3.5 Pod 被驱逐
- 3.6 node 节点报错
- 3.7 查看 kubelet 日志
- 3.8 主节点无法调度
- 4. Calico 安装问题汇总
- 4.1 节点之间访问 Timeout
- 4.2 Calico-node Pod启动失败
- 5. CoreDNS 安装问题汇总
- 5.1 DNS 域名服务 IP 地址调整
- 6. Istio 安装问题汇总
- 6.1 Kiali 无法连接 Istiod
- 6.2 Istio Ingress 修改网络类型
- 6.3 istio 关闭 egress 限制
1. HAProxy 安装问题汇总
1.1 绑定vip启动失败
- 问题描述
在/etc/haproxy/haproxy.cfg
中配置了绑定 vip ,启动 haproxy 服务时出现绑定失败的错误提示。 - 解决办法
修改配置文件/etc/sysctl.conf
,添加如下内容:
net.ipv4.ip_nonlocal_bind=1
然后让变量生效
sysctl -p
接着再次启动haproxy
systemctl restart haproxy
2. ETCD 安装问题汇总集群无法启动
2.1 etcd 节点重启失败
- 问题描述
由于某个节点数据出现故障,导致节点无法启动。etcdctl 与 kubectl 客户端工具无法使用,均出现请求 timeout 的情况,而直接重启当前节点的 etcd 服务出现异常。 - 解决办法
第一步:删除该节点etcd的数据目录,ETCD_DATA_DIR
变量值即为数据存储目录
第二步:设置 ETCD_INITIAL_CLUSTER_STATE=“existing”
第三步:重启节点,systemctl restart etcd
3. Kubernetes 安装问题汇总
3.1 namespace 无法删除
- 问题描述
命名空间状态为 Terminating,导致无法在这个命名空间中部署资源,也无法删除。 - 解决办法
cd /opt
kubectl get namespace 命名空间 -o json > 命名空间.json
修改 命名空间.json 中内容,删除 spec
和 status
对应的值后,然后执行下边命令:
kubectl proxy --port=9988 &
curl -k -H "Content-Type: application/json" -X PUT --data-binary @命名空间.json 127.0.0.1:9988/api/v1/namespaces/${命名空间}/finalize
3.2 大量Pod 状态为 Terminating
- 问题描述
由于某些节点故障,导致出现大量的 Pod 状态为 Terminating
istio-system jaeger-5994d55ffc-nmhq6 0/1 Terminating 0 13h
istio-system jaeger-5994d55ffc-pjj5m 0/1 Terminating 0 11h
istio-system kiali-64df7bf7cc-29kxl 0/1 Terminating 0 12h
istio-system kiali-64df7bf7cc-2bk77 0/1 Terminating 0 11h
istio-system kiali-64df7bf7cc-4wwhg 0/1 Terminating 0 14h
istio-system kiali-64df7bf7cc-8cfsh 0/1 Terminating 0 13h
istio-system kiali-64df7bf7cc-dks5w 0/1 Terminating 0 15h
istio-system kiali-64df7bf7cc-dkzgc 0/1 Terminating 0 15h
- 解决办法
kubectl get pods -n 命名空间 | grep Terminating | awk '{print $1}' | xargs kubectl delete pod -n 命名空间 --force --grace-period=0
如果发现大量的Pod存在这种情况,可通过编写脚本定期执行。
3.3 Pod 日志无法查看
- 问题描述
使用kubectl logs -f PodName
查看日志时提示如下错误信息:
Error from server (Forbidden): Forbidden (user=kubernetes, verb=get, resource=nodes, subresource=proxy)
- 解决办法
kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes
3.4 Pod容器初始化失败
- 问题描述
Failed to create pod sandbox: rpc error: code = Unknown desc = failed pulling image "k8s.gcr.io/pause:3.6":
Error response from daemon: Get https://k8s.gcr.io/v2/:
net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
- 解决办法
由于网络访问限制,正常情况下无法访问registry.k8s.io 域名内的镜像,所以通过国内镜像仓库下载后,使用 tag 指令重命名。
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
3.5 Pod 被驱逐
- 问题描述
大量的 Pod 状态是 Evicted - 解决办法
删除状态为 Evicted 的 Pod
kubectl get pods -A| grep Evicted | awk '{print $2}' | xargs kubectl delete pod -n <namespace>
3.6 node 节点报错
- 问题描述
"Error syncing pod, skipping" err="network is not ready: container runtime network not ready
- 解决办法
Kubernetes CNI 网络插件安装失败,如果 CNI 是 Calico,请确认 calico-node 是否启动成功。
3.7 查看 kubelet 日志
journalctl -u kubelet --since today |less
3.8 主节点无法调度
- 问题描述
0/1 nodes are available: 1 node(s) had untolerated taint {node.kubernetes.io/not-ready: }
k8s 节点不可调度,使用kubectl 工具查看节点状态
kubectl get nodes -o wide
显示结果如下所示:
NAME STATUS ROLES AGE VERSION
k8s-master1 NotReady,SchedulingDisabled <none> 43h v1.24.2
k8s-master2 Ready <none> 4d6h v1.24.2
k8s-node1 NotReady,SchedulingDisabled <none> 44h v1.24.2
- 解决办法
# 禁止调度
kubectl cordon 节点名称
# 解除禁用
kubectl uncordon 节点名称
4. Calico 安装问题汇总
4.1 节点之间访问 Timeout
- 问题描述
cni-installer/<nil> <nil>: Unable to create token for CNI kubeconfig error=Post
"https://10.255.0.1:443/api/v1/namespaces/kube-system/serviceaccounts/calico-node/token":
dial tcp 10.255.0.1:443: i/o timeout
- 解决办法
检查集群网络CNI插件是否正常,如 calico-node 是否能够正常启动。检查 Kubernetes 启动参数中--service-cluster-ip-range
与--cluster-cidr
值是否出现了重叠,导致了集群变成了单机环境。
4.2 Calico-node Pod启动失败
- 问题描述
calico-node启动失败,在事件信息中出现如下:
Back-off restarting failed container
invalid capacity 0 on image filesystem
Node k8s-node2 status is now: NodeHasNoDiskPressure
Updated Node Allocatable limit across pods
Node k8s-node2 status is now: NodeHasSufficientPID
- 分析日志
#: kubectl logs -n kube-system calico-node-wzq2p -c install-cni
#: kubectl describe pod calico-node-wzq2p -n kube-system
#: journalctl -u kubelet -f
提示磁盘空间不足不一定真的是磁盘空间不足导致的calico-node无法启动,需要查看具体的日志信息。可以使用 kubectl logs -n kube-system calico-node-wzq2p -c install-cni
查看具体的错误提示,然后分析问题。作者曾经就一直以为是磁盘空间不足导致的 calico-node 无法启动,后来查看了详细日志才发现是 kube-proxy
的配置参数 --cluster-cidr
与 kube-controller-manager
、kube-apiserver
中设置的 --service-cluster-ip-range
不匹配。
5. CoreDNS 安装问题汇总
5.1 DNS 域名服务 IP 地址调整
- 问题描述
CoreDNS 默认的配置与当前 kubernetes 集群配置不一致,Kubelet 启动参数clusterDNS
依赖 CoreDNS 域名服务 IP 地址,当 Kubelet 服务启动时设置的clusterDNS
参数与 CoreDNS 部署设置的域名服务 IP 地址不一致时,将会导致服务访问超时。 - 解决办法
执行下边命令,指定 DNS域名服务的 Service IP 地址
cd /opt
git clone https://github.com/coredns/deployment
cd /opt/deployment/kubernetes
./deploy.sh -r 10.255.0.0/16 -i 10.255.0.2 > coredns.yaml
kubectl apply -f coredns.yaml
上边配置中的 -i
既是设置 DNS 域名服务 IP 地址。
6. Istio 安装问题汇总
6.1 Kiali 无法连接 Istiod
- 问题描述
unable to proxy Istiod pods.
Make sure your Kubernetes API server has access to the Istio control plane through 8080 port
- 解决办法
yum install socat -y
6.2 Istio Ingress 修改网络类型
- 问题描述
默认情况下, Istio Ingress 使用 LoadBalancer - 解决办法
kubectl patch svc -n istio-ingress istio-ingress -p '{"spec": {"type": "NodePort"}}'
6.3 istio 关闭 egress 限制
helm upgrade --set meshConfig.outboundTrafficPolicy.mode=REGISTRY_ONLY istiod istio/istiod -n istio-system