k8s的应用
k8s在当下云原生+微服务时代的运用越来越广阔,我认为主要有以下几个优点。 1.服务发现和负载均衡 2.自动化部署/回滚 3.弹性升级 4.强大的监控体系
k8s是什么呢?
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。
k8s架构
k8s是由ApiServer、控制器、etcd、scheduler、云控制器组成。apiServer负责执行k8s的操作api,是整个k8s的核心。控制器则是多个具体控制器组成,负责具体的容器调度、网络连接等。scheduler则是负责定时检查集群状态的。云控制器则类似插件,对接云服务商。
k8s组件
apiServer
这是k8s的大脑,所有的对k8s的命令都是由它来负责的,一般部署在单独的master节点上。对外暴露Restful风格的api
//查询v1版本的pods
curl localhost:8080/api/v1/pods
etcd
k8s集群的KV数据库,里面保存着集群的信息,包括节点、pod、RC等信息。组件可以通过apiserver来读写etcd,保存自身信息或者访问其他信息。
scheduler
主要是根据特定算法将pod调度到具体的node节点上。一般是三个,其中先起来的scheduler成为master,负责提供服务,剩下两个处于等待,并不对外服务。 具体调度流程如下:
- 客户通过kubectl或者请求REST API来创建pod资源
- apiserver存储相关数据到etcd
- scheduler通过watch机制,监听数据,将待调度的pod放入调度队列中
- 调度器取出列表,通过调度算法将pod分配到具体节点上。
- kubelet通过监听scheduler的pod绑定事件,获取pod清单,下载镜像,然后启动镜像。
调度算法有多种:
- 无磁盘冲突。只要检测node节点里无对应磁盘,即可
- 资源优先 只要满足pod的资源配置即可
- 指定标签 只要node含有对应的标签即可
- Host优先 pod的nodeName和node名称一致即可
kubelet
kubelet是node节点上的管理(服务)进程,用于处理master节点下发到该node的任务,包括节点管理、pod管理、pod健康检查、cAdvisiver的资源监控。
节点管理
kubelet会通过APIserver注册自己,并存入到etcd中。注册完会定时上报更新自身状态
pod管理
- 以下三种方式获取pod清单,并且定时持续更新
- 文件。从kubelet启动参数“--config”指定目录下的文件
- http端口。通过“--manifest-url”设置的url获取
- ApiServer。kubelet通过ApiServer监听etcd,获取pod目录。
- 如果清单中监听到创建和修改的pod任务,则会进行1、创建数据目录 2、从apiServer读取该pod信息 3、挂载外部卷 4、下载secret 5、检测节点里的所有pod 6、创建pause容器,该容器接管所有容器的网络,可以看作是管理容器。7、处理容器,包括终止、运行等
健康检查
通过两类探针来检查容器健康状态。一类是LivenessProbe,该探针用于判断是否健康,不健康则kubelet会删除该容器,如果不包含该探针,则认为一直健康。一类是ReadinessProbe,用于判断是否启动完成且能对外提供服务,如果检测失败,则Endpoint Controller会删除该容器所在pod的ip对应的endpoint条目。LivenessProbe有三种:
- 命令行。执行某个命令,命令退出码是0则表示成功。上家公司就通过判断某个文件是否存在来健康检查
- TCP端口检测。指定端口能被访问则健康。
- HTTP端口GET调用。返回码>=200&&<=400则成功。
kube-proxy
kube-proxy可以看作是k8s服务的透明代理和负载均衡器。服务的高可用、水平扩展等的落实都是依靠buke-proxy来实现的。 kube-proxy的具体细节。
- 查询和监听apiServer中的service和endpoints的变化。
- 为每一个service创建服务代理对象,里面包括监听该服务请求的socket server
- 为每一个创建负载均衡器,里面保存着service和endpoints的路由表
针对变化的service,如果没有设置ClusterIp,则不做处理。设置了则为每一个CluserIp创建服务代理对象,删除的则先删除iptable里的规则,然后删除代理对象。针对endpoints的变化,则会更新负载均衡器中的转发地址。
负载均衡则包括随机、会话保持两种。指定了会话保持,kube-proxy则生成1个affinityState对象,绑定一个endpoint,只要session没有过期,后续同一个ip的请求都是走该endpoint