如何在舵图中获取 pod 索引

Str*_* B. 0 kubernetes kubernetes-helm

我正在部署一个 Kubernetes 有状态集,我想在舵图中获取 pod 索引,以便我可以使用此 pod 索引配置每个 pod。

例如,在以下模板中,我使用变量{{ .Values.podIndex }}来检索 pod 索引,以便使用它来配置我的应用程序。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: {{ .Values.name }}
spec:
  replicas: {{ .Values.replicaCount }}
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 50%
  template:
    metadata:
      labels:
        app: {{ .Values.name }}
    spec:
      containers:
        - image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
          imagePullPolicy: Always
          name: {{ .Values.name }}
          command: ["launch"],
          args: ["-l","{{ .Values.podIndex }}"]
          ports:
            - containerPort: 4000
      imagePullSecrets:
        - name: gitlab-registry
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 8

你不能以你描述的方式做到这一点。

可能最好的方法是将您的 Deployment 更改为StatefulSet。每个从 StatefulSet 启动的 pod 都有一个identity,每个 pod 的主机名被设置为 StatefulSet 的名称加上一个索引。如果您的launch命令查看hostname,它将看到类似的内容name-0并知道它是 StatefulSet 中的第一个(索引 0)pod。

第二种方法是使用 Go 模板创建n 个单副本部署。这不是我的首选路径,但你可以

{{ range $podIndex := until .Values.replicaCount -}}
---
apiVersion: v1
kind: Deployment
metadata:
  name: {{ .Values.name }}-{{ $podIndex }}
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: {{ .Values.name }}
          command: ["launch"]
          args: ["-l", "{{ $podIndex }}"]
{{ end -}}
Run Code Online (Sandbox Code Playgroud)

这里的实际流程是 Helm 读入所有模板文件并生成一个 YAML 文件块,然后将它们提交给 Kubernetes API 服务器(根本没有模板指令),Kubernetes 机器对其进行操作。您可以通过运行查看正在提交的内容helm template。当 Deployment 创建 Pod 时,所有的模板指令都已被剥离;你不能让 pod 规范中的字段依赖于它是哪个副本或它被安排在哪个节点上。