kubernetes pod名称不断更改

shyt4zoc  于 2023-04-29  发布在  Kubernetes
关注(0)|答案(7)|浏览(230)

我需要在Kubernetes pod上进行一些自动化测试,但是pod的名称一直在变化,一开始是hisham-7 cc 8 f99597,过了一段时间后就变成了hisham-7 cc 8 f99597 - 8 j8 lj有没有办法让我知道pod的名称,这样我就可以在自动化场景中使用这个名称?

m1m5dgzv

m1m5dgzv1#

这里只是回答你的回答,因为你已经问过了,否则最好使用服务名称进行通信,而不是POD名称,如果你正在使用它。
您可以将工作负载作为POD运行,但如果将其作为deployment运行,则不是一个好主意。
如果您以POD运行,则可以在每次需要时维护单个名称。

额外

您还可以使用元数据或downwardAPI来获取现有POD的详细信息。

name将被注入到环境变量(MY_POD_NAME)中,您的自动化可以自动获取它,将其与os.env一起使用。
示例:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
          printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;
          sleep 10;
        done;
      env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: MY_POD_SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName

阅读更多:https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/

vfh0ocws

vfh0ocws2#

pod是cattle, not pets ( devops.stackexchange.com )。因此,pod不具有身份。因此,我们不应该直接与pod通信,而是通过Service公开pod并与服务通信。服务有一个定义良好的常量名称。

sg24os4d

sg24os4d3#

名称的变化是由于您使用了“部署”,这是设计使然。
如果你真的需要使用自动化,不要使用pod名称,而是通过部署。所以我们不用

kubectl exec -it -n {namespace} {podname} -- {command}

使用

kubectl exec -it -n {namespace} deployments/{name-of-deployment} -- {command}

这将随机选择一个部署pod来运行命令。由于所有的pod都是副本,所以每个pod都应该以相同的方式运行,所以结果应该是相同的。
您还可以执行一些stdout操作,例如:

kubectl get pods -n {namespace} \
  -l {label1}={value1} --no-headers | \
  awk '{print $1)' | head

选择列表中的第一个pod
您也可以使用statefulset而不是deployment,它将以已知的方式命名您的pod:{statefulset}-0{statefulset}-1等等,然后你可以转到一个特定的命令。

velaa5lx

velaa5lx4#

要获得可预测的pod名称,必须使用状态完整集

ergxz8rk

ergxz8rk5#

这取决于你的测试是做什么的,以及你为什么需要知道Pod的名字。

如果你只需要Pod的名称:

假设你在测试中可以访问集群和kubectl,并且你的pod是一个部署的一部分,该部署有一个特定的标签,比如app=nginx,你可以这样查询它的名称:
kubectl get po --selector=app=nginx-o=name
输出将类似于
pod/yourDeploymentName-7bd6c579fd-7gxzn
您可以通过awk修剪前导pod/
kubectl get po --selector=app=nginx-o=name | awk -F "/" '{print $2}'

cfh9epnr

cfh9epnr6#

可以动态获取pod名称

MYPOD=$(kubectl get pods \
    -n your_namesoace \
    --selector='your_app_selector' \
    -o \
    jsonpath='{.items[0].metadata.name)

这个查询将给予你第一个pod,在通过命名空间和release / app选择器名称过滤后。
您可以在for循环中运行并执行动态脚本。

xuo3flqw

xuo3flqw7#

为了在Kubernetes中部署后保持Pod的名称相同,您可以使用标签和选择器的组合。
创建部署时,您可以为将由部署创建的Pod定义一组标签。例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image:latest

在本例中,应用程序:my-app标签被分配给pod模板。然后在选择器中使用此标签,以确保部署创建的pod具有相同的标签。这意味着如果删除或替换了一个pod,部署将自动创建一个具有相同标签和名称的新pod。
要验证Pod是否与部署具有相同的名称,您可以使用以下命令:

kubectl get pods -l app=my-app

这将列出所有带有app=my-app标签的Pod,包括部署创建的Pod。

相关问题