configmap端口转发在kubernetes多容器Pod中不起作用

时间:2019-10-16 09:16:25

标签: kubernetes

下面是包含多个容器的Pod的configMap文件。   端口号80暴露于外部环境,然后将重定向到在容器中运行的另一个容器的端口5000。

apiVersion: v1
kind: ConfigMap
metadata:
  name: mc3-nginx-conf
data:
  nginx.conf: |-
    user  nginx;
    worker_processes  1;

    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;

    events {
        worker_connections  1024;
    }

    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        sendfile        on;
        keepalive_timeout  65;

        upstream webapp {
            server 127.0.0.1:5000;
        }

        server {
            listen 80;

            location / {
                proxy_pass         http://webapp;
                proxy_redirect     off;
            }
        }
    }


$kubectl apply -f confimap.yaml

吊舱配置:

apiVersion: v1
kind: Pod
metadata:
  name: mc3
  labels:
    app: mc3
spec:
  containers:
  - name: webapp
    image: training/webapp
  - name: nginx
    image: nginx:alpine
    ports:
    - containerPort: 80
    volumeMounts:
    - name: nginx-proxy-config
      mountPath: /etc/nginx/nginx.conf
      subPath: nginx.conf
  volumes:
  - name: nginx-proxy-config
    configMap:
      name: mc3-nginx-conf

步骤3。使用NodePort服务公开Pod:

$ kubectl expose pod mc3 --type=NodePort --port=80
service "mc3" exposed

步骤4。确定转发到Pod的节点上的端口:

$ kubectl describe service mc3

Name:                     mc3
Namespace:                default
Labels:                   app=mc3
Annotations:              <none>
Selector:                 app=mc3
Type:                     NodePort
IP:                       100.68.152.108
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32636/TCP
Endpoints:                100.96.2.3:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

但是我无法执行卷曲

$ curl 100.96.2.3:80

$ curl http://100.96.2.3:80

$ curl http://100.96.2.3:32636

所以,我想知道为什么这种重定向不起作用。

来源:https://www.mirantis.co.jp/blog/multi-container-pods-and-container-communication-in-kubernetes/

它写在我们可以使用url访问的页面上

http://myhost

现在,我的主人在哪里? 并且,我知道暴露的端口是32636

但是,我无法从浏览器访问或curl / wget命令。

1 个答案:

答案 0 :(得分:0)

据我所知,您在通过NodePort连接应用程序时遇到了麻烦。

在您发布的评论中: I am executing on google cloud shell,所以我假设您正在GKE上运行。

您还发表了评论:

XXXXX@cloudshell:~ (pubsub-quickstart-XXXXX)$ curl -v 10.59.242.245:31357 * Rebuilt URL to: 10.59.242.245:31357 * Trying 10.59.242.245... * TCP_NODELAY set * connect to 10.59.242.245 port 31357 failed: Connection timed out * Failed to connect to 10.59.242.245 port 31357: Connection timed out * Closing connection 0 curl: (7)`

所以我看到您正在尝试从curl cloudshell到群集节点的私有IP地址 那是行不通的。

不可能通过cloudshell上的私有地址连接到节点 因为这些实例位于不同的网络中(彼此分离)。

要从外部网络连接到您的应用程序,您需要使用EXTERNAL-IP个节点,这些节点可以运行kubectl get no -owide

第二件事(非常重要)是创建防火墙规则,以允许进入该端口的流量,例如使用gcloud cli:

gcloud compute firewall-rules create test-node-port --allow tcp:[NODE_PORT]

有关在GKE上公开应用程序的更多信息,请参见GKE documentation here

让我知道是否有帮助。