Pod通信问题整理

(1)Pod中的容器们运行在一个逻辑“主机”上。他们使用同一个网络命名空间(network namespace,换句话讲,就是同样的IP地址和端口空间),以及同样的IPC(inter-process communication,进程间通信)命名空间,他们还使用共享卷(shared volume)。这些特征使得Pod内的容器能互相高效地通信。同时,Pod使得你可以将多个紧耦合的应用容器当做一个实体来管理

  • pod中容器间通信

    • 通过共享卷通信

    • 进程间通信(IPC),可以类似与linux主机上进程之间通信

    • 网络通信:Pod中的容器可以通过localhost 来相互通信,因为他们使用同一个网络命名空间,对于容器来说,hostname就是Pod名称。

      在实际业务中,业务配置为此(localhost)方式进行配置,访问

  • pod与pod之间通信

    • 两个pod在一台主机上面:通过docker默认的docker网桥互连容器 ??未理解
    • 两个pod在不同主机上面:需要k8s网络模型flannel组建一个大二层扁平网络,pod的ip分配由flannel统一分配,通信过程也是走flannel的网桥。每个node上面都会创建一个flannel0虚拟网卡,用于跨node之间通讯。跨节点通讯时,发送端数据会从docker0路由到flannel0虚拟网卡,接收端数据会从flannel0路由到docker0
  • pod与集群外服务通信


    image.png

(1)创建一个不指定后端pod label的Service

(2)手动创建一个和该Service 同名的Endpoint ,用于指向实际的后端访
问地址

kind : Service
apiVersion: vl
metadata:
  name : my-service
spec:
  ports:
  - protocol : TCP
  port : 80
  targetPort: 80
  
  
kind: Endpoints
apiVersion : vl
metadata:
  name: my-service
subsets :
- addresses:
  - IP: 1. 2. 3 . 4
  ports:
  - port: 80
  • 外部访问pod通信

    • NodePort:是K8s里一个广泛应用的服务暴露方式。K8s中的service默认情况都是使用Cluster IP这种类型,会产生一个只能在内部访问的Cluster IP,如果想能够直接访问service,需要将service type修改为nodePort。同时给改service指定一个nodeport值(30000-32767)

      kind: Service
      apiVersion: v1
      metadata:
        name: MyWeb
      spec:
        type: NodePort
        ports:
          - port:8086
            nodePort: 30000
        selector:
          name: MyWeb
      
  • hostNetwork: hostNetwork:true 在pod中使用该配置,在这种Pod中运行的应用程序可以直接看到pod启动的主机的网络接口

  • hostPort:直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过主机的IP来访问Pod了

  • LoadBalancer:只能在service上定义,是公有云提供的负载均衡器

    kind: Service
    apiVersion: v1
    metadata:
      name: influxdb
    spec:
      type: loadBalabcer
      ports:
        - port: 8086
      selector:
        name: influxdb
        
    内部可以使用ClusterIP加端口来访问服务
    外部可以使用两种方式:
        任意节点的IP加30051端口访问服务 10.97.121.42:30051
        使用EXTERNAL-IP来访问,这是云供应商提供的负载均衡IP:8086   
    
  • Ingress:ingress controller是由K8s管理的负载均衡容器,它的镜像包含一个nginx或HAProxy负载均衡器和一个控制器守护进程

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: influxdb
    spec:
      rules:
        - host: influxdb.kube.example.com
          http:
            paths:
              - backend:
                  serviceName: influxdb
                  servicePort: 8086
              
    外部访问URL  http://influxdb.kube.example.com/ping 访问该服务,入口是80端口,然后Ingress controller直接将流量转发给后端Pod,不需再经过kube-proxy的转发,比LoadBalance方式更高效
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容