将Kubernetes服务中的传入端口映射到Docker容器中的不同端口

18

我理解问题的流程如下:

  1. 当请求一个kubernetes服务(例如通过http)时,我使用端口80。
  2. 请求被转发到一个pod(仍然是端口80)
  3. 端口将请求转发到暴露端口80的(docker)容器中
  4. 容器处理请求

然而我的容器暴露了不同的端口,比如说3000。 如何在第2或第3步中进行端口映射,比如80:3000?

kubernetes文档中有一些令人困惑的选项,比如targetporthostport,它们对我没有帮助。kubectl port-forward似乎只能将我本地(开发)机器的端口转发到特定的pod以进行调试。

这些是我在谷歌云中设置服务所使用的命令:

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

23

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

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

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


6
你定义服务的 targetPort3001,但容器暴露的端口是 3000,可能存在一些拼写错误。请修改服务的 targetPort3000,以便正确地将流量路由到容器。 - Leo Y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接