Kubernetes容器端口设置类似于docker-compose?

问题描述

我无法完全按照自己的意愿设置k8s吊舱。我的麻烦是我有多个侦听相同端口(80,443)的容器。在远程机器上,我通常将docker-compose与'ports-12345:80'结合使用来进行设置。对于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

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

我的负载均衡器以及我的第一个容器都正常工作。添加第二个容器成功,但是无法到达第二个容器。第二个容器使用具有不同名称和不同映像的相似脚本进行部署。

解决方法

这里的答案是为声明端口的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的一些绒毛,但是此问题的相关答案是声明服务中吊舱的端口和目标端口,并在容器部署中将targetPort公开为containerPort。 感谢David Maze和GintsGints的帮助!