首页 > 其他分享 >掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具

掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具

时间:2023-10-23 10:31:38浏览次数:27  
标签:Kubernetes 45h 故障 集群 proxy pod kube Pod 事件

Kubernetes 是一款管理容器化应用程序的强大工具。然而,与任何复杂的系统一样,使用它时也可能出错。当问题出现时, 掌握有效的故障排除技术和工具非常重要。  

本文将介绍以下步骤,助您了解事件收集的入门知识:

  • 检索最新事件
  • 使用 Pod 模拟问题
  • 在位于 PV 的 Pod 中存储事件  

检索最新事件

对 Kubernetes 集群进行故障诊断的第一步是检索最新的事件。 Kubernetes 中的事件由集群中的各种组件和对象(如 Pod、节点和服务)生成。它们可提供有关集群状态和可能发生的任何问题的信息。  

要检索最新事件,可以使用 Kubectl get events命令。这将显示集群中所有事件的列表。

kubectl get events

LAST SEEN   TYPE      REASON                    OBJECT                                 MESSAGE
78s         Warning   BackOff                   pod/bbb                                Back-off restarting failed container
72s         Warning   BackOff                   pod/bbb2                               Back-off restarting failed container
12m         Normal    Pulling                   pod/bbb3                               Pulling image "busybox"
12m         Normal    Created                   pod/bbb3                               Created container bbb3
46m         Normal    Started                   pod/bbb3                               Started container bbb3

 

如上所示,它按 时间排序 显示了集群中所有通信口的列表。您还可以添加 -w 标记,以观察新事件发生的变化。  

这将显示集群中发生事件的实时状态。通过观察事件,您可以 快速识别可能发生的任何问题。  

虽然 kubectl get events 命令有助于检索事件,但如果事件按时间顺序显示,则很难识别问题。为了更容易识别问题,您可以按照 metadata.creationTimestamp 对事件进行排序。

kubectl get events --sort-by=.metadata.creationTimestamp
LAST SEEN   TYPE      REASON                    OBJECT                                 MESSAGE
104s        Normal    Pulling                   pod/busybox13                          Pulling image "busybox"
88s         Warning   FailedScheduling          pod/mysqldeployment-6f8b755598-phgzr   0/2 nodes are available: 2 Insufficient cpu. preemption: 0/2 nodes are available: 2 No preemption victims found for incoming pod.
104s        Warning   BackOff                   pod/busybox6                           Back-off restarting failed container
82s         Warning   ProvisioningFailed        persistentvolumeclaim/pv-volume        storageclass.storage.k8s.io "csi-hostpath-sc" not found
82s         Warning   ProvisioningFailed        persistentvolumeclaim/pv-volume-2      storageclass.storage.k8s.io "csi-hostpath-sc" not found

 

如上所示,按 metada.creationTimestamp 排序显示集群中所有事件的列表。通过这种方式对通信口进行排序,您可以快速识别最近的事件和可能出现的任何问题。  

使用 Pod 模拟问题

如果您发现存在 与联网或服务发现相关的问题终止 kube-proxy pod 可能会有帮助。 kube-proxy pod 负责集群中的联网和服务发现,因此终止它有助于识别与这些功能相关的任何问题。  

要终止 kube-proxy pod,可以使用 kubectl delete pod 命令。如果您需要指定 kube-proxy pod 的名称,可以使用 kubectl get pods 命令找到它。

kubectl get pods -n kube-system
NAME                              READY   STATUS    RESTARTS      AGE
coredns-57575c5f89-66z2h          1/1     Running   1 (45h ago)   36d
coredns-57575c5f89-bcjdn          1/1     Running   1 (45h ago)   36d
etcd-k81                          1/1     Running   1 (45h ago)   36d
fluentd-elasticsearch-5fdvc       1/1     Running   2 (45h ago)   60d
fluentd-elasticsearch-wx6x9       1/1     Running   1 (45h ago)   60d
kube-apiserver-k81                1/1     Running   1 (45h ago)   36d
kube-controller-manager-k81       1/1     Running   2 (45h ago)   36d
kube-proxy-bqpb5                  1/1     Running   1 (45h ago)   36d
kube-proxy-q94sk                  1/1     Running   1 (45h ago)   36d
kube-scheduler-k81                1/1     Running   2 (45h ago)   36d
metrics-server-5c59ff65b6-s4kms   1/1     Running   2 (45h ago)   58d
weave-net-56pl2                   2/2     Running   3 (45h ago)   61d
weave-net-rml96                   2/2     Running   5 (45h ago)   62d

 

如上,将显示 Kube 系统命名空间中所有 pod 的列表,其中包括kube-proxy pod。获得 kube-proxy pod 的名称后,就可以使用 kubectl delete pod 命令将其删除。

kubectl delete pod -n kube-system kube-proxy-q94sk

 

这将删除 kube-system 命名空间中的 kube-proxy pod。Kubernetes 会自动创建一个新的 kube-proxy pod 来替代它。  

您可以使用以下命令检查事件:

kubectl get events -n=kube-system --sort-by=.metadata.creationTimestamp

LAST SEEN   TYPE     REASON             OBJECT                 MESSAGE
4m59s       Normal   Killing            pod/kube-proxy-bqpb5   Stopping container kube-proxy
4m58s       Normal   Scheduled          pod/kube-proxy-cbkx6   Successfully assigned kube-system/kube-proxy-cbkx6 to k82
4m58s       Normal   SuccessfulCreate   daemonset/kube-proxy   Created pod: kube-proxy-cbkx6
4m57s       Normal   Pulled             pod/kube-proxy-cbkx6   Container image "registry.k8s.io/kube-proxy:v1.24.11" already present on machine

 

在位于 PV 的 Pod 中存储事件

将事件存储在位于 PV 中的 Pod,是跟踪 Kubernetes 集群中所发生事件的有效方法。下面是关于如何操作的分步讲解:  

为 Pod 添加权限

要在 pod 中连接 Kubernetes API,您需要赋予它适当的权限。下面是一个将权限绑定到 pod 的 YAML 文件示例。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: event-logger
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: default
  namespace: default

 

创建持久加密卷 (PV) 和持久加密卷声明 (PVC)

现在我们已经设置好 ClusterRoleBind,可以创建一个持久卷来存储我们的事件。下面是一个使用 hostPath 创建 PC 的 YAML 文件示例:

# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data

---

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  volumeName: my-pv

 

创建 Pod 以收集事件

现在,我们已经设置好 PV 和 PVC,可以创建 Pod 来收集事件了。下面是一个 YAML 文件示例,用于创建一个 Pod,在 Pod 中连接到 Kubernetes API,并将所有事件存储到文件 events.log 中。

apiVersion: v1
kind: Pod
metadata:
  name: event-logger
spec:
  containers:
  - name: event-logger
    image: alpine
    command: ["/bin/sh", "-c"]
    args:
    - |
      apk add --no-cache curl jq && while true; do
        EVENTS=$(curl -s -k -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://${KUBERNETES_SERVICE_HOST}/api/v1/events | jq -r '.items[]')
        if [ -n "$EVENTS" ]; then
          echo "$EVENTS" >> /pv/events.log
        fi
        sleep 10
      done
    volumeMounts:
    - name: event-log
      mountPath: /pv
    - name: sa-token
      mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      readOnly: true
  volumes:
  - name: event-log
    persistentVolumeClaim:
      claimName: my-pvc
  - name: sa-token
    projected:
      sources:
      - serviceAccountToken:
          path: token
          expirationSeconds: 7200
      - configMap:
          name: kube-root-ca.crt

 

该 Pod 将运行一个安装了 curl 和 jq 的简单 shell 脚本,使用 event-logger ClusterRoleBinding 连接到 Kubernetes API,并将所有事件存储在 /pv/events.log 中。  

可以运行以下命令检查事件:

kubectl exec event-logger -- cat /pv/events.log

 

通过使用这些故障排除技术和工具,您可以 保持 Kubernetes 集群的健康和平稳运行。检索最新事件、模拟问题并将事件存储在位于 PV 中的 pod 中,是有效维护集群的基本步骤。随着您对 Kubernetes 的使用经验越来越丰富,您可以探索更高级的工具,如用于分析事件的 Kibana、Prometheus 或 Grafana,以及集中式日志记录解决方案,如 Elasticsearch 或 Fluentd。  

参考链接: https://medium.com/@walissonscd/mastering-kubernetes-troubleshooting-best-practices-and-tools-for-effective-cluster-maintenance-bc1a12e7a7b2

 

标签:Kubernetes,45h,故障,集群,proxy,pod,kube,Pod,事件
From: https://blog.51cto.com/u_15682575/7983921

相关文章

  • 掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具
    Kubernetes是一款管理容器化应用程序的强大工具。然而,与任何复杂的系统一样,使用它时也可能出错。当问题出现时,掌握有效的故障排除技术和工具非常重要。 本文将介绍以下步骤,助您了解事件收集的入门知识:检索最新事件使用Pod模拟问题在位于PV的Pod中存储事件 检索......
  • 两台实体机器4个虚拟机节点的Hadoop集群搭建(Ubuntu版)
    安装UbuntuLinux元信息两台机器,每台机器两台UbuntuUbuntu版本:ubuntu-22.04.3-desktop-amd64.iso处理器数量2,每个处理器的核心数量2,总处理器核心数量4单个虚拟机内存8192MB(8G),最大磁盘大小30G参考链接清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/ubunt......
  • 405-503 搞懂Kubernetes调度 (DNS ingress NodeSelector NodeAffinity)4.5-5.3
    一、Kubernetes里的DNSK8S集群默认使用CoreDNS作为DNS服务:#kubectlgetsvc-nkube-system|grepdnskube-dnsClusterIP10.96.0.10<none>53/UDP,53/TCP,9153/TCP24d测试在node-1-231安装bind-utilsyuminstall-ybind-utils解析外网域名dig@10......
  • 云原生架构实战02 Kubernetes实战入门
    一、Kubernetes是什么?kubernetes具有以下特性:服务发现和负载均衡Kubernetes可以使用DNS名称或自己的IP地址公开容器,如果进入容器的流量很大,Kubernetes可以负载均衡并分配网络流量,从而使部署稳定。存储编排Kubernetes允许你自动挂载你选择的存储系统,例如本地存储、公共云提......
  • Redis 集群
    sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数......
  • linux网络故障排查
    在日常使用中,经常会出现无法连通的情况,这个时候我们就需要找到问题出在哪里,这里面给各位提供一个生产环境排查网络故障的大体思路,一般情况下如果遇到网络故障,都是通过筛选的方式一点一点的确定问题所在,首先判断是本机的问题还是网络上其它设备的问题,如果同一网络环境中的其它主机......
  • Linux常见较全的故障修复思路及解决方案
    一、crontab不执⾏crontab是linux自动周期执⾏脚本的常用工具,实现服务器按着设定的周期策略进⾏执⾏脚本或命令任务,但是crontab也常出现一些不执⾏的问题导致计划任务未按预期执⾏。根据个⼈运维工作所⻅的案例,进行归纳,常⻅问题如下:1、脚本编辑器错误shell脚本:#!/bin/bash#!/bin/shpyth......
  • 401 Kubernetes网络 (Pod Service Calico Flannel) 4.1-4.4
    一、Pod网络在K8S集群里,多个节点上的Pod相互通信,要通过网络插件完成,比如Calico网络插件。使用kubeadm初始化K8S集群时,需要指定一个参数--pod--network-cidr=10.18.0.0/16它用来定义Pod的网段。配置Calico的时候,也要定义CALICO_IPV4POOL_CIDR的参数,它的值也是Pod的网络。容器网......
  • hadoop集群 大数据项目实战_电信用户行为分析_day04
    进行HIVE环境配置1.上传相关的包 2.对上传的包进行下载和创建软连接 3.配置相关的文件4.分别发送给其他机子 假设你需要在所有机器执行同一个指令,则你就需要相关设置  5.在hive的onf文件中创建hive-site.xml进行相关设置```xml<configuration><--元数据存......
  • 如何优雅重启 kubernetes 的 Pod
    最近在升级服务网格Istio,升级后有个必要的流程就是需要重启数据面的所有的Pod,也就是业务的Pod,这样才能将这些Pod的sidecar更新为新版本。方案1因为我们不同环境的Pod数不少,不可能手动一个个重启;之前也做过类似的操作:kubectldelete--allpods--namespace=dev这......