将Docker Compose转换为Kubernetes

将Docker Compose转换为Kubernetes,kubernetes,docker-compose,Kubernetes,Docker Compose,我正在学习Kubernetes,在理解名称/标签/选择器的使用以及pod名称和容器名称是否应该对齐方面遇到了很大的困难 我安装了一个.NET核心MVC应用程序、一个PostgreSQL数据库和一个Nginx反向代理 与docker-compose.yml配合使用非常好: version: "3.7" services: reverseproxy: build: context: ./Nginx dockerfile: ../Nginx.dockerfile

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

我安装了一个.NET核心MVC应用程序、一个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应用程序容器被构建、标记并推送到my 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文件将相应更新

我还为mvc应用程序添加了一个暴露端口5000的服务

现在豆荚不再崩溃,但我仍然无法访问MVC应用程序

我想,我应该提到的是,我正试图在Windows10的Docker桌面上运行这个程序

反向代理在Compose堆栈中是有意义的,但我不再确定它在Kubernetes集群中是否也有意义,或者我是否应该设置某种入口控制器

有人能告诉我,是否有可能在Docker桌面上测试这个设置


运行kubectl get nodes-o wide表明没有外部IP,但我也不确定集群是否镜像到本地主机。

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

当mvc pod试图通过数据库连接字符串连接到名为postgres的主机时,该字符串与服务名称匹配。 在您的两个服务中,matchLabels:需要是pod标签的子集;即部署的规范、模板、元数据和标签。 在部署中,匹配标签需要匹配YAML文件中紧挨着它们的相应pod的标签。 其他部分(部署的名称、服务的标签和顶级部署对象)实际上并不重要,但它们在以后查找时很有用

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

版本:v1 种类:服务 规格: 选择器: 火柴标签:
app:reverseproxy我需要了解的是,需要一个Ingress控制器和一个Ingress.yaml

所有云主机提供商都提供自己的入口控制器,但在Docker Desktop上测试时,您必须自己安装一个入口控制器

为Docker Desktop安装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

…此外,服务应该与部署同名还是同名?您可以查看工具Komposer。它为用户进行转换you@JoshBeauregard谢谢,但我试过了-它甚至不能产生有效的kubernetes yaml,更不用说为你的答案大量使用YamlTanks了,关于空端点,你是对的。我的yaml linter抱怨您建议在matchLabels下放置app:reverseproxy,但忽略matchLabels并将app:reverseproxy直接放置在选择器下会让我的linter感到高兴并解决空端点问题。现在我的应用程序没有崩溃,但仍然无法访问。@TheRoadrunner如果它不再崩溃,请用问题的实际状态更新您的问题,谢谢!