我正在学习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。
答案 0 :(得分:1)
在此设置中,实际上有三件事很重要:
postgres
的主机时,该主机与服务的名称相匹配。matchLabels:
必须是pod的 labels 的子集;即部署的spec
,template
,metadata
,labels
。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