将Docker Compose转换为Kubernetes
我正在学习Kubernetes,在理解名称/标签/选择器的使用以及pod名称和容器名称是否应该对齐方面遇到了很大的困难 我安装了一个.NET核心MVC应用程序、一个PostgreSQL数据库和一个Nginx反向代理 与docker-compose.yml配合使用非常好:将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
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如果它不再崩溃,请用问题的实际状态更新您的问题,谢谢!