如何在一个部署和服务中公开 2 个端口

How to expose 2 port in one deployement and service

我想在一项服务上公开 2 个端口:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: etools
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: etools
    spec:
      containers:
      - name: etools
        image: eregistry.azurecr.io/etools:latest
        ports:
        - containerPort: 8080
        - containerPort: 3100
---
apiVersion: v1
kind: Service
metadata:
  name: etools
spec:
  ports:
  - port: 8080
  selector:
    app: etools
  ports:
  - port: 3100
  selector:
    app: etools

如何实现?

你的 Service 非常接近,但是在 ports: 数组中,如果有多个端口则需要命名(理想情况下它们总是有名称),并且 selector: 每个 Service 只有一次,而不是每个端口:

spec:
  selector:
    app: etools
  ports:
  - name: web
    port: 8080
    targetPort: 8080
  - name: other-port-something
    port: 3100
    targetPort: 3100

请注意,虽然您经常会看到 port:targetPort: 等于相同的数字,但它们不一定是。所以你的容器可以在 8080 上监听,因为 docker 图片说它会,但是你的 Service 可以将它暴露给集群的其他成员,因为 port: 80 更接近人们所期望的。

也可以用自然语言名称命名 PodSpec 中的端口,然后将 Service 指向 that 值:

ports:
- name: http
  port: 80
  targetPort: http-in-my-pod

我推荐它,因为它使您的 Service 不必因为 PodSpec 中的 containerPort 发生变化而不得不更改,但由您自行决定。

当您提供格式错误的 yaml 时,kubectl 没有提供有用的反馈,我感到有些惊讶,但无论如何,我相信上面的代码片段是正确的。正如文档所指定的那样,名称在服务中必须是唯一的,而且 "DNS-compatible" 名称,所以没有下划线、空格、疯狂字符