前言:容器编排的标准

到目前为止,我们已经学习了如何通过Docker创建和管理容器。但在实际生产环境中,需要在多台服务器上运行数十甚至数百个容器。此时手动管理每个容器实际上是不可能的。

在本第6篇中,我们将了解已成为容器编排事实标准的Kubernetes(简称K8s)的基础概念和架构。理解什么是Kubernetes、为什么需要它以及它是如何构成的,将帮助您在云原生环境中对应用程序运营有一个全面的认识。

1. 什么是Kubernetes?

1.1 Kubernetes的定义

Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。它在希腊语中意为"舵手"或"飞行员",扮演着适当运输和管理容器这一"货物"的角色。

"K8s"这个缩写来源于K和s之间有8个字母(ubernete)。

1.2 Kubernetes的历史

  • 2014年:Google基于其内部使用的Borg系统的经验,将Kubernetes开源发布
  • 2015年:发布1.0版本,捐赠给云原生计算基金会(CNCF)
  • 2018年:成为CNCF的第一个"毕业"项目
  • 现在:已成为容器编排的事实标准

1.3 Kubernetes提供的功能

  • 服务发现和负载均衡:通过DNS名称或IP地址暴露容器,并分发流量
  • 存储编排:自动挂载本地存储、云存储等
  • 自动化滚动更新和回滚:逐步部署应用程序更改,出现问题时回滚到先前版本
  • 自动装箱(Bin Packing):根据资源需求将容器最优放置在节点上
  • 自我修复(Self-healing):重启失败的容器,替换无响应的容器
  • 密钥和配置管理:安全存储和管理敏感信息

2. 为什么需要Kubernetes?

2.1 仅使用Docker不足的原因

在单个服务器上运行几个容器时,仅使用Docker就足够了。但在实际生产环境中,有以下需求:

  • 在多台服务器上分布部署数百个容器
  • 流量增加时自动扩展容器数量
  • 容器故障时自动恢复
  • 无停机部署(滚动更新、蓝绿部署、金丝雀部署)
  • 容器间网络和存储管理
  • 资源监控和日志记录

2.2 容器编排的必要性

容器编排是指自动化容器的部署、管理、扩展和网络连接。就像交响乐团的指挥协调各种乐器一样,容器编排器协调众多容器。

手动管理的问题 编排的解决方案
服务器故障时需要手动恢复 自动故障检测和恢复
流量增加时需要手动扩展 自动扩缩容(HPA、VPA)
部署时发生停机 无停机滚动更新
容器放置优化困难 自动调度和装箱
服务间通信复杂 服务发现和负载均衡

2.3 Kubernetes vs 其他编排工具

  • Docker Swarm:Docker原生编排,简单但功能有限
  • Apache Mesos:通用集群管理工具,学习曲线陡峭
  • Nomad:HashiCorp的编排工具,轻量级
  • Kubernetes:功能最多,生态系统最大,事实标准

3. Kubernetes架构

Kubernetes集群主要由Control Plane(控制平面)和Worker Node(工作节点)组成。

3.1 Control Plane(主节点)

Control Plane充当集群的"大脑"。它管理集群的状态,并调度在工作节点上运行的工作负载。

3.1.1 API Server(kube-apiserver)

Kubernetes所有通信的中心。kubectl命令、其他组件和外部客户端都通过API Server与集群交互。

  • 提供RESTful API
  • 处理认证(Authentication)、授权(Authorization)
  • 请求验证
  • 与etcd的唯一通信渠道

3.1.2 etcd

存储集群所有状态数据的分布式键值存储。

  • 存储集群配置、状态、元数据
  • 通常配置为3个或5个实例以实现高可用性
  • 使用Raft共识算法
  • 集群备份 = etcd备份

3.1.3 Scheduler(kube-scheduler)

决定新创建的Pod应该放置在哪个节点上。

  • 考虑资源需求(CPU、内存)
  • 检查节点的可用资源
  • 应用亲和性/反亲和性规则
  • 处理污点(Taint)和容忍(Toleration)

3.1.4 Controller Manager(kube-controller-manager)

运行各种控制器以将集群状态维持在期望状态。

  • Node Controller:监控节点状态
  • Replication Controller:维护Pod数量
  • Endpoints Controller:连接Service和Pod
  • Service Account Controller:创建账户和令牌

3.1.5 Cloud Controller Manager(可选)

与云提供商的API集成,管理云特定功能。

  • 负载均衡器配置
  • 存储卷管理
  • 节点管理(云实例)

3.2 Worker Node

Worker Node是实际运行应用程序容器的服务器。

3.2.1 kubelet

在每个节点上运行的代理,管理Pod的生命周期。

  • 从API Server接收Pod规范(PodSpec)
  • 向容器运行时请求创建/删除容器
  • 监控容器状态并报告
  • 向API Server报告节点状态信息

3.2.2 kube-proxy

在每个节点上执行网络代理角色。

  • 将Service的虚拟IP映射到实际Pod IP
  • 管理iptables或IPVS规则
  • 路由集群内部和外部流量
  • 负载均衡(轮询)

3.2.3 Container Runtime

实际运行容器的软件。

  • containerd:从Docker分离出来的行业标准运行时
  • CRI-O:Kubernetes专用轻量级运行时
  • Docker Engine:从Kubernetes 1.24开始停止直接支持(移除dockershim)

3.3 架构图

┌─────────────────────────────────────────────────────────────────┐
│                       CONTROL PLANE                             │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐             │
│  │ API Server  │  │  Scheduler  │  │ Controller  │             │
│  │             │  │             │  │  Manager    │             │
│  └──────┬──────┘  └─────────────┘  └─────────────┘             │
│         │                                                       │
│  ┌──────┴──────┐                                               │
│  │    etcd     │                                               │
│  │ (Key-Value) │                                               │
│  └─────────────┘                                               │
└─────────────────────────────────────────────────────────────────┘
                              │
                              │ (API 通信)
                              │
┌─────────────────────────────────────────────────────────────────┐
│                       WORKER NODE 1                             │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐             │
│  │   kubelet   │  │  kube-proxy │  │  Container  │             │
│  │             │  │             │  │   Runtime   │             │
│  └─────────────┘  └─────────────┘  └─────────────┘             │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐                           │
│  │  Pod 1  │ │  Pod 2  │ │  Pod 3  │                           │
│  └─────────┘ └─────────┘ └─────────┘                           │
└─────────────────────────────────────────────────────────────────┘

4. Kubernetes核心对象

4.1 Pod

Pod是Kubernetes中可以创建和管理的最小部署单元。

Pod的特点:

  • 包含一个或多个容器
  • 同一Pod中的容器共享网络和存储
  • 同一Pod中的容器通过localhost通信
  • 通常是一个主容器 + 辅助容器(Sidecar)
  • Pod是临时的(ephemeral)- 可能随时被删除和重新创建
# pod-example.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.24
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

4.2 Service

Service为Pod集合提供稳定的网络端点。Pod的IP可能会改变,但Service的IP(ClusterIP)是固定的。

Service类型:

  • ClusterIP(默认):只能在集群内部访问
  • NodePort:通过每个节点的特定端口允许外部访问
  • LoadBalancer:通过云负载均衡器进行外部访问
  • ExternalName:将外部DNS名称映射到集群内部
# service-example.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx    # 将流量转发到具有此标签的Pod
  ports:
  - protocol: TCP
    port: 80        # Service端口
    targetPort: 80  # Pod的容器端口
  type: ClusterIP

4.3 Deployment

Deployment提供Pod的声明式更新。定义期望的状态后,Deployment Controller会使实际状态达到期望状态。

Deployment的功能:

  • 管理Pod数量(replicas)
  • 滚动更新和回滚
  • 扩缩容(手动/自动)
  • Pod模板管理
# deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3    # 维护3个Pod
  selector:
    matchLabels:
      app: nginx
  template:      # Pod模板
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 滚动更新时可额外创建的Pod数
      maxUnavailable: 0  # 滚动更新时不可用的Pod数

4.4 Namespace

Namespace是逻辑上分离集群的虚拟集群。

默认Namespace:

  • default:未指定时创建资源的默认命名空间
  • kube-system:用于Kubernetes系统组件
  • kube-public:所有用户都可以读取的公共资源
  • kube-node-lease:存储节点心跳信息
# namespace-example.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: development
  labels:
    environment: dev
---
apiVersion: v1
kind: Namespace
metadata:
  name: production
  labels:
    environment: prod

Namespace的用途:

  • 环境隔离(dev、staging、production)
  • 按团队隔离资源
  • 应用资源配额(ResourceQuota)
  • 应用网络策略(NetworkPolicy)

5. kubectl基础

kubectl是与Kubernetes集群交互的命令行工具。

5.1 kubectl安装

# macOS (Homebrew)
brew install kubectl

# Windows (Chocolatey)
choco install kubernetes-cli

# Linux (curl)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

5.2 基本命令结构

kubectl [command] [TYPE] [NAME] [flags]

# 示例
kubectl get pods                    # 查看所有Pod
kubectl get pod nginx-pod           # 查看特定Pod
kubectl get pods -n kube-system     # 查看kube-system命名空间的Pod
kubectl get pods -o wide            # 包含详细信息的查看
kubectl get pods -o yaml            # 以YAML格式输出

5.3 常用命令

资源查询(get)

# 查看Pod列表
kubectl get pods
kubectl get pods -A                 # 所有命名空间

# 查看Service列表
kubectl get services
kubectl get svc                     # 使用缩写

# 查看Deployment列表
kubectl get deployments
kubectl get deploy                  # 使用缩写

# 同时查看多种资源
kubectl get pods,services,deployments

# 按标签过滤
kubectl get pods -l app=nginx

# 查看所有资源
kubectl get all

资源详细信息(describe)

# Pod详细信息
kubectl describe pod nginx-pod

# Node详细信息
kubectl describe node node-1

# Service详细信息
kubectl describe service nginx-service

创建资源(create、apply)

# 使用YAML文件创建资源
kubectl apply -f deployment.yaml

# 应用目录中的所有YAML文件
kubectl apply -f ./manifests/

# 命令式创建资源
kubectl create deployment nginx --image=nginx:1.24
kubectl create namespace my-namespace

# Dry-run(不实际创建进行测试)
kubectl apply -f deployment.yaml --dry-run=client

修改资源(edit、patch、scale)

# 直接编辑资源(打开编辑器)
kubectl edit deployment nginx-deployment

# 使用patch进行部分修改
kubectl patch deployment nginx-deployment -p '{"spec":{"replicas":5}}'

# 调整规模
kubectl scale deployment nginx-deployment --replicas=5

删除资源(delete)

# 删除特定资源
kubectl delete pod nginx-pod
kubectl delete deployment nginx-deployment

# 删除YAML文件中定义的资源
kubectl delete -f deployment.yaml

# 按标签删除
kubectl delete pods -l app=nginx

# 删除命名空间及其中的所有资源
kubectl delete namespace development

日志和调试

# 查看Pod日志
kubectl logs nginx-pod
kubectl logs nginx-pod -f           # 实时日志流
kubectl logs nginx-pod --previous   # 上一个容器的日志

# 多容器Pod中查看特定容器日志
kubectl logs nginx-pod -c sidecar

# 在Pod内部执行命令
kubectl exec nginx-pod -- ls /usr/share/nginx/html
kubectl exec -it nginx-pod -- /bin/bash  # 交互式shell

# 端口转发(在本地访问Pod)
kubectl port-forward pod/nginx-pod 8080:80
kubectl port-forward service/nginx-service 8080:80

5.4 上下文和命名空间管理

# 查看当前上下文
kubectl config current-context

# 查看可用上下文列表
kubectl config get-contexts

# 切换上下文
kubectl config use-context my-cluster

# 更改默认命名空间
kubectl config set-context --current --namespace=development

5.5 有用的kubectl插件和工具

# kubectx - 快速切换上下文
brew install kubectx
kubectx                  # 上下文列表和切换
kubens                   # 命名空间列表和切换

# k9s - 终端UI
brew install k9s
k9s

# kubectl自动补全(bash)
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

# kubectl别名设置
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get services'

6. 实践:部署第一个应用程序

6.1 本地Kubernetes环境设置

# 在Docker Desktop中启用Kubernetes
# Settings > Kubernetes > Enable Kubernetes

# 或使用Minikube
brew install minikube
minikube start

# 检查集群状态
kubectl cluster-info
kubectl get nodes

6.2 部署Nginx

# 1. 创建Deployment
kubectl create deployment nginx-demo --image=nginx:1.24

# 2. 确认Deployment
kubectl get deployments
kubectl get pods

# 3. 创建Service(NodePort类型)
kubectl expose deployment nginx-demo --type=NodePort --port=80

# 4. 确认Service
kubectl get services

# 5. 访问测试(Minikube)
minikube service nginx-demo

# 6. 或使用端口转发
kubectl port-forward service/nginx-demo 8080:80
# 在浏览器中访问 http://localhost:8080

6.3 扩缩容测试

# 扩展Pod数量
kubectl scale deployment nginx-demo --replicas=5

# 确认Pod
kubectl get pods -o wide

# 缩减Pod数量
kubectl scale deployment nginx-demo --replicas=2

6.4 滚动更新

# 更新镜像
kubectl set image deployment/nginx-demo nginx=nginx:1.25

# 检查滚动更新状态
kubectl rollout status deployment/nginx-demo

# 滚动更新历史
kubectl rollout history deployment/nginx-demo

# 回滚
kubectl rollout undo deployment/nginx-demo

6.5 清理

# 删除资源
kubectl delete deployment nginx-demo
kubectl delete service nginx-demo

# 或一次性删除
kubectl delete deployment,service nginx-demo

7. Kubernetes学习资源

7.1 官方文档

  • Kubernetes官方文档:https://kubernetes.io/docs/
  • Kubernetes教程:https://kubernetes.io/docs/tutorials/
  • kubectl速查表:https://kubernetes.io/docs/reference/kubectl/cheatsheet/

7.2 本地学习环境

  • Minikube:本地Kubernetes集群
  • Kind(Kubernetes in Docker):使用Docker容器运行集群
  • Docker Desktop:内置Kubernetes支持
  • k3s:轻量级Kubernetes发行版

7.3 在线实践环境

  • Katacoda:基于浏览器的Kubernetes实践
  • Play with Kubernetes:免费在线Kubernetes环境

结论

在本第6篇中,我们了解了Kubernetes的基础概念和架构。核心内容总结如下:

  • Kubernetes是什么:容器编排的事实标准平台
  • 架构:由Control Plane(API Server、etcd、Scheduler、Controller Manager)和Worker Node(kubelet、kube-proxy、Container Runtime)组成
  • 核心对象:Pod(最小部署单元)、Service(网络端点)、Deployment(声明式Pod管理)、Namespace(逻辑隔离)
  • kubectl:与Kubernetes集群交互的CLI工具

Kubernetes乍看起来可能很复杂,但一旦理解其设计理念——"声明式配置"和"期望状态(Desired State)",就会发现它是一个非常强大和灵活的工具。

下一篇我们将介绍Kubernetes实战。我们将探讨ConfigMap和Secret的配置管理、通过Ingress的外部流量路由、通过PersistentVolume的数据持久化等实际运营所需的高级主题。