1 K8s 核心组件使用指南

K8s集群组件

image

Kubernetes 组件 - Kubernetes

Kubelet : 每个工作节点上运行的节点代理

  • kubelet 是在每个节点上运行的主要 “节点代理”

即: Kubelet 是 kubernetes 工作节点上的一个代理组件,运行在每个节点上。

image

Kubelet工作节点上的主要服务,定期从kube-apiserver组件接收新的或修改的Pod规范,并确保Pod及其容器在期望规范下运行。
同时该组件作为工作节点的监控组件,向kube-apiserver汇报主机的运行状况。

image

  • 它可以使用以下方式之一向 API 服务器注册:
  • 主机名(hostname);
  • 覆盖主机名的参数;
  • 特定于某云驱动的逻辑。
  • kubelet 是基于 PodSpec 来工作的。
  • 每个 PodSpec 是一个描述 Pod 的 YAML 或 JSON 对象。
  • kubelet 接受通过各种机制(主要是通过 apiserver)提供的一组 PodSpec,并确保这些 PodSpec 中描述的容器处于运行状态且运行状况良好。
  • kubelet 不管理不是由 Kubernetes 创建的容器。
  • 除了来自 API 服务器的 PodSpec 之外,还可以通过以下两种方式将容器清单manifest)提供给 kubelet
  • 文件(File):利用命令行参数传递路径。kubelet 周期性地监视此路径下的文件是否有更新。 监视周期默认为 20s,且可通过参数进行配置。
  • HTTP 端点(HTTP endpoint):利用命令行参数指定 HTTP 端点。 此端点的监视周期默认为 20 秒,也可以使用参数进行配置。

参考文献

Kubeadm : k8s 部署工具

组件简介

  • Kubeadm 是一个提供了 kubeadm init 和 kubeadm join 的工具, 作为创建 Kubernetes 集群的 “快捷途径” 的最佳实践。
  • kubeadm 通过执行必要的操作来启动和运行最小可用集群

按照设计,它只关注启动引导,而非配置机器。
同样的, 安装各种 “锦上添花” 的扩展,例如 Kubernetes Dashboard、 监控方案、以及特定云平台的扩展,都不在讨论范围内。
相反,k8s官方希望在 kubeadm 之上构建更高级别以及更加合规的工具, 理想情况下,使用 kubeadm 作为所有部署工作的基准将会更加易于创建一致性集群

常用命令

  • kubeadm init 用于搭建控制平面节点
  • kubeadm join 用于搭建工作节点并将其加入到集群中
 
kubeadm join 172.16.1.72:6443 --token 67yn2j.pwv6zn6ci59bw8ma \
--discovery-token-ca-cert-hash sha256:ef39262b36489b6f6e8df35af5d921cdee7a4de01148544e2f28c18f5c3d7d1d
  • kubeadm upgrade 用于升级 Kubernetes 集群到新版本
  • kubeadm config 如果你使用了 v1.7.x 或更低版本的 kubeadm 版本初始化你的集群,则使用 kubeadm upgrade 来配置你的集群
  • kubeadm token 用于管理 kubeadm join 使用的令牌
 
# 在kubeadm init后,没有记录kubeadm join 及其token信息,如何查询? 答: 再生成一个token即可:
kubeadm token create --print-join-command
# 查看历史的token
kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
zlwgj5.3euou24y2rb9b3sh 23h 2026-04-20T02:00:23Z authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
# 再生成一个token
kubeadm token create --print-join-command
  • kubeadm reset 用于恢复通过 kubeadm init 或者 kubeadm join 命令对节点进行的任何变更
  • kubeadm certs 用于管理 Kubernetes 证书
  • kubeadm kubeconfig 用于管理 kubeconfig 文件
  • kubeadm version 用于打印 kubeadm 的版本信息
  • kubeadm alpha 用于预览一组可用于收集社区反馈的特性

参考文献

Kubectl : k8s 命令行工具

组件简介

  • Kubernetes 提供 kubectl 是使用 Kubernetes API 与 Kubernetes 集群控制面板进行通信的【命令行工具】

这个工具叫做 kubectl

  • 即:kubectl作为客户端CLI工具,可以让用户通过命令行的方式对Kubernetes集群进行操作。
  • 针对配置信息,kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。

你可以通过设置 KUBECONFIG 环境变量或设置 --kubeconfig 参数来指定其它 kubeconfig 文件。

  • 有关每个命令的详细信息,包括所有受支持的参数和子命令, 请参阅 kubectl 参考文档。

有关安装说明,请参见安装 kubectl; 如需快速指南,请参见备忘单。
如果你更习惯使用 docker 命令行工具, Docker 用户的 kubectl 介绍了一些 Kubernetes 的等价命令。

kubectl可操作的资源对象类型: ns / svc / rc / ...

资源对象的名称缩写
cluster
componentstatusescs
configmapscm
daemonsetsds
deploymentsdeploy
endpointsep
eventsev
horizontalpodautoscalershpa
ingressesing
Jobs
limitrangeslimits
nodesno
namespacesns
networkpolicies
statefulsets
persistentvolumeclaimspvc
persistentvolumespv
podspo
podsecuritypoliciespsp
podtemplate
replicasetsrs
replicationcontrollersrc
resourcequotasquota
cronjob
secrets
serviceaccounts
servicessvc
storageclassessc
thirdpartyresources

语法格式

 
$ kubectl [command] [TYPE] [NAME] [flags]

(1)command:子命令,指定要对一个或多个资源执行的操作。例如create、delete、describe、get、apply等。
(2)TYPE:资源对象的类型,不区分大小写,能以单数形式、复数形式或者简写形式表示。例如:以下3种TYPE是等价的。

 
$ kubectl get pod pod1
$ kubectl get pods pod1
$ kubectl get po pod1

(3)NAME:资源对象的名称,区分大小写。如果不指定名称,则系统将返回属于TYPE的全部对象的列表,例如$ kubectl get pods将返回所有Pod的列表。

在对多个资源执行操作时,你可以按类型和名称指定每个资源,或指定一个或多个文件:

(4)flags:kubectl子命令的可选参数。例如,可使用-s 或 --server 参数指定指定apiserver的URL地址和端口,而不用默认值。

  • 一个命令行中也可以同时对多个资源对象进行操作,以多个TYPE和NAME的组合表示,示例如下。
 
$ kubectl get pods pod1 pod2
$ kubectl get pod/pod1 rc/rc1
$ kubectl get pod -f pod1.yaml -f pod2.yaml
$ kubectl create -f pod1.yaml -f rc1.yaml -f service1.yaml
  • 用一个或多个文件指定资源:-f file1 -f file2 -f file<#>
  • 使用 YAML 而不是 JSON

因为 YAML 对用户更友好, 特别是对于配置文件。
例子:kubectl get -f ./pod.yaml

  • 注意,从命令行指定的参数会覆盖默认值和任何相应的环境变量
  • 如果你需要帮助,在终端窗口中运行 kubectl help

kubectl 输出格式

kubectl 的输出格式

输出格式说明
-o=custom-columns=<spec>根据自定义列名进行输出,以逗号分隔
-o=custom-colimns-file=<filename>从文件中获取自定义列名进行输出
-o=json以JSON格式显示结果
-o=jsonpath=<template>输出jsonpath表达式定义的字段信息
-o=jsonpath-file=<filename>输出jsonpath表达式定义的字段信息,来源于文件
-o=name仅输出资源对象的名称
-o=wide输出额外信息。对于Pod资源,将输出Pod所在的Node
-o=yaml以yaml格式显示结果

常见输出格式:

  • 显示Pod的更多信息
 
$ kubectl get pod <pod-name> -o wide
$ kubectl get pod <pod-name> --namespace <namespace> -o wide
  • 以yaml格式显示Pod的详细信息
 
$ kubectl get pod <pod-name> -o yaml
  • 以自定义列名显示Pod的信息
 
$ kubectl get pod <pod-name> -o=custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
  • 基于文件的自定义列名输出
 
$ kubectl get pods <pod-name> -o=custom-columns-file=template.txt
  • 还可以将输出结果按某个字段排序,通过--sort-by参数以jsonpath表达式进行指定
 
$ kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>

例如,按照名字进行排序

 
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
chaosfomoney-deployment-64ccd59bdc-h72gh 1/1 Running 0 1d
chaosfomoney-deployment-64ccd59bdc-spnpj 1/1 Running 0 1d
chaosfomoney-deployment-64ccd59bdc-xhnjr 1/1 Running 0 1d
$ kubectl get pods --sort-by=.metadata.name
NAME READY STATUS RESTARTS AGE
chaosfomoney-deployment-64ccd59bdc-h72gh 1/1 Running 0 1d
chaosfomoney-deployment-64ccd59bdc-spnpj 1/1 Running 0 1d
chaosfomoney-deployment-64ccd59bdc-xhnjr 1/1 Running 0 1d

常用命令

kubectl create : 创建资源对象
  • 根据yaml配置文件一次创建service和rc
 
$ kubectl create -f my-service.yaml -f my-rc.yaml
  • 根据<directory>目录下所有.yaml.yml.json文件的定义进行创建操作
 
$ kubectl create -f <directory>
kubectl apply : 以文件或标准输入为准应用或更新资源
 
# 使用 example-service.yaml 中的定义创建 Service。
kubectl apply -f example-service.yaml
# 使用 example-controller.yaml 中的定义创建 replication controller。
kubectl apply -f example-controller.yaml
# 使用 <directory> 路径下的任意 .yaml、.yml 或 .json 文件 创建对象。
kubectl apply -f <directory>
kubectl edit : 直接编辑 K8s 集群的资源对象(Pod/Deployment/Service/...)
  • 简要介绍
  • kubectl edit : 允许直接编辑 Kubernetes 集群中的资源对象(如 Pod、Deployment、Service 等),修改后会立即生效,无需手动执行 kubectl apply
  • 本质流程:拉取资源当前配置 → 打开编辑器修改 → 提交更新到集群。
  • 掌握 kubectl edit 可极大提升 Kubernetes 资源管理效率,但需谨慎操作以避免意外影响。
  • 使用语法
  • 方式1: 编辑指定资源
 
kubectl edit <资源类型> <资源名称> -n <命名空间>
# 示例:编辑名为 "nginx" 的 Deployment
kubectl edit deployment nginx -n default
kubectl edit daemonset -n kube-system kube-proxy
  • 方式2: 通过文件格式指定资源
 
# 编辑指定 YAML 文件对应的资源
kubectl edit -f deployment.yaml
  • 核心参数
参数说明
-o / --output指定编辑格式(如 yaml、json),默认由 KUBE_EDITOR 环境变量决定
--record在资源注解中记录本次修改的命令(用于审计)
--windows-line-endings使用 Windows 换行符(CRLF)
--allow-missing-template-keys允许模板中缺失字段(默认 true)
--field-manager指定字段管理器名称(用于 Server-Side Apply)
--validate修改后验证配置合法性(默认 true,设为 false 可跳过验证)
  • 高级功能与技巧
  • 指定编辑器

默认使用 vim,可通过环境变量切换编辑器:

 
# 使用 nano 编辑器
export KUBE_EDITOR="nano"
kubectl edit deploy/nginx
# 临时指定编辑器(无需修改环境变量)
KUBE_EDITOR="code --wait" kubectl edit deploy/nginx # 使用 VS Code
  • 编辑特定资源版本
 
# 显示资源版本、并指定版本编辑
kubectl get deploy nginx -o yaml | grep resourceVersion # 获取当前版本
kubectl edit deploy/nginx --resource-version=<版本号>
  • 编辑多个资源

结合标签选择器批量操作

 
# 编辑所有包含 "app=web" 标签的 Pod
kubectl edit pods -l app=web -n default
  • 快速定位字段

在编辑器中直接搜索关键字(如 replicas、image),快速修改核心参数。

  • 常见使用场景
  • 实时调整副本数
 
kubectl edit deploy/nginx
# 修改 replicas 字段 → 保存退出后立即生效
  • 更新容器镜像
 
kubectl edit deploy/nginx
# 修改 spec.template.spec.containers[0].image → 保存退出
  • 修改 ConfigMap/Secret
 
# 编辑 ConfigMap
kubectl edit cm app-config -n default
# 编辑 Secret(注意:Base64 编码值需自行处理)
kubectl edit secret db-credentials -n default
  • 调试资源限制
 
kubectl edit deploy/nginx
# 调整 resources.limits 和 resources.requests → 保存退出
  • 注意事项
  • 并发修改冲突
    若资源被其他用户或控制器修改,提交时会提示版本冲突(需重新拉取最新版本后编辑)。
  • 格式校验严格
    YAML 格式错误(如缩进错误、键名错误)会导致提交失败,需仔细检查。
  • 生产环境谨慎使用
    直接修改运行中的资源可能引发服务中断,建议在测试环境验证后再操作。
  • 备份原始配置
    重要操作前备份当前配置:
 
kubectl get deploy/nginx -o yaml > nginx-backup.yaml
  • FAQ / 常见问题排查
  1. 错误:Edit cancelled, no changes made

原因:编辑器未正确保存修改(如直接关闭未保存)。
解决:重新执行命令并确保保存修改。

  1. 错误:invalid configuration

原因:YAML 格式或字段值不合法。
解决:

 
# 关闭验证后强制提交(不推荐)
kubectl edit deploy/nginx --validate=false
  1. 错误:the object has been modified

原因:资源版本过期(其他人已修改过)。
解决:重新执行 kubectl edit 获取最新版本。

  • 替代方案
场景替代命令说明
少量字段修改kubectl patch无需进入编辑器,直接通过 JSON 或 YAML 片段修改
批量修改kubectl apply -f updated.yaml通过文件更新配置
查看历史修改记录kubectl rollout history查看 Deployment 等资源的修订历史
  • 参考文献
kubectl get : 列出一个或多个资源(pod/rc/service/ds)
 
# 获取集群所有的节点
kubectl get node 或 kubectl get no
# 查看rc和service列表
kubectl get rc,service
# 以纯文本输出格式列出所有 Pod
kubectl get pods
# 查询指定节点名(如: edge-1)的 所有 pod
kubectl get pod -A -o wide | grep edge-1
# 以纯文本输出格式列出所有 Pod,并包含附加信息(如【节点名】)。
kubectl get pods -o wide
# 以纯文本输出格式列出具有指定名称的副本控制器。提示:你可以使用别名 'rc' 缩短和替换 'replicationcontroller' 资源类型。
kubectl get replicationcontroller <rc-name>
# 以纯文本输出格式列出所有副本控制器和 Service。
kubectl get rc,services
# 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。
kubectl get ds --include-uninitialized
# 列出在节点 server01 上运行的所有 Pod
kubectl get pods --field-selector=spec.nodeName=server01
  • 查询pod
 
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
  • 按命名空间查询pod
 
kubectl get pod
# 等效于(命名空间=default): kubectl get pod -n default
# 查询所有命名空间下的 pod
kubectl get pod --all-namespaces
# 根据指定命名空间,查询其下的 pod | 不带等同 -n default
kubectl get pods -n kube-system

示例:

image


 

image

image

kubectl get pod local-path-provisioner-844bd8758f-mvgr9 --namespace local-path-storage -o wide
kubectl describe pod local-path-provisioner-844bd8758f-mvgr9 -n local-path-storage
kubectl logs local-path-provisioner-844bd8758f-6grj7 --namespace local-path-storage --all-containers

  • 查询所有 Pod,并显示 Node 信息(IP / hostname 等)
 
[root@k8s-master-1 ~]# kubectl get pods -A -o wide
//等效于: kubectl get pods --all-namespaces -o wide 或 kubectl get pod --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-flannel kube-flannel-ds-lgrbd 1/1 Running 2 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kube-flannel kube-flannel-ds-wv2j6 0/1 Init:0/2 0 26h 172.12.12.244 edge-1 <none> <none>
kube-system coredns-c676cc86f-nzj2x 1/1 Running 1 (28h ago) 3d3h 172.10.34.4 k8s-master-1 <none> <none>
kube-system coredns-c676cc86f-s88tw 1/1 Running 1 (28h ago) 3d3h 172.10.34.5 k8s-master-1 <none> <none>
kube-system etcd-k8s-master-1 1/1 Running 1 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kube-system kube-apiserver-k8s-master-1 1/1 Running 1 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kube-system kube-controller-manager-k8s-master-1 1/1 Running 1 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kube-system kube-proxy-c7vf9 0/1 ContainerCreating 0 26h 172.12.12.244 edge-1 <none> <none>
kube-system kube-proxy-l9g4h 1/1 Running 1 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kube-system kube-scheduler-k8s-master-1 1/1 Running 1 (28h ago) 3d3h 172.12.12.72 k8s-master-1 <none> <none>
kubeedge cloud-iptables-manager-wrdjk 1/1 Running 0 28h 172.12.12.72 k8s-master-1 <none> <none>
kubeedge cloudcore-ffd866959-zblcp 1/1 Running 0 32h 172.12.12.72 k8s-master-1 <none> <none>
  • 查询系统命名空间下的pod
 
[root@k8s-master-1 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-c676cc86f-nzj2x 1/1 Running 1 (29h ago) 3d3h
coredns-c676cc86f-s88tw 1/1 Running 1 (29h ago) 3d3h
etcd-k8s-master-1 1/1 Running 1 (29h ago) 3d3h
kube-apiserver-k8s-master-1 1/1 Running 1 (29h ago) 3d3h
kube-controller-manager-k8s-master-1 1/1 Running 1 (29h ago) 3d3h
kube-proxy-c7vf9 0/1 ContainerCreating 0 26h
kube-proxy-l9g4h 1/1 Running 1 (29h ago) 3d3h
kube-scheduler-k8s-master-1 1/1 Running 1 (29h ago) 3d3h
  • 查询系统命名空间下,Status为ContainerCreating的 pod name
 
[root@k8s-master-1 ~]# kubectl get pods -n kube-system | grep ContainerCreating | awk '{print $1}' | xargs
kube-proxy-c7vf9
kubectl delete : 删除资源对象
 
# 删除所有Pod
kubectl delete pods --all
# 基于pod.yaml定义的名称删除Pod
$ kubectl delete -f pod.yaml
# 删除所有包含某个label的Pod和Service
$ kubectl delete pod,service -l name=<label-name>
kubectl exec : 执行容器的命令
  • 执行Pod的date命令,默认使用Pod的第1个容器执行
 
$ kubectl exec <pod-name> date
  • 指定Pod中某个容器执行date命令
 
$ kubectl exec <pod-name> -c <container-name> date
  • 通过bash获得Pod中某个容器的TTY、在Pod 的容器内进行调试,相当于登陆容器 <remark=IMPORTANT>
 
$ kubectl exec -ti <pod-name> -c <container-name> /bin/bash
或者:
kubectl get pod <pod-name> -o wide # 获取节点
# SSH 到节点后
crictl pods --name <pod-name> # 找到 Pod ID
crictl ps -p <pod-id> # 查看 Pod 中的容器
crictl logs <container-id> # 查看日志
crictl exec -it <container-id> /bin/sh # SSH 到节点后
kubectl describe : 显示一个或多个资源的详细状态,默认情况下包括未初始化的资源
 
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe nodes <node-name>
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe pods/<pod-name>
# 显示由名为 <rc-name> 的副本控制器管理的所有 Pod 的详细信息。
# 记住:副本控制器创建的任何 Pod 都以副本控制器的名称为前缀。
kubectl describe pods <rc-name>
# 描述所有的 Pod
kubectl describe pods

image

kubectl logs : 打印 Pod 中容器的日志
 
# 返回 Pod <pod-name> 的日志快照
kubectl logs <pod-name>
# 从 Pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令
kubectl logs -f <pod-name>
# 获取最近一小时内的 Pod 日志
kubectl logs --since=1h <pod名称>
# 获取 Pod 的最近 100 行日志 (排查异常Pod的重要命令)
kubectl logs --tail=100 <pod-name> --namespace <namespace>
# 获取 Pod 内所有容器的日志 (排查异常Pod的重要命令,尤其是 Pod 的 init 容器初始化异常时) <remark=IMPORTANT>
kubectl logs --tail=100 <pod-name> --namespace <namespace> --all-containers
如: kubectl logs local-path-provisioner-844bd8758f-6grj7 --namespace local-path-storage --all-containers

image

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐