在此任务中,我们将探索如何通过直接将 pod 分配到集群中的特定节点来绕过 Kubernetes 调度程序。对于需要 pod 在特定节点上运行而无需执行通常的调度过程的特定场景,这可能是一种有用的方法。
我们假设您有一个正在运行的 Kubernetes 集群,该集群是使用类似于之前文章中描述的 KIND(Docker 中的 Kubernetes)配置创建的。在这里,我们创建了一个名为 kind-cka-cluster 的集群:
kind create cluster --name kind-cka-cluster --config config.yml
由于我们已经在之前的文章中介绍了使用 KIND 进行集群创建,因此我们不会再次讨论这些细节。
要查看此新集群中可用的节点,请运行:
kubectl get nodes
您应该看到与此类似的输出:
NAME STATUS ROLES AGE VERSION kind-cka-cluster-control-plane Ready control-plane 7m v1.31.0
对于此任务,我们将在 kind-cka-cluster-control-plane 上调度我们的 pod。
现在,让我们创建一个 YAML 格式的 pod 清单。使用 pod 配置中的 nodeName 字段,我们可以为 pod 指定确切的节点,完全绕过 Kubernetes 调度程序。
node.yml:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeName: kind-cka-cluster-control-plane
在此清单中:
这种方法是一种直接选择节点的方法,重写了其他方法,例如nodeSelector或亲和性规则。
根据 Kubernetes 文档:
“nodeName是比affinity或nodeSelector更直接的节点选择形式。nodeName是Pod规范中的一个字段。如果nodeName字段不为空,则调度程序会忽略该Pod,并且命名节点上的kubelet会尝试放置该节点上的 Pod 会否决使用 nodeSelector 或亲和性和反亲和性规则。”
更多详细信息,请参阅 Kubernetes 节点分配文档。
准备好清单后,将其应用到集群:
kubectl apply -f node.yml
此命令创建 nginx pod 并将其直接分配给 kind-cka-cluster-control-plane 节点。
最后,检查 pod 是否在指定节点上运行:
kubectl get pods -o wide
输出应确认 nginx pod 确实在 kind-cka-cluster-control-plane 上运行:
kind create cluster --name kind-cka-cluster --config config.yml
这验证了通过设置nodeName字段,我们成功绕过了Kubernetes调度程序并直接将我们的pod调度到控制平面节点上。
要访问我们新创建的集群的控制平面节点,请使用以下命令:
kubectl get nodes
导航到包含静态 pod 清单的目录:
NAME STATUS ROLES AGE VERSION kind-cka-cluster-control-plane Ready control-plane 7m v1.31.0
验证当前清单:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeName: kind-cka-cluster-control-plane
要重新启动 kube-controller-manager,请暂时移动其清单文件:
kubectl apply -f node.yml
确认重启后,将manifest文件恢复到原来的位置:
kubectl get pods -o wide
通过这些步骤,我们成功演示了如何访问控制平面并操作静态 pod 清单来管理控制平面组件的生命周期。
将 kube-controller-manager.yaml 清单文件暂时移动到 /tmp 后,我们可以验证 kube-controller-manager 是否已重新启动。正如之前的文章中提到的,我使用的是 k9s,它确实清楚地显示了重启,但是对于没有 k9s 的读者,请尝试以下命令
检查事件:
要收集更多信息,请使用:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 28s 10.244.0.5 kind-cka-cluster-control-plane <none> <none>
在输出末尾查找事件。成功重启将显示类似以下内容的事件:
docker exec -it kind-cka-cluster-control-plane bash
出现“Killing”、“Created”和“Started”事件表明 kube-controller-manager 已停止并重新启动成功。
完成任务并确认 pod 的行为后,清理不再需要的所有资源非常重要。这有助于维护整洁的环境并释放集群中的资源。
列出 Pod:
首先,您可以检查集群中当前运行的 Pod:
cd /etc/kubernetes/manifests
您可能会看到如下输出:
ls
描述 Pod:
要获取有关特定 pod 的更多信息,请使用描述命令:
mv kube-controller-manager.yaml /tmp
这将为您提供有关 pod 的详细信息,例如其名称、命名空间、节点和其他配置:
mv /tmp/kube-controller-manager.yaml /etc/kubernetes/manifests/
删除 Pod:
如果您发现不再需要该 pod,可以使用以下命令安全地将其删除:
kubectl describe pod kube-controller-manager-kind-cka-cluster-control-plane -n kube-system
验证删除:
执行删除命令后,您可以通过再次列出 pod 来验证 pod 是否已被删除:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Killing 4m12s (x2 over 8m32s) kubelet Stopping container kube-controller-manager Normal Pulled 3m6s (x2 over 7m36s) kubelet Container image "registry.k8s.io/kube-controller-manager:v1.31.0" already present on machine Normal Created 3m6s (x2 over 7m36s) kubelet Created container kube-controller-manager Normal Started 3m6s (x2 over 7m36s) kubelet Started container kube-controller-manager
确保 nginx pod 不再出现在列表中。
通过执行这些清理步骤,您可以帮助确保 Kubernetes 集群保持组织有序且高效。
在本节中,我们将基于 nginx 镜像创建三个 pod,每个 pod 都有唯一的名称和指示不同环境的特定标签:env:test、env:dev 和 env:prod。
第 1 步:创建脚本
首先,我们将创建一个脚本,其中包含生成 pod 的命令。使用以下命令创建脚本文件:
kind create cluster --name kind-cka-cluster --config config.yml
接下来,将以下代码粘贴到文件中:
kubectl get nodes
第 2 步:使脚本可执行
保存文件后,使用以下命令使脚本可执行:
NAME STATUS ROLES AGE VERSION kind-cka-cluster-control-plane Ready control-plane 7m v1.31.0
第 3 步:执行脚本
运行脚本来创建 Pod:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeName: kind-cka-cluster-control-plane
您应该看到指示 Pod 创建的输出:
kubectl apply -f node.yml
第 4 步:验证创建的 Pod
然后脚本将显示创建的 Pod 的状态:
kubectl get pods -o wide
此时,您可以根据 pod 的标签来过滤它们。例如,要查找带有 env=dev 标签的 pod,请使用以下命令:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 28s 10.244.0.5 kind-cka-cluster-control-plane <none> <none>
您应该看到确认 pod 正在运行的输出:
docker exec -it kind-cka-cluster-control-plane bash
以上是CKA 全日课程 Kubernetes 中的静态 Pod、手动调度、标签和选择器的详细内容。更多信息请关注PHP中文网其他相关文章!