1. 訪問Rest API
直接訪問Rest API一般有兩種方式观挎,一種是通過代理的模式琳袄,一種直接的http客戶端訪問玖喘,比較推薦第一種訪問的方式贡蓖。
1.1 代理模式
首先通過如下方式把代理運(yùn)行起來:
screen kubectl proxy # 通過CTL+a+d組合鍵放在后臺運(yùn)行
然后就可以訪問API了曹鸠,比如:
1.2 非代理模式
這種訪問模式是基于ServiceAccount資源并且需要提供認(rèn)證token。
首先斥铺,獲取token:
k8s_token=$(kubectl get secret $(kubectl get secrets | grep -i default | awk '{print $1}') -o yaml | grep token: | awk '{print $2}' | base64 -d)
其次彻桃,獲取訪問API的BaseURL:
最后,通過如下方式訪問API:
不過這種方式可能有時需要角色綁定晾蜘,類似下面這樣:
kubectl create clusterrolebinding my_role --clusterrole=cluster-admin --serviceaccount=default:default
2. K8s集群Pod和Service訪問策略
這里的訪問一般可分為集群內(nèi)部訪問(比如Node訪問Pod邻眷、Pod間互訪等)和集群外部訪問,下面就從這兩種訪問途徑聊聊它們各自的實現(xiàn)方式剔交。
2.1 集群內(nèi)部訪問
簡單總結(jié)一下肆饶,大致會有下面幾種實現(xiàn)的方式:
- hostNetwork
通過設(shè)置Pod的YAML的文件spec區(qū)域字段hostNetwork: true實現(xiàn),其實質(zhì)是實現(xiàn)了Pod和其所在的Node共享網(wǎng)絡(luò)棧省容,如此就可以通過Node的任一IP加Pod服務(wù)的端口來實現(xiàn)對Pod服務(wù)的訪問抖拴。
不過這種實現(xiàn)方式會存在兩個缺點:Pod服務(wù)暴露的端口可能會與Node某個服務(wù)端口沖突;由于Pod的生命周期很短比如重啟或者出現(xiàn)故障等原因腥椒,Pod經(jīng)常會被調(diào)度到不同的Node阿宅,因此可能需要維護(hù)一個Pod和Node映射關(guān)系。
- hostPort
這是一種直接定義Pod網(wǎng)絡(luò)的方式笼蛛,直接將容器的端口與所調(diào)度的節(jié)點上的端口路由洒放,這樣用戶就可以通過宿主機(jī)的IP加上來訪問Pod了,如下是這種訪問方式的一個實現(xiàn)樣例:
...
spec:
containers:
- name: nginx_test
image: nginx:1.9.1
ports:
- containerPort: 80
hostPort: 8900
...
如此就能夠通過$HOSTIP:8900來訪問該P(yáng)od的服務(wù)了滨砍,不過這種實現(xiàn)方式仍存在hostNetwork訪問實現(xiàn)的第二個缺點往湿。
- Kubectl port-forward
在本地設(shè)置端口監(jiān)聽,實現(xiàn)對Pod端口轉(zhuǎn)發(fā)惋戏,由于這種類型的轉(zhuǎn)發(fā)端口是綁定在本地的领追,這種方式也僅適用于調(diào)試服務(wù)。
- ClusterIP類型的Service
這個是K8s默認(rèn)使用Service的方式响逢,通過一個固定的VIP和端口去訪問Pod服務(wù)绒窑,同時提供負(fù)載均衡能力,不過僅限K8s內(nèi)部集群訪問舔亭,比如Pod間的訪問些膨,如下是實現(xiàn)一個http service的YAML定義的樣例:
...
spec:
clusterIP: 10.110.14.69
externalTrafficPolicy: Cluster
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: httpd-app
sessionAffinity: None
...
通過kubectl create命令創(chuàng)建Service之后蟀俊,我們可以通過如下命令看一下該Service的Endpoint資源信息:
從上圖不難看出,該Service對應(yīng)了后端的三個Pod订雾,我們實際使用中通過10.110.14.69:80實現(xiàn)對后端HTTP服務(wù)的訪問肢预。
2.2 集群外部訪問
- NodePort
基于ClusterIP的功能,為Service在K8s集群中的每個Node綁定一個端口(即NodePort)洼哎,這樣就可以通過每個Node的IP加上這個端口去實現(xiàn)訪問烫映,kube-proxy會自動將流量以round-robin的方式轉(zhuǎn)發(fā)給該service的每一個pod。
配置方法基本與ClusterIP類型的Service相同噩峦,只不過需要在spec區(qū)域加上字段type: NodePort窑邦,當(dāng)然也可以指定具體的nodePort值(默認(rèn)范圍30000-32767)或者任其隨機(jī)分配。
這種服務(wù)暴露方式壕探,無法讓你指定自己想要的應(yīng)用常用端口,不過可以在集群上再部署一個反向代理作為流量入口郊丛。
- LoadBalancer
只能在Service內(nèi)定義(作為一種Service type)李请,基于NodePort和公有云提供的負(fù)載均衡器,通過負(fù)載均衡器把外部請求轉(zhuǎn)發(fā)到NodePort進(jìn)而實現(xiàn)對Pod服務(wù)的訪問厉熟。
kind: Service
apiVersion: v1
metadata:
name: my-nginx
spec:
type: LoadBalancer
ports:
- port: 80
selector:
run: my-nginx
name: my-nginx
創(chuàng)建好Service之后查看一下服務(wù)信息:
root@vinefu-dev:~#kubectl get svc my-nginx
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx 10.97.121.42 10.13.242.236 80:30051/TCP 39s
如此對內(nèi)可以通過10.97.121.42:80去訪問导盅;對外一方面可以通過Node IP加上端口30051訪問,另一方面還可以通過EXTERNAL-IP 10.13.242.236:80去訪問揍瑟。
- Ingress
Ingress是授權(quán)入站連接到達(dá)集群服務(wù)的規(guī)則集合白翻,提供了外部訪問內(nèi)部的入口,Ingress 支持將 Service 暴露到 Kubernetes 集群外绢片,同時可以自定義 Service 的訪問策略滤馍。Ingress 能夠把 Service 配置成外網(wǎng)能夠訪問的 URL,也支持提供按域名訪問的虛擬主機(jī)功能底循。例如巢株,通過負(fù)載均衡器實現(xiàn)不同的二級域名到不同 Service 的訪問。
另外要實現(xiàn)Ingress熙涤,需提前安裝好對應(yīng)的Ingress Controller阁苞。Ingress
用作將原來需要手動配置的規(guī)則抽象成一個 Ingress 對象,使用 YAML 格式的文件來創(chuàng)建和管理祠挫。Ingress Controller
用作通過與 Kubernetes API 交互那槽,動態(tài)的去感知集群中 Ingress 規(guī)則變化,下面舉一個典型的Ingress YAML定義樣例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: s1
servicePort: 80
path: /bar
- host: bar.foo.com
http:
paths:
- backend:
serviceName: s2
servicePort: 80
path: /foo
通過kubectl create -f命令創(chuàng)建完Ingress對象后等舔,只要服務(wù)(s1骚灸,s2)存在,Ingress controller就會將提供一個滿足該Ingress的特定loadbalancer實現(xiàn)软瞎。