资源总架构
Master
- api server 进程:接收和执行控制命令,是集群控制入口,对集群所有资源“增删改查”。
- replication controller 进程:所有资源自动化控制中心。
- scheduler 进程:资源(Pod)调度。
- etcd server:K8S 集群所有数据存储在 etcd。
Node
- 早期叫 minion
- 代表一个机器。可以是物理机,也可以是虚拟机。
- 每个 Node 上可有多个 Pod。
- Node 宕机,其上 Pod 被 Master 自动转移到其他 Node。
- kubnet 进程:负责 Pod 对应的容器的创建启停。与 Master 一起完成集群管理。
- kube-proxy:实现 K8S service 的通信与负载均衡。
- Docker engine:负责本机容器的创建。
- Node 可在运行中动态加入集群。
Pod
- 包含 跟容器 Pause + 其他用户容器。
- Pause 作用1:一个容器死亡,算 Pod 总体死亡吗?引入无关紧要且不容易挂掉的 Pause 容器,以其状态代表 Pod 状态。
- Pause 作用2:Pod 内多个业务容器共享 Pause 容器 IP。 共享 Pause 容器挂接的 Volume。既简化了密切关联的业务容器之间的通信问题,也解决了文件共享问题。
- 每个 Pod 可以为其使用的资源设限。
Label
- label 是一个 key=value 键值对。
- label 可附加到任何资源上。如 Node,Pod,RC,Service。
- 可在资源定义时指定,也可在对象创建后动态添加。
- 通过 Label Selector 查询和筛选拥有某些 label 的资源对象。
- Kube-Controller 进程通过资源对象 RC 上定义的 Label Selector 来筛选要监控的 Pod 副本数量。从而实现 Pod 副本数量符合 RC 中定义。
- Kube-Proxy 进程通过 Service 的 Label Selector 来选择 Pod,自动建立起每个 Service 到对应 Pod 的请求转发路由表,从而实现 Service 的只能负载均衡机制。
- 通过某些 Node 定义特定的 Label,并且在 Pod 定义文件中使用 NodeSelector 这种标签调度策略,kube-scheduler 进程可实现 Pod 定向调度的特性。
Replication Controller
RC 定义包括
- Pod 期待副本数 (replicas)。
- RC 包含完整的 Pod 定义模板。
- RC 通过 Label Selector 实现对 Pod 副本的自动控制。
- 通过改变 RC 中的副本数量,K8S 实现自动扩容缩容。
- 通过改变 RC 中的镜像版本,K8S 实现升级回滚等。
Service
- service 即微服务。
- service 通过 label selector 将一群 Pod 作为真正处理请求的后端。
- service 定义了一个服务的访问入口(cluster IP)。Cluster IP 是一个虚拟 IP,无法被 Ping,因为它没有实体网络对象(既无软件也无硬件)。Cluster IP 仅属于当前 K8S 集群的内部地址,在集群外不可用。
K8S 内部访问 Service
- K8S 集群内的应用可以通过 cluster IP 直接访问到此 service 后端的 Pod,至于访问哪个 Pod,由负载均衡算法决定(默认 RR)
- 请求从 Client -> clusterIP -> Client 所在 Node 的 kube-proxy 进程 -> Service 后端 Pod。
-
内部访问有“userspace 代理模式”,“iptables 代理模式”,“IPVS 代理模式”,详见官网:https://kubernetes.io/zh/docs/concepts/services-networking/service/。但每种代理模式都是 Client 所在 Node 完成负载均衡及请求路由的。
-
“userspace 代理模式”下,负载均衡由 Client 所在 Node 的 kube-proxy 进程 完成。使用哪个 backend
Pod
,是 kube-proxy 基于SessionAffinity
来确定的。
(本图为 userspace 代理模式)
K8S 外部访问 Service
3个概念
- Node IP:Node 的物理地址。
- Pod IP:每个 Pod 的 IP,是由 Docker Engine 根据 docker0 网桥的 ip 地址段进行分配的,通常是一个虚拟的二层网络。
- Cluster IP:Server 的虚拟 IP,不能 Ping,无“实体网络对象”。
外部访问
- Cluster IP 不能在 K8S 集群外访问。
- 采用 NodePort 可以让每个 Node 的 IP 可供外部访问。在 service 定义中做如下扩展即可。
- NodePort 的实现方式是在 K8S 集群内每个 Node 上需要外部访问的 Service 开启一个对应的 TCP 监听端口,外部系统只要用任意一个 Node 的 IP + 具体的 NodePort 端口即可访问此服务。即直接访问具体 Node。
- 那么怎么做负载均衡呢?用户可在 K8S 集群外部署单独的 HAProxy 或者 Nginx 。
延伸1:
https://www.cnblogs.com/linuxk/p/10291178.html