Kubernetes 系列【5】部署一个简单的 Kubernetes 应用

📅 2026/7/5 14:32:06
Kubernetes 系列【5】部署一个简单的 Kubernetes 应用
文章目录1. 前言2. 前置条件3. kubectl 基础命令4. 部署第一个应用4.1 创建 Deployment4.1.1 直接创建4.1.2 先创建文件4.2 查看 Deployment5. 查看 Pod 和 Node 运行详情5.1 查看 Pod 列表5.2 查看 Pod 详细信息5.3 查看容器日志5.4 在容器中执行命令6. 使用 Service 对外暴露应用6.1 内部访问6.2 创建 NodePort Service6.3 查看 Service6.4 访问 NGINX方式1集群内部访问方式2外部访问NodePort最常用方式3直接访问 PodIP7. 使用标签筛选资源7.1 查看 Deployment 标签7.2 根据标签查看 Pod7.3 根据标签查看 Service7.4 给 Pod 添加标签8. 删除 Service9. NGINX 扩容与缩容9.1 查看当前 Deployment9.2 查看 ReplicaSet9.3 扩容到 4 个副本9.4 验证负载均衡9.5 缩容到 2 个副本10. 常用排障命令11. 清理资源1. 前言本文档整理自Kubernetes官方基础教程目标是帮助初学者理解并完成第一个Kubernetes应用部署。通过本文档你将学习使用kubectl创建Deployment。查看Pod、Node、Deployment、Service等资源状态。使用Service对外暴露应用。对应用进行扩容和缩容。使用常用命令排查应用运行问题。2. 前置条件开始前需要准备已有可用Kubernetes集群例如minikube、kind、k3s或真实K8S集群。已安装并配置好kubectl。当前终端可以连接Kubernetes集群。如果使用Windows建议使用WSL或Git Bash。本文命令采用POSIX Shell语法适用于Linux、macOS、WSL、Git Bash。3. kubectl 基础命令kubectl命令通用格式kubectl动作资源类型资源名称示例# 查看集群中所有节点信息kubectl get nodes# 查看所有运行中的Pod资源kubectl get pods# 查看指定Pod的详细描述信息排查事件、配置与异常kubectl describe podpod-name# 查看指定Pod的容器日志kubectl logspod-name# 删除指定的Deployment控制器kubectl delete deploymentdeployment-name查看帮助kubectl get nodes--help验证kubectl是否连接到集群kubectl version查看节点kubectl get nodes4. 部署第一个应用4.1 创建 Deployment4.1.1 直接创建本教程使用NGINX官方镜像kubectl create deployment nginx--imagenginx:latest该命令会完成创建Deployment。创建对应Pod。将Pod调度到可用Node。配置异常自动恢复能力。任意一台能连接Kubernetes集群的服务器上执行即可执行后本地不会生成文件是直接把Deployment资源创建到Kubernetes集群的etcd数据库里了。4.1.2 先创建文件如果你想把它导出成YAML文件可以执行kubectl get deployment nginx-oyamlnginx-deployment.yaml或者一开始就生成YAML文件而不立即创建kubectl create deployment nginx--imagenginx:latest --dry-runclient-oyamlnginx-deployment.yaml然后以后用文件部署kubectl apply-fnginx-deployment.yaml文件内容# API版本Deployment资源归属apps/v1分组apiVersion:apps/v1# 资源类型无状态应用控制器kind:Deploymentmetadata:# 注解存放描述、版本记录等不可筛选信息annotations:# Deployment版本修订号每次滚动更新自增deployment.kubernetes.io/revision:1# 资源创建时间戳creationTimestamp:2026-06-29T11:18:58Z# 资源配置变更次数每修改spec则1generation:1# 标签用于筛选、关联Podlabels:app:nginx# Deployment名称name:nginx# 所属命名空间默认defaultnamespace:default# apiserver内部资源版本用于并发控制resourceVersion:427574# 全局唯一资源IDuid:0a5a8b8f-3975-4d0c-ac89-a73c5e420fdbspec:# 滚动更新超时阈值超过该时间标记更新失败progressDeadlineSeconds:600# 期望运行Pod副本数量replicas:1# 保留历史修订版本数用于回滚revisionHistoryLimit:10# 标签选择器匹配管理对应Podselector:matchLabels:app:nginx# 更新策略配置strategy:# 滚动更新参数rollingUpdate:# 更新期间最大可超出期望副本的比例maxSurge:25%# 更新期间最大不可用副本比例maxUnavailable:25%# 更新类型滚动更新不中断业务type:RollingUpdate# Pod模板用于创建受控Podtemplate:metadata:creationTimestamp:null# Pod自身标签与selector匹配labels:app:nginxspec:containers:-# 容器镜像image:nginx:latest# 镜像拉取策略每次都拉取最新镜像imagePullPolicy:Always# 容器名称name:nginx# 容器CPU/内存资源配额此处为空不限制resources:{}# 容器终止日志输出路径terminationMessagePath:/dev/termination-log# 终止日志读取策略terminationMessagePolicy:File# DNS解析策略优先集群内部DNSdnsPolicy:ClusterFirst# Pod重启策略容器异常始终重启restartPolicy:Always# 使用集群默认调度器schedulerName:default-scheduler# Pod安全上下文权限控制配置此处为空securityContext:{}# 容器优雅关闭等待时长超时强制杀进程terminationGracePeriodSeconds:304.2 查看 Deploymentkubectl get deployments示例字段说明字段说明READY当前就绪副本数 / 期望副本数UP-TO-DATE已更新到目标版本的副本数AVAILABLE当前可用副本数AGE资源运行时长5. 查看 Pod 和 Node 运行详情5.1 查看 Pod 列表部署后Pod会被Kubernetes调度到某个Worker/从节点 上运行默认一般不会运行在control-plane节点上除非control-plane节点允许调度。查看当前命名空间下所有运行的Pod资源kubectl get pods返回NAME READY STATUS RESTARTS AGE nginx-64fb578bf4-st6d51/1 Running013h字段说明字段含义说明NAMEPod 的名称READY就绪副本数 / 总副本数代表容器是否就绪STATUSPod 当前状态Running 运行中、Pending 调度中、Error 异常、Completed 已完成RESTARTS容器重启次数AGEPod 从创建到现在的运行时长查看更详细信息kubectl get pods-owide返回NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-64fb578bf4-st6d51/1 Running06m24s100.99.8.46 iz2ze60mcbemirrld91q6rznonenone字段说明字段含义说明NAMEPod 名称READY就绪容器数量 / 总容器数量1/1代表正常就绪STATUSPod 当前状态常见Running正常运行、Pending调度中、Error异常RESTARTS容器重启次数AGEPod 已经运行多长时间IPPod 内部IP地址NODEPod 被调度到哪一台节点机器NOMINATED NODE临时预留节点一般为空READINESS GATES就绪准入控制一般为空5.2 查看 Pod 详细信息kubectl describe pod$POD_NAME可以看到Pod IP。所在Node。容器镜像。端口。启动事件。异常原因。详细说明# Pod名称Name: nginx-64fb578bf4-st6d5# 所属命名空间Namespace: default# 优先级数值越高优先级越高默认0Priority:0# 绑定的服务账号Service Account: default# 调度到的节点名称与节点IPNode: iz2ze60mcbemirrld91q6rz/172.17.172.89# Pod创建启动时间Start Time: Mon,29Jun202619:48:04 0800# Pod标签用于控制器筛选管理Labels:appnginx pod-template-hash64fb578bf4# 注解信息这里是Calico网络插件写入的网络信息Annotations: cni.projectcalico.org/containerID: 5f74ae8bcc86ad290009ec7abf27ce13096d7d8cca62b21c9a62450e44812d80 cni.projectcalico.org/podIP:100.99.87.146/32 cni.projectcalico.org/podIPs:100.99.87.146/32# Pod整体运行状态Status: Running# Pod内网IP地址IP:100.99.87.146 IPs: IP:100.99.87.146# 归属控制器由ReplicaSet创建管理Controlled By: ReplicaSet/nginx-64fb578bf4# 容器配置信息Containers: nginx:# 容器IDContainer ID: docker://8d6394a91483a2642ae6fd0be94afd75ded38261762ae0ea9cca6a518c0945ee# 容器镜像Image: nginx:latest# 镜像唯一IDImage ID: docker-pullable://swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginxsha256:482d22ab90f2ed6c388907dff6d230c66d7e1a60711ab655b9e00db1cc97b0ac Port:noneHost Port:none# 容器当前状态State: Running Started: Mon,29Jun202619:48:04 0800# 容器是否就绪Ready: True# 容器重启次数Restart Count:0Environment:none# 挂载的存储卷默认挂载serviceaccount证书Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-8zqtf(ro)# Pod各项就绪条件Conditions: Type Status PodReadyToStartContainers True# 容器可以正常启动Initialized True# 初始化容器执行完毕Ready True# Pod整体就绪ContainersReady True# 业务容器全部就绪PodScheduled True# Pod已经成功调度到节点# 数据卷配置Volumes: kube-api-access-8zqtf: Type: Projected(a volume that contains injected data from multiple sources)TokenExpirationSeconds:3607ConfigMapName: kube-root-ca.crt ConfigMapOptional:nilDownwardAPI:true# 资源QoS等级BestEffort表示无资源配额限制QoS Class: BestEffort# 节点亲和选择器Node-Selectors:none# 容忍度节点异常时Pod等待300秒再驱逐Tolerations: node.kubernetes.io/not-ready:NoExecuteopExistsfor300s node.kubernetes.io/unreachable:NoExecuteopExistsfor300s# 事件日志此处无异常事件Events:none5.3 查看容器日志kubectl logs$POD_NAME5.4 在容器中执行命令登录到nginx这个Pod容器中输出容器内所有环境变量常用于排查配置变量、服务账号变量、注入参数是否生效kubectlexec$POD_NAME--env进入容器kubectlexec-ti$POD_NAME--bash# 或kubectlexec-ti$POD_NAME--sh在容器内访问NGINXcurlhttp://localhost:80退出容器exit6. 使用 Service 对外暴露应用6.1 内部访问默认情况下Pod运行在集群内部网络中外部不能直接访问只能通过kubectl get pods -o wide中的内部IP地址访问6.2 创建 NodePort Service为nginx应用创建NodePort类型服务集群内部可直接访问Service集群外部可以使用任意节点IPNodePort端口访问Nginx页面。kubectl expose deployment/nginx--typeNodePort--port80命令分段解析kubectl expose根据已有控制器自动创建Service对象。deployment/nginx资源类型为Deployment资源名称是nginxService通过标签自动关联该Deployment下所有Pod。--typeNodePortService类型设置为NodePort。集群会在所有节点开放一个随机端口外部客户端可以通过「节点IP 端口」访问服务。--port 80Service内部端口Service监听集群内部的80端口并把流量转发给后端Pod的80端口。查看生成结果kubectl get svc nginx返回NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE nginx NodePort10.101.223.70none80:37212/TCP 11s字段说明字段说明NAMEService资源名称TYPE服务类型NodePort表示节点端口模式CLUSTER-IPService集群内部虚拟IP仅集群内可访问EXTERNAL-IP外部IPNodePort类型为空PORT(S)端口映射Service端口:NodePort端口/协议AGEService创建时长6.3 查看 Service查询当前命名空间下所有Service资源kubectl get services返回NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE nginx NodePort10.101.223.70none80:37212/TCP 2m9s查看详细信息kubectl describeservicenginx6.4 访问 NGINX方式1集群内部访问Service内部虚拟IP10.101.223.70端口80。curl10.101.223.70:80只能在集群节点或Pod内部执行。方式2外部访问NodePort最常用节点端口37212格式任意集群节点IP:37212# 把节点IP换成你服务器公网/内网IPcurlhttp://172.17.172.89:37212浏览器直接打开http://服务器IP:37212访问失败排查两点服务器安全组/防火墙放开37212端口云服务器开放入站规则否则外网无法连通端口说明Service端口80Node对外开放端口37212Pod容器端口80方式3直接访问 PodIPPod地址100.99.87.146:80curl100.99.87.146:807. 使用标签筛选资源7.1 查看 Deployment 标签kubectl describe deployment nginx7.2 根据标签查看 Podkubectl get pods-lappnginx7.3 根据标签查看 Servicekubectl get services-lappnginx7.4 给 Pod 添加标签kubectl label pods$POD_NAMEversionv1查看标签kubectl describe pod$POD_NAME根据新标签筛选kubectl get pods-lversionv18. 删除 Service删除Service后外部访问入口会消失但Deployment和Pod仍然运行。kubectl deleteservice-lappnginx确认删除kubectl get services验证Pod内部NGINX仍然可用kubectlexec-ti$POD_NAME--curlhttp://localhost:809. NGINX 扩容与缩容9.1 查看当前 Deploymentkubectl get deployments9.2 查看 ReplicaSetkubectl get rsReplicaSet名称通常格式为deployment-name-hash返回示例NAME DESIRED CURRENT READY AGE nginx-64fb578bf411113h字段说明字段说明NAMEReplicaSet控制器名称DESIRED期望副本数CURRENT当前运行副本数READY就绪可用副本数AGE资源运行时长9.3 扩容到 4 个副本kubectl scale deployment/nginx--replicas4查看结果kubectl get deployments kubectl get pods-owide9.4 验证负载均衡如果Service仍然存在可以多次访问curlhttp://Node节点IP:$NODE_PORT多次请求可能会落到不同Pod说明Service负载均衡生效。9.5 缩容到 2 个副本kubectl scale deployment/nginx--replicas2查看结果kubectl get deployments kubectl get pods-owide10. 常用排障命令命令作用kubectl get pods查看 Pod 列表kubectl get pods -o wide查看 Pod 所在节点和 IPkubectl describe pod pod查看 Pod 详细状态和事件kubectl logs pod查看容器日志kubectl exec -ti pod -- bash进入容器执行命令kubectl get svc查看 Servicekubectl describe svc svc查看 Service 详细信息kubectl get deployments查看 Deploymentkubectl describe deployment deployment查看 Deployment 事件和状态11. 清理资源删除Servicekubectl deleteservicenginx删除Deploymentkubectl delete deployment nginx确认资源已删除kubectl get pods kubectl get deployments kubectl get services