Kubernetes 技术分享:入门学习 v1.34

42 阅读6分钟

一、为什么需要 Kubernetes?

在传统部署方式中,我们通常会遇到以下问题:

  • 应用部署依赖环境复杂,无法快速迁移
  • 扩容与缩容需要人工干预
  • 服务一旦宕机需要手动拉起
  • 多个应用之间资源抢占,没有统一管理方式

Docker 的出现让“应用即容器”成为现实,而 Kubernetes(简称 K8s)则让“容器集群”以自动化方式运行,成为容器编排领域的事实标准。

📌 Kubernetes 解决的问题

  • 自动化部署与滚动更新
  • 应用自愈(Self-Healing)
  • 负载均衡与服务发现
  • 资源调度与隔离
  • 弹性扩缩容

二、Kubernetes 架构与核心概念

🌐 1. Kubernetes 架构图(Control Plane & Worker)

image.png K8s 的架构分为两大部分:

控制平面(Control Plane)

组件功能
kube-apiserver集群 API 入口,所有操作都通过它
etcd分布式键值存储,保存集群状态
kube-scheduler决定 Pod 调度到哪个节点
kube-controller-manager运行控制器(如 Deployment、Node 控制器)
cloud-controller-manager与云厂商交互(如 AWS、阿里云)

节点(Worker Node)

组件功能
kubelet负责 Pod 生命周期
kube-proxy负责网络转发
Container Runtime容器运行时(如 containerd、CRI-O)

📦 三、K8s 常用资源对象

🧩 常用 Kubernetes 资源及使用场景

资源类型资源名称典型使用场景说明
工作负载(Workloads)Pod调试、单容器任务、作为其他控制器的基础单元最小调度单位,通常不直接创建,由控制器管理
Deployment无状态应用部署(如 Web 服务、API 服务)支持滚动更新、回滚、扩缩容,最常用的工作负载
StatefulSet有状态应用(如 MySQL、Redis、ZooKeeper、Kafka)提供稳定的网络标识(hostname)、有序启停、持久化存储绑定
DaemonSet每节点运行一个 Pod(如日志采集、监控代理、网络插件)适用于集群级守护进程,新节点自动部署
Job一次性任务(如数据迁移、批处理计算)运行到成功完成即终止
CronJob定时任务(如每日备份、报表生成)基于 Cron 表达式周期性触发 Job
HorizontalPodAutoscaler (HPA)自动扩缩容根据 CPU、内存或自定义指标动态调整 Pod 副本数
服务与网络(Service & Networking)Service为 Pod 提供稳定访问入口支持 ClusterIP(集群内)、NodePort(节点端口)、LoadBalancer(云厂商 LB)
IngressHTTP/HTTPS 路由到多个 Service需配合 Ingress Controller(如 Nginx、Traefik),实现域名/路径路由
IngressClass指定 Ingress 使用的控制器类型多 Ingress Controller 场景下区分路由策略
NetworkPolicy限制 Pod 间网络通信实现"零信任"网络,仅允许白名单流量(需 CNI 支持,如 Calico)
配置与存储(Config & Storage)ConfigMap注入非敏感配置(如 app.conf、环境变量)可通过 Volume 或 env 引用,支持热更新(部分场景)
Secret存储敏感信息(密码、Token、TLS 证书)Base64 编码(非加密),建议配合 etcd 加密或外部 Vault
PersistentVolume (PV)集群级持久化存储(如云盘、NFS)由管理员预配或通过 StorageClass 动态创建
PersistentVolumeClaim (PVC)用户申请存储资源Pod 通过 PVC 挂载 PV,解耦存储使用与供给
StorageClass定义存储类型(SSD/HDD、快照策略等)支持动态卷供应(Dynamic Provisioning)
集群与策略(Cluster & Policy)Namespace多租户隔离(dev / test / prod)逻辑分区,资源配额和权限可按 Namespace 控制
ResourceQuota限制命名空间资源总量(CPU、内存、Pod 数等)防止单个团队耗尽集群资源
LimitRange设置 Pod 默认/最小/最大资源请求避免用户提交无资源限制的 Pod
PodDisruptionBudget (PDB)保障高可用(自愿中断时最少可用 Pod 数)确保滚动升级或节点维护时不中断服务
Role / RoleBinding命名空间级 RBAC 权限控制授权用户/ServiceAccount 操作特定资源
ClusterRole / ClusterRoleBinding集群级权限控制如监控组件读取所有节点信息
扩展机制CustomResourceDefinition (CRD)扩展 K8s API(如 Istio 的 VirtualService、Prometheus 的 ServiceMonitor)与自定义控制器(Operator)配合,实现领域自动化
APIService注册聚合 API(如 metrics-server)将外部服务注册为 K8s API 的子资源

Namespace

创建ns.yml

apiVersion: v1
kind: Namespace
metadata:
  name: dev

执行命令 kubectl apply -f ns.yml

# 将当前 kubectl 上下文的默认命名空间设为 dev
kubectl config set-context --current --namespace=dev

# 查看当前默认命名空间:
kubectl config view --minify | grep namespace

Pod

K8s 的最小调度单位,一般不直接使用 Pod。

示例:运行一个 Nginx Pod

创建nginx.yml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev   # ← 关键:资源绑定到 dev 命名空间
  labels:
    app: nginx
spec:
  containers:
    - name: nginx-app
      image: docker.1ms.run/library/nginx:latest
      # imagePullPolicy: Never 
      ports:
        - containerPort: 80
          protocol: TCP
  restartPolicy: Always

执行命令 kubectl apply -f nginx.yml

Deployment

管理 Pod 的理想方式,提供滚动更新。

示例:运行一个 3 副本的 Web Deployment

创建 nginx-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: dev   # ← 关键:资源绑定到 dev 命名空间
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-demo
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
        - name: app
          image: docker.1ms.run/library/nginx:latest

执行命令 kubectl apply -f nginx-deployment.yml

Service

提供稳定访问入口,解决 Pod IP 会变的问题。

创建 nginx-service.yml

apiVersion: v1
kind: Service
metadata:
  name: web-demo-service
  namespace: dev   # ← 关键:资源绑定到 dev 命名空间
spec:
  selector:
    app: web-demo
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort

执行命令 kubectl apply -f nginx-service.yml

四 常用 kubectl 命令分类汇总

1. 查看资源(Read)

# 查看 Pod 
kubectl get pods 
kubectl get pods -n <namespace> 
kubectl get pods --all-namespaces 

# 查看 Deployment / Service / ConfigMap 等 
kubectl get deploy 
kubectl get svc 
kubectl get cm 
kubectl get ns 

# 查看命名空间 
# 详细描述资源(含事件、挂载、IP 等) 
kubectl describe pod <pod-name> 

# 实时监听资源变化 
kubectl get pods -w

2. 创建与部署(Create / Apply)

# 声明式部署(推荐)
kubectl apply -f my-app.yaml

# 快速创建(仅用于测试)
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

# 从模板生成 YAML(不实际创建)
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deploy.yaml

3. 删除资源(Delete)

kubectl delete pod <pod-name>
kubectl delete -f my-app.yaml
kubectl delete deploy nginx
kubectl delete all --all -n test   # 删除命名空间内所有资源(慎用!)

4. 调试与日志(Debug)

# 查看容器日志
kubectl logs <pod-name>
kubectl logs -f <pod-name> --tail=50    # 实时跟踪最后 50 行

# 进入容器执行命令
kubectl exec -it <pod-name> -- sh
kubectl exec <pod-name> -- cat /etc/hosts

# 端口转发(本地访问 Pod 服务)
kubectl port-forward <pod-name> 8080:80

5. 更新与扩缩容(Update / Scale)

# 扩容 Deployment
kubectl scale deploy nginx --replicas=5

# 滚动更新镜像
kubectl set image deploy/nginx nginx=nginx:1.25

# 暂停/恢复 Deployment
kubectl rollout pause deploy/nginx
kubectl rollout resume deploy/nginx

# 查看发布历史 & 回滚
kubectl rollout history deploy/nginx
kubectl rollout undo deploy/nginx
kubectl rollout undo deploy/nginx --to-revision=2

6. 配置与上下文管理

# 查看当前配置
kubectl config view

# 切换上下文(集群/用户)
kubectl config use-context my-cluster

# 设置默认命名空间(避免每次加 -n)
kubectl config set-context --current --namespace=dev

 7. 其他实用技巧

# 快速查看集群信息
kubectl cluster-info

# 查看节点资源使用
kubectl top nodes
kubectl top pods

# 获取所有 API 资源类型
kubectl api-resources

# 查看支持的 API 版本
kubectl api-versions

最佳实践建议

  • ✅ 生产环境优先使用 kubectl apply + YAML 文件,便于版本控制(GitOps)。
  • ✅ 使用 --dry-run=client 预览效果,避免误操作。
  • ✅ 为 Pod 设置 resources.requests/limits,防止资源争抢。
  • ✅ 结合 kubectl explain 学习官方 API 字段含义。
  • ❌ 避免在生产中频繁使用命令式创建(如 kubectl run),难以追溯和复现。