hostNetwork、
hostPort、
NodePort、
LoadBalancer、
Ingress
暴露Pod與Service一樣,因為Pod就是Service的backend
1、hostNetwork:true
這是一種直接定義 Pod 網絡的方式。
如果在 Pod 中使用?hostNetwork:true?配置, pod 中運行的應用程序可以直接看到 pod 啟動的主機的網絡接口。
在主機的所有網絡接口上都可以訪問到該應用程序。
注:每次pod的IP是會變化的
使用主機網絡的 pod 的示例定義:
apiVersion: v1
kind: Pod
metadata:name: influxdb
spec:hostNetwork: truecontainers:- name: influxdbimage: influxdb
部署該 Pod:
$ kubectl create -f influxdb-hostnetwork.yml
訪問該 pod 所在主機的 8086 端口:
curl -v http://$POD_IP:8086/ping
將看到?204 No Content?的 204 返回碼,說明可以正常訪問。
注意:
1.?每次啟動這個 Pod 的時候都可能被調度到不同的節點上,所有外部訪問 Pod 的 IP 也是變化的,而且調度 Pod 的時候還需要考慮是否與宿主機上的端口沖突,因此一般情況下除非您知道需要某個特定應用占用特定宿主機上的特定端口時才使用 hostNetwork: true 的方式。
2. 這種 Pod 的網絡模式有一個用處就是可以將網絡插件包裝在 Pod 中然后部署在每個宿主機上,這樣該 Pod 就可以控制該宿主機上的所有網絡。
2、hostPort:
這是一種直接定義 Pod 網絡的方式。
hostPort?直接將容器的端口與所調度的節點上的端口路由綁定,這樣用戶就可以通過宿主機的 IP 加上來訪問 Pod 了。
如:
apiVersion: v1
kind: Pod
metadata:name: influxdb
spec:containers:- name: influxdbimage: influxdbports:- containerPort: 8086hostPort: 8086
注:這樣做有個缺點,因為 Pod 重新調度的時候該 Pod 被調度到的宿主機可能會變動,這樣就變化了,用戶必須自己維護一個 Pod 與所在宿主機的對應關系。
這種網絡方式可以用來做 nginx Ingress controller 。外部流量都需要通過 kubenretes node 節點的 80 和 443 端口。
3、NodePort:
1. 是K8s里一個廣泛應用的服務暴露方式。
2. K8s中的service默認情況都是使用Cluster IP這種類型,會產生一個只能在內部訪問的Cluster IP,3.如果想能夠直接訪問service,需要將service type修改為nodePort。
4.同時給service指定一個nodeport值(30000-32767),用` --service-node-port-range`定義。
集群外就可以使用K8s任意一個節點的IP加上30000端口訪問該服務了,kube-proxy會自動將流量以輪詢的方式轉發給該service的每一個pod。
apiVersion: v1
kind: Pod
metadata:name: influxdblabels:name: influxdb
spec:containers:- name: influxdbimage: influxdbports:- containerPort: 8086
同時還可以給 service 指定一個?nodePort?值,范圍是 30000-32767,這個值在 API server 的配置文件中,用?--service-node-port-range?定義。
kind: Service
apiVersion: v1
metadata:name: influxdb
spec:type: NodePortports:- port: 8086nodePort: 30000selector:name: influxdb
1. 集群外就可以使用 kubernetes 任意一個節點的 IP 加上 30000 端口訪問該服務了。kube-proxy 會自動將流量以 round-robin 的方式轉發給該 service 的每一個 pod。
2. 這種服務暴露方式,無法讓你指定自己想要的應用常用端口,不過可以在集群上再部署一個反向代理作為流量入口。
4、LoadBalancer:
LoadBalancer?只能在?service?上定義。這是公有云提供的負載均衡器,如 AWS、Azure、CloudStack、GCE 等。
kind: Service
apiVersion: v1
metadata:name: influxdb
spec:type: LoadBalancerports:- port: 8086selector:name: influxdb
查看服務:
kubectl get svc influxdb
內部可以使用ClusterIP:Port來訪問服務
外部可以使用兩種方式:
-
- 任意節點的IP加30051端口訪問服務?10.97.121.42:30051
- 使用EXTERNAL-IP來訪問,這是云供應商提供的負載均衡IP 10.13.242.236:8086
5、Ingress:
Ingress?是自?kubernetes1.1?版本后引入的資源類型。必須要部署?Ingress controller?才能創建 Ingress 資源,Ingress controller 是以一種插件的形式提供。
- Ingress controller 部署在 Kubernetes 之上的 Docker 容器。
- 它的 Docker 鏡像包含一個像 nginx 或 HAProxy 的負載均衡器和一個控制器守護進程。
- 控制器守護程序從 Kubernetes 接收所需的 Ingress 配置。
- 它會生成一個 nginx 或 HAProxy 配置文件,并重新啟動負載平衡器進程以使更改生效。換句話說,Ingress controller 是由 Kubernetes 管理的負載均衡器。
Kubernetes Ingress 提供了負載平衡器的典型特性:HTTP 路由,粘性會話,SSL 終止,SSL 直通,TCP 和 UDP 負載平衡等。目前并不是所有的 Ingress controller 都實現了這些功能,需要查看具體的 Ingress controller 文檔。
ingress controller是由K8s管理的負載均衡容器,它的鏡像包含一個nginx或HAProxy負載均衡器和一個控制器守護進程。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: influxdb
spec:rules:- host: influxdb.kube.example.comhttp:paths:- backend:serviceName: influxdbservicePort: 8086
外部訪問URL?http://influxdb.kube.example.com/ping?訪問該服務,入口是80端口,然后Ingress controller直接將流量轉發給后端Pod,不需再經過kube-proxy的轉發,比LoadBalance方式更高效。
?