我有一个多容器pod部署,公开端口8080,容器内的端口可通过localhost访问,但不能访问pod IP 当我在pod本地主机上telnet我能够连接但是当我在/ etc / hosts中的pod IP上telnet时,我的连接被拒绝了。
deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test
namespace: yara
labels:
component: test-multi-container-pod
spec:
replicas: 1
template:
metadata:
labels:
app: test
spec:
serviceAccountName: test
containers:
- name: container-1
image: "gcr.io/projectID/my-image1:v1.9.3"
pullPolicy: "IfNotPresent"
resources:
limits:
cpu: 1000m
memory: 2Gi
requests:
cpu: 500m
memory: 2Gi
- name: container2
image: "gcr.io/projectID/my-image2:0.0.107"
pullPolicy: "IfNotPresent"
securityContext:
runAsUser: 0
resources:
limits:
cpu: 1000m
memory: 2Gi
requests:
cpu: 500m
memory: 2Gi
- name: "app-container"
## nodejs image that exposes ports 3000 & 8080
image: "gcr.io/projectID/node:8.9.4_1804082101"
workingDir: "/usr/src/app"
pullPolicy: "Always"
command: ["tail", "-f", "/dev/null"]
ports:
- name: http
containerPort: 3000
- name: graphql
containerPort: 8080
resources:
limits:
cpu: 1500m
memory: 2Gi
requests:
cpu: 1500m
memory: 2Gi
service.yaml
apiVersion: v1
kind: Service
metadata:
name: test-app
namespace: "yara"
labels:
component: test-multi-container-pod
spec:
type: NodePort
ports:
- protocol: TCP
name: http
port: 3000
targetPort: http
- protocol: TCP
name: graphql
port: 8080
targetPort: graphql
selector:
component: test-multi-container-pod
答案 0 :(得分:0)
Pod规范中的command
选项会覆盖Docker容器中的Entrypoint
选项,这就是您实际运行tail而不是应用程序的原因
- name: "app-container"
...
command: ["tail", "-f", "/dev/null"]
根据documentation,kubernetes中的command
会使用以下规则覆盖docker容器entrypoint
:
Pod中的所有容器共享相同的网络命名空间。它看起来很相似,好像Pod中容器的进程将在同一主机上运行,并且只能绑定到同一Pod中其他进程不占用的端口。实际上,如果配置两个使用相同端口绑定的容器,其中一个容器无法启动错误:" [emerg] 1#1:bind()到0.0.0.0:80失败(98:地址已经在使用)&#34 ;.
如果您需要通过其他Pod和服务找到并访问该特定的pod容器进程,则可以使用Pod Spec中的port:
指令对其进行描述。它为系统提供了有关容器使用的网络连接的附加信息,但主要是信息性的。 未在Pod规范中指定端口不会阻止该端口暴露。 任何正在侦听默认端口的端口" 0.0.0.0"可以通过Pod地址从网络访问容器内的地址,也可以通过localhost
从容器中的其他容器访问该地址。
因此,您从localhost:8080收到的响应可以从pod中绑定到该端口的另一个容器传送。
您可以在article中找到有关Pod网络的详细说明。