资讯动态

Kubectl 实战:从第一个 Pod 到 ConfigMap 与故障排查

发布时间:2026/9/30 19:27:44 来源:尧图企业网站定制
1. 从零开始为什么要先把 Kubectl 玩熟如果你刚接触 Kubernetes或者已经在看各种 YAML 文件但总觉得没摸到门道我强烈建议你先别急着写复杂编排把kubectl这个命令行工具练到像用ls一样自然。kubectl是 Kubernetes 的官方控制台命令所有对集群的查看、部署、调试、排错几乎都能通过它完成。换句话说你可以在不写一行 YAML 的情况下先靠kubectl把 Pod 跑起来、看日志、进容器、改配置这套流程通了再回头理解那些清单文件会顺很多。这篇文章从一个实际场景出发我手里有一个刚搭好的 Kubernetes 集群无论你是用 kind、minikube 还是云厂商的托管集群操作逻辑一致现在要做的第一件事就是部署第一个 Pod并围绕这个 Pod 完成状态查看、日志获取、文件拷贝、环境变量注入、配置挂载等一系列日常操作。整个过程全部用kubectl命令行完成不涉及复杂的 Helm 或 Operator适合作为入门的第一课也适合老手拿来梳理自己的命令体系。文章里会用到一些高频关键词kubectl、Pod、ConfigMap、deploy、cp这些是日常操作中出现频率最高的几个点。我会从原理讲到实操最后附上我踩过的坑和排查思路希望你看完能直接上手而不是停留在“看得懂”的层面。2. Kubectl 的工作方式与集群交互逻辑2.1 kubectl 到底在做什么很多人第一次用kubectl时会有个错觉以为它是一个像ssh一样直接连进集群的隧道工具。其实不是。kubectl本质是一个 HTTP 客户端它读取你本地的~/.kube/config配置文件拿到 API Server 的地址、证书和认证信息然后把你的操作请求封装成 REST API 调用发给 Kubernetes 的控制面组件。控制面经过认证、授权、准入控制等一系列校验后再把结果返回给kubectl展示。这套逻辑解释了为什么你经常要配kubeconfig也解释了为什么kubectl本身不需要安装什么 Agent。你只要有了正确的配置文件和网络连通性就能操作集群。理解这一点后很多怪异现象就好解释了比如你在 A 机器上能访问集群在 B 机器上不行多半是配置文件或网络环境不同而不是集群本身“拒绝了你”。2.2 kubeconfig 与上下文切换平时用得最多的三个配置相关命令是kubectl config get-contexts查看当前可用的所有上下文kubectl config current-context查看当前正在使用哪个上下文kubectl config use-context 名称切换上下文上下文context由集群地址、用户身份、命名空间三者组合而成。我经常遇到的情况是本地同时配了开发集群和测试集群的访问权限如果不小心用错上下文可能把测试环境的资源删了或者把开发环境的 Pod 误判成生产故障。所以我的习惯是在操作任何重要资源前先执行kubectl config current-context确认一下当前环境这个习惯帮我避免过不止一次事故。如果你需要临时指定不同的 kubeconfig 文件可以加--kubeconfig参数或者设置环境变量KUBECONFIG。不过日常场景下切换 context 已经足够。2.3 命名空间资源隔离的第一道门命名空间Namespace是 Kubernetes 里实现资源逻辑隔离的方式。默认情况下集群里会有default、kube-system、kube-public等命名空间。kube-system里跑的是控制面组件和系统级插件一般不建议动它我们日常操作主要是在自己创建的业务命名空间里进行。创建命名空间用kubectl create namespace demo查看已有的命名空间kubectl get namespaces指定命名空间操作资源时习惯性加-n参数比如kubectl get pods -n demo如果不加-nkubectl会默认操作default命名空间。初学者最容易犯的错就是“忘了加 -n”结果明明部署了资源却看不到或者删错了资源。我的建议是只要不是刻意操作default空间一律显式加上-n参数形成肌肉记忆。提示如果你经常在某个固定命名空间下工作可以查看上下文里的默认命名空间或者直接用kubectl config set-context --current --namespacedemo把当前上下文的默认命名空间改成demo这样即使忘了加-n也不会跑到default里。3. 部署第一个 Pod从命令行到运行状态3.1 先用 kubectl run 快速启动一个 Pod很多教程喜欢先让你写一个 YAML 文件再 apply但我想换个顺序先用一条命令把 Pod 跑起来看看它长什么样再谈 YAML。这样你更容易建立“Pod 是一个可运行对象”的直觉。最简单的启动命令是kubectl run nginx-pod --imagenginx:1.24 --port80这条命令的含义是在集群里创建一个名为nginx-pod的 Pod使用nginx:1.24镜像容器内监听 80 端口。执行后kubectl会立刻返回pod/nginx-pod created这样的信息但注意这并不代表 Pod 已经就绪它只是被 API Server 接受了。查看 Pod 状态kubectl get pods刚启动时你大概率会看到类似这样的输出NAME READY STATUS RESTARTS AGE nginx-pod 0/1 ContainerCreating 0 5sContainerCreating表示节点正在拉取镜像、创建容器。如果镜像已经在节点本地存在很快就变成Running如果网络拉取慢可能会停留较长时间。等几秒后再执行kubectl get pods看到Running且READY为1/1就说明 Pod 成功运行了。想看更多细节用kubectl describe pod nginx-pod这个命令会列出从 Pod 调度到容器启动全过程的详细事件包括被分配到了哪个节点、使用的镜像、容器状态、最近事件等。当 Pod 启动失败时describe输出里的事件部分Events往往直接告诉你原因。3.2 Pod 的四个常见状态与判断方法我见过不少新手被 Pod 状态搞懵这里把最常见的几种状态用一个表格列出来状态含义常见原因下一步Pending已接受创建请求但还没有完成调度节点资源不足、缺少持久卷、节点亲和性不满足看describe事件确认调度器卡在哪ContainerCreating已经在节点上创建容器镜像拉取中、存储卷挂载失败等待或看节点上容器运行时日志Running容器正常运行健康检查通过执行logs或exec查看内部情况CrashLoopBackOff容器反复启动又崩溃启动命令错误、配置缺失、资源不足查看容器日志调整启动参数Error容器退出且报错镜像不存在、启动命令退出非零看logs和describe事件判断一个 Pod 是否真的“健康”不能只看状态是 Running还要看READY列是否达到预期副本数。如果设置了存活探针和就绪探针探针失败也会反映在READY列上。日常巡检时一条kubectl get pods -A看清所有命名空间的 Pod是很多运维老手的开场命令。3.3 通过 Deployment 管理 Pod 而不是直接裸建kubectl run创建的是单个 Pod但它没有副本管理、滚动更新、故障自愈这些能力。一旦 Pod 所在节点出问题这个 Pod 不会自动迁移或重建。所以实际生产环境我们一般不会直接kubectl run而是使用 Deployment 这类工作负载资源。创建 Deployment 的命令kubectl create deployment nginx-deploy --imagenginx:1.24 --replicas2这个命令会创建一个名为nginx-deploy的 Deployment管理两个副本。查看 Deploymentkubectl get deployments kubectl get rs kubectl get podsRS指的是 ReplicaSetDeployment 通过 ReplicaSet 来管理 Pod 副本数。这条链路是Deployment - ReplicaSet - Pod。明白了这条链你再看滚动更新、回滚、扩缩容就都顺了。注意kubectl run和kubectl create deployment都会生成对应的资源对象并且支持用--dry-runclient -o yaml导出 YAML 内容。这个技巧对“从命令行反推 YAML”、或者给不熟悉 YAML 的同事演示非常有用。例如kubectl create deployment nginx-deploy --imagenginx:1.24 --replicas2 --dry-runclient -o yaml。3.4 扩缩容、更新镜像、回滚一旦用 Deployment 管理 Pod日常运维常见操作就变成了扩容到 5 个副本kubectl scale deployment nginx-deploy --replicas5更新镜像版本kubectl set image deployment/nginx-deploy nginxnginx:1.25这里nginxnginx:1.25中的nginx是容器名不是镜像名。如果你不确定容器名可以用kubectl describe deployment nginx-deploy查看。查看更新过程kubectl rollout status deployment/nginx-deploy查看历史版本并回滚kubectl rollout history deployment/nginx-deploy kubectl rollout undo deployment/nginx-deploy如果你希望回滚到指定版本在后面加--to-revision序号即可。这里我想强调一个观点kubectl用得好不好不在于你会多少条命令而在于你对“Deployment 管理 Pod 生命周期”这个模型理解得深不深。命令只是表象模型才是核心。4. 进入 Pod 内部日志、执行命令与文件拷贝4.1 查看日志是排错的第一动作Pod 运行起来后第一件想做的事通常是看日志。最基本的命令kubectl logs nginx-pod如果 Pod 里只有一个容器直接写 Pod 名即可。如果 Pod 里有多个容器需要指定容器名kubectl logs nginx-pod -c nginx如果容器之前崩溃过想看看上一次退出的日志kubectl logs nginx-pod --previous--previous在CrashLoopBackOff场景特别有用因为当前容器还没起来或者刚起来就没了普通logs拿不到有效输出反而上次的日志里有报错线索。跟踪日志输出kubectl logs -f nginx-pod退出跟踪用CtrlC。如果日志量大可以加--tail50只取最后 50 行。还有一个我常用的组合kubectl logs -f deployment/nginx-deploy --tail20直接跟踪某个 Deployment 下所有 Pod 的日志尾部相当于一个轻量聚合日志。实操心得查看日志时如果发现“无日志输出”先检查容器的启动命令是否把日志写到了 stdout/stderr。Kubernetes 默认只收集容器标准输出和标准错误如果应用写的是文件你需要用kubectl exec进容器查看或者配置日志收集方案。4.2 用 exec 进入 Pod 执行命令调试验证时kubectl exec是我的首选。格式为kubectl exec -it nginx-pod -- /bin/sh-it表示交互式终端--后面是你在容器里要执行的命令。进去以后你就在一个正常可交互的 shell 里了可以执行ls、cat、curl、ps等命令进行排查。如果不进入交互模式也可以一次性执行单条命令比如kubectl exec nginx-pod -- ls /usr/share/nginx/html这种写法适合在脚本里批量执行。需要注意的是不同镜像里带的 shell 不同有的只有sh有的有bash。如果bash不存在就用sh。还有一个容易踩的坑容器里可能没有curl、ping、vi这些工具因为很多基础镜像刻意精简了体积尤其是使用 distroless 或 Alpine 的镜像。所以进容器前先想清楚你依赖哪些工具如果没有要么改用宿主机的kubectl logs排查要么装个带调试工具的临时 Pod。4.3 kubectl cp从 Pod 里拷文件出来标题里专门提到了kubectl cp这个命令确实实用。它的格式跟scp很像kubectl cp pod名:容器内路径 本地路径比如把 Pod 内的 nginx 默认页面拷到本地kubectl cp nginx-pod:/usr/share/nginx/html/index.html ./index.html反过来把本地文件拷进 Podkubectl cp ./test.html nginx-pod:/usr/share/nginx/html/test.html执行kubectl cp时kubectl会自动在 Pod 内执行tar命令打包再传输因此要求 Pod 内存在tar。大多数标准镜像都有但极简镜像可能没有这时候你会看到tar: not found之类的报错。解决办法是要么换一个带有tar的镜像要么用kubectl exec配合cat和重定向变通完成拷贝。另外如果 Pod 里有多个容器需要指定容器名kubectl cp nginx-pod:/etc/nginx/nginx.conf ./nginx.conf -c nginx拷贝目录时注意路径末尾斜杠的语义与cp命令一致。比如写到容器目录:/usr/share/nginx/html/表示把目录内容拷贝到目标目录写:/usr/share/nginx/html不带斜杠则行为可能更接近把整个目录按名字拷贝。实操心得kubectl cp对二进制文件、中文字符文件、大文件偶尔会有坑。最常见的是符号链接和权限信息丢失这是因为传输过程中经过了tar打包再解包部分元数据可能变化。如果只是临时提取日志或配置文件问题不大但如果你要做备份或迁移建议优先用挂载存储卷而不是依赖kubectl cp。5. ConfigMap 与配置注入让 Pod 的配置不再写死5.1 为什么需要 ConfigMap容器镜像设计的一个原则是“镜像不变配置可变”。同一份镜像在开发环境、测试环境、生产环境里跑行为应该不同而这个区别就来自配置。如果每次改配置都要重新构建镜像那 Dev/Prod 环境切换的成本就太高了。Kubernetes 提供了 ConfigMap 来解决“配置与镜像分离”的问题。ConfigMap 本质上是一组键值对你可以在创建 Pod 时把它作为环境变量注入、作为文件挂载到容器路径、或者作为命令行参数引用。它不负责加密敏感数据应该用 Secret不要放进 ConfigMap。5.2 从命令行创建 ConfigMap创建 ConfigMap 有好几种方式我用命令行最顺手的方式是从字面量创建kubectl create configmap demo-config --from-literalAPP_ENVproduction --from-literalLOG_LEVELinfo查看 ConfigMapkubectl get configmaps kubectl describe configmap demo-config如果你有一份现成的配置文件也可以直接导入kubectl create configmap app-config --from-file./application.properties--from-file会读取文件内容默认把文件名当作键名文件内容当值。你还可以指定键名--from-filemykey./config.txt。多个文件用逗号分隔实际工作中我经常一条命令导入整个目录下的多个配置文件。5.3 在 Pod 中使用 ConfigMap 作为环境变量创建完 ConfigMap接下来让 Pod 用上它。你可以先写一个 Deployment 的 YAML也可以用命令行的方式。我这里先展示一种不看 YAML 也能完成的快速验证方法使用kubectl run加--env参数但这种写法只能使用普通字面量环境变量跟 ConfigMap 的联动一般要在 YAML 里通过envFrom或valueFrom实现。所以这一步我建议你接触一下 YAML至少能看懂结构。一个最小示例apiVersion: v1 kind: Pod metadata: name: config-demo-pod spec: containers: - name: app image: busybox:1.36 command: [/bin/sh, -c, echo $APP_ENV $LOG_LEVEL; sleep 3600] envFrom: - configMapRef: name: demo-config把上面内容保存为pod-config.yaml执行kubectl apply -f pod-config.yaml然后进入 Pod 查看环境变量kubectl exec -it config-demo-pod -- /bin/sh你会看到APP_ENVproduction、LOG_LEVELinfo。这里用到的envFrom会把 ConfigMap 里所有键值对注入为环境变量比较适合配置项较多的场景。5.4 ConfigMap 挂载成文件热更新与注意事项把 ConfigMap 挂载为文件是另一种常见用法。修改上面的 YAMLspec: containers: - name: app image: busybox:1.36 command: [/bin/sh, -c, cat /etc/config/app.properties; sleep 3600] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: app-config这样/etc/config/app.properties就是 ConfigMap 里app.properties键对应的内容。这种做法的好处是更新 ConfigMap 后挂载到 Pod 里的文件内容会自动同步一般几秒到几十秒内不需要重启 Pod。但要注意这个“自动更新”只在挂载场景下生效如果通过环境变量注入更新 ConfigMap 后 Pod 里的环境变量不会改变必须重建 Pod。注意ConfigMap 挂载有个常见坑它会覆盖挂载目录的原有内容。比如你把 ConfigMap 挂载到/etc/nginx/conf.d这个目录原来是空的还好如果原有目录本身有文件就可能被覆盖。解决方法是使用 subPath 挂载指定单文件或者把 ConfigMap 挂到一个单独的空目录再用符号链接或修改主配置的方式引用。6. 暴露服务从 Pod 到集群内外的访问6.1 Service 的作用与类型Pod 的 IP 是临时分配的Pod 重建后 IP 会变。如果客户端直接访问 Pod IP一旦 Pod 挂掉重建连接就断了。Kubernetes 引入 Service 作为稳定的访问入口它通过标签选择器动态关联一组 Pod客户端只需访问 Service 的 VIP虚拟 IP或 DNS 名称无需关心后端 Pod 变化。Service 常见类型ClusterIP默认类型只能在集群内部访问适合内部服务调用NodePort在每个节点上开放一个端口外部可通过节点IP:端口访问LoadBalancer云平台或支持 MetalLB 的环境中自动创建负载均衡器外部通过负载均衡器 IP 访问6.2 暴露 Deployment 对应 Service假设我们已经有了nginx-deploy这个 Deployment想把它的 80 端口暴露为 Servicekubectl expose deployment nginx-deploy --typeClusterIP --port80 --target-port80 --namenginx-service--port是 Service 对外监听的端口--target-port是后端 Pod 内的容器端口。如果你只想在集群内部测试ClusterIP就够了kubectl get svc nginx-service你会看到类似NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service ClusterIP 10.96.123.45 none 80/TCP 10m在集群内部业务 Pod 可以直接通过http://nginx-service访问这个服务不需要带 IP。如果想让外部访问可以用 NodePortkubectl expose deployment nginx-deploy --typeNodePort --port80 --target-port80 --namenginx-nodeport然后查 Service 分配的端口kubectl get svc nginx-nodeport输出里端口部分会显示类似80:31864/TCP说明外部可以通过任意节点的 IP 加 31864 端口访问这个服务。6.3 端口转发临时调试利器在没有配置 Service 或者不想改动集群内资源的情况下kubectl port-forward是临时验证 Pod 服务最方便的方式kubectl port-forward pod/nginx-pod 8080:80执行后本机访问http://localhost:8080流量会转发到 Pod 的 80 端口。port-forward本质是 kubectl 与 API Server 建立一条隧道数据通过 API Server 转发到节点再进入 Pod。它适合临时调试不适合生产流量。如果担心安全性生产环境还是应该依赖 Ingress 或 LoadBalancer而不是把业务端口直接暴露在节点上。7. 标签、选择器与批量管理技巧7.1 标签是资源组织的灵魂随着集群里资源越来越多靠“看一眼名字”来管理完全不够。Kubernetes 用标签Label来标记资源键值对形式比如appnginx、envprod、tierfrontend。标签可以加在 Pod、Deployment、Service、Node 等几乎所有资源上。给 Pod 打标签最直接的方式是在创建时指定kubectl run nginx-lb --imagenginx:1.24 --labelsappnginx,tierfrontend查看标签kubectl get pods --show-labels如果你想临时给已有的 Pod 加一个标签kubectl label pod nginx-lb envprod7.2 用标签选择器过滤资源标签选择器最大的用途是在get、delete、logs等命令里精确过滤资源。语法格式kubectl get pods -l appnginx kubectl get pods -l tier in (frontend,backend) kubectl get pods -l env!prod还可以用组合选择器多个条件用逗号分隔相当于 ANDkubectl get pods -l appnginx,tierfrontend-l参数支持、!、in、notin、exists等多种方式。掌握这个过滤语法后运维效率会提升不少尤其在几十上百个 Pod 同时运行的环境里。7.3 批量操作 Pod 的风险提示批量删除 Pod 要格外小心比如kubectl delete pods -l appnginx这个命令会删除所有带appnginx标签的 Pod。如果你确认这些 Pod 由 Deployment 管理删除后 Deployment 会根据副本数自动重建短暂影响服务但不会“消失”但如果是裸 Pod删除后就是真的没了。所以我给出的建议是删除前先执行kubectl get pods -l appnginx确认范围最好再配合--dry-runclient预览不要凭记忆乱删。8. 常见问题与排查技巧实录8.1 ImagePullBackOff镜像拉取失败这是新手遇到最多的报错。看到ImagePullBackOff或ErrImagePull第一反应是镜像地址写错、镜像不存在、或者节点无法访问镜像仓库。排查步骤kubectl describe pod pod-name看 Events 部分一般会直接显示拉取失败原因。如果提示repository does not exist检查镜像名称和 tag 是否正确如果提示超时或 TLS 握手失败检查节点到镜像仓库的网络连通性以及是否配置了镜像仓库认证imagePullSecrets。我遇到过不少次“本地能 pull节点不能 pull”的情况原因往往是节点上没有 docker 凭证。解决办法是在集群里创建 Secret并在 Deployment 的spec.template.spec.imagePullSecrets里引用。8.2 CrashLoopBackOff容器起不来容器反复退出时kubectl get pods会显示CrashLoopBackOff。排查思路先看日志kubectl logs pod-name --previous如果日志没有有效输出用kubectl describe pod pod-name看退出容器的退出码检查启动命令、环境变量、挂载文件是否正确如果涉及数据库等服务检查依赖是否就绪常见原因包括启动命令里依赖的文件不存在、权限不足、配置了错误的环境变量、资源限制过小导致 OOM、容器里没有前台进程导致直接退出。我之前排查过一个案例容器启动命令写的是sh /opt/app/run.sh但镜像里实际没有这个脚本导致启动即退出CrashLoopBackOff无限循环。这类问题用logs --previous几乎都能看到报错线索。8.3 Pending 状态调度不成功Pod 一直停在Pending多半是资源不足或存在调度限制。先执行kubectl describe pod pod-name再看 Events。常见提示0/2 nodes are available: 2 Insufficient cpu节点 CPU 资源不够需要扩容节点、删除无用 Pod 或调整资源请求0/2 nodes available: 1 node(s) had taint X节点上有污点Pod 没有对应容忍0/2 nodes available: 2 node(s) had untolerated taint同上如果你确认 Pod 不需要特别调度策略可以查看节点资源kubectl top nodes看 CPU 和内存使用情况。对于本地开发环境最常见的原因就是笔记本资源不足。8.4 kubectl cp 拷贝文件失败如果你执行kubectl cp时报错优先怀疑容器里没有tar。这时候可以用一个更通用的替代方案kubectl exec pod-name -- cat /path/to/file ./local-file.txt把容器内文件内容重定向到本地文件。反过来往容器里拷文件cat ./local-file.txt | kubectl exec -i pod-name -- sh -c cat /path/to/file.txt这种方式不依赖tar兼容性更好。对于文本和配置类文件我常用这一套对于二进制文件或大文件我会考虑临时挂载 PVC或者用kubectl cp并提供带tar的调试容器。8.5 端口转发失效kubectl port-forward有时会出现“转发没反应”或“连接被拒绝”的情况。排查步骤确认 Pod 是否 Runningkubectl get pods确认容器内服务是否监听对应端口kubectl exec pod-name -- netstat -tlnp或ss -tlnp确认本地端口是否被占用lsof -i:8080确认 kubeconfig 指向的 API Server 可达port-forward有时会因为长连接空闲断掉重新执行即可。如果频繁断连可以考虑用--address 0.0.0.0指定监听地址但要注意安全性不要长期暴露在公网网卡上。9. 速查表高频 kubectl 命令一页纸为了方便日常查阅我把这篇文章涉及的命令整理成一个速查表目标命令查看当前上下文kubectl config current-context切换上下文kubectl config use-context name创建命名空间kubectl create namespace demo启动一个测试 Podkubectl run nginx-pod --imagenginx:1.24 --port80查看所有 Podkubectl get pods -A查看 Pod 详情kubectl describe pod name查看容器日志kubectl logs name --previous进入 Pod 执行命令kubectl exec -it name -- /bin/sh从 Pod 拷文件kubectl cp pod:path local-path创建 Deploymentkubectl create deployment name --imageimage --replicasn扩缩容kubectl scale deployment name --replicasn更新镜像kubectl set image deployment/name containerimage回滚 Deploymentkubectl rollout undo deployment/name创建 ConfigMapkubectl create configmap name --from-literalkeyvalue标签过滤kubectl get pods -l appnginx端口转发kubectl port-forward pod/name 8080:80个人建议先用kubectl api-resources查看当前集群支持的所有资源类型再用kubectl explain 资源名查看字段说明。这两个命令是自学的“拐杖”比死记硬背更高效。10. 从第一个 Pod 到日常运维的工作流建议这篇文章从kubectl run建第一个 Pod 起步一路走到 Deployment 管理、ConfigMap 注入、Service 暴露、以及常见故障排查。其实你会发现所有操作都围绕一个核心模型控制面接受你的声明 Pod、Deployment、Service然后调度器和各类控制器负责让实际状态向声明状态收敛。kubectl只是你跟这个模型对话的翻译官。按我个人经验给正在上手 Kubernetes 的朋友一个建议不要一上来就追求“写一个复杂的编排文件”先做到能用几条命令完成下面这组动作创建命名空间用 Deployment 启动一个应用查看 Pod、日志给应用打个标签并按标签过滤创建一个 ConfigMap 并注入到 Pod用 Service 或端口转发访问服务模拟故障查看 Pod 如何被重建这一套走完你对 Pod、Deployment、Service、ConfigMap 这几个核心对象的认识会比看十篇教程都扎实。后续再遇到复杂问题无非是在这个模型上叠加存储、网络策略、可观测性、弹性伸缩等一层层能力。最后分享一个我常用的工作流先在default命名空间临时测试确认无误后再用-n指定正式命名空间重新部署所有 YAML 文件尽量用kubectl create --dry-runclient -o yaml生成初始版本再手工补充字段。这样既能减少手写 YAML 的拼写错误又保留了对最终文件的控制权。踩过几次坑之后你会发现kubectl真正值钱的地方并不在某一条命令而是你理解 Kubernetes 对象模型之后能把命令组合成一套解决实际问题的思路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑