1.1 Kubernetes简介

什么是Kubernetes

Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由Google开发,现在由Cloud Native Computing Foundation (CNCF)维护。

核心特性

  1. 自动化部署和回滚 - 自动部署应用程序并在出现问题时回滚
  2. 服务发现和负载均衡 - 自动分配IP地址和DNS名称,并在多个容器间分配负载
  3. 存储编排 - 自动挂载存储系统,如本地存储、公有云存储等
  4. 自我修复 - 重启失败的容器,替换和重新调度不响应的容器
  5. 密钥和配置管理 - 管理敏感信息和应用程序配置
  6. 水平扩展 - 根据CPU使用率或其他指标自动扩展应用程序

为什么需要Kubernetes

传统部署方式的问题: - 资源利用率低 - 应用程序之间相互影响 - 扩展困难 - 部署复杂

容器化部署的优势: - 资源隔离 - 轻量级 - 可移植性 - 快速启动

Kubernetes的价值: - 自动化运维 - 高可用性 - 弹性伸缩 - 服务治理

1.2 Kubernetes架构

整体架构图

┌─────────────────────────────────────────────────────────────┐
│                    Kubernetes Cluster                       │
├─────────────────────────────────────────────────────────────┤
│                     Control Plane                          │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐           │
│  │   API       │ │   etcd      │ │ Scheduler   │           │
│  │   Server    │ │             │ │             │           │
│  └─────────────┘ └─────────────┘ └─────────────┘           │
│  ┌─────────────┐ ┌─────────────┐                           │
│  │ Controller  │ │ Cloud       │                           │
│  │ Manager     │ │ Controller  │                           │
│  └─────────────┘ └─────────────┘                           │
├─────────────────────────────────────────────────────────────┤
│                      Worker Nodes                          │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ Node 1                                              │   │
│  │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐     │   │
│  │ │ kubelet │ │ kube-   │ │  Pod 1  │ │  Pod 2  │     │   │
│  │ │         │ │ proxy   │ │         │ │         │     │   │
│  │ └─────────┘ └─────────┘ └─────────┘ └─────────┘     │   │
│  └─────────────────────────────────────────────────────┘   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ Node 2                                              │   │
│  │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐     │   │
│  │ │ kubelet │ │ kube-   │ │  Pod 3  │ │  Pod 4  │     │   │
│  │ │         │ │ proxy   │ │         │ │         │     │   │
│  │ └─────────┘ └─────────┘ └─────────┘ └─────────┘     │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

Control Plane组件

1. API Server (kube-apiserver)

作用: - Kubernetes集群的前端,所有组件都通过API Server进行通信 - 提供RESTful API接口 - 负责认证、授权、准入控制 - 是唯一与etcd直接交互的组件

特点: - 无状态设计 - 支持水平扩展 - 所有操作都通过API Server

2. etcd

作用: - 分布式键值存储系统 - 存储集群的所有配置信息和状态数据 - 提供数据的一致性和高可用性

存储内容: - 集群配置信息 - 资源对象的状态 - 网络配置 - 密钥和配置映射

3. Scheduler (kube-scheduler)

作用: - 负责Pod的调度决策 - 根据资源需求、约束条件等选择合适的节点 - 考虑亲和性、反亲和性、污点和容忍等因素

调度流程: 1. 过滤阶段:筛选可用节点 2. 打分阶段:为节点打分 3. 选择阶段:选择最高分节点

4. Controller Manager (kube-controller-manager)

作用: - 运行各种控制器 - 监控集群状态并做出相应调整 - 确保实际状态与期望状态一致

主要控制器: - Node Controller:监控节点状态 - Replication Controller:维护Pod副本数量 - Endpoints Controller:管理Service端点 - Service Account & Token Controllers:管理服务账户和令牌

5. Cloud Controller Manager

作用: - 与云提供商API交互 - 管理云特定的控制器 - 实现云平台的集成

功能: - 节点管理 - 路由管理 - 服务负载均衡 - 存储卷管理

Worker Node组件

1. kubelet

作用: - 节点上的主要代理 - 与API Server通信 - 管理Pod的生命周期 - 监控容器健康状态

功能: - Pod管理 - 容器运行时交互 - 节点状态报告 - 资源监控

2. kube-proxy

作用: - 网络代理组件 - 实现Service的网络规则 - 提供负载均衡功能

代理模式: - iptables模式(默认) - IPVS模式 - userspace模式(已弃用)

3. Container Runtime

作用: - 负责运行容器 - 管理容器镜像 - 提供容器运行环境

支持的运行时: - Docker - containerd - CRI-O - rkt(已弃用)

1.3 核心概念

1. Pod

定义: Pod是Kubernetes中最小的可部署单元,包含一个或多个紧密相关的容器。

特点: - 共享网络和存储 - 同一Pod中的容器总是被调度到同一节点 - 具有唯一的IP地址 - 生命周期短暂

Pod示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.20
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: sidecar
    image: busybox
    command: ['sh', '-c', 'while true; do echo $(date) >> /var/log/app.log; sleep 30; done']
    volumeMounts:
    - name: log-volume
      mountPath: /var/log
  volumes:
  - name: log-volume
    emptyDir: {}

2. ReplicaSet

定义: ReplicaSet确保指定数量的Pod副本在任何时候都在运行。

功能: - 维护Pod副本数量 - 自动替换失败的Pod - 支持扩缩容

ReplicaSet示例:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        ports:
        - containerPort: 80

3. Deployment

定义: Deployment为Pod和ReplicaSet提供声明式更新。

功能: - 管理ReplicaSet - 支持滚动更新 - 支持回滚 - 支持暂停和恢复

Deployment示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

4. Service

定义: Service是一种抽象,定义了一组Pod的逻辑集合和访问策略。

类型: - ClusterIP:集群内部访问(默认) - NodePort:通过节点端口访问 - LoadBalancer:通过云提供商的负载均衡器访问 - ExternalName:通过DNS CNAME记录访问

Service示例:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080
  type: NodePort

5. Namespace

定义: Namespace提供了一种在单个集群中隔离资源组的方法。

默认命名空间: - default:默认命名空间 - kube-system:系统组件命名空间 - kube-public:公共资源命名空间 - kube-node-lease:节点租约命名空间

Namespace示例:

apiVersion: v1
kind: Namespace
metadata:
  name: development
  labels:
    environment: dev
    team: backend

6. ConfigMap

定义: ConfigMap用于存储非敏感的配置数据。

使用方式: - 环境变量 - 命令行参数 - 配置文件

ConfigMap示例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database_host: "mysql.example.com"
  database_port: "3306"
  log_level: "info"
  app.properties: |
    server.port=8080
    spring.datasource.url=jdbc:mysql://mysql.example.com:3306/mydb
    spring.datasource.username=user
    logging.level.root=INFO

7. Secret

定义: Secret用于存储敏感数据,如密码、令牌、密钥等。

类型: - Opaque:任意用户定义的数据 - kubernetes.io/service-account-token:服务账户令牌 - kubernetes.io/dockercfg:Docker配置文件 - kubernetes.io/tls:TLS证书和密钥

Secret示例:

apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  username: YWRtaW4=  # base64编码的"admin"
  password: MWYyZDFlMmU2N2Rm  # base64编码的密码
---
apiVersion: v1
kind: Secret
metadata:
  name: tls-secret
type: kubernetes.io/tls
data:
  tls.crt: LS0tLS1CRUdJTi... # base64编码的证书
  tls.key: LS0tLS1CRUdJTi... # base64编码的私钥

1.4 资源对象管理

1. 标签和选择器

标签(Labels): - 键值对形式的元数据 - 用于标识和组织资源 - 支持查询和选择

选择器(Selectors): - 基于标签选择资源 - 支持等值和集合操作

示例:

# 标签示例
metadata:
  labels:
    app: nginx
    version: v1.20
    environment: production
    tier: frontend

# 选择器示例
selector:
  matchLabels:
    app: nginx
    environment: production
  matchExpressions:
  - key: version
    operator: In
    values: ["v1.20", "v1.21"]
  - key: tier
    operator: NotIn
    values: ["backend"]

2. 注解(Annotations)

定义: 注解是附加到对象的非标识性元数据。

用途: - 存储工具和库的配置信息 - 记录部署信息 - 存储调试信息

示例:

metadata:
  annotations:
    kubernetes.io/change-cause: "Update to nginx 1.20"
    deployment.kubernetes.io/revision: "3"
    prometheus.io/scrape: "true"
    prometheus.io/port: "9090"
    nginx.ingress.kubernetes.io/rewrite-target: "/"

3. 字段选择器

定义: 字段选择器允许根据资源字段的值选择Kubernetes资源。

支持的字段: - metadata.name - metadata.namespace - status.phase(对于Pod) - spec.nodeName(对于Pod)

示例:

# 选择特定名称的Pod
kubectl get pods --field-selector metadata.name=nginx-pod

# 选择运行状态的Pod
kubectl get pods --field-selector status.phase=Running

# 选择特定节点上的Pod
kubectl get pods --field-selector spec.nodeName=node-1

# 组合条件
kubectl get pods --field-selector status.phase=Running,spec.nodeName=node-1

1.5 Kubernetes API

1. API版本

版本格式: - Alpha:v1alpha1, v2alpha1 - Beta:v1beta1, v2beta1 - Stable:v1, v2

API组: - 核心组(Core Group):/api/v1 - 命名组(Named Groups):/apis/GROUP_NAME/VERSION

2. 资源类型

核心资源: - Pod - Service - ConfigMap - Secret - Namespace - Node - PersistentVolume - PersistentVolumeClaim

扩展资源: - Deployment(apps/v1) - StatefulSet(apps/v1) - DaemonSet(apps/v1) - Ingress(networking.k8s.io/v1) - NetworkPolicy(networking.k8s.io/v1)

3. API操作

CRUD操作: - CREATE:创建资源 - READ:读取资源 - UPDATE:更新资源 - DELETE:删除资源

特殊操作: - PATCH:部分更新 - WATCH:监听资源变化 - LIST:列出资源

示例:

# 创建资源
kubectl create -f deployment.yaml

# 读取资源
kubectl get deployment nginx-deployment

# 更新资源
kubectl apply -f deployment.yaml

# 删除资源
kubectl delete deployment nginx-deployment

# 部分更新
kubectl patch deployment nginx-deployment -p '{"spec":{"replicas":5}}'

# 监听变化
kubectl get pods --watch

1.6 集群网络

1. 网络模型

Kubernetes网络要求: - 每个Pod都有唯一的IP地址 - Pod之间可以直接通信,无需NAT - 节点和Pod之间可以直接通信 - Pod看到的自己的IP地址与其他Pod看到的一致

2. 网络组件

CNI(Container Network Interface): - 定义容器网络接口标准 - 支持插件化网络解决方案

常见CNI插件: - Flannel:简单的覆盖网络 - Calico:基于BGP的网络和网络策略 - Weave:简单易用的网络解决方案 - Cilium:基于eBPF的高性能网络

3. 服务网络

ClusterIP: - 集群内部虚拟IP - 通过kube-proxy实现负载均衡 - 默认服务类型

NodePort: - 在每个节点上开放端口 - 端口范围:30000-32767 - 可以从集群外部访问

LoadBalancer: - 云提供商的负载均衡器 - 自动分配外部IP - 适用于云环境

ExternalName: - DNS CNAME记录 - 将服务映射到外部DNS名称 - 不提供代理功能

1.7 存储系统

1. 存储类型

临时存储: - emptyDir:Pod生命周期内的临时存储 - hostPath:挂载节点文件系统路径

持久存储: - PersistentVolume(PV):集群级别的存储资源 - PersistentVolumeClaim(PVC):用户对存储的请求

2. 存储类(StorageClass)

定义: StorageClass为管理员提供了描述存储”类”的方法。

功能: - 动态供应存储 - 定义存储参数 - 支持不同的存储后端

示例:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  replication-type: none
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer

3. 卷类型

常见卷类型: - awsElasticBlockStore - azureDisk - gcePersistentDisk - nfs - iscsi - cephfs - glusterfs

总结

本章介绍了Kubernetes的基础概念和架构,包括:

核心概念

  1. 集群架构 - Control Plane和Worker Node的组件及其作用
  2. 资源对象 - Pod、Deployment、Service等核心资源
  3. 网络模型 - 集群网络和服务发现机制
  4. 存储系统 - 持久化存储和动态供应

关键特性

  1. 声明式API - 通过YAML描述期望状态
  2. 自动化运维 - 自我修复、自动扩展、滚动更新
  3. 服务发现 - 内置DNS和负载均衡
  4. 资源管理 - 标签选择器和命名空间隔离

设计原则

  1. 声明式 - 描述期望状态而非执行步骤
  2. 控制器模式 - 持续监控并调整实际状态
  3. API驱动 - 所有操作通过API进行
  4. 可扩展性 - 支持插件和自定义资源

下一章我们将学习如何安装和配置Kubernetes集群,包括单节点和多节点集群的搭建方法。