将Docker-Compose转换为Kubernetes

时间:2020-01-07 21:18:35

标签: kubernetes docker-compose

我正在学习Kubernetes,在理解名称/标签/选择器的使用以及Pod名称和容器名称是否应该对齐方面遇到了很大的麻烦。

我使用.NET Core MVC App,PostgreSQL数据库和Nginx反向代理进行了设置。

使用此docker-compose.yml效果很好:

version: "3.7"

services:

  reverseproxy:
    build:
      context: ./Nginx
      dockerfile: ../Nginx.dockerfile
    ports:
      - "80:80"
      - "443:443"
    restart: always

  db:
    image: postgres:12.1-alpine
    environment:
      POSTGRES_PASSWORD: "mvcdbsecretpassword"

  mvc:
    depends_on:
      - reverseproxy
      - db
    build:
      context: .
      dockerfile: ./MyMvc.dockerfile
    environment:
      ConnectionStrings.MyMvc: "Host=db;Port=5432;Database=MyMvcDb;Username=postgres;Password=mvcdbsecretpassword"
    expose:
      - "5000"
    restart: always

MVC应用程序容器已构建并标记并推送到我的Docker Hub注册表中。 在启动时,它会记录连接字符串,并接受docker-compose文件中的设置(显然-毕竟它正在工作)。

我已将其转换为六个kubernetes yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  labels:
    name: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:12.1-alpine
        env:
        - name: POSTGRES_PASSWORD
          value: mvcdbsecretpassword
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  ports:
  - name: "postgres"
    port: 5432
    targetPort: 5432
  selector:
    app: postgres
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mvc
  labels:
    name: mymvc
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mymvc
  template:
    metadata:
      labels:
        app: mymvc
    spec:
      containers:
      - name: mvc
        image: mymvc:v2
        env:
          - name: ConnectionStrings.MyMvc
            value: "Host=postgres;Port=5432;Database=MyMvcDb;Username=postgres;Password=mvcdbsecretpassword"
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: mvc
  labels:
    app: mymvc
spec:
  ports:
  - name: "mvc"
    port: 5000
    targetPort: 5000
  selector:
    app: mymvc
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reverseproxy-deployment
  labels:
    app: mymvc
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mymvc
  template:
    metadata:
      labels:
        app: mymvc
    spec:
      containers:
      - name: reverseproxy
        image: reverseproxy:v2
        ports:
        - containerPort: 80
        - containerPort: 443
---
apiVersion: v1
kind: Service
metadata:
  name: reverseproxy-service
  labels:
    app: mymvc
spec:
  ports:
  - name: "http"
    port: 80
    targetPort: 80
  - name: "https"
    port: 443
    targetPort: 443
  selector:
    app: mymvc
  type: LoadBalancer

如前所述,我对何时使用名称和何时使用标签感到非常困惑。

一点指导将不胜感激。

编辑:David Maze帮助我了解了名称,标签和选择器之间的关系。 YAML文件会相应更新。

我还为暴露端口5000的mvc应用添加了一项服务。

现在,窗格不再崩溃,但我仍然无法访问MVC应用。

我想,我应该提一下,我正在尝试使其在Windows 10机器上的Docker桌面上运行。

反向代理在Compose堆栈中很有意义,但是我不再确定,在Kubernetes集群中还是在我应该设置某种Ingress控制器的情况下,反向代理也很有意义。

有人可以告诉我,是否甚至可以在Docker Desktop上测试此设置?

运行kubectl get nodes -o wide显示没有外部IP,但是我也不确定群集是否已镜像到localhost。

2 个答案:

答案 0 :(得分:1)

在此设置中,实际上有三件事很重要:

  1. 当您的“ mvc”吊舱尝试通过数据库连接字符串连接到名为postgres的主机时,该主机与服务的名称相匹配。
  2. 在您的两项服务中,matchLabels:必须是pod的 labels 的子集;即部署的spectemplatemetadatalabels
  3. 在部署中,matchLabels需要与相应容器的标签匹配(在YAML文件中紧挨着它们)。

其他部分(部署的名称,服务的标签和顶级部署对象)实际上并不重要,但是它们对于以后查找内容很有用。

在该示例中,您显示服务标签实际上不匹配。您需要说例如

apiVersion: v1
kind: Service
spec:
  selector:
    matchLabels:
      app: reverseproxy # <-- include "app:" key

如果查看类似kubectl describe service reverseproxy-service的输出(在命令提示符下使用对象 name ),则应该看到类似Endpoints: <none>的行;表示该服务未正确绑定到匹配的广告连播,并且这样的标签不匹配是常见的原因。

答案 1 :(得分:0)

我需要了解的是,需要一个Ingress控制器和一个Ingress.yaml。

所有云托管提供商都提供了自己的Ingress Controller,但是要在Docker Desktop上进行测试,您必须自己安装一个。

用于为Docker桌面安装Nginx-Ingress的命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/provider/

我的示例Ingress.yaml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: mvc-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "false"
spec:
  tls:
  - hosts:
    - mymvc.local
    secretName: mvcsecret-tls
  rules:
    - host: mymvc.local
      http:
        paths:
        - path: /
          backend:
            serviceName: mvc
            servicePort: 5000