如何訪問K8s集群

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)软瞎。

3. 文檔參考

Ingress解析

淺析從外部訪問 Kubernetes 集群中應(yīng)用的幾種方式

從外部訪問Kubernetes中的Pod

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逢唤,一起剝皮案震驚了整個濱河市拉讯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳖藕,老刑警劉巖魔慷,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異著恩,居然都是意外死亡院尔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門喉誊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邀摆,“玉大人,你說我怎么就攤上這事伍茄《绊铮” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵敷矫,是天一觀的道長例获。 經(jīng)常有香客問我,道長曹仗,這世上最難降的妖魔是什么榨汤? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮怎茫,結(jié)果婚禮上收壕,老公的妹妹穿的比我還像新娘。我一直安慰自己轨蛤,他們只是感情好蜜宪,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著祥山,像睡著了一般端壳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枪蘑,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天损谦,我揣著相機(jī)與錄音,去河邊找鬼岳颇。 笑死照捡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的话侧。 我是一名探鬼主播栗精,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了悲立?” 一聲冷哼從身側(cè)響起鹿寨,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薪夕,沒想到半個月后脚草,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡原献,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年馏慨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姑隅。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡写隶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讲仰,到底是詐尸還是另有隱情慕趴,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布鄙陡,位于F島的核電站秩贰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柔吼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一丙唧、第九天 我趴在偏房一處隱蔽的房頂上張望愈魏。 院中可真熱鬧,春花似錦想际、人聲如沸培漏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牌柄。三九已至,卻和暖如春侧甫,著一層夾襖步出監(jiān)牢的瞬間珊佣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工披粟, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留咒锻,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓守屉,卻偏偏與公主長得像惑艇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355