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

 

posted on 2019-11-26 10:20  DjanFey  阅读(141)  评论(0编辑  收藏  举报

导航