1.1 Kubernetes简介
什么是Kubernetes
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由Google开发,现在由Cloud Native Computing Foundation (CNCF)维护。
核心特性
- 自动化部署和回滚 - 自动部署应用程序并在出现问题时回滚
- 服务发现和负载均衡 - 自动分配IP地址和DNS名称,并在多个容器间分配负载
- 存储编排 - 自动挂载存储系统,如本地存储、公有云存储等
- 自我修复 - 重启失败的容器,替换和重新调度不响应的容器
- 密钥和配置管理 - 管理敏感信息和应用程序配置
- 水平扩展 - 根据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的基础概念和架构,包括:
核心概念
- 集群架构 - Control Plane和Worker Node的组件及其作用
- 资源对象 - Pod、Deployment、Service等核心资源
- 网络模型 - 集群网络和服务发现机制
- 存储系统 - 持久化存储和动态供应
关键特性
- 声明式API - 通过YAML描述期望状态
- 自动化运维 - 自我修复、自动扩展、滚动更新
- 服务发现 - 内置DNS和负载均衡
- 资源管理 - 标签选择器和命名空间隔离
设计原则
- 声明式 - 描述期望状态而非执行步骤
- 控制器模式 - 持续监控并调整实际状态
- API驱动 - 所有操作通过API进行
- 可扩展性 - 支持插件和自定义资源
下一章我们将学习如何安装和配置Kubernetes集群,包括单节点和多节点集群的搭建方法。