Kubernetes-知识汇总
Kubernetes知识汇总
一.Kubernetes集群组件
1.Kubernetes 主控组件(Master)
kube-apiserver、kube-controller-manager 和 kube-scheduler
- 1.1 kube-apiserver:
对外暴露了Kubernetes API。它是的 Kubernetes 前端控制层。它被设计为水平扩展,即通过部署更多实例来缩放要使用Kubernetes对象(无论是创建,修改还是删除它们),都需要使用Kubernetes API - 1.2 kube-controller-manager(控制器管理器)
是各种controller的管理者,是集群内部的管理控制中心,通过 apiserver 监控整个集群的状态, 并确保集群处于预期的工作状态,这些控制器包括:- 节点控制器: 当节点移除时,负责注意和响应。
- 副本控制器: 负责维护系统中每个副本控制器对象正确数量的 Pod。
- 端点控制器: 填充 端点(Endpoints) 对象(即连接 Services & Pods)。
- 服务帐户和令牌控制器: 为新的命名空间创建默认帐户和 API 访问令牌.
1 Replication Controller
2 Node Controller
3 CronJob Controller
4 Daemon Controller
5 Deployment Controller
6 Endpoint Controller
7 Garbage Collector
8 Namespace Controller
9 Job Controller
10 Pod AutoScaler
11 RelicaSet
12 Service Controller
13 ServiceAccount Controller
14 StatefulSet Controller
15 Volume Controller
16 Resource quota Controller
https://www.jianshu.com/p/a36682a848e1
- 1.3 kube-scheduler(调度器)监视没有分配节点的新创建的 Pod,选择一个node节点供他们运行
2.集群中的每个非master节点都运行两个(组件)进程:
- 2.1 kubelet,和master节点进行通信,监测已分配给其节点的Pod(通过apiserver或通过本地配置文件)提供如下功能:
- 挂载 Pod 所需要的数据卷(Volume)。
- 下载 Pod 的 secrets。
- 通过 Docker 运行(或通过 rkt)运行 Pod 的容器。
- 周期性的对容器生命周期进行探测。
- 如果需要,通过创建 镜像 Pod(Mirror Pod) 将 Pod 的状态报告回系统的其余部分。
- 将节点的状态报告回系统的其余部分
2 kube-proxy
是一种网络代理,将Kubernetes的网络服务代理到每个节点上,通过维护主机上的网络规则并执行连接转发,实现了Kubernetes服务抽象
作为k8s和Linux kernel Netfilter交互的一个枢纽。监听kubernetes集群Services和Endpoints对象的变化,并根据kube-proxy不同的模式(iptables or ipvs), 对内核设置不同的规则,来实现路由转发
3.etcd
用于 Kubernetes 的后端存储。所有集群数据都存储在此处,始终为您的Kubernetes集群的etcd 数据提供备份计划
4.Cluster DNS
是一个 DNS 服务器,和您部署环境中的其他 DNS 服务器一起工作,为 Kubernetes 服务提供DNS记录
二.pod
1.创建pod过程
- 1.1 Pod 与 API Server 交互的主要流程如下:
用户通过Kubectl提交一个创建RC的请求,该请求通过APIServer被写入etcd中,此时Controller Manager通过API Server的监听资源变化的接口监听到这个RC事件,分析之后,发现当前集群中还没有它所对应的Pod实例,于是根据RC里的Pod模板定义生成一个Pod对象,通过APIServer写入etcd,至此API Server 创建过程完成,剩下的由 scheduler 和 kubelet 来完成,此时 pod 处于 pending 状态 - 1.2 与scheduler交互:
此事件被Scheduler发现,它立即执行一个复杂的调度流程,为这个新Pod选定一个落户的Node,然后通过API Server讲这一结果写入到etcd中,目标Node上运行的Kubelet进程通过APIServer监测到这个“新生的”Pod,并按照它的定义,启动该Pod并任劳任怨地负责它的下半生,直到Pod的生命结束 - 1.3 kubelet作用:
Kubelet组件启动pod,kubelet 组件的作用不单单是创建 pod,另外还包括节点管理、cAdvisor 资源监控管理、容器健康检查等功能
2.pod生命周期
- 生命周期:
状态: Pending,Running,Failed,Succeded,Unknown
创建过程: 请求apiserver,scheduler调度pod到node,kubelet请求apiserver监控etcd中pod状态资源变化,在去启动pod在请求apiserver存储pod资源变化在etcd中
重要行为:
初始化容器
容器探测:
liveness
readiness - 标签作用:
pod有自己的ip和主机名,每一次删除重建都会生成新的IP和主机名,同一组pod资源通过标签来关联
3.pod控制器
pod控制器通过pod的标签来关联
- 3.1 自主式pod,缺陷如果node出现问题,那么pod将消失,新pod的ip或主机名都会发生改变
- 3.2 pod控制器,实现pod生命周期
控制器通过标签选择器来管理同一个pod资源的多个pod副本
4.service服务发现
pod是有生命周期的,新pod的ip或主机名都会发生改变,客户端是无法固定访问pod,因此在同一种pod资源中添加service服务发现,service是通过标签选择器来关联pod
5.DNS服务(附件)
实现service服务发现需要通过DNS解析
- 小结: pod是有生命周期的因此需要pod控制器来实现删除,创建,重建等操作,service来提供集群外或者集群内访问。pod控制器和service都是通过标签选择器与pod资源相关联
三.集群中的网络
四.控制器种类
ReplicationController
RelicaSet
Deployment
DaemonSet #守护进程,一个节点只启动一个
Job #一次性执行任务,任务结束后删除pod
CronJob #周期性执行任务,执行完一次删除一次,在重新执行
StatefulSet
五.发布策略
金丝雀发布
蓝绿发布 资源逐个替换
灰度
(利用deployment滚动更新的节奏实现以上功能)
六.service
service --> endpoint --> pod
1.创建service过程
service依赖于DNS
kube-proxy通过watch监控api service内的变化
- 1.1 通过Kubectl提交一个新的映射到该Pod的Service的创建请求
- 1.2 ControllerManager会通过Label标签查询到相关联的Pod实例,然后生成Service的Endpoints信息,并通过APIServer写入到etcd中
- 1.3 接下来,所有Node上运行的Proxy进程通过APIServer查询并监听Service对象与其对应的Endpoints信息,建立一个软件方式的负载均衡器来实现Service访问到后端Pod的流量转发功能
2.定义 Service
apiVersion: v1
kind: Service
matadata:
name: string
namespace: string
labels:
- name: string
spec:
selector: []
type: string
clusterIP: string
sessionAffinity: string
ports:
- name: string
protocol: string
port: int #service端口
targetPort: int #pod端口
nodePort: int #node暴露端口
status:
loadBalancer:
ingress:
ip: string
hostname: string
3.vip
在 Kubernetes 集群中,每个 Node 运行一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName 的形式
4.service三种代理模式(4层):
- ipvs:
client_pod 请求到ipvs(service规则),再有ipvs调度到server_pod上面 (ipvs-1.11之后) - iptables:
client_pod 请求到iptables(service规则),再有iptables调度到server_pod上面 (iptables 1.10之前) - userspace:
client_pod 请求到iptables(service规则),在转发给kube-proxy处理,之后再有iptables调度到server_pod上面 (userspace-浪费资源)
5.服务发现
Kubernetes 支持2种基本的服务发现模式 —— 环境变量和 DNS
6.service类型
1 NodePort
2 LoadBalancer 在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 <NodeIP>:NodePort。此模式只能在云服务器(AWS等)上使用
3 ExternalName 将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)
4 clusterIP
默认是 ClusterIP 类型。Type 的取值以及行为如下: * ClusterIP:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType。 * NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务
7.资源记录
创建服务之后自动添加一个资源记录: svc_name.default.svc.cluster.local.
8.字段
sessionAffinity: ClientIP #将来自同一客户端的请求发往同一端pod上
9.无头service
ClusterIP: None
七.Deployment
strategy #更新策略
rollingUpdate #滚动更新
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
#利用以上两个参数控制滚动更新节奏
revisionHistoryLimit #保存历史版本
paused #暂停
kubelet rollout pause deployment myapp #暂停
kubelet patch deployment myapp -p '{"spec":{"replicas":5}}' #打补丁
kubelet set image *** && ubelet rollout pause deployment myapp #更新一个pod并暂停
kubelet rollout status deployment myapp #查看更新状态
kubelet rollout resume deployment myapp #继续更新
kubelet get rs -o wide #查看工作信息
kubelet rollout history deployment myapp #查看版本历史
kubelet rollout undo deployment muapp --to-revision=1 #回滚第一个版本
八.DaemonSet
updateStrategy:
rollingUpdate:
maxUnavailable:
OnDelete:
revisionHistoryLimit #保存历史版本
hostNetwork