Kubernetes Pod 无法使用服务与另一个 Pod 通信
Kubernetes Pod unable to communicate with another Pod using a Service
我有 2 个 Pods,每个有 1 个容器。容器名称是:
- mc1
- mc2
mc1 容器托管一个 asp.net 核心剃须刀页面应用程序,而 mc2 托管一个网络 api 应用程序。现在 mc1 必须与 mc2 通信,即 razor 页面应用必须调用 web api app.
我试着用下图来解释它:
我为这 2 个 pods 创建了 2 个部署:
name: dep1
labels:
app: mc-app1
spec:
replicas: 1
selector:
matchLabels:
app: mc-app1
template:
metadata:
labels:
app: mc-app1
spec:
containers:
- name: mc1
image: multiapp
imagePullPolicy: Never
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dep2
labels:
app: mc-app2
spec:
replicas: 1
selector:
matchLabels:
app: mc-app2
template:
metadata:
labels:
app: mc-app2
spec:
containers:
- name: mc2
image: multiapi
imagePullPolicy: Never
ports:
- containerPort: 80
我还为包含 mc2 容器的 POD 创建了一个服务(即 web api 应用程序)。
apiVersion: v1
kind: Service
metadata:
name: multi-container-service-2
spec:
type: NodePort
selector:
app: mc-app2
ports:
- port: 8080
targetPort: 80
部署和服务已成功应用于 k8s 集群。
接下来,我进入容器“mc1”并尝试卷曲名为 multi-container-service-2 的服务,但这不起作用。
我遇到错误:
curl: (7) Failed to connect to multi-container-service-2 port 80: Connection refused
在下图中,我使用以下命令进入容器 mc1 的 shell:
kubectl exec -it dep1-5c78b8c889-tjzzr -c mc1 -- /bin/bash
在下一张图片中,我正在执行出现错误的卷曲:
请注意,我已经使用下面给出的 2 个命令安装了 curl:
apt-get update
apt-get install curl
为什么无法使用服务调用mc2容器中的应用程序?我的操作系统是 windows 10.
我正在借助这两个教程:
如 official kubernetes documentation:
中所述
Kubernetes creates DNS records for services and pods. You can contact services with consistent DNS names instead of IP addresses.
为了通过集群中的服务进行 Pod 到 Pod 通信,您必须使用以下语法:
{service_name}.{namespace}.svc.cluster.local
所以在你的情况下,卷曲将是:
curl multi-container-service-2.default.svc.cluster.local
您已将服务端口设置为 8080
,但您在端口 80(即容器的端口)上调用该服务。
这应该有效:
curl http://multi-container-service-2:8080
我有 2 个 Pods,每个有 1 个容器。容器名称是:
- mc1
- mc2
mc1 容器托管一个 asp.net 核心剃须刀页面应用程序,而 mc2 托管一个网络 api 应用程序。现在 mc1 必须与 mc2 通信,即 razor 页面应用必须调用 web api app.
我试着用下图来解释它:
我为这 2 个 pods 创建了 2 个部署:
name: dep1
labels:
app: mc-app1
spec:
replicas: 1
selector:
matchLabels:
app: mc-app1
template:
metadata:
labels:
app: mc-app1
spec:
containers:
- name: mc1
image: multiapp
imagePullPolicy: Never
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dep2
labels:
app: mc-app2
spec:
replicas: 1
selector:
matchLabels:
app: mc-app2
template:
metadata:
labels:
app: mc-app2
spec:
containers:
- name: mc2
image: multiapi
imagePullPolicy: Never
ports:
- containerPort: 80
我还为包含 mc2 容器的 POD 创建了一个服务(即 web api 应用程序)。
apiVersion: v1
kind: Service
metadata:
name: multi-container-service-2
spec:
type: NodePort
selector:
app: mc-app2
ports:
- port: 8080
targetPort: 80
部署和服务已成功应用于 k8s 集群。
接下来,我进入容器“mc1”并尝试卷曲名为 multi-container-service-2 的服务,但这不起作用。
我遇到错误:
curl: (7) Failed to connect to multi-container-service-2 port 80: Connection refused
在下图中,我使用以下命令进入容器 mc1 的 shell:
kubectl exec -it dep1-5c78b8c889-tjzzr -c mc1 -- /bin/bash
在下一张图片中,我正在执行出现错误的卷曲:
请注意,我已经使用下面给出的 2 个命令安装了 curl:
apt-get update
apt-get install curl
为什么无法使用服务调用mc2容器中的应用程序?我的操作系统是 windows 10.
我正在借助这两个教程:
如 official kubernetes documentation:
中所述Kubernetes creates DNS records for services and pods. You can contact services with consistent DNS names instead of IP addresses.
为了通过集群中的服务进行 Pod 到 Pod 通信,您必须使用以下语法:
{service_name}.{namespace}.svc.cluster.local
所以在你的情况下,卷曲将是:
curl multi-container-service-2.default.svc.cluster.local
您已将服务端口设置为 8080
,但您在端口 80(即容器的端口)上调用该服务。
这应该有效:
curl http://multi-container-service-2:8080