【问题标题】:How to add different label to pods from a same DaemonSet link them in single pod service?如何为来自同一个 DaemonSet 的 pod 添加不同的标签,将它们链接到单个 pod 服务中?
【发布时间】:2022-11-03 18:35:19
【问题描述】:

我希望从动态生成的 Ingress 中使用每个 pod 创建的服务。

但为此,我需要一种方法来区分由我的 DaemonSet 实例化的 pod。

我试过了:

apiVersion: v1
kind: Service
metadata:
  name: my-service-node1
spec:
  selector:
    app: my-app
    kubernetes.io/hostname: "node1"
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

kubernetes.io/hostname 仅在节点中定义, 我寻找一种方法来转发这个标签,我发现只有Q/A

为每个 DaemonSet 生成一个随机标签也应该有效,但我认为这也是不可能的。

在我的DaemonSet 中使用我的template/metadata/labels 中的变量会很好,但这也不存在。

如果我可以直接在我的 Ingress 中引用 pod,那将解决我的问题,但看起来 Ingress 只能与 Service 对话。

【问题讨论】:

    标签: kubernetes kubernetes-ingress kubernetes-pod kubernetes-service


    【解决方案1】:

    没有得到 100% 的问题,但是您可以使用初始化容器将标签添加到服务

    因此,每当任何 POD 启动时,它都会首先运行 init 容器,从您想要获取它的位置获取必要的标签。之后,它将标签添加到 POD 并使用相同的选择器更新服务。

    补丁命令

    kubectl patch service <Service-name> -p '{"spec":{"selector":{"app": "new-app"}}}'
    

    要更新服务,您可以使用修补方法

    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: node2pod
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            name: node2pod
            app: node2pod
        spec:
          initContainers:
          - name: node2pod
            image: <IMAGE>
            command:
            - "sh"
            - "-c"
            - "kubectl -n ${NAMESPACE} label pods ${POD_NAME} vm/rack=$(kubectl get no -Lvm/rack | grep ${NODE_NAME} | awk '{print $6}')"
            - "kubectl patch service <Service-name> -p '{"spec":{"selector":{"app": "new-app"}}}'"
            env:
            - name: NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
          containers:
          - name: nginx
            image: nginx
    

    【讨论】:

    • 这个initContainers 启动镜像 <IMAGE>,并在里面运行一些 kubectl 调用,所以镜像 <IMAGE> 必须包含 kubectl 二进制文件,并且必须允许默认服务用户修补节点,并且在这个示例中 <Service-name > 必须替换为node2pod;那是对的吗 ?
    • 是的,你是对的,你的解决方案看起来也不错。
    【解决方案2】:

    我发布了一个处理这个问题的 Docker 镜像。

    图片is here

    代码源是here

    检查 docker hub 上的文档


    更新: here 提供完整的使用示例:

    可以测试:

    kubectrl apply -f https://raw.githubusercontent.com/UrielCh/dyn-ingress/main/demo.yml
    

    【讨论】:

      猜你喜欢
      • 2019-10-27
      • 2017-07-12
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2021-05-04
      • 2019-10-19
      相关资源
      最近更新 更多