kubernetes

ansible # 应用程序编排


docker提供的编排工具3剑客:

docker-componse # 适用单机编排,面向1个docker host

docker swarm # 面向docker host集群编排,docker host要加入到docker swarm池中

dcoker machine # 能将1个docker host初始化加入到docker swarm集群中的主机


ASF下的:

mesos + marathon


kubernetes # 舵手|飞行员,受Borg的影响,用go按Borg的思想重写,Borg是google内部运行了十几年的稳定的容器编排工具


DevOps # 本身不是技术,而是文化,一种运动,一种趋势,使得devlop和operation结合;容器的出现,使得devops在落地上完成了实现的可能,不用关注各平台

MicroServices # 单体应用(众多功能)-->一个microservice只运行1个功能,微服务部署在容器上

BlockChain

瀑布式开发-->敏捷开发-->精益开发

ops-->devops

CI # 持续集成

CD # delivery持续交付

CD # deployment持续部署,部署模型(蓝绿部署|灰度|金丝雀)


github.com/kubernetes

12年,amazon的aws,ms的azure,阿里云,云计算平台宣布支持容器化k8s;

docker企业版中支持自身的swarm,还有k8s;

rkt(CoreOS是gg大力扶持的,redhat收购了CoreOS并花大价钱在容器上,k8s成为redhat的openshift的PaaS,可理解为openshift是k8s的发行版,k8s很底层)的容器编排工具fleet,直接放弃fleet直接使用k8s;


特性:​

自动装箱;

自我修复;

水平扩展;

服务发现和负载均衡;

自动发和回滚;

密钥和配置管理; # 模拟了配置中心的作用

存储编排;

任务批量处理行;



架构:​

是一集群,组成集群的主机有角色(p2p无中心节点,有中心节点);

master/nodes

nodes即worker,运行容器的节点

kubernetes学习笔记1_kubernetes


注:

可将registry托管在k8s上;

mysql提供的3306,可理解为该端口为api server;

master一般3个,node不限量;


kubernetes学习笔记1_k8s_02


master上组件:

api server,用https通信

scheduler,负责哪个node适合运行某个容器(筛选-->优选)

controller,周期性探测管理的容器是否健康,一旦不符合用户定义的状态,使之成为健康状态;

controler manager,监控controler的健康状态,master是多节点的,cm也要做冗余;k8s支持众多的控制器,控制容器健康的只是一种;

master是集群大脑,api server负责接收并处理请求,scheduler负责调度容器创建的请求,controler负责容器处于健康状态,cm确保已创建的容器处于健康状态;

master上有一共享存储,etcd,etcd是一kv数据库系统,还有协调功能实现leader选举,更像zk,etcd也是restful(用https通信,同es,1个port用于内部通信(点对点证书),1个port用于对外提供服务),一般3个节点,etcd的客户端是api server(https,与etcd通信不要和etcd内部通信使用同一个ca颁发的证书,与client通信需要另一套ca及证书,另与kubelet通信,与kube-proxy通信);

手动部署k8s,至少要建5套CA;


node上组件:

kubelet组件,与api server交互,(集群代理)接收master调度来的任务,用来执行启动pod|挂载卷等;

容器引擎docker,用于执行容器;

kube-proxy,node上的守护进程,用于管理service,随时与api server通信(pod发生改变),api server会生成一通知事件,kube-proxy会在本地把对应的改变生成为iptables规则



pod:

k8s上,最小运行单位(原子单元)是pod,可理解为对容器作了层封装(外壳),1个pod中有多个容器,共享底层的net|UTS|IPC,而另3个是隔离的,pod是模拟传统的vm,使得可以精细的控制容器间通信,同一个pod中的容器共享同一个存储卷;

一般1个pod内放1个容器,除非几个容器间有紧密关联,如果1个Pod内有多个容器,其中有1个主容器,其它的称为side car边车是辅助的用来补充主的功能,如nignx和filebeat;

node内运行pod,node可以是任何OS平台;

label selector,对pod打标签(kv),用来身份识别和过滤,分类管理;

k8s是restful风格的api,所有对象都可以用label selector,pod只是用的其中1种;

pod有生命周期;


pod控制器分类:

1、自主式pod,自己管理的,不能动态的增减pod,如果pod异常挂掉不能主动增加;

2、控制器管理的pod

ReplicationController,1)保持某pod始终有配置的几个副本;2)支持滚动更新(如用户要求有2个pod,在使用新镜像时(nginx版本升级),在更新过程中允许临时超出1个pod,依次把旧版本运行的容器替换掉),支持回滚操作(先例操作,即滚动更新的逆反)

ReplicSet,副本集控制器

Deployment,更新时用的,用的最多,只能管理无状态应用,支持HPA(horizontalPodAutoscale水平pod自动伸缩控制器,如2个Pod不足以支持当前的访问量,会自动加pod)

StatefulSet,管理有状态应用

DaemonSet,1个node上运行1个副本,而不是随意运行

Job,运行作业

CronJob,周期性的作业

注:每1种控制器实现特定的任务管理,用于确保不同类型的pod资源来符合用户期望的运行方式;


service

client程序和pod间有一中间层service实现代理转发,用于在pod更新时动态地加入组中,service关联后端的pod通过label selector选定新加的pod;

service不是一程序,而是iptables的DNAT规则,在1.11ver上已改为ipvs(LVS);

service是基础架构级(支撑其它服务运行的组件)的pod,称为addon附件,k8s自身要用到,安装k8s时要先安装它

k8s上有一专用的DNS(也是pod),也是基础架构级组件,用于动态创建动态删除对应的service地址;


kubernetes学习笔记1_k8s_03


用户访问到N,要经3次转发,先经外部的调度器,再经物理节点的网卡,再经service转;

每个服务都要有1个service组件和1个controller,service要手动创建,service和controller通过label和label selector实现自己治下的资源;

dns也需要service和controller;

另负责监控pod的grafana|prometheus也是附件之一;


k8s网络:

节点网络;

集群网络,service网络;

pod网络;

k8s自身不提供这3种网络,依赖于第三方插件(也可作为附件),网络服务商至少要解决pod网络和service网络,节点网络由运维人员构建k8s集群前提供;

k8s通过CNI(container network interface)接入外部的网络服务解决方案,只要遵循CNI就可作为k8s网络的解决方案,这些网络可作为附件运行在pod容器上为其它pod提供网络(也可作为守护进程运行在node上),这个网络解决方案pod虽运行在集群之上但要共享节点的网络名称空间,这样就实现了以容器方式运行进而进行系统管理;

flannel,常见的CNI,coreos提供,简单,仅网络配置,overlay网络;

calico,配置复杂,网络配置和网络策略,3层隧道网络,也可使用bgp协议的路由直通模型;

canel,网络配置,网络策略;

通常需要2个维度的网络,1给pod和service提供地址,2k8s要求提供network policy网络策略功能(隔离不同的pod间通信,pod间本身是可以直接通信的,只不过为解决pod异常停止|动态加pod才加了中间service);


k8s通信:

同一pod内的多个容器间通信,本地通信lo;

各pod间通信,overlay network叠加网络(隧道);

pod与service通信,service地址仅是宿主机上的iptables规则,pod上的容器将其网关指向docker0,docker0访问service时通过iptables规则检查就知道了;

kubernetes学习笔记1_kubernetes_04