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 对服务名称的调用来建立通过服务的通信:作业容器中的调用。
谢谢大家!
** 免责声明:我的基础知识很浅,但希望我对案例的解释是可以理解的。抱歉,术语可能不准确。
我有一个在 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 对服务名称的调用来建立通过服务的通信:作业容器中的调用。 谢谢大家!