我尝试在 Kubernetes 配置文件中命名标签时更加明确,认为部署使用 pod 标签,服务使用部署标签。
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth-depl
labels:
app: auth-depl-label
spec:
replicas: 1
selector:
matchLabels:
app: auth-pod-label
template:
metadata:
labels:
app: auth-pod-label
spec:
containers:
- name: auth-pod
image: bogdan-pechounov/auth
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: auth-srv
spec:
selector:
app: auth-depl-label
type: LoadBalancer
ports:
- protocol: TCP
port: 3000
targetPort: 3000
但是,在 Chrome 中minikube service auth-srv
会产生This site can’t be reached
错误。在 中minikube dashboard
,该服务处于待处理状态,并且没有与该服务关联的 pod。
使用 pod 标签确实有效,这让我想知道部署标签是做什么用的。
apiVersion: v1
kind: Service
metadata:
name: auth-srv
spec:
selector:
app: auth-pod-label
type: LoadBalancer
ports:
- protocol: TCP
port: 3000
targetPort: 3000
完整代码(skaffold dev
开始)
答案1
这让我很疑惑部署标签是做什么用的。
每个标签只是一种引用资源集合的方式,无需知道它们的名称。但是,正如您所指出的,kubernetes 本身以与您的问题相关的几种方式使用标签:
Deployments
使用标签来跟踪其管理的 Pod 的健康和基数(因为 Pod 的名称大多是随机的)Services
Ready
使用标签来跟踪应将流量发送到的Pod
同时Deployments
,还需要注意的Deployment
是本身template: { metadata: { labels: {} } }
有标签,但这些标签与新创建的 Pod 上标记的标签无关,并且那些是必须成为的子集matchLabels:
才能Deployment
管理它们
同样的故事Service
,它又可以有它的自己的标签,但与会员使用的标签无关Service
。请注意,虽然 中的标签与 中的标签相同是很常见的,matchLabels:
但它们彼此之间没有任何关系Service
selector:
这是一个非常好的设置,因为Deployment
只关心 Pod 的存在awesome
, 也Service
只关心那些 Pod 的存在v1
,并且两者都是由从 Deployment 中新生成的 Pod 实现的,因为模板的标签应用于它们
kind: Deployment
spec:
...
matchLabels:
app: awesome
template:
metadata:
labels:
app: awesome
release: v1
---
kind: Service
spec:
selector:
release: v1