系列文章:
容器 & 服务:开篇,压力与资源
容器 & 服务:一个 Java 应用的 Docker 构建实战
容器 & 服务:Docker 应用的 Jenkins 构建
容器 & 服务:Docker 应用的 Jenkins 构建 (二)
容器 & 服务:K8s 与 Docker 应用集群 (一)
容器 & 服务:K8s 与 Docker 应用集群 (二)
容器 & 服务:Kubernetes 构件及 Deployment 操作
容器 & 服务: ClickHouse 与 k8s 架构
容器 & 服务: 扩容
一 metrics-server 错误信息
在 helm 安装 metrics-server 后,可能还是会报错,以下以遇到的实例,分享问题分析和解决过程。
1.1 问题描述
container flamingskys$ kubectl top node
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
1.2 pod 信息
lijingyong:container flamingskys$ kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-f9fd979d6-4xqfp 1/1 Running 3 27dcoredns-f9fd979d6-555sx 1/1 Running 3 27detcd-docker-desktop 1/1 Running 3 27dkube-apiserver-docker-desktop 1/1 Running 8 27dkube-controller-manager-docker-desktop 1/1 Running 3 27dkube-proxy-h26lk 1/1 Running 3 27dkube-scheduler-docker-desktop 1/1 Running 19 27dmetrics-server-6bdfb6d589-x79mr 0/1 CrashLoopBackOff 385 40hstorage-provisioner 1/1 Running 24 27dvpnkit-controller 1/1 Running 3 27d
复制代码
很明显的问题,metrics-server-6bdfb6d589-x79mr 这个 pod 当前是 CrashLoopBackOff 状态,继续查看 pod 问题详情。
注:直接使用 kubectl describe pod metrics-server-6bdfb6d589-x79mr 是不行的,需要指明 namespace,否则会报找不到 pod 的错误:
1.3 pod 日志
kubectl describe pod -n kube-system metrics-server-6bdfb6d589-x79mr
复制代码
输出内容如下:
Name: metrics-server-6bdfb6d589-x79mrNamespace: kube-systemPriority: 0Node: docker-desktop/192.168.65.4Start Time: Sat, 24 Apr 2021 23:24:03 +0800Labels: app.kubernetes.io/instance=metrics-server app.kubernetes.io/managed-by=Helm app.kubernetes.io/name=metrics-server helm.sh/chart=metrics-server-5.8.5 pod-template-hash=6bdfb6d589Annotations: <none>Status: RunningIP: 10.1.0.18IPs: IP: 10.1.0.18Controlled By: ReplicaSet/metrics-server-6bdfb6d589Containers: metrics-server: Container ID: docker://bbfc367728248cf676f084eb526bec02b2a0dfb6e8c1e4d6dd463a85c111cdfe Image: docker.io/bitnami/metrics-server:0.4.3-debian-10-r0 Image ID: docker-pullable://bitnami/metrics-server@sha256:48c75855698863a4968bd971b61c14fe84a4516e9ddf91373cf613c6862ed620 Port: 8443/TCP Host Port: 0/TCP Command: metrics-server Args: --secure-port=8443 State: Waiting Reason: CrashLoopBackOff Last State: Terminated Reason: Completed Exit Code: 0 Started: Mon, 26 Apr 2021 15:43:40 +0800 Finished: Mon, 26 Apr 2021 15:44:09 +0800 Ready: False Restart Count: 389 Liveness: http-get https://:https/livez delay=0s timeout=1s period=10s #success=1 #failure=3 Readiness: http-get https://:https/readyz delay=0s timeout=1s period=10s #success=1 #failure=3 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from metrics-server-token-78x8d (ro)Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True Volumes: metrics-server-token-78x8d: Type: Secret (a volume populated by a Secret) SecretName: metrics-server-token-78x8d Optional: falseQoS Class: BestEffortNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300sEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Pulled 44m (x374 over 29h) kubelet Container image "docker.io/bitnami/metrics-server:0.4.3-debian-10-r0" already present on machine Warning Unhealthy 19m (x1124 over 29h) kubelet Liveness probe failed: HTTP probe failed with statuscode: 500 Warning BackOff 4m8s (x4698 over 29h) kubelet Back-off restarting failed container
复制代码
上面是我 pod 日志的完整内容,定位到最后,可以看到错误原因:
二 Liveness probe
2.1 k8s 的健康检查
Kubernetes 在每个 Node 节点上都有 kubelet ,Container Probe 也就是容器的健康检查是由 kubelet 定期执行的。
在创建 Pod 时,可以通过liveness和readiness两种方式来探测 Pod 内容器的运行情况。liveness可以用来检查容器内应用的存活的情况来,如果检查失败会杀掉容器进程,是否重启容器则取决于 Pod 的重启策略。readiness检查容器内的应用是否能够正常对外提供服务,如果探测失败,则 Endpoint Controller 会将这个 Pod 的 IP 从服务中删除。
2.2 Liveness probe failed
从 Events 的消息,可以确认是健康检查时报了 500 错误,但我们还需要更详细的信息。
但从整个 pod 日志中,看不到更多消息,所以只能另寻出路。
三 metrics-server
回到我们的最初目的,是为了安装 metrics-server。那么直接到它的 github:metrics-server。按照安装说明操作,在 git 的 Installation 部分。命令:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
复制代码
注意,在安装说明中有一个提示:
WARNING: You should no longer use manifests from master branch (previously available in deploy/kubernetes directory). They are now meant solely for development.
兼容性说明:
那么看来应该就是这里的问题了,我们修改上面 components.yaml 调整后即可。
评论