Kubernetes pod不接受暴露端口上的连接

时间:2018-04-19 23:11:54

标签: kubernetes kubernetes-ingress

我有一个多容器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

1 个答案:

答案 0 :(得分:0)

Pod规范中的command选项会覆盖Docker容器中的Entrypoint选项,这就是您实际运行tail而不是应用程序的原因

  - name: "app-container" 
    ...
    command: ["tail", "-f", "/dev/null"]

根据documentation,kubernetes中的command会使用以下规则覆盖docker容器entrypoint

  • 如果您没有为Container提供命令或参数,则使用Docker镜像中定义的默认值。
  • 如果为Container提供命令但没有args,则仅使用提供的命令。默认的EntryPoint和Docker镜像中定义的默认Cmd将被忽略。
  • 如果只为Container提供args,则Docker镜像中定义的默认入口点将与您提供的args一起运行。
  • 如果提供命令和args,则会忽略Docker镜像中定义的默认入口点和默认Cmd。您的命令与您的args一起运行。

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网络的详细说明。