K8s 核心组件使用指南
1 K8s 核心组件使用指南
K8s集群组件

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

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

- 它可以使用以下方式之一向 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 | |
| componentstatuses | cs |
| configmaps | cm |
| daemonsets | ds |
| deployments | deploy |
| endpoints | ep |
| events | ev |
| horizontalpodautoscalers | hpa |
| ingresses | ing |
| Jobs | |
| limitranges | limits |
| nodes | no |
| namespaces | ns |
| networkpolicies | |
| statefulsets | |
| persistentvolumeclaims | pvc |
| persistentvolumes | pv |
| pods | po |
| podsecuritypolicies | psp |
| podtemplate | |
| replicasets | rs |
| replicationcontrollers | rc |
| resourcequotas | quota |
| cronjob | |
| secrets | |
| serviceaccounts | |
| services | svc |
| storageclasses | sc |
| 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 / 常见问题排查
- 错误:Edit cancelled, no changes made
原因:编辑器未正确保存修改(如直接关闭未保存)。
解决:重新执行命令并确保保存修改。
- 错误:invalid configuration
原因:YAML 格式或字段值不合法。
解决:
# 关闭验证后强制提交(不推荐) |
kubectl edit deploy/nginx --validate=false |
- 错误: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 |
示例:



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 |

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 |

更多推荐



所有评论(0)