将kubernetes服务中的传入端口映射到Docker容器上的其他端口

Mai*_*ppe 4 portforwarding kubernetes

这是我了解问题流的方式:

  1. 当请求kubernetes服务时(例如通过http),我正在使用端口80。
  2. 该请求将转发到Pod(仍在端口80上)
  3. 端口将请求转发到暴露端口80的(docker)容器
  4. 容器处理请求

但是我的容器提供了另一个端口,例如3000。如何在步骤2或3中进行类似于80:3000的端口映射?

kubernetes文档中有诸如targetport和这样的令人困惑的选项hostport,这些选项对我没有帮助。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"
Run Code Online (Sandbox Code Playgroud)

Mai*_*ppe 8

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

kubectl expose deployment test-app --type="LoadBalancer" --target-port=3000 --port=80
Run Code Online (Sandbox Code Playgroud)

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

一个更好的方式做这件事是YAML文件service.yaml,并deployment.yaml和通话

kubectl create -f deployment.yaml
kubectl create -f service.yaml
Run Code Online (Sandbox Code Playgroud)

文件中包含这些内容的位置

# 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
Run Code Online (Sandbox Code Playgroud)

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    app: test-app
  ports:
  - port: 80
    targetPort: 3000
  type: LoadBalancer
Run Code Online (Sandbox Code Playgroud)

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

  • 由于您将服务的目标端口定义为3001,而容器暴露了端口3000,可能存在一些错字 (6认同)