k8s 集群内部 Pods 之间的通信

Communication between Pods inside k8s cluster

** 免责声明:我的基础知识很浅,但希望我对案例的解释是可以理解的。抱歉,术语可能不准确。

我有一个在 k8s 中工作的应用程序,它由具有单个容器(主容器)的容器 (Pod#1) 表示。该 pod 中还创建了 k8s-service。 在“主容器”中,localhost:8082(图片上的黄色块)上有工作应用程序和工作服务(不是 k8s-service)。

在 运行 时间里,来自 Pod#1 “main-container” 的应用程序创建了 k8s-job,它由另一个 pod (Pod#2) 和另一个容器 (job-container) 表示。

这里的问题是:Pod#2 作业容器需要与 运行 主容器(端口 8082)中的工作服务(不是 k8s 服务)进行通信。

我知道可以通过服务建立这种通信(喜欢ServiceName:Port)。

但是还有其他方法可以建立这个连接吗? main-container 和 job-container 是否有可能有一个与服务通信的选项(比如 https://localhost:8082 ,它肯定不适用于 job-container )

...communication can be established through the service (like ServiceName:Port). But are there any other options to establish this connection?

您可以使用 Statefulset 创建生成的“主容器”pod(例如作业)pods 可以通过 pod DNS 解析“主容器”pod 名称并返回连接。这是一个简单的例子:

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx
spec:
  serviceName: nginx
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx  # Presume this is the container that expose 8082 in your diagram
        image: nginx:alpine
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
EOF

假定您的“主容器”创建作业:

cat << EOF | kubectl apply -f -
apiVersion: batch/v1
kind: Job
metadata:
  name: nginx
spec:
  template:
    metadata:
      name: nginx
    spec:
      restartPolicy: Never
      containers:
      - name: nginx
        image: busybox
        imagePullPolicy: IfNotPresent
        command:  # Simulate the line from Pod#2 to Pod#1 in your diagram
        - wget
        - -qO-
        - nginx-0.nginx

 EOF

作业始终可以使用 DNS 名称 nginx-0.nginx 到达 nginx pod(不是 服务)。检查 kubectl logs <job pod>.

根据评论中的讨论,我通过替换 localhost:port 对服务名称的调用来建立通过服务的通信:作业容器中的调用。 谢谢大家!