Kubernetes集群架构
Kubernetes集群架构
Kubernetes集群概述
Kubernetes集群由一组节点(Node)组成,这些节点在Kubernetes控制平面的协调下运行容器化应用。集群架构设计确保了高可用性、可扩展性和容错性。
控制平面组件
控制平面负责管理整个Kubernetes集群,包括调度、扩展、更新等操作。控制平面组件可以运行在集群内的任何节点上,但通常会运行在专用的控制平面节点上。
1. API Server
API Server是Kubernetes控制平面的前端,提供了REST API接口,是整个系统的中心枢纽。
主要功能:
- API接口:提供Kubernetes API,是所有组件通信的中心
- 认证授权:验证请求的身份和权限
- 数据验证:验证API对象的数据格式和内容
- 集群状态管理:处理集群状态的变更请求
配置示例:
apiVersion: v1
kind: Pod
metadata:
name: kube-apiserver
namespace: kube-system
spec:
containers:
- name: kube-apiserver
image: k8s.gcr.io/kube-apiserver:v1.21.0
command:
- kube-apiserver
- --advertise-address=192.168.10.100
- --allow-privileged=true
- --authorization-mode=Node,RBAC
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --enable-admission-plugins=NodeRestriction
2. etcd
etcd是Kubernetes的后端存储,是一个一致且高度可用的键值存储,保存所有集群数据。
主要功能:
- 数据存储:存储集群的所有配置数据和状态信息
- 数据一致性:使用Raft算法保证数据一致性
- 高可用性:支持集群部署,提供故障恢复能力
部署建议:
# etcd集群部署(奇数个节点)
etcd --name etcd0 \
--data-dir /var/lib/etcd \
--listen-client-urls https://192.168.10.100:2379 \
--advertise-client-urls https://192.168.10.100:2379 \
--listen-peer-urls https://192.168.10.100:2380 \
--initial-advertise-peer-urls https://192.168.10.100:2380 \
--initial-cluster etcd0=https://192.168.10.100:2380,etcd1=https://192.168.10.101:2380,etcd2=https://192.168.10.102:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new
3. Scheduler
Scheduler监视新创建的、未指定运行节点的Pods,并选择节点让Pod在上面运行。
主要功能:
- 调度决策:根据资源需求、策略约束等选择合适的节点
- 资源优化:最大化集群资源利用率
- 亲和性调度:支持节点亲和性、Pod亲和性等高级调度策略
调度策略配置:
apiVersion: kubescheduler.config.k8s.io/v1beta1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
plugins:
score:
disabled:
- name: NodeResourcesFit
enabled:
- name: NodeResourcesFit
weight: 1
4. Controller Manager
Controller Manager运行控制器进程,管理集群状态。
主要控制器:
- Node Controller:负责节点故障检测和响应
- Replication Controller:维护Pod副本数量
- Endpoints Controller:填充Endpoints对象
- Service Account & Token Controllers:为新的命名空间创建默认账户和API访问令牌
配置示例:
apiVersion: v1
kind: Pod
metadata:
name: kube-controller-manager
namespace: kube-system
spec:
containers:
- name: kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.21.0
command:
- kube-controller-manager
- --allocate-node-cidrs=true
- --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
- --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
- --bind-address=127.0.0.1
- --cluster-cidr=10.244.0.0/16
5. Cloud Controller Manager
Cloud Controller Manager与底层云提供商交互,管理云特定的控制器组件。
主要功能:
- 云服务集成:与云提供商的API集成
- 节点管理:管理云环境中的节点生命周期
- 负载均衡:配置云提供商的负载均衡器
节点组件
节点组件在每个节点上运行,维护运行的Pod并提供Kubernetes运行环境。
1. kubelet
kubelet在集群中的每个节点上运行,确保Pod中的容器都运行正常。
主要功能:
- Pod管理:确保Pod中的容器按预期运行
- 资源监控:报告节点和Pod的资源使用情况
- 健康检查:执行Pod的存活和就绪探针
- 卷管理:挂载和卸载Pod的存储卷
配置示例:
apiVersion: v1
kind: Pod
metadata:
name: kubelet
namespace: kube-system
spec:
containers:
- name: kubelet
image: k8s.gcr.io/kubelet:v1.21.0
command:
- kubelet
- --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
- --kubeconfig=/etc/kubernetes/kubelet.conf
- --config=/var/lib/kubelet/config.yaml
- --container-runtime=remote
- --container-runtime-endpoint=unix:///run/containerd/containerd.sock
2. kube-proxy
kube-proxy在集群中的每个节点上运行,维护节点上的网络规则。
主要功能:
- 服务代理:实现Kubernetes服务的网络代理
- 负载均衡:在Pod之间分发服务流量
- 网络规则:维护iptables或ipvs规则
工作模式:
# iptables模式(默认)
kube-proxy --proxy-mode=iptables
# ipvs模式(高性能)
kube-proxy --proxy-mode=ipvs
# userspace模式(已废弃)
kube-proxy --proxy-mode=userspace
3. 容器运行时
容器运行时负责实际运行容器,支持多种实现。
主要运行时:
- Docker:最常用的容器运行时
- containerd:轻量级容器运行时
- CRI-O:专为Kubernetes设计的容器运行时
containerd配置示例:
# /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "k8s.gcr.io/pause:3.5"
[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
网络组件
Kubernetes网络组件负责集群内的网络通信。
1. CNI插件
CNI(Container Network Interface)插件负责Pod网络的实现。
常用CNI插件:
- Calico:提供网络策略支持
- Flannel:简单易用的网络方案
- Cilium:基于eBPF的高性能网络
- Weave Net:支持网络加密
Calico部署示例:
apiVersion: v1
kind: DaemonSet
metadata:
name: calico-node
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: calico-node
template:
spec:
containers:
- name: calico-node
image: calico/node:v3.21.0
env:
- name: DATASTORE_TYPE
value: kubernetes
- name: FELIX_DEFAULTENDPOINTTOHOSTACTION
value: ACCEPT
2. DNS服务
Kubernetes DNS服务为集群提供服务发现功能。
CoreDNS配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
存储组件
Kubernetes存储组件负责持久化存储的管理。
1. CSI驱动
CSI(Container Storage Interface)驱动为Kubernetes提供存储扩展能力。
常用CSI驱动:
- AWS EBS CSI Driver
- Azure Disk CSI Driver
- GCE Persistent Disk CSI Driver
- Ceph CSI
CSI驱动部署示例:
apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
name: ebs.csi.aws.com
spec:
attachRequired: true
podInfoOnMount: true
安全组件
Kubernetes安全组件负责集群的安全管理。
1. RBAC
RBAC(Role-Based Access Control)提供基于角色的访问控制。
RBAC配置示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
2. 网络策略
网络策略控制Pod之间的网络通信。
网络策略示例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
集群高可用部署
1. 控制平面高可用
# 多主节点部署
kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" \
--upload-certs
2. etcd集群部署
# 3节点etcd集群
etcd --name etcd0 --initial-cluster-state new \
--initial-cluster etcd0=https://192.168.10.100:2380,etcd1=https://192.168.10.101:2380,etcd2=https://192.168.10.102:2380
集群监控和日志
1. 监控组件
- Metrics Server:集群资源使用指标收集
- Prometheus:监控和告警系统
- Grafana:可视化监控面板
2. 日志组件
- EFK Stack:Elasticsearch + Fluentd + Kibana
- Loki:轻量级日志聚合系统
- Promtail:日志收集代理
集群维护
1. 节点维护
# 腾空节点
kubectl drain node-name --ignore-daemonsets
# 节点维护完成
kubectl uncordon node-name
2. 版本升级
# 升级控制平面
kubeadm upgrade plan
kubeadm upgrade apply v1.22.0
# 升级节点组件
kubectl drain node-name
# 升级kubelet和kubeadm
kubectl uncordon node-name
总结
Kubernetes集群架构设计确保了系统的高可用性、可扩展性和安全性。理解各个组件的功能和交互方式,对于集群的部署、维护和故障排查至关重要。在实际生产环境中,需要根据业务需求合理配置各组件,确保集群的稳定运行。