【k8s學(xué)習(xí)】Kubernetes Ingress介紹

【本文內(nèi)容】

  • 什么是Ingress
  • Ingress的yaml配置
  • Ingress的use case(什么情況下需要用到Ingress)
  • Ingress Controller的介紹
  • Demo - 通過(guò)Ingress暴露kubernetes dashboard
  • tls相關(guān)(https)

【前置文章】

1. External Service vs. Ingress

External Service

假設(shè)我們的Kubernetes集群中有my-app pod甘萧,以及my-app external service慨蛙,意味著我們可以從外部以NodeIP + Port的形式訪問(wèn)my-app項(xiàng)目,如http://124.89.11.11:35010 --> 這就是external service能達(dá)到的效果痴脾。這時(shí)候my-app service的yaml中的配置颤介,則需要配成:spec.type = LoadBalancer,并且需要配置spec.ports.nodePord = 35010赞赖,表明需要對(duì)集群外暴露這個(gè)Service滚朵,以下是定義external service的示例:

image.png

Ingress

官網(wǎng):https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/

但如果我們想要用https://my-app.com來(lái)訪問(wèn)my-app項(xiàng)目,那么就需要用到Ingress組件了前域。即會(huì)先創(chuàng)建一個(gè)my-app ingress --> 然后轉(zhuǎn)發(fā)到my-app internal service --> 再轉(zhuǎn)發(fā)到my-app pod辕近,可以看到有了Ingress組件后,Service組件不再需要external了(即上述的type可以刪掉匿垄,不填默認(rèn)是ClusterIP移宅,即internal service了,不對(duì)外暴露椿疗,nodePort也可以刪除)吞杭。

2. Ingress yaml配置文件

簡(jiǎn)單的Ingress yaml示例:

注,這里的apiVersion有更新变丧,之前的版本是apiVersion: extensions/v1beta1,最新的版本是下述的v1绢掰,兩者的語(yǔ)法有些許差別痒蓬,比如v1beta1中是serviceName,servicePort滴劲,而在v1(下述)中則是service.name和service.port.number

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
spec:
  rules:
  - host: dashboard.info.abc
    http:
      paths:
        - path: "/"
          pathType: Prefix
          backend:
            service:
              name: myapp-internal-service
              port:
                number: 8080
  • apiVersionkind攻晒,前兩行是聲明,其中kind表示當(dāng)前需要?jiǎng)?chuàng)建的是Ingress資源班挖。
  • spec中的rules:表示Routing rules鲁捏,路由規(guī)則。表示這個(gè)從host來(lái)的請(qǐng)求萧芙,需要被轉(zhuǎn)發(fā)到serviceName中给梅,即request from myapp.com --> 轉(zhuǎn)發(fā)到myapp-internal-service
  • 其中的paths表示可以按url的后綴進(jìn)行匹配双揪,下文有具體的例子解釋动羽。
  • 【和internal service的對(duì)應(yīng)】,Ingress中的serviceName對(duì)應(yīng)的是service yaml中的metadata.name渔期,Ingress中的servicePort對(duì)應(yīng)的是service yaml中的spec.ports.port运吓。

3. Ingress Controller

官網(wǎng):https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/

3.1 Ingress Controller介紹

除了安裝Ingress組件之外渴邦,我們還需要一個(gè)Ingress的實(shí)現(xiàn)(Implementation),這個(gè)實(shí)現(xiàn)就是Ingress Controller拘哨,Ingress Controller也是運(yùn)行在Pod中的谋梭,即我們可以創(chuàng)建一個(gè)Pod,叫Ingress Controller Pod倦青。

Ingress Controller是干什么的瓮床?它是用來(lái)解析上述Ingress yaml中的rules規(guī)則的,即需要怎樣的跳轉(zhuǎn)姨夹。(如一級(jí)域名纤垂,二級(jí)域名等等,諸如此類(lèi)的跳轉(zhuǎn)規(guī)則的實(shí)現(xiàn))磷账。

目前有很多第三方的實(shí)現(xiàn)峭沦,如:

3.2 現(xiàn)實(shí)中的Ingress Controller架構(gòu)

如果用的是一些云服務(wù)器吼鱼,例如aws, google提供的Kubernetes,那么請(qǐng)求會(huì)先到達(dá)這些云服務(wù)商的負(fù)載均衡器上绰咽,即Cloud Load Balancer --> 再跳轉(zhuǎn)到我們?cè)贙ubernetes集群內(nèi)定義的Ingress Controller Pod上 --> 然后再是my-app ingress --> my-app internal service --> my-app pod菇肃。

相當(dāng)于云服務(wù)商會(huì)幫我們做掉負(fù)載均衡的部分。

如果我們的Kubernetes集群運(yùn)行在自己的服務(wù)器上(沒(méi)有依賴(lài)aws這些云服務(wù)商提供服務(wù))取募,那么在Ingress Controller之前琐谤,可能需要一臺(tái)Proxy Server,用來(lái)做轉(zhuǎn)發(fā)(負(fù)載均衡)玩敏。

3.3 在Minikube上安裝Ingress Controller

在minikube上可以通過(guò)以下命令斗忌,minikube會(huì)自動(dòng)幫我們安裝Kubernetes Nginx Ingress Controller,安裝的時(shí)候可能需要一些時(shí)間:

?minikube addons enable ingress

我minikube啟動(dòng)的時(shí)候vm-driver用的是hyperkit旺聚,然后遇到如下問(wèn)題:
image.png

于是我換成docker作為vm-driver织阳,先用命令minikube delete --all刪除下minikube,然后再run:minikube start --vm-driver=docker砰粹。
再安裝ingress唧躲,就沒(méi)有問(wèn)題了:

image.png

通過(guò)查看namespace=kube-system下的pod,可以看到名為nginx-ingress-controller的相關(guān)的已經(jīng)running了:

kubectl get all -n ingress-nginx

image.png
3.4 示例:給kubernetes-dashboard配置Ingress

在minikube上安裝好基于Kubernetes Nginx的Ingress Controller后碱璃,我們?cè)囍okubenetes-dashboard配置Ingress弄痹,以便以hostName的方式暴露給集群外部使用。
首先運(yùn)行minikube dashboard:

minikube dashboard

image.png

首先查看kubernetes dashboard的所有配置(在namespace為kubernetes-dashboard下):

kubectl get all -n kubernetes-dashboard

image.png

編寫(xiě)Ingress yaml文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dashboard-ingress
  namespace: kubernetes-dashboard
spec:
  rules:
  - host: dashboard.com
    http:
      paths:
        - path: "/"
          pathType: Prefix
          backend:
            service:
              name: kubernetes-dashboard
              port:
                number: 80

kubectl apply -f dashboard-ingress.yaml

創(chuàng)建好之后嵌器,查看Ingress列表界酒,需要加上-n(即namespace的意思),否則只會(huì)在namespace=default下查詢(xún):
image.png

進(jìn)入host文件(我的是MacOS系統(tǒng)嘴秸,如果是Windows庇谆,自行查閱):

sudo vim /etc/hosts

在host文件的最后加上跳轉(zhuǎn)的mapping:


image.png

這要在瀏覽器中訪問(wèn)dashboard.com的時(shí)候會(huì)訪問(wèn)到我們的kubernetes dashboard。

3.5 default-http-backend

kubectl describe ingress dashboard-ingress -n kubernetes-dashboard

可能會(huì)遇到以下信息:
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)

這個(gè)表示我們沒(méi)有default http來(lái)處理不正確的url凭疮,即如果我們?cè)趗rl中輸入dashboard.com/abc饭耳,會(huì)跳404,但如果我們配置了一個(gè)Service执解,名字就叫default-http-backend寞肖,那么所有404的跳轉(zhuǎn),就會(huì)跳到這個(gè)Service上了衰腌。

4. Ingress同一個(gè)域名下多個(gè)路徑

4.1 配置多個(gè)path

比如myapp.com網(wǎng)站新蟆,除了首頁(yè)之前,我們可能會(huì)有很多Service(即myapp.com項(xiàng)目并不只是一個(gè)Web項(xiàng)目右蕊,而是拆分成很多的微服務(wù)琼稻,那么可能會(huì)部署不同的Pod以及Mapping在不同的Service上),比如/analytics饶囚,/shopping帕翻,

我們可以通過(guò)在同一個(gè)Ingress配置多個(gè)path來(lái)達(dá)到這樣的效果:

spec:
  rules:
    - host: myapp.com
      http:
        paths:
          - path: /analytics
            pathType: Prefix
            backend:
              service:
                name: analytics-service
                port:
                  number: 3000
          - path: /shopping
            pathType: Prefix
            backend:
              service:
                name: shopping-service
                port:
                  number: 3001
4.2 配置多個(gè)host

另外一種case是有些大公司不止一個(gè)域名,除了myapp.com這個(gè)主域名外萝风,還會(huì)有二級(jí)域名嘀掸,如analytics.myapp.com,shopping.myapp.com等等规惰,針對(duì)這種情況睬塌,需要配置多個(gè)host:

spec:
  rules:
    - host: analytics.myapp.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: analytics-service
                port:
                  number: 3000
    - host: shopping.myapp.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: shopping-service
                port:
                  number: 3001

5. 配置TLS認(rèn)證—http://

官網(wǎng):https://kubernetes.io/docs/concepts/services-networking/ingress/#tls

需要要Ingress yaml配置文件中的spec加tls配置,指向Secret中的metadata.name(所以還需要再配置一個(gè)Secret yaml文件)歇万。

spec:
  tls:
  - hosts:
      - my-app.com
    secretName: myapp-secret-tls

Secret yaml配置文件衫仑,當(dāng)需要?jiǎng)?chuàng)建tls的Secret,需要指定的type為kubernetes.io/tls

apiVersion: v1
kind: Secret
metadata:
  name: myapp-secret-tls
  namespace: default
data:
  tls.crt: base64 encoded cert
  tls.key: base64 encoded key
type: kubernetes.io/tls

需要注意的是Secret中的namespace需要和Ingress中的一致堕花,否則Ingress無(wú)法mapping這個(gè)信息。


參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末粥鞋,一起剝皮案震驚了整個(gè)濱河市缘挽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呻粹,老刑警劉巖壕曼,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異等浊,居然都是意外死亡腮郊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)筹燕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)轧飞,“玉大人衅鹿,你說(shuō)我怎么就攤上這事」В” “怎么了大渤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)掸绞。 經(jīng)常有香客問(wèn)我泵三,道長(zhǎng),這世上最難降的妖魔是什么衔掸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任烫幕,我火速辦了婚禮,結(jié)果婚禮上敞映,老公的妹妹穿的比我還像新娘较曼。我一直安慰自己,他們只是感情好驱显,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布诗芜。 她就那樣靜靜地躺著,像睡著了一般埃疫。 火紅的嫁衣襯著肌膚如雪伏恐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天栓霜,我揣著相機(jī)與錄音翠桦,去河邊找鬼。 笑死胳蛮,一個(gè)胖子當(dāng)著我的面吹牛销凑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仅炊,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼斗幼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了抚垄?” 一聲冷哼從身側(cè)響起蜕窿,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呆馁,沒(méi)想到半個(gè)月后桐经,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浙滤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年阴挣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纺腊。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畔咧,死狀恐怖茎芭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盒卸,我是刑警寧澤骗爆,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站蔽介,受9級(jí)特大地震影響摘投,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虹蓄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一犀呼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧薇组,春花似錦外臂、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至炭菌,卻和暖如春罪佳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黑低。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工赘艳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人克握。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓蕾管,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親菩暗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掰曾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353