前言
在云原生时代,Kubernetes(简称K8s)已成为容器编排的事实标准,它能自动化部署、扩展和管理容器化应用,解决了传统部署模式的诸多痛点。本文将从云原生基础、K8s核心概念、集群部署实操到日常运维管理,为你提供一份全面的K8s学习与实践指南,助力快速上手并落地生产。
一、Kubernetes 操作管理概述
1、核心概念梳理
1.1 Kubernetes 管理操作分类
| 类型 | 别称 | 特点 |
|---|---|---|
| 陈述式 | 命令式 | 直接通过 kubectl 命令操作资源,增删查方便,修改复杂 |
| 声明式 | 配置清单式 | 通过 YAML/JSON 配置文件定义资源最终状态,适合复杂场景和自动化 |
1.2 陈述式管理核心原理
- Kubernetes 所有操作都通过 apiserver 接口完成,是唯一入口;
kubectl是官方 CLI 工具,负责将用户命令转为 apiserver 可识别的请求;- 核心优势:操作直观,适合快速调试;核心劣势:无法保留操作记录,不适合大规模运维。
2、高频操作命令(分类整理)
2.1 基础环境与权限
bash
# 授权(解决dashboard等组件权限不足问题)
kubectl create clusterrolebinding serviceaccount-cluster-admin \
--clusterrole=cluster-admin \
--user=system:serviceaccount:kubernetes-dashboard:kubernetes-dashboard
# 启用kubectl命令自动补全(bash环境)
source <(kubectl completion bash)
# 查看kubelet日志(排查节点问题)
journalctl -u kubelet -f
2.2 集群信息查看
bash
kubectl --help # 查看命令帮助
kubectl version # 查看k8s版本(客户端+服务端)
kubectl api-resources # 查看所有资源对象及简写(如pods→po,deployments→deploy)
kubectl cluster-info # 查看集群核心组件地址(apiserver、etcd等)
kubectl get componentstatuses # 查看master节点状态(控制器、调度器、etcd)
2.3 命名空间操作
bash
kubectl get namespace # 查看所有命名空间
kubectl create ns <命名空间名> # 创建命名空间(如kubectl create ns app)
kubectl delete namespace <命名空间名> # 删除命名空间
2.4 资源对象操作(核心)
(1)Deployment(副本控制器)
bash
# 创建Deployment(指定镜像和命名空间)
kubectl create deployment nginx-wl --image=nginx -n kube-public
# 查看Deployment/Pod
kubectl get deploy -n kube-public # 查看Deployment
kubectl get pods -n kube-public # 查看Pod(-o wide显示IP/节点)
kubectl describe deploy nginx-wl -n kube-public # 查看Deployment详细信息
kubectl describe pod <pod名> -n kube-public # 查看Pod详细信息(排查故障)
# 扩缩容
kubectl scale deployment nginx-wl --replicas=2 -n kube-public # 扩容到2个副本
kubectl scale deployment nginx-wl --replicas=1 -n kube-public # 缩容到1个副本
# 删除Deployment(会自动删除关联Pod)
kubectl delete deployment nginx-wl -n kube-public
(2)Pod 操作
bash
# 进入Pod容器(交互式终端)
kubectl exec -it <pod名> bash -n <命名空间>
# 删除Pod(Deployment管理的Pod会自动重建)
kubectl delete pod <pod名> -n <命名空间>
# 强制删除卡死的Pod(terminate状态)
kubectl delete pod <pod名> -n <命名空间> --force --grace-period=0
# --grace-period=0:跳过30s优雅退出,立即终止
(3)Service(服务暴露)
Service 是 Pod 的访问入口,核心类型及端口说明:
| 类型 | 用途 | 端口说明 |
|---|---|---|
| ClusterIP | 集群内部访问(默认) | port:集群内访问端口(clusterIP:port) |
| NodePort | 集群外部访问 | nodePort:宿主机端口(30000-32767),外部通过「节点IP:nodePort」访问 |
| LoadBalancer | 云平台负载均衡 | 自动绑定云厂商LB,适合生产环境 |
| ExternalName | 映射外部域名 | 无需端口,仅做域名转发 |
创建 Service 示例:
bash
# 将Deployment暴露为NodePort类型Service
kubectl expose deployment nginx-wl --type=NodePort --port=80 --target-port=80 -n kube-public
# --port:Service集群内端口;--target-port:Pod容器端口
二、K8s核心运维命令与项目生命周期管理
1. 两种资源管理方式
| 管理方式 | 特点 | 适用场景 |
|---|---|---|
| 陈述式(命令式) | 直接通过kubectl命令操作,简单直观 | 快速测试、临时操作 |
| 声明式(配置清单) | 通过YAML/JSON文件定义资源,可版本控制 | 生产环境、复杂配置、批量操作 |
2. 常用陈述式命令
(1)基础信息查看
bash
kubectl version # 查看版本
kubectl cluster-info # 查看集群信息
kubectl get nodes # 查看节点
kubectl get pods -A # 查看所有命名空间Pod
kubectl get deployment -n default # 查看指定命名空间Deployment
kubectl describe pod <pod-name> # 查看Pod详细信息
(2)资源操作
bash
# 创建命名空间
kubectl create ns app
# 创建Deployment
kubectl create deployment nginx --image=nginx:1.14 --replicas=3
# 暴露Service(NodePort类型)
kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-svc --type=NodePort
# 扩缩容
kubectl scale deployment nginx --replicas=5
# 进入容器
kubectl exec -it <pod-name> bash
# 删除资源
kubectl delete deployment nginx
kubectl delete svc nginx-svc
kubectl delete ns app
(3)更新与回滚
bash
# 更新镜像版本
kubectl set image deployment/nginx nginx=nginx:1.15
# 查看更新历史
kubectl rollout history deployment/nginx
# 回滚到上一版本
kubectl rollout undo deployment/nginx
# 回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=1
3. 声明式管理操作
bash
# 导出资源配置
kubectl get deployment nginx -o yaml > nginx-deploy.yaml
# 编辑配置文件并应用
vim nginx-deploy.yaml
kubectl apply -f nginx-deploy.yaml
# 在线编辑资源
kubectl edit deployment nginx
# 删除资源
kubectl delete -f nginx-deploy.yaml
4. 常用发布策略
(1)滚动发布(默认)
渐进式更新Pod,先创建新Pod,再删除旧Pod,不中断服务。
(2)金丝雀发布(灰度发布)
bash
# 1. 更新镜像并暂停滚动
kubectl set image deployment/nginx nginx=nginx:1.16 && kubectl rollout pause deployment/nginx
# 2. 验证新Pod状态
kubectl get pods -w
# 3. 确认正常后继续滚动
kubectl rollout resume deployment/nginx
三、常见问题排查
- Node状态为NotReady :检查Calico等网络插件是否正常运行,执行
kubectl get pods -n kube-system | grep calico。 - Pod处于Pending状态 :可能是资源不足或调度约束,执行
kubectl describe pod <pod-name>查看事件。 - Dashboard登录失败:检查Token是否正确,或重新创建管理员用户,确保权限绑定正确。
- 容器启动失败 :执行
kubectl logs <pod-name>查看日志,排查镜像拉取或配置问题。
四、声明式资源管理方法
1、声明式资源管理核心原理
声明式管理的核心是 "定义最终状态":你不需要关心"如何操作",只需要在 YAML/JSON 配置清单中定义资源的最终状态,Kubernetes 会自动对比当前状态和目标状态,完成差异调整。
| 维度 | 陈述式(命令式) | 声明式(配置清单式) |
|---|---|---|
| 操作方式 | 直接执行 kubectl 命令 |
编写 YAML 配置,通过 kubectl apply/delete -f 应用 |
| 核心特点 | 即时操作,无状态记录 | 以文件为唯一数据源,可版本控制、可复用、可审计 |
| 适用场景 | 快速调试、临时操作 | 生产环境、自动化部署(CI/CD)、复杂资源管理 |
| 语法示例 | kubectl create deployment nginx --image=nginx |
kubectl apply -f nginx-deploy.yaml |
2、声明式管理核心操作(完整流程)
2.1 配置清单的查看与解释(理解配置结构)
声明式管理的前提是看懂 YAML 配置,以下命令帮你快速解析配置结构:
bash
# 1. 导出已有资源的 YAML 配置(作为编写模板)
kubectl get deployment nginx -o yaml > nginx-deploy.yaml # 导出Deployment配置
kubectl get service nginx -o yaml > nginx-svc.yaml # 导出Service配置
# 2. 解释配置字段含义(新手必备)
kubectl explain deployment.metadata # 查看Deployment的metadata字段说明
kubectl explain deployment.spec.replicas # 查看副本数字段说明
kubectl explain service.spec.type # 查看Service类型字段说明
kubectl explain service.spec.ports.port # 查看Service端口字段说明
2.2 配置清单的修改与应用(离线/在线)
(1)离线修改(推荐,可版本控制)
步骤:导出配置 → 本地修改 → 删除旧资源(可选)→ 应用新配置
bash
# ① 导出配置文件
kubectl get service nginx -o yaml > nginx-svc.yaml
# ② 本地编辑(比如修改端口为8080)
vim nginx-svc.yaml
# 找到 spec.ports.port 字段,将值改为8080
# ③ 若apply不生效,先删除旧资源(避免配置冲突)
kubectl delete -f nginx-svc.yaml
# ④ 应用新配置(核心命令)
kubectl apply -f nginx-svc.yaml
# ⑤ 验证结果
kubectl get svc nginx
(2)在线修改(临时调整,不修改本地文件)
适合临时调试,修改即时生效,但本地 YAML 文件不会同步更新:
bash
# 在线编辑Service配置(默认打开vim编辑器)
kubectl edit service nginx
# 在编辑器中修改 spec.ports.port 为888,保存退出即可生效
# 验证修改结果
kubectl get svc nginx
2.3 Deployment 版本更新(暂停/恢复,灰度发布)
这是声明式管理中最常用的"更新"场景,通过暂停/恢复实现灰度发布,确保更新安全:
bash
# ① 更新镜像版本,并暂停Deployment(新增Pod但不删除旧Pod)
kubectl set image deployment/nginx nginx=nginx:1.14 && kubectl rollout pause deployment/nginx
# ② 监控更新过程(-w 实时刷新)
kubectl get pods -w
# 此时会看到新Pod创建,但旧Pod不会删除,可验证新Pod是否正常
# ③ 验证新Pod(比如curl访问)
curl -I <新Pod的IP>
curl -I <NodeIP:Service的NodePort>
# ④ 确认新Pod正常后,恢复更新(删除旧Pod,完成全量更新)
kubectl rollout resume deployment/nginx
# ⑤ 查看更新状态和最终结果
kubectl rollout status deployment/nginx # 查看更新进度
kubectl get pods -w # 实时查看Pod替换过程
2.4 资源删除(声明式 vs 陈述式)
| 方式 | 命令示例 | 特点 |
|---|---|---|
| 陈述式删除 | kubectl delete service nginx |
直接指定资源名删除,依赖集群当前状态 |
| 声明式删除 | kubectl delete -f nginx-svc.yaml |
基于配置文件删除,与文件保持一致,更规范 |
bash
# 声明式删除(推荐)
kubectl delete -f nginx-deploy.yaml # 删除Deployment
kubectl delete -f nginx-svc.yaml # 删除Service
# 陈述式删除(临时操作)
kubectl delete deployment/nginx # 删除Deployment
kubectl delete svc/nginx-service # 删除Service
# 验证删除结果
kubectl get all # 查看所有资源,确认目标资源已删除
3、核心配置清单示例(快速参考)
以下是最基础的 Deployment + Service 配置清单模板(nginx-deploy-svc.yaml),你可基于此修改:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 2 # 副本数
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14 # 镜像版本
ports:
- containerPort: 80
--- # 分隔符,一个文件可定义多个资源
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
type: NodePort # Service类型
selector:
app: nginx # 关联Deployment的Pod标签
ports:
- port: 80 # 集群内访问端口
targetPort: 80 # Pod容器端口
nodePort: 30080 # 外部访问端口(30000-32767)
应用这个配置的命令:
bash
kubectl apply -f nginx-deploy-svc.yaml
小结
- 声明式核心:以 YAML 配置文件为"唯一数据源",定义资源最终状态,而非操作步骤;
- 修改方式 :离线修改(
apply -f)可版本控制,推荐生产环境;在线修改(edit)适合临时调试; - 版本更新 :
rollout pause/resume实现灰度发布,先验证新Pod再完成全量更新,降低更新风险; - 删除规范 :声明式删除(
delete -f)比陈述式更规范,适合生产环境,避免"删错资源"。
声明式管理是 Kubernetes 运维的核心,掌握 YAML 配置编写和 apply/delete 命令,就能应对绝大多数生产环境的资源管理场景。
总结
Kubernetes作为云原生的核心技术,其学习曲线虽陡,但掌握后能极大提升应用部署与运维效率。本文从基础概念到实操部署,再到日常运维,覆盖了K8s的核心知识点。建议新手先通过Minikube熟悉基础操作,再搭建生产级集群实践。随着实践深入,你会逐渐体会到K8s在弹性伸缩、高可用、自动化运维等方面的强大能力,为业务增长提供坚实的技术支撑。