kubernetes - 具有完全相同 pod 标签的两个 Kubernetes 部署
问题描述
假设我有两个部署,除了部署名称之外完全相同:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-d
spec:
replicas: 3
selector:
matchLabels:
app: mynginx
template:
metadata:
labels:
app: mynginx
spec:
containers:
- name: nginx
image: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-d2
spec:
replicas: 3
selector:
matchLabels:
app: mynginx
template:
metadata:
labels:
app: mynginx
spec:
containers:
- name: nginx
image: nginx
由于这两个部署具有相同的选择器和相同的 pod 模板,我希望看到三个 pod。但是,创建了六个 pod:
# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-d-5b686ccd46-dkpk7 1/1 Running 0 4m16s app=mynginx,pod-template-hash=5b686ccd46
nginx-d-5b686ccd46-nz7wf 1/1 Running 0 4m16s app=mynginx,pod-template-hash=5b686ccd46
nginx-d-5b686ccd46-vdtfr 1/1 Running 0 4m16s app=mynginx,pod-template-hash=5b686ccd46
nginx-d2-5b686ccd46-nqmq7 1/1 Running 0 4m16s app=mynginx,pod-template-hash=5b686ccd46
nginx-d2-5b686ccd46-nzrlc 1/1 Running 0 4m16s app=mynginx,pod-template-hash=5b686ccd46
nginx-d2-5b686ccd46-qgjkn 1/1 Running 0 4m16s app=mynginx,pod-template-hash=5b686ccd46
这是为什么?
解决方案
考虑一下:Pod不直接由部署管理,而是部署管理 ReplicaSet。
这可以使用验证
kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-d-5b686ccd46 3 3 3 74s
nginx-d2-7c76fbbbcb 3 3 0 74s
您可以通过指定选择器来选择要为副本集或部署考虑哪些 pod。除此之外,每个部署都添加了自己的标签,以便能够区分哪些 pod 由其自己的副本集管理,哪些由其他副本集管理。
您也可以对此进行检查:
kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-d-5b686ccd46-7j4md 1/1 Running 0 4m app=mynginx,pod-template-hash=5b686ccd46
nginx-d-5b686ccd46-9j7tx 1/1 Running 0 4m app=mynginx,pod-template-hash=5b686ccd46
nginx-d-5b686ccd46-zt4ls 1/1 Running 0 4m app=mynginx,pod-template-hash=5b686ccd46
nginx-d2-5b686ccd46-ddcr2 1/1 Running 0 75s app=mynginx,pod-template-hash=5b686ccd46
nginx-d2-5b686ccd46-fhvm7 1/1 Running 0 79s app=mynginx,pod-template-hash=5b686ccd46
nginx-d2-5b686ccd46-q99ww 1/1 Running 0 83s app=mynginx,pod-template-hash=5b686ccd46
这些作为匹配标签添加到副本集中:
spec:
replicas: 3
selector:
matchLabels:
app: mynginx
pod-template-hash: 5b686ccd46
由于即使这些是相同的,您也可以检查 pod 并查看是否还有所有者引用:
kubectl get pod nginx-d-5b686ccd46-7j4md -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2021-10-28T14:53:17Z"
generateName: nginx-d-5b686ccd46-
labels:
app: mynginx
pod-template-hash: 5b686ccd46
name: nginx-d-5b686ccd46-7j4md
namespace: default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: nginx-d-5b686ccd46
uid: 7eb8fdaf-bfe7-4647-9180-43148a036184
resourceVersion: "556"
可以在此处找到更多信息:https ://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/
因此,部署(和副本集)可以区分哪些 pod 由哪个管理,并且每个 pod 都可以确保所需的副本数量。
推荐阅读
- swift - 从 @Binding var 修改 @State var 不会刷新 SwiftUI 中的视图
- django - 通过 created/creator 过滤 Django Simple-History
- mstest - 如何在不运行测试并使用 vstest.console.exe 进行最少文本解析的情况下获取测试数量?
- node.js - 错误:NJS-012:在参数 2 中遇到无效的绑定数据类型
- javascript - 用户关闭后如何不让聊天弹出
- django - Django 将数据插入字段查询集
- javascript - 将关键帧动画文本与容器中心对齐
- c# - 如何比较列表中两个类属性的两个数据?
- python - 将第 1 列中的行值转换为变量,将第 2 列中的行值转换为变量的值
- php - SQL JOIN 替换不需要的列