第一章:Kubernetes 基础概念速览

1.1 什么是 Kubernetes?

Kubernetes(简称 k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。它解决了分布式系统中“如何高效管理大量容器”的难题,核心功能包括:

  • 自动调度:根据资源需求将容器分配到合适的节点。
  • 自我修复:当容器崩溃时自动重启,确保服务可用性。
  • 水平扩展:根据负载动态调整容器数量。
  • 服务发现:通过内置的 DNS 和负载均衡器暴露服务。

类比理解
Kubernetes 就像一个“容器管家”,负责管理多个“虚拟房间”(节点),每个房间里运行着多个“住户”(容器)。管家会监控住户的健康状态,分配资源,并在房间不足时自动扩建。

1.2 核心组件与架构

Kubernetes 集群由以下组件构成:

  • 控制平面(Master 节点)
    • API Server:集群的入口,接收所有操作指令。
    • etcd:分布式键值存储,保存集群状态数据。
    • Scheduler:决定容器运行在哪个节点。
    • Controller Manager:维护集群状态(如副本数、节点状态)。
  • 工作节点(Worker 节点)
    • Kubelet:节点上的代理,执行控制平面的指令。
    • Container Runtime(如 Docker):实际运行容器的引擎。
    • Kube-Proxy:管理网络规则,实现服务通信。

图示

用户 → API Server → etcd/Scheduler/Controller → Kubelet → 容器
           ↑                    ↓
         监控与调度               运行容器

1.3 常用术语速查

术语解释
PodKubernetes 的最小部署单元,通常包含一个或多个紧密相关的容器。
Deployment管理 Pod 的控制器,支持滚动更新和自动回滚。
Service定义一组 Pod 的访问策略,提供稳定的 IP 和 DNS 名称。
Ingress外部流量进入集群的入口,支持路径路由和负载均衡。
ConfigMap存储非敏感配置数据(如环境变量),供 Pod 使用。
Secret存储敏感数据(如密码、密钥),以加密形式保存。
Namespace逻辑隔离集群资源,避免命名冲突(如 devprod 环境)。

第二章:核心命令分类详解

2.1 集群信息与状态查询

2.1.1 查看集群基础信息
kubectl cluster-info

输出示例

Kubernetes master is running at https://192.168.1.100:6443
KubeDNS is running at https://192.168.1.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

作用:快速确认集群是否可用,并获取 API Server 和核心服务(如 DNS)的访问地址。

2.1.2 检查节点状态
kubectl get nodes

输出示例

NAME       STATUS   ROLES    AGE   VERSION
node-1     Ready    <none>   10d   v1.25.0
node-2     NotReady master  10d   v1.25.0

关键字段

  • STATUSReady 表示节点健康,NotReady 可能因网络或资源问题。
  • ROLESmaster 为控制平面节点,<none> 为工作节点。

深入操作

kubectl describe node node-1  # 查看节点资源分配、污点等详细信息
kubectl top nodes             # 显示节点 CPU/内存使用率(需安装 Metrics Server)
2.1.3 查看集群事件
kubectl get events --sort-by='.lastTimestamp'

作用:排查集群异常时,通过事件日志定位问题根源(如 Pod 崩溃、节点断开)。


2.2 Pod 管理命令

2.2.1 创建与删除 Pod

创建 Pod(声明式,推荐):

kubectl apply -f pod.yaml

示例 pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

快速创建 Pod(命令式):

kubectl run nginx-pod --image=nginx --port=80

删除 Pod

kubectl delete pod nginx-pod
# 强制删除卡在 Terminating 状态的 Pod
kubectl delete pod nginx-pod --grace-period=0 --force
2.2.2 查看 Pod 状态
kubectl get pods -o wide  # 显示 Pod 的 IP、所在节点等
kubectl describe pod nginx-pod  # 查看 Pod 的详细事件和配置

状态解析

  • Pending:Pod 正在调度或拉取镜像。
  • Running:Pod 已启动。
  • CrashLoopBackOff:容器频繁崩溃,需检查日志。
2.2.3 交互与调试

进入 Pod 终端

kubectl exec -it nginx-pod -- /bin/bash

在 Pod 中执行命令

kubectl exec nginx-pod -- date  # 查看 Pod 内部时间

端口转发(将 Pod 端口映射到本地):

kubectl port-forward nginx-pod 8080:80  # 访问本地 8080 即可转发到 Pod 的 80 端口

复制文件到 Pod

kubectl cp ./local-file nginx-pod:/tmp/remote-file

2.3 Deployment 管理命令

2.3.1 创建 Deployment
kubectl create deployment nginx-deploy --image=nginx --replicas=3

或通过 YAML 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
2.3.2 扩缩容
kubectl scale deployment nginx-deploy --replicas=5

自动扩缩容(需配置 HPA):

kubectl autoscale deployment nginx-deploy --min=2 --max=10 --cpu-percent=80
2.3.3 滚动更新与回滚

更新镜像

kubectl set image deployment/nginx-deploy nginx=nginx:1.21

查看更新状态

kubectl rollout status deployment/nginx-deploy

回滚到上一版本

kubectl rollout undo deployment/nginx-deploy

查看更新历史

kubectl rollout history deployment/nginx-deploy

2.4 Service 与网络管理

2.4.1 创建 Service

将 Deployment 暴露为 Service

kubectl expose deployment nginx-deploy --type=NodePort --port=80

查看 Service 详情

kubectl get svc nginx-deploy -o wide

输出示例

NAME              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-deploy      NodePort   10.96.123.456   <none>        80:31234/TCP   10m
  • ClusterIP:仅集群内部访问。
  • NodePort:通过节点 IP + 端口(如 31234)访问。
  • LoadBalancer:云环境下的外部负载均衡器。
2.4.2 测试服务连通性

从集群内部访问

kubectl run test-pod --image=busybox --rm -it --restart=Never -- sh
# 在容器内执行
wget -O- http://nginx-deploy

从外部访问 NodePort

curl http://<节点IP>:31234

第三章:进阶技巧与实战场景

3.1 多环境管理(Namespace)

3.1.1 创建与切换 Namespace
kubectl create namespace dev
kubectl config set-context --current --namespace=dev  # 切换默认命名空间
3.1.2 跨 Namespace 操作
kubectl get pods -n prod  # 查看 prod 命名空间的 Pod
kubectl apply -n test -f pod.yaml  # 在 test 命名空间创建资源

3.2 声明式配置与模板生成

3.2.1 生成 YAML 模板
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deploy.yaml

修改模板后应用

kubectl apply -f deploy.yaml
3.2.2 合并多个 YAML 文件
kubectl apply -f ./k8s/  # 应用目录下所有 YAML 文件

3.3 资源监控与调优

3.3.1 安装 Metrics Server

作用:提供节点和 Pod 的资源使用率数据(kubectl top 依赖此组件)。

安装步骤

  1. 下载 Metrics Server 的 YAML 文件:
    wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  2. 修改 args 添加 --kubelet-insecure-tls(测试环境用,生产环境需配置证书):
    args:
      - --kubelet-insecure-tls
      - --kubelet-preferred-address-types=InternalIP
  3. 应用配置:
    kubectl apply -f components.yaml
3.3.2 查看资源使用
kubectl top pods                # 查看 Pod 的 CPU/内存使用
kubectl top nodes                # 查看节点的资源使用

3.4 调试技巧

3.4.1 临时调试容器
kubectl run debug --image=busybox --rm -it --restart=Never -- sh

作用:快速创建一个临时容器,用于测试集群内部网络或 DNS。

3.4.2 调试运行中的 Pod
kubectl debug nginx-pod -it --image=busybox --target=nginx  # 进入 Pod 的指定容器调试

第四章:常见故障排查

4.1 Pod 无法启动

场景 1:ImagePullBackOff

现象:Pod 状态为 ImagePullBackOff
原因:镜像拉取失败(如镜像不存在、私有仓库未配置 Secret)。
排查步骤

  1. 查看事件日志:
    kubectl describe pod <pod-name> | grep -A10 Events
  2. 手动拉取镜像测试:
    docker pull <image-name>  # 本地测试镜像是否存在
  3. 配置私有仓库 Secret:
    kubectl create secret docker-registry regcred --docker-server=<registry> --docker-username=<user> --docker-password=<pass>
    在 Pod 模板中引用:
    spec:
      imagePullSecrets:
      - name: regcred
场景 2:CrashLoopBackOff

现象:Pod 频繁重启。
原因:容器内进程崩溃(如应用配置错误、端口冲突)。
排查步骤

  1. 查看容器日志:
    kubectl logs <pod-name> --previous  # 查看上一次运行的日志
  2. 进入容器检查:
    kubectl exec -it <pod-name> -- /bin/sh

4.2 网络问题

场景 1:Service 无法访问

现象:通过 Service IP 或 DNS 无法访问后端 Pod。
排查步骤

  1. 检查 Service 的 Endpoints:
    kubectl get endpoints <service-name>
    • 如果 Endpoints 为空,说明 Selector 未匹配到 Pod。
  2. 测试 Pod 内部网络:
    kubectl exec -it <pod-name> -- curl http://<other-pod-ip>
场景 2:DNS 解析失败

现象:容器内无法解析域名(如 nslookup kubernetes.default 失败)。
排查步骤

  1. 检查 CoreDNS Pod 状态:
    kubectl get pods -n kube-system | grep coredns
  2. 查看 CoreDNS 日志:
    kubectl logs -n kube-system <coredns-pod-name>

4.3 权限问题

场景 1:RBAC 权限不足

现象:执行 kubectl 命令时报错 forbidden
排查步骤

  1. 查看当前上下文的 ServiceAccount:
    kubectl config view --minify | grep serviceaccount
  2. 检查 RoleBinding 是否授权:
    kubectl get rolebinding -n <namespace>

第五章:效率工具推荐

5.1 自动补全

Bash 补全

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

Zsh 补全

source <(kubectl completion zsh)
echo "source <(kubectl completion zsh)" >> ~/.zshrc

5.2 界面化管理工具

  • K9s:终端 UI 工具,实时监控集群状态。
  • Lens:图形化界面,支持多集群管理。
  • Octant:Web 界面,集成日志、监控等功能。

总结

本文通过 基础概念→核心命令→进阶技巧→故障排查 的路径,系统梳理了 Kubernetes 的常见操作。掌握这些命令后,你可以:

  1. 快速部署和调试容器化应用。
  2. 高效管理集群资源(如扩缩容、滚动更新)。
  3. 独立排查 80% 以上的常见问题。

下一步建议

  • 在测试环境实践所有命令,加深理解。
  • 阅读官方文档的 Tasks 章节 拓展知识。
  • 尝试编写 Helm Chart 或 Kustomize 模板,提升配置管理效率。

Kubernetes 的学习是一个“用进废退”的过程,持续实践才能真正掌握其精髓!

Logo

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

更多推荐