5分钟让你理解K8S必备架构概念,以及网络模型(一)
前言
很多小伙伴学习K8S的时候,会被K8S里面的概念搞乱了,望而生畏;而且很多文章里面介绍的时候讲的太专业了。老顾今天来帮小伙伴们梳理一下,讲的不深入,目的是帮忙小伙伴更好的理解,各个概念的由来。
架构图
Pod是K8S的最小单元,它里面可以有多个Container。Container就是服务/组件运行的环境。
小伙伴们基本使用,理解到这里也就可以了
Master Node组件
整体流程
etcd
用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。
API Server
提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。
Controller Manager
集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。
Scheduler
集群中的调度器,负责Pod在集群节点中的调度分配。
Work Node组件
Kubelet
负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。本质Pod的管理是Container Runtime组件负责的
kube-proxy
实现了Service的代理与软件模式的负载均衡器,这个是因为pod的网络ip是经常变化的。这个网络知识,下一篇文章老顾会介绍
Pod发布
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中
kind: Pod #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: mc-user #资源的名字,在同一个namespace中必须唯一
spec: #specification of the resource content 指定该资源的内容
containers: #容器定义
- name: mc-user #容器的名字
image: rainbow/mc-user:1.0.RELEASE #容器镜像
kubectl apply -f mc-user-pod.yaml
反向代理
NodePort Service
K8S的Service很多,其中NodePort Service是提供反向代理的实现
1)pod需要打上一个Label标签
2)外部流量请求到NodePort Service,通过Selector 进行路由,
3)NodePort Service根据Label标签进行路由转发到后端的Pod
Service Type还可以为 LoadBalancer、ClusterIP LoadBalancer:这个是部署到云端(如阿里云)的时候需要用的,也是反向代理+负载均衡的作用,用作外部访问K8S内部。ClusterIP:这个Service是K8S集群内部做反向代理用的
Label与Selector
Service发布
apiVersion: v1
kind: Service
metadata:
name: mc-user
spec:
ports:
- name: http #通讯协议
port: 8080 #这里的端口和clusterIP对应,即ip:8080,供内部访问。
targetPort: 8080 #端口一定要和container暴露出来的端口对应
nodePort: 31001 #节点都会开放此端口,此端口供外部调用
selector:
app: mc-user #这里选择器一定要选择容器的标签
type: NodePort #这里代表是NodePort类型的
nodePort的端口范围:30000~32767
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中
kind: Pod #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: mc-user #资源的名字,在同一个namespace中必须唯一
labels: #标签定义
app: mc-user #标签值
spec: #specification of the resource content 指定该资源的内容
containers: #容器定义
- name: mc-user #容器的名字
image: rainbow/mc-user:1.0.RELEASE #容器镜像