以下是我在k8s网站上遇到的示例。
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx
选择器: 运行:my-nginx 无法弄清楚在规范中对其进行标记,然后在规范定义中应用相同的选择器的原因是什么。找到了很多示例,但没有解释。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
selector:
matchLabels:
run: load-balancer-example
replicas: 2
template:
metadata:
labels:
run: load-balancer-example
spec:
containers:
- name: hello-world
image: gcr.io/google-samples/node-hello:1.0
ports:
- containerPort: 8080
protocol: TCP
** 选择器:
matchLabels:
run: load-balancer-example**
答案 0 :(得分:3)
这是Kubernetes的基本设计概念之一:
资源通过labels and selectors链接。
必须引用其他资源的资源(例如服务或部署)具有选择器,它定义了一组标签。这些资源选择具有标签与该选择器匹配的所有(特定类型的)资源。
例如,带有选择器a=b
的Deployment指的是恰好具有标签a=b
的所有Pod。
这就是为什么在您的Deployment规范中,必须在Pod模板(run=load-balancer-example
部分)中定义与Deployment选择器中相同的标签(template
)。因为您希望部署管理这些 Pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
selector:
matchLabels:
run: load-balancer-example # <<<<<----- must match
replicas: 2
template: # <- you define a template for the Pods that will be created here
metadata:
labels:
run: load-balancer-example # <<<<------ must match
spec:
containers:
- name: hello-world
image: gcr.io/google-samples/node-hello:1.0
ports:
- containerPort: 8080
protocol: TCP
如果您还有其他带有run=load-balancer-example
的Pod,则Deployment也将对其进行管理。另一方面,如果Deployment规范的Pod模板中的标签与选择器不同,则Deployment将不会管理这些Pod,因为它们的标签与Deployment的选择器不匹配。
在您的第一个示例中,服务规范中的标签定义是不相关的。第一个(labels
)是服务的标签(如果需要,可以省略它),第二个(selector
)是服务的选择器:
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx # <<<<<---- unrelated to the other 'run: my-nginx'
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx # <<<<<---- unrelated to the other 'run: my-nginx'
但是,选择器 与任何Pod的标签有关。特别是,此服务将适用于所有带有run=my-nginx
标签的Pod。
答案 1 :(得分:0)
标签可用于对资源进行分组。标签选择器可以将这些分组资源作为目标。
根据资源的不同,标签可用于一种或多种目的。 Deployments
使用标签来知道哪些子节点是它们的Pod(此处不涉及标签选择器),Services
使用标签将流量转发到后端(Pods
)。网络策略使用标签来允许或拒绝流量等。
为什么要使用标签?最明显的例子是服务。豆荚一直死掉。重新创建它们时,它们具有不同的IP地址。您不能依赖Pod的IP地址,因为它随时可能更改。因此,您可以创建服务并根据其标签定位一组pod。服务不会消失,除非您将其删除。用不同的IP地址重新创建的Pod具有相同的标签,因此该服务将Pod的新IP地址作为可能的端点获取,并且流量仍然可以流动。