website/content/zh/docs/tasks/debug-application-cluster/debug-stateful-set.md

2.8 KiB
Raw Blame History

title content_template
调试StatefulSet templates/task

{{% capture overview %}}

此任务展示如何调试StatefulSet。

{{% /capture %}}

{{% capture prerequisites %}}

  • 你需要有一个Kubernetes集群通过必要的配置使kubectl命令行工具与您的集群进行通信。
  • 你应该有一个运行中的StatefulSet以便用于调试。

{{% /capture %}}

{{% capture steps %}}

调试StatefulSet

由于StatefulSet在创建时设置了app=myapp标签列出仅属于该StatefulSet的所有pod时可以使用以下命令

kubectl get pods -l app=myapp

如果您发现列出的任何Pods长时间处于UnknownTerminating状态,关于如何处理它们的说明任务,请参阅删除 StatefulSet Pods。您可以参考调试 Pods指南来调试StatefulSet中的各个Pod。

StatefulSets提供调试机制可以使用注解来暂停所有控制器在Pod上的操作。在任何StatefulSet Pod上设置pod.alpha.kubernetes.io/initialized注解为"false"暂停 StatefulSet的所有操作。暂停时StatefulSet将不执行任何伸缩操作。一旦调试钩子设置完成后就可以在StatefulSet pod的容器内执行命令而不会造成伸缩操作的干扰。您可以通过执行以下命令将注解设置为"false"

kubectl annotate pods <pod-name> pod.alpha.kubernetes.io/initialized="false" --overwrite

当注解设置为"false"StatefulSet在其Pods变得不健康或不可用时将不会响应。StatefulSet不会创建副本Pod直到每个Pod上删除注解或将注解设置为"true"

逐步初始化

创建StatefulSet之前您可以通过使用和上文相同的注解即将yaml文件中.spec.template.metadata.annotations里的pod.alpha.kubernetes.io/initialized字段设置为"false"对竞态条件的StatefulSet进行调试。

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: my-app
spec:
  serviceName: "my-app"
  replicas: 3
  template:
    metadata:
      labels:
        app: my-app
      annotations:
        pod.alpha.kubernetes.io/initialized: "false"
...
...
...

设置注解后如果创建了StatefulSet您可以等待每个Pod来验证它是否正确初始化。StatefulSet将不会创建任何后续的Pods直到在已经创建的每个Pod上将调试注解设置为"true" (或删除)。 您可以通过执行以下命令将注解设置为"true"

kubectl annotate pods <pod-name> pod.alpha.kubernetes.io/initialized="true" --overwrite

{{% /capture %}}

{{% capture whatsnext %}}

点击链接调试init-container,了解更多信息。

{{% /capture %}}