欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

集群外访问容器

程序员文章站 2024-03-13 09:56:15
...

首先,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。

上一篇: INSTALL_FAILED_ABORTED

下一篇: