我正在学习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):连接被拒绝“
如前所述,我对何时使用名称和何时使用标签感到非常困惑。
一些指导将不胜感激。
在此设置中,实际上有三件事很重要:
postgres
的主机时,该主机与服务的name匹配。matchLabels:
必须是pod的labels的子集;即部署的spec
,template
,metadata
,labels
。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,并且这样的标签不匹配是常见的原因。