将kubernetes服务中的传入端口映射到docker容器上的不同端口

时间:2016-09-14 07:21:04

标签: kubernetes portforwarding

这是我理解相关流程的方式:

  1. 在请求kubernetes服务时(例如通过http),我使用的是端口80。
  2. 请求被转发到pod(仍然在端口80上)
  3. 端口将请求转发给公开端口80的(docker)容器
  4. 容器处理请求
  5. 然而,我的容器暴露了一个不同的端口,让我们说3000。 如何在步骤2或3中进行80:3000的端口映射?

    kubernetes文档中有targetporthostport等令人困惑的选项对我没有帮助。 kubectl port-forward似乎只将我的本地(开发)计算机的端口转发到特定的pod进行调试。

    这些是我用于在Google云中设置服务的命令:

    kubectl run test-app --image=eu.gcr.io/myproject/my_app --port=80
    kubectl expose deployment test-app --type="LoadBalancer"
    

1 个答案:

答案 0 :(得分:6)

我发现我需要在第二个命令中添加一些参数:

kubectl expose deployment test-app --type="LoadBalancer" --target-port=3000 --port=80

这会创建一个服务,将传入的http流量(在端口80上)定向到端口3000上的pod。

更好的做法是使用yaml文件service.yamldeployment.yaml并调用

kubectl create -f deployment.yaml
kubectl create -f service.yaml

文件中包含这些内容

# deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: test-app
    spec:
      containers:
        - name: user-app
          image: eu.gcr.io/myproject/my_app
          ports:
            - containerPort: 3000

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    app: test-app
  ports:
  - port: 80
    targetPort: 3000
  type: LoadBalancer

请注意,服务的选择器必须与部署的标签匹配。