首先,k8s中有三种IP:

 1. Node IP:宿主机的IP,外网是可以直接访问到的
 2. Pod IP: pod 的ip,是使用网络插件(如flannel)创建的ip。集群内可以访问,外网无法访问,用于跨主机的pod通信
 3. Cluster IP: 虚拟IP,只能集群内访问

所以外网只能访问到nodeIp,至于Pod IP 和Cluster IP都是访问不到的,要想外部能访问到容器,kubernetes提供了如下几个方法:

 1. hostNetwork 
 2. hostPort 
 3. NodePort 
 4. LoadBalancer 
 5. Ingress

1、hostNetwork

hostNetwork 设为 true ,可以让容器和node的网络共享,也就是说在容器外可以直接使用 node IP + 容器 port 来访问容器提供的服务

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  hostNetwork: true
  containers:
    - name: nginx
      image: nginx

使用hostnetwork,会发现pod IP 和 Node IP 是一样的

2、 host Port

将 node 的port 与container 的port映射,让外部可以通过 node IP + pod Port访问容器服务了

apiVersion: v1
kind: Pod
metadata:
  name: influxdb
spec:
  containers:
    - name: influxdb
      image: influxdb
      ports:
        - containerPort: 8086
          hostPort: 8086

hostPort的优缺点与hostNetwork类似,因为它们都是使用了宿主机的网络资源。hostPort相对hostNetwork的一个优点是,hostPort不需要提供宿主机的网络信息,但其性能不如hostNetwork,因为需要经过iptables的转发才能到达Pod。

3、Node Port

与前两个不同,node port是一种service,他可以指定node节点的一个port,让这个port和service代理的服务的port映射

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80

---
kind: Service
apiVersion: v1
metadata:
  name: nginx
spec:
  type: NodePort
  ports:
    - port: 80  # 映射的容器的端口
      nodePort: 30000  # node 节点的端口
  selector:
    name: nginx

这样容器外就可以以任意node IP + 30000端口就能访问到 service代理的后端服务了。kube-proxy会自动将流量以round-robin的方式转发给该service的每一个pod。

4、LoadBalancer

LoadBalancer 只能在service上定义。这是公有云提供的负载均衡器,如AWS、Azure、CloudStack、GCE等。

5、Ingress

必须要部署 Ingress controller 才能创建Ingress资源,Ingress controller是以一种插件的形式提供。Ingress controller 是部署在Kubernetes之上的Docker容器。

    internet
        |
   [ Ingress ]
   --|-----|--
   [ Services ]
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx
spec:
  rules:
    - host: nginx.test.com
      http:
        paths:
          - backend:
              serviceName: nginx
              servicePort: 80

外部的请求会先到ingress,ingress再根据配置,路由分发到service。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐