【问题标题】:Get service IP:PORT as environment variable in pod获取服务 IP:PORT 作为 pod 中的环境变量
【发布时间】:2022-10-17 20:41:55
【问题描述】:

我有一个service 正在运行并连接到一个吊舱。在 pod 中,我需要定义必须指向自身的 env 变量。如果我在本地运行,我会将path 设置为localhost:8080 并且它可以工作。如何将env 变量设置为指向服务本身?

user@user % kubectl get svc
NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)             AGE
my-service           LoadBalancer   10.96.116.26   129.153.28.245    8080:31495/TCP      21h
kubernetes           ClusterIP      10.96.0.1      <none>            443/TCP,12250/TCP   5d18h

如果配置是:

spec:
      containers:
      - name: myapp   
        image: path/to/imageregistry/image:v1.0.0-amd64
        env:
          - name: BASE_PATH
            value: "129.153.28.245:8080"

应用程序正在运行,从某种意义上说,如果我在浏览器中打开 129.153.28.245:8080/app/pages,它将打开该网站。如果我用&lt;CLUSTER-IP&gt; 替换&lt;EXTERTNAL-IP&gt;,它不会加载。

如何从service 中检索&lt;EXTERTNAL-IP&gt; 并放入env 变量中,例如:

env:
    - name: BASE_PATH
      value: "<EXTERNAL-IP-FROM-SERVICE-NAME>:8080"

还是有另一种更好的方法来做到这一点?

这是完整的DeploymentService yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp    
        image: xxx.ocir.io/xxxxxx/myrepo/myimage:v1.0.0-amd64
        env:
          - name: BASE_PATH
            value: "129.153.28.245:8080"
        ports:
        - containerPort: 80
      imagePullSecrets:
      - name: ocirsecret
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: myapp

【问题讨论】:

  • 也许,您可以使用容器命令来 kubectl 描述您的服务以获取 IP 地址并导出为 env 变量?
  • 你在 Kubernetes 开源、GCP、AWS、Azure 工作吗?
  • @HectorMartinezRodriguez 没关系(oracle cloud k8s)
  • @先生。你为什么要那样做?在问题中包含您的部署目标会很有帮助,这样社区就可以为您提供最适合它的解决方案。

标签: kubernetes kubernetes-pod


【解决方案1】:

将 Pod 和集群变量暴露给容器

假设您需要一些有关应用程序中 Pod 或 K8s 环境的数据来将 Pod 信息作为元数据添加到日志中。比如例如

  • Pod IP
  • Pod 命名空间
  • Pod 的服务帐号
  • 但是如何访问这些信息呢?
    • 可以在配置文件中提供所有 Pod 信息
  • 有两种方法可以将 Pod 文件暴露给正在运行的容器:
    1. 环境变量
    2. 卷文件

环境变量

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-env
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
        - name: log-sider
          image: busybox
          command: [ 'sh', '-c' ]
          args:
            - while true; do
              echo sync app logs;
              printenv POD_NAME POD_IP POD_SERVICE_ASCCOUNT;
              sleep 20;
              done;
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: POD_SERVICE_ASCCOUNT
              valueFrom:
                fieldRef:
                  fieldPath: spec.serviceAccountName

【讨论】:

    猜你喜欢
    • 2020-03-30
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2021-09-29
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多