mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
381 字
1 分钟
Kubernetes 核心架构与组件
2023-08-05

一、整体架构#

1.1 架构图#

graph TB subgraph "Control Plane (Master)" A["kube-apiserver"] B["etcd"] C["kube-scheduler"] D["kube-controller-manager"] E["cloud-controller-manager"] end subgraph "Node 1" F1["kubelet"] G1["kube-proxy"] H1["Container Runtime"] I1["Pod 1"] J1["Pod 2"] end subgraph "Node 2" F2["kubelet"] G2["kube-proxy"] H2["Container Runtime"] I2["Pod 3"] end A --> B A --> C A --> D A --> E A -.-> F1 A -.-> F2

1.2 组件职责#

组件类型职责
kube-apiserverControl Plane集群 API 网关,所有操作的入口
etcdControl Plane分布式键值存储,保存集群状态
kube-schedulerControl Plane调度 Pod 到合适的 Node
kube-controller-managerControl Plane运行各种控制器
cloud-controller-managerControl Plane与云服务商交互
kubeletNode管理 Pod 生命周期
kube-proxyNode网络代理,维护网络规则
Container RuntimeNode容器运行时(containerd)

二、Control Plane 组件#

2.1 kube-apiserver#

# API Server 是集群的统一入口
# 所有组件都通过它交互
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
# API Server 特性
# 1. 认证鉴权
kubectl get pods --token=<token>
# 2. 准入控制
# - LimitRanger
# - ResourceQuota
# - MutatingWebhook
# 3. 存储缓存
# watch 机制通知变更

2.2 etcd#

# etcd 是一致性键值存储
# 存储 Kubernetes 所有状态数据
# 重要数据
# - Pod 状态
# - Service 端点
# - ConfigMap/Secret
# - 调度信息
# 备份命令
ETCDCTL_API=3 etcdctl snapshot save backup.db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key

2.3 kube-scheduler#

# Scheduler 负责选择最佳 Node 运行 Pod
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
# 调度策略
nodeSelector:
disktype: ssd
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: memory
operator: GreaterThan
values:
- "8Gi"
tolerations:
- key: "node.kubernetes.io/not-ready"
operator: "Exists"
effect: "NoSchedule"

2.4 kube-controller-manager#

# 运行所有 Kubernetes 控制器
# 控制器列表
# - ReplicaSet Controller
# - Deployment Controller
# - DaemonSet Controller
# - StatefulSet Controller
# - Job Controller
# - CronJob Controller
# - Service Controller
# - Endpoint Controller
# - Namespace Controller
# - Node Controller

三、Node 组件#

3.1 kubelet#

# kubelet 是 Node 上的主要代理
# 1. 向 API Server 注册 Node
# 2. 创建/销毁 Pod
# 3. 监控容器健康
# 4. 报告资源使用
# kubelet 不会管理非 Kubernetes 创建的容器

3.2 kube-proxy#

# kube-proxy 维护网络规则
# 实现 Service 的负载均衡
# 模式
# 1. iptables (默认) - 规则匹配
# 2. IPVS - 适合大规模集群
# 3. Userspace - 旧模式,不推荐
# 查看 iptables 规则
iptables -L -t nat | grep KUBE-SERVICES

3.3 Container Runtime#

# 支持的容器运行时
# 1. containerd (推荐)
# 2. CRI-O
# 3. Docker (deprecated)
# CRI: Container Runtime Interface
# kubelet 通过 CRI 与容器运行时通信

四、Pod 生命周期#

4.1 Pod 状态#

状态说明
PendingPod 已被 Kubernetes 接受,等待调度
RunningPod 已绑定到 Node,容器正在运行
Succeeded所有容器正常退出
Failed容器异常退出
Unknown无法获取 Pod 状态

4.2 Pod 详细配置#

apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
# 容器配置
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
protocol: TCP
# 资源请求和限制
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
# 环境变量
env:
- name: DB_HOST
value: "db-service"
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secrets
key: password
# 探针配置
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 3
startupProbe:
httpGet:
path: /healthz
port: 80
failureThreshold: 30
periodSeconds: 10

4.3 探针类型#

探针用途失败动作
livenessProbe判断容器是否存活重启容器
readinessProbe判断容器是否就绪停止发送流量
startupProbe判断容器是否启动完成超时则重启
# 探针配置示例
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10 # 启动后多久开始
periodSeconds: 5 # 检查间隔
timeoutSeconds: 3 # 超时时间
successThreshold: 1 # 连续成功次数
failureThreshold: 3 # 连续失败次数
# TCP 检查
readinessProbe:
tcpSocket:
port: 5432
# 执行命令
startupProbe:
exec:
command:
- cat
- /tmp/healthy

五、Deployment 管理#

5.1 基本配置#

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
# 选择器
selector:
matchLabels:
app: nginx
# 更新策略
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多超出副本数
maxUnavailable: 0 # 最少可用副本数
# Pod 模板
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80

5.2 常用操作#

# 更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
# 查看滚动更新状态
kubectl rollout status deployment/nginx-deployment
# 回滚
kubectl rollout undo deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment --to-revision=2
# 暂停/恢复
kubectl rollout pause deployment/nginx-deployment
kubectl rollout resume deployment/nginx-deployment
# 查看历史版本
kubectl rollout history deployment/nginx-deployment

5.3 HPA 水平自动伸缩#

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
# 手动伸缩
kubectl scale deployment/nginx-deployment --replicas=5
# 查看 HPA
kubectl get hpa
kubectl describe hpa nginx-hpa

六、Workload 类型对比#

类型用途特点
Deployment无状态应用滚动更新,回滚
ReplicaSetDeployment 的底层很少直接使用
StatefulSet有状态应用稳定的网络标识,持久存储
DaemonSet守护进程每个 Node 运行一个
Job一次性任务并行执行
CronJob定时任务定时调度

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

Kubernetes 核心架构与组件
https://blog.souloss.com/posts/interview/kubernetes-core-architecture/
作者
Souloss
发布于
2023-08-05
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时