0

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

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

在运行时,来自 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)

在此处输入图像描述

4

2 回答 2

0

中继评论中的讨论,我通过将 localhost:port 调用替换为作业容器中的 service-name:call 来建立通过 Service 的通信。谢谢你们!

于 2021-12-13T18:36:09.147 回答
0

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

您可以使用 Statefulset 创建“main-container” pod,其中生成的(例如作业)pod 可以通过 pod DNS 解析“main-container”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 pod(而不是nginx-0.nginx服务) 。检查与kubectl logs <job pod>

于 2021-11-20T01:11:58.837 回答