第十二章 网络(上)
12.1 kubernetes网络模型
集群中每个pod都有自己的IP地址,Pod之间不用配置NAT就能直接通信。
同一个Pod中的容器共享Pod的IP,能通过localhost通信。
每个pod可被看做是一个个独立的系统,而pod中的容器则可被看做是同一个系统中的不同进程。
1. Pod内容器之间通信
当Pod被调度到某个节点,Pod中的所有容器都在这个节点上运行,这些容器共享相同的本地文件系统,IPC和网络命名空间。
2. Pod之间的通信
Pod的IP是集群可见的,即集群中的任何其他Pod和节点都可以通过IP直接与Pod通信,这种通信不需要任何网络地址转换、隧道或代理技术。
3. Pod与Service的通信
Pod间可以直接通过IP地址通信,但是前提是Pod需要知道对方的IP。 在K8s集群中,Pod频繁的被创建和销毁,pod的IP是不固定的。
为了解决这个问题,Service提供了访问Pod的抽象层。无论Pod如何变化,service对外提供相对稳定的服务。此外,service还提供了高可用和负载均衡,转发给Pod。
4. 外部访问
无论是Pod和service的ClusterIP(注意是Cluster Ip),它们只能在K8s集群中可见,对集群之外的世界,这些IP是私有的。
K8s提供了两种方式让外界能够与Pod通信:
- NodePort: Service通过Cluster节点的静态端口对外提供服务。外部可以通过 <NodeIP>:<NodePort>访问service。
- LoadBalancer:
12.2 各种网络方案
为了保证网络方案的标准化、扩展性和灵活性,K8s采用了Container Networking Interface(CNI)规范。
CNI: 是CoreOS提出的容器网络规范,使用了插件(Plugin)模型创建容器的网络栈。
12.3 Network Policy
Network Policy是K8s的一种资源,通过Label选择Pod,并指定其他Pod或外界如何与这些Pod通信。
默认情况下,所有Pod是非隔离的,任何来源的网络流量都可以访问Pod;当为Pod定义了Network Policy时,只有Policy允许的流量才能访问Pod。