Kubernetes多容器Pod中的容器间通信

时间:2019-03-08 14:30:15

标签: kubernetes kubernetes-pod

我有一个包含3个容器A,B和C的容器。我想从C访问容器A和B中的服务。localhost:<port>127.0.0.1都不起作用。

我的Yaml

apiVersion: "v1"
kind: Pod
metadata:
  name: web3
  labels:
    name: web
    app: demo
spec:
  containers:
    - name: client
      image: ubuntu
      command: ['cat']
      tty: true
    - name: apache1
      image: nimmis/apache-php5
      ports:
        - containerPort: 8080
          name: apacheport1
          protocol: TCP
    - name: apache2
      image: nimmis/apache-php5
      command: ['cat']
      tty: true
      ports:
        - containerPort: 8088
          name: apacheport2
          protocol: TCP

我在做什么

kubectl apply -f example.yaml
kubectl exec -it web3 -c client bash

然后尝试获得其他两项服​​务

root@web3:/# curl http://localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused
root@web3:/# curl http://localhost:8088
curl: (7) Failed to connect to localhost port 8088: Connection refused
root@web3:/# curl http://localhost:80

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <!--
    Modified from the Debian original for Ubuntu

问题  如何使第一个2卷发工作。 (我不想使用该服务,因为我的用例仅用于测试目的)  为什么在我没有暴露端口的情况下打开80端口。

1 个答案:

答案 0 :(得分:1)

问题在于,使用nimmis/apache-php5的Apache正在监听端口80。 因此,暴露的是端口80。 通过containerPort: <P>并不是说将容器的端口80暴露给<P>,而是暴露端口<P>本身。此外,如文档中所述,Not specifying a port here DOES NOT prevent that port from being exposed.

我找不到将内部容器端口映射到容器中其他端口的方法。但是,您可以通过字段hostPort将内部容器端口映射到主机端口。

apiVersion: "v1"
kind: Pod
metadata:
name: web3
labels:
name: web
app: demo
spec:
containers:
- name: client
  image: ubuntu
  command: ['cat']
  tty: true
- name: apache1
  image: nimmis/apache-php5
  ports:
    - containerPort: 80
      name: apacheport1
      hostPort: 8002
      protocol: TCP
- name: apache2
  image: nimmis/apache-php5
  command: ['cat']
  tty: true
  ports:
    - containerPort: 80
      hostPort: 8001
      name: apacheport2
      protocol: TCP

然后您获得节点的IP,例如在Minikube上

$ minikube ip  # e.g., 192.168.97.100

并从client中检查是否可以访问Apache服务:

$ kubectl exec -it web3 -c client bash
# apt-get update && apt-get install curl
# curl 192.168.99.100:8002