k8s学习(二)--基础概念
学习目标:1. 什么是pod 2. 控制器类型 3. k8s网络通讯模式
一、pod概念
A、什么是pod
pod包含一组容器,pod内容器既共享网络,又共享存储
B、自主式pod
C、控制器管理的pod
1. 控制器类型
a. ReplicationController & ReplicaSet &Deployment & HPA
1)ReplicationController用来确保容器应用的副本数始终保持在用户定义的副本数,如果有容器异常退出,会自动创建新的pod来替代;而如果异常多出来的容器也会自动回收。在新版本中建议使用ReplicaSet来代替ReplicationController。
2) ReplicaSet跟ReplicationController没有本质的区别,只是名字不一样,并且ReplicaSet支持集合式的selector
3) 虽然ReplicaSet可以独立使用,但一般还是建议使用deployment来自动管理ReplicaSet,这样就无需担心跟其它机制不兼容问题。
4) HPA (Horizontal Pod Autoscaling)仅适用于Deployment和ReplicaSet,在v1版本中仅支持根据Pod的Cpu利用率进行扩缩容,在v1alpha版本中,支持根据内存和用户自定义的metric扩缩容。
b. StatefulSet 是为了解决有状态服务的问题(对应Deployment和ReplicaSet是为无状态服务而设计),其应用场景包括:
1)稳定的持久化存储,即pod重新调度后还是能访问到相同的持久化数据,基于PVC实现
2)稳定的网络标志,即pod重新调度后其PodName和HostName不变,基于Headless Service(即没有cluster ip的service)来实现。
3)有序部署,有序扩展,即pod是有顺序的,在部署和扩展的时候要依据定义的顺序依次进行。(在下一个pod运行之前的pod必须是ready和running状态。)
4)有序收缩,有序删除。
c. DaemonSet 确保全部(或者一些)Node上运行一个Pod副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群中移除时,这些Pod也会被回收。删除DaemonSet会删除它创建的所有Pod。一些典型用法:
1) 运行集群存储daemon,例如在每个node上运行glusterd、ceph
2) 在每个node上运行日志手机daemon
3) 在每个Node上运行监控daemon
d. Job, Cronjob
1)Job:负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
2)CronJob管理基于时间的Job,即
a)在给定时间点只运行一次
b)周期性地在给定时间点运行
二、 服务发现
A、client想访问一组相关pod(通过标签选择),可以通过访问service间接访问,service有自己的ip不变,可以避免pod替换后ip变化的问题。
三、网络通讯模式
A、Kubernetes的网络模型假设了所有的pod都在一个可以直接连通的扁平网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,Kubernetes假定这个网络已经存在。而在私有云里搭建kubernetes集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的docker容器之间的互相访问先打通,然后运行kubernetes。
B、Flannel是CoreOS团队针对kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的docker容器都具有全集群唯一的虚拟ip。而且它还能在这些ip间建立一个全覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内。
C、etcd之与flannel
1. 存储管理flannel可分配的ip地址段资源
2. 监控etcd中每个pod的实际地址,并在内存中建立维护pod节点路由表
D、不同情况下网络通讯方式
1. 同一个pod内部通讯:同一个pod共享同一个网络命名空间,共享同一个linux协议栈。
2. pod1至pod2
a. pod1和pod2不在同一台主机,上面B所说情况
b. pod1和pod2在同一台主机,由docker0网桥直接转发请求至pod2,不需要经过flannel
3. pod至service网络:lvs(负载均衡)转发
4. pod到外网:pod向外网发送请求,查找路由表,转发数据包到宿主机网卡,宿主网卡完成路由选择后,iptables执行masquerade,把源ip更改为宿主机网卡的ip然后向外网服务器发送请求
5. 外网访问pod:service