【问题标题】:Kubernetes container ports setup similar to docker-compose?Kubernetes 容器端口设置类似于 docker-compose?
【发布时间】:2020-09-08 15:30:14
【问题描述】:

我无法完全按照我想要的方式设置我的 k8s pod。我的麻烦是我有多个容器监听相同的端口(80,443)。在远程机器上,我通常使用带有 'ports - 12345:80' 的 docker-compose 来设置它。对于 K8s,从我发现的所有示例中可以看出,对于容器,唯一的选择是公开一个端口,而不是代理它。我知道我可以使用反向代理转发到多个端口,但这需要图像使用不同的端口,而不是使用相同的端口并让容器转发请求。有没有办法在 k8s 中做到这一点?

apiVersion: v1
kind: Service
metadata:
  name: backend
spec:
  loadBalancerIP: xxx.xxx.xxx.xxx
  selector:
    app: app
    tier: backend
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 80
  type: LoadBalancer
apiVersion: apps/v1
kind: Deployment
metadata:
   name: app-deployment
spec:
  selector:
    matchLabels:
      app: app
      tier: backend
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: app
        tier: backend
        track: stable
    spec:
      containers:
      - name: app
        image: image:example
        ports:
        - containerPort: 80
      imagePullSecrets:
      - name: xxxxxxx

理想情况下,我可以让节点上的容器监听不同的端口,这些容器中运行的应用程序会继续监听 80/443,并且我的服务会根据需要路由到正确的容器。

我的负载均衡器工作正常,我的第一个容器也是如此。添加第二个容器成功,但无法访问第二个容器。第二个容器使用类似的脚本,但具有不同的名称和不同的映像进行部署。

【问题讨论】:

  • 此设置中有 三个 端点,与普通 Docker 不同:负载均衡器端点、集群内部服务端点和容器/pod 端点。这些不必同意,您可以拥有外部端口 443(带有 TLS 终止)、服务端口 80 和容器端口 8000。服务有自己的集群内部 IP 地址,因此您可以拥有多个服务都侦听端口80. 这对您的设置有帮助吗?哪个部分不工作?
  • 我已经掌握了集群服务和负载均衡器端点。我的问题是我的图像都侦听端口 80。我的容器应该侦听例如 5000 和 6000,然后将请求转发到其图像的端口 80。在 containerPort 中公开端口 5000 只会公开端口 5000,这将路由到映像的端口 5000,映像未列出该端口。为了清晰起见,我很乐意在必要时进行编辑。我真正想要的是模仿 docker-compose 的端口:-5000:80 功能。
  • 在你的 pod spec 中,你想设置containerPort: 5000;并在服务中设置port: 80, targetPort: 5000? (相当于 Compose ports: ['80:5000'],将服务端口 80 转发到容器端口 5000。)我不确定您在这里指的是“容器”和“图像”。
  • 使用 kpose github.com/kubernetes/kompose 将 docker-compose 转换为 k2s 配置。 :)
  • @DavidMaze 我所说的容器和图像正是如此。一个图像和一个容器。这些图像具有 API 应用程序,它们都侦听端口 80 的 http 流量。 docker-compose 文件通常会声明每个容器将在 5000/6000 接收 http 流量并将其转发到容器内的端口 80。这里所讨论的容器恰好位于部署的 pod 中。

标签: docker kubernetes azure-aks


【解决方案1】:

这里的答案是为声明端口的 pod 添加服务。使用 Kompose 转换 docker-compose 文件,结果如下:

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: pathToKompose.exe convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: app
  name: app
spec:
  ports:
  - name: "5000"
    port: 5000
    targetPort: 80
  selector:
    io.kompose.service: app
status:
  loadBalancer: {}

还有

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: pathToKompose.exe convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: app
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: app
  strategy: {}
  template:
    metadata:
      annotations:
        kompose.cmd: pathToKompose.exe convert
        kompose.version: 1.21.0 (992df58d8)
      creationTimestamp: null
      labels:
        io.kompose.service: app
    spec:
      containers:
      - image: image:example
        imagePullPolicy: ""
        name: app
        ports:
        - containerPort: 80
        resources: {}
      restartPolicy: Always
      serviceAccountName: ""
      volumes: null
status: {}

可以删除 Kompose 中的一些绒毛,但此问题的相关答案是在服务中声明 pod 的端口和目标端口,并将 targetPort 公开为容器部署中的 containerPort。 感谢 David Maze 和 GintsGints 的帮助!

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 2022-01-13
    • 1970-01-01
    • 2021-11-13
    • 2020-10-18
    • 1970-01-01
    • 2019-02-10
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多