集群外访问容器
首先,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。