一、理论知识

1. Kubernetes 资源抽象

  • 核心概念:Kubernetes 将所有内容抽象为资源。用户通过操作资源来管理集群。
  • 最小管理单元Pod。Kubernetes 不直接管理容器,而是将容器封装在 Pod 中。
  • 管理方式:通常不直接管理 Pod,而是通过 Pod 控制器(如 Deployment)来管理。
  • 服务访问:通过 Service 资源实现 Pod 间及服务对外的访问。
  • 数据持久化:通过 VolumePVCPV 等存储系统实现。

2. 资源管理方式

类型

命令示例

适用环境

优点

缺点

命令式对象管理

kubectl run ...

测试

简单快捷

无法审计、跟踪,只能操作活动对象

命令式对象配置

kubectl create -f ...

开发

可审计、跟踪

项目大时配置文件多,操作麻烦

声明式对象配置

kubectl apply -f ...

生产/开发

支持目录操作,版本控制

意外情况下难以调试

3. Pod 生命周期与架构

  • 定义:Pod 是 Kubernetes 创建和管理的最小可部署单元,代表集群中运行的一个进程,拥有唯一 IP。
  • 结构:类似“豌豆荚”,包含一个或多个容器(共享 IPC、Network、UTC namespace)。
  • 生命周期容器
    • Init 容器:在应用容器启动前运行,必须成功完成,支持阻塞启动直到满足先决条件。
    • 应用容器:主业务容器。
  • 探针 (Probes)
    • LivenessProbe (存活探针):判断容器是否运行。失败则杀死容器并根据重启策略重启。
    • ReadinessProbe (就绪探针):判断容器是否准备好服务请求。失败则从 Service 端点列表中移除 IP。
    • StartupProbe (启动探针):判断应用是否已启动。成功前禁用其他探针。

4. 常用资源类型

  • 工作负载:Pod (po), Deployment (deploy), ReplicaSet (rs), DaemonSet (ds), StatefulSet (sts), Job, CronJob。
  • 服务发现:Service (svc), Ingress (ing)。
  • 存储:VolumeAttachment, PersistentVolume (pv), PersistentVolumeClaim (pvc)。
  • 配置:ConfigMap (cm), Secret。
  • 集群:Nodes (no), Namespaces (ns)。

5. YAML 资源清单关键参数

  • apiVersion: API 版本 (如 v1, apps/v1)。
  • kind: 资源类型 (如 Pod, Deployment)。
  • metadata: 元数据 (name, namespace, labels)。
  • spec: 详细定义 (containers, image, ports, resources, probes 等)。
  • 资源优先级 (QoS)
    • Guaranteed: limits 与 requests 一致且已设定。
    • Burstable: limits 与 requests 不一致。
    • BestEffort: 未设定资源限制。

二、操作命令与实操指南

2.1 集群信息与版本查看

# 显示集群客户端与服务端版本信息
kubectl version

# 显示集群控制平面及核心组件运行信息
kubectl cluster-info

2.2 资源基本管理 (CRUD)

# 查看所有 Pod 资源
kubectl get pod

# 查看某个特定 Pod 的详细信息
kubectl get pod <pod_name>

# 以 YAML 格式展示某个 Pod 的配置
kubectl get pod <pod_name> -o yaml

# 查看资源内部详细信息 (包含事件、IP 节点等)
kubectl describe pods <pod_name>

# 查看资源帮助文档 (例如查看 deployment 的字段说明)
kubectl explain deployment
kubectl explain deployment.spec

# 删除资源 (例如删除名为 web 的 deployment)
kubectl delete deployments.apps web

2.3 Pod 的创建与管理

2.3.1 命令式创建 (自主式 Pod,生产不推荐)
# 创建一个名为 testpod 的 Pod,使用 nginx 镜像
kubectl run testpod --image nginx

# 查看 Pod 运行状态及宽格式输出 (显示 IP 和节点)
kubectl get pods -o wide

# 创建一个交互式 Pod (用于调试)
kubectl run -it testpod --image busybox

# 创建一个非交互式 Pod
kubectl run nginxX --image nginx
2.3.2 控制器管理 (推荐方式)
# 创建一个名为 webcluster 的 Deployment 控制器,镜像 nginx,副本数 2
kubectl create deployment webcluster --image nginx --replicas 2

# 查看控制器状态
kubectl get deployments.apps

# 扩容:将 timinglee  deployment 的副本数调整为 6
kubectl scale deployment timinglee --replicas 6

# 缩容:将 timinglee  deployment 的副本数调整为 2
kubectl scale deployment timinglee --replicas 2

2.4 调试与日志管理

# 输出容器在 Pod 中的日志
kubectl logs pods/<pod_name>

# 查看特定容器的日志 (多容器 Pod 场景)
kubectl logs <pod_name> -c <container_name>

# 进入运行中的容器 (交互环境)
kubectl attach pods/<pod_name> -it

# 在运行中的 Pod 中执行指定命令 (例如进入 bash)
kubectl exec -it pods/<pod_name> -- /bin/bash

# 将本机文件复制到 Pod 中
kubectl cp <本地文件路径> <pod_name>:/<容器内路径>

# 将 Pod 中的文件复制到本机
kubectl cp <pod_name>:/<容器内文件路径> <本地文件路径>

2.5 声明式配置 (YAML 部署)

2.5.1 生成与 apply
# 利用命令生成 YAML 模板文件 (dry-run 模式)
kubectl create deployment webcluster --image nginx --dry-run=client -o yaml > webcluster.yml

# 利用 YAML 文件生成资源
kubectl apply -f webcluster.yml

# 利用 YAML 文件删除资源
kubectl delete -f webcluster.yml
2.5.2 标签管理
# 查看 Pod 及其标签
kubectl get pods --show-labels

# 给 Pod 添加标签
kubectl label pods <pod_name> app=lee

# 更改标签 (覆盖现有标签)
kubectl label pods <pod_name> app=webcluster --overwrite

# 删除标签 (将值设为 -)
kubectl label pods <pod_name> app-

2.6 应用版本更新与回滚

# 查看 Deployment 的历史版本
kubectl rollout history deployment <deployment_name>

# 更新控制器镜像版本 (将 myapp 容器镜像更新为 v2)
kubectl set image deployments/<deployment_name> myapp=myapp:v2

# 版本回滚到指定版本 (例如回滚到 revision 1)
kubectl rollout undo deployment <deployment_name> --to-revision 1

2.7 高级配置实操 (YAML 示例)

2.7.1 多容器 Pod 与网络共享
# pod.yml 示例:理解 Pod 间网络整合 (容器间通过 localhost 通信)
apiVersion: v1
kind: Pod
metadata:
  name: test
  labels:
    run: timinglee
spec:
  containers:
  - image: myapp:v1
    name: myapp1
  - image: busybox:latest
    name: busybox
    command: ["/bin/sh", "-c", "sleep 1000000"]
  • 注释:在 busybox 容器中 curl localhost 可访问 myapp1 容器服务,因为同 Pod 容器共享网络 namespace。
2.7.2 资源限制 (QoS 配置)
# pod.yml 示例:设定资源限制 (Guaranteed 类型)
spec:
  containers:
  - name: myapp
    image: myapp:v1
    resources:
      limits:               # 资源使用上限
        cpu: 500m
        memory: 100M
      requests:             # 资源请求保障 (与 limits 一致则为 Guaranteed)
        cpu: 500m
        memory: 100M
2.7.3 存活探针 (Liveness Probe)
# pod.yml 示例:TCP 存活探测
spec:
  containers:
  - name: myapp
    image: myapp:v1
    livenessProbe:
      tcpSocket:            # 检测端口存在性
        port: 8080
      initialDelaySeconds: 3  # 容器启动后等待 3 秒开始探测
      periodSeconds: 1        # 探测间隔 1 秒
      timeoutSeconds: 1       # 超时时间 1 秒
  • 注释:若端口不通,kubelet 会杀死容器并根据重启策略重启,状态可能显示 CrashLoopBackOff
2.7.4 就绪探针 (Readiness Probe)
# pod.yml 示例:HTTP 就绪探测
spec:
  containers:
  - name: myapp
    image: myapp:v1
    readinessProbe:
      httpGet:
        path: /test.html      # 探测路径
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
  • 注释:若探测失败 (如 404),Pod 状态为 Running 但 READY 为 0/1,Service 不会将流量转发给该 Pod。需创建对应文件 (如 echo test > /usr/share/nginx/html/test.html) 使其就绪。
2.7.5 Init 容器
# pod.yml 示例:初始化容器
spec:
  initContainers:
  - name: init-myservice
    image: busybox
    command: ["sh", "-c", "until test -e /testfile; do echo waiting for myservice; sleep 2; done"]
  containers:
  - name: myapp
    image: myapp:v1
  • 注释:主容器 myapp 会在 init-myservice 成功执行完毕 (即 /testfile 存在) 后才启动。
2.7.6 节点选择与主机网络
# 指定运行节点
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1

# 共享宿主机网络 (不使用 Docker 网桥)
spec:
  hostNetwork: true
  • 注释hostNetwork: true 时,容器直接使用宿主机网络栈,端口冲突风险增加,且同一宿主机无法启动相同端口的第二个副本。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐