将Docker-Compose转换为Kubernetes

问题描述 投票:0回答:1

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

我安装了.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:
    matchLabels: 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: mydockerhubregistry/mymvc:v2
        env:
          - name: ConnectionStrings.MyMvc
            value: "Host=postgres;Port=5432;Database=MyMvcDb;Username=postgres;Password=moviedbsecretpassword"
      restartPolicy: Always
---
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: nginx:1.7.9
        ports:
        - containerPort: 80
        - containerPort: 443
---
apiVersion: v1
kind: Service
metadata:
  name: reverseproxy-service
  labels:
    app: reverseproxy
spec:
  ports:
  - name: "http"
    port: 80
    targetPort: 80
  - name: "https"
    port: 443
    targetPort: 443
  selector:
    matchLabels: reverseproxy
  type: LoadBalancer

启动这些部署和服务时,mvc pod在每次启动时始终崩溃,并显示以下消息:

“ Npgsql.NpgsqlException(0x80004005):连接时发生异常---> System.Net.Sockets.SocketException(111):连接被拒绝“

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

一些指导将不胜感激。

kubernetes docker-compose
1个回答
0
投票

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

  1. [当您的“ mvc” pod尝试通过数据库连接字符串连接到名为postgres的主机时,该主机与服务的name匹配。
  2. 在您的两个服务中,matchLabels:必须是pod的labels的子集;即部署的spectemplatemetadatalabels
  3. 在部署中,matchLabels需要匹配对应的Pod的labels(在YAML文件中紧随其后)。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.