首页  >  文章  >  web前端  >  CKA 全日课程 Kubernetes 中的静态 Pod、手动调度、标签和选择器

CKA 全日课程 Kubernetes 中的静态 Pod、手动调度、标签和选择器

Linda Hamilton
Linda Hamilton原创
2024-11-04 13:33:02872浏览

CKA Full Course Day Static Pods, Manual Scheduling, Labels, and Selectors in Kubernetes

任务:在没有调度程序的情况下手动调度 Pod

在此任务中,我们将探索如何通过直接将 pod 分配到集群中的特定节点来绕过 Kubernetes 调度程序。对于需要 pod 在特定节点上运行而无需执行通常的调度过程的特定场景,这可能是一种有用的方法。

先决条件

我们假设您有一个正在运行的 Kubernetes 集群,该集群是使用类似于之前文章中描述的 KIND(Docker 中的 Kubernetes)配置创建的。在这里,我们创建了一个名为 kind-cka-cluster 的集群:

kind create cluster --name kind-cka-cluster --config config.yml

由于我们已经在之前的文章中介绍了使用 KIND 进行集群创建,因此我们不会再次讨论这些细节。

步骤 1:验证集群节点

要查看此新集群中可用的节点,请运行:

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。

步骤 2:定义 Pod 清单 (node.yml)

现在,让我们创建一个 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

在此清单中:

  • 我们将 nodeName 设置为 kind-cka-cluster-control-plane,这意味着调度程序将跳过分配节点,而该特定节点上的 Kubelet 将处理放置。

这种方法是一种直接选择节点的方法,重写了其他方法,例如nodeSelector或亲和性规则。

根据 Kubernetes 文档:

“nodeName是比affinity或nodeSelector更直接的节点选择形式。nodeName是Pod规范中的一个字段。如果nodeName字段不为空,则调度程序会忽略该Pod,并且命名节点上的kubelet会尝试放置该节点上的 Pod 会否决使用 nodeSelector 或亲和性和反亲和性规则。”

更多详细信息,请参阅 Kubernetes 节点分配文档。

第 3 步:应用 Pod 清单

准备好清单后,将其应用到集群:

kubectl apply -f node.yml

此命令创建 nginx pod 并将其直接分配给 kind-cka-cluster-control-plane 节点。

第 4 步:验证 Pod 放置位置

最后,检查 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调度到控制平面节点上。


任务:登录控制平面节点,进入默认静态 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 重启

将 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 集群保持组织有序且高效。


创建具有特定标签的多个 Pod

在本节中,我们将基于 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

标签和提及

  • @piyushsachdeva
  • 第 13 天:视频教程

以上是CKA 全日课程 Kubernetes 中的静态 Pod、手动调度、标签和选择器的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn