前面讲了外部用户怎样管理 K8S,而我们更关心的是内部运行的 Pod 怎样对外访问。使用过Docker 的同学应该知道,如果使用 bridge 模式,在容器创建时,都会分配一个虚拟 IP,该 IP 外部是没法访问到的,我们需要做一层端口映射,将容器内端口与宿主机端口进行映射绑定,如许外部通过访问宿主机的指定端口,就可以访问到内部容器端口了。
那么,K8S 的外部访问是否也是如许实现的?答案是否定的,K8S 中环境要复杂一些。因为上面讲
的 Docker 是单机模式下的,而且一个容器对外就暴露一个服务。在分布式集群下,一个服务每每由多个Application 提供,用来分担访问压力,而且这些 Application 可能会分布在多个节点上,如许又涉及到了跨主机的通讯。
这里,K8S 引入了 Service 的概念,将多个雷同的 Pod 包装成一个完整的 service 对外提供服务,至于获取到这些雷同的 Pod,每个 Pod 启动时都会设置 labels 属性,在 Service 中我们通过选择器 Selector,选择具有雷同 Name 标签属性的 Pod,作为整体服务,并将服务信息通过 Apiserver 存入 etcd 中,该工作由Service Controller 来完成。同时,每个节点上会启动一个 kube-proxy 历程,由它来负责服务地点到 Pod地点的代理以及负载均衡等工作。
如图所示:
问题五:Pod 怎样动态扩容和缩放?
既然知道了服务是由 Pod 构成的,那么服务的扩容也就意味着 Pod 的扩容。通俗点讲,就是在需要时将Pod 复制多份,在不需要后,将 Pod 缩减至指定份数。K8S 中通过 Replication Controller 来进行管理,为每个 Pod 设置一个期望的副本数,当现实副本数与期望不符时,就动态的进行数量调解,以到达期望值。期望数值可以由我们手动更新,或自动扩容代理来完成。
如图所示: