目录
中文网:https://www.kubernetes.org.cn
https://github.com/kubernetes/kubernetes
百度前员工刘杰写的《分布式系统原理介绍》【https://daiwk.github.io/assets/分布式系统原理介绍.pdf】。
参考http://kubernetes.kansea.com/docs/whatisk8s/
参考Borg, Omega, and Kubernetes Lessons learned from three container-management systems over a decade
openstack
docker,基于LXC为基础构建的容器引擎,通过namespace和cgroup实现资源隔离和调配。将os和应用捆绑,使得应用系统环境标准化、集装箱化。主要问题:缺乏完整的调度部署管理能力。
2004年google开始使用容器,06年cgroup 内部集群资源管理平台borg和omega k8s起源于borg,参考了omega的经验和教训。borg和omega的创始人都加入k8s。
https://daiwk.github.io/assets/Borg_Omega_Kubernetes.pdf
https://daiwk.github.io/assets/Borg.pdf
https://daiwk.github.io/assets/Omega.pdf
https://daiwk.github.io/assets/Nomad.pdf
Cloud Native Computing Foundation ==>生态绑定、法律保护、推广、培训等。
5w+commits,2.5w stars
通过kubectl提交,应用描述文件(json/yaml)
一个app下可以有多个实例。
使用label和selector进行deployment和service的对应,nodeport虚拟端口nodeport,对外暴露的端口targetport
k8s会调度相应的app到对应的docker host上去运行
调度和pack各种xxx到不同的nodes上
可以参考https://www.kubernetes.org.cn/kubernetes%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84
单集群可以一次5000台机器上线
有一个中心化的api server,然后把状态存储在etcd中 主节点有scheduler和controller mgr,worker节点有kubelet和service proxy。
api server中有所有资源的增删改查的接口,还有authorization,可以按namespace来划分权限。
scheduler中把定义的pod按照策略调度到相应节点
controller manager和apiserver通信,获取集群的特定信息,然后做出响应的反馈动作。由多个controller组成
etcd是分布式k-v你在什么地方,所有集群数据存放在etcd中,实现组件的无状态化。可以通过watch的方式监听变化,并触发相应动作。
worker节点:
pod是若干相关容器的组合。pod包含的容器运行在同一台宿主机上,它们使用相同的pid/network/ipc/uts命名空间/ip地址和端口,相互之前能通过localhost来发现和通信,还可以共享一块存储volume空间。其实是容器的更高层次的抽象。
控制管理pod副本。确保任何时候k8s集群中有足够v几个的pod副本在运行。如果少于,会自动启动。
区分pod/service/replication/controller的k/v对。每个api对象可以有多个label,但每个label的k只能对应一个v。
只描述集群的期望状态
升级时,旧实例下一下,上一个新实例这样。但如果是大更新,只能停机更新,旧的全下了再上新的。 参数: maxSurge:不容许实例减少,且集群资源充裕 maxUnavaliable:集群资源照张,可以先缩容,再更新
部署带持久化数据的服务
搭建分布式db集群
每个host部署一个服务,也有rolling update
parallelism:最大的共有并行数 completions: 完成了多少个job就算完成了
service是真实应用服务的抽象,定义了pod的逻辑集合和访问这个pod集合的策略。 将代理pod对外表现为一个单一的访问接口,外部不需要了解后端pod是如何运行的。
实现原理:kube-proxy维护一个iptables,会去watch apiserver,然后更新这个table,有dns解析功能
不提供round-robin 显式返回所有endpoints 可以自定义策略(如选主) 最佳实践:cacendera的去中心化选主
skyDNS->KubeDNS。可以对特定的domain自定义上游nameserver。
优先级:
每个pod有一个ip,需要容器网络
可以将存储在pod上进行挂载,可以直接挂载基于fuse共享存储NFS等。
微服务 自动伸缩 使用supervisor,如果主进程被Kill了,会把这个信号量传给每个子进程,避免孤儿进程 节点亲和&应用亲和:例如混布cpu+gpu(后来,1.6的k8s原生支持gpu了)
使用minikube:
https://qii404.me/2018/01/06/minukube.html
有状态的容器:例如
监控:普罗米修斯
建一个k8s集群的时候,有n+3台机器做master,因为用的是etcd,选主至少要3台机器。
service如何访问到pods:
可以参考https://blog.csdn.net/yuanjunlai141/article/details/79487381