參考文獻(xiàn):
https://github.com/kubernetes/ingress-nginx/blob/nginx-0.20.0/docs/deploy/index.md
http://www.reibang.com/p/0a58e61627c4
http://www.reibang.com/p/02845519b0e0
https://blog.csdn.net/bbwangj/article/details/82940419
http://www.reibang.com/p/121b58782865
測(cè)試環(huán)境:
組件 | 版本號(hào) |
---|---|
kubernetes | v1.12.1 |
ingress-nginx | 0.20.0 |
centos | 7.5 |
docker | 17.03.2-ce |
一、Ingress 簡(jiǎn)介
在Kubernetes中,服務(wù)和Pod的IP地址僅可以在集群網(wǎng)絡(luò)內(nèi)部使用毅访,對(duì)于集群外的應(yīng)用是不可見(jiàn)的。
為了使外部的應(yīng)用能夠訪問(wèn)集群內(nèi)的服務(wù)适刀,
在Kubernetes 目前 提供了以下幾種方案:
- NodePort
- LoadBalancer
- Ingress
-
Ingress 組成衰粹?
- ingress controller
- 將新加入的Ingress轉(zhuǎn)化成Nginx的配置文件并使之生效
- ingress服務(wù)
- 將Nginx的配置抽象成一個(gè)Ingress對(duì)象,每添加一個(gè)新的服務(wù)只需寫(xiě)一個(gè)新的Ingress的yaml文件即可
- ingress controller
-
Ingress 工作原理?
ingress controller通過(guò)和kubernetes api交互揖铜,動(dòng)態(tài)的去感知集群中ingress規(guī)則變化喊熟,
然后讀取它柏肪,按照自定義的規(guī)則,規(guī)則就是寫(xiě)明了哪個(gè)域名對(duì)應(yīng)哪個(gè)service芥牌,生成一段nginx配置烦味,
再寫(xiě)到nginx-ingress-control的pod里,這個(gè)Ingress controller的pod里運(yùn)行著一個(gè)Nginx服務(wù),控制器會(huì)把生成的nginx配置寫(xiě)入/etc/nginx.conf文件中谬俄,
然后reload一下使配置生效柏靶。
以此達(dá)到域名分配置和動(dòng)態(tài)更新的問(wèn)題。
-
Ingress 可以解決什么問(wèn)題溃论?
- 動(dòng)態(tài)配置服務(wù)
如果按照傳統(tǒng)方式, 當(dāng)新增加一個(gè)服務(wù)時(shí), 我們可能需要在流量入口加一個(gè)反向代理指向我們新的k8s服務(wù). 而如果用了Ingress, 只需要配置好這個(gè)服務(wù), 當(dāng)服務(wù)啟動(dòng)時(shí), 會(huì)自動(dòng)注冊(cè)到Ingress的中, 不需要而外的操作. - 減少不必要的端口暴露
配置過(guò)k8s的都清楚, 第一步是要關(guān)閉防火墻的, 主要原因是k8s的很多服務(wù)會(huì)以NodePort方式映射出去, 這樣就相當(dāng)于給宿主機(jī)打了很多孔, 既不安全也不優(yōu)雅. 而Ingress可以避免這個(gè)問(wèn)題, 除了Ingress自身服務(wù)可能需要映射出去, 其他服務(wù)都不要用NodePort方式
- 動(dòng)態(tài)配置服務(wù)
-
Ingress當(dāng)前的實(shí)現(xiàn)方式屎蜓?
本文使用的是基于nginx的ingress
二、部署配置Ingress
2.1 部署文件介紹钥勋、準(zhǔn)備
第一步: 獲取配置文件位置
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.20.0/deploy
第二步: 下載部署文件
提供了兩種方式 :
- 默認(rèn)下載最新的yaml
- 指定版本號(hào)下載對(duì)應(yīng)的yaml
-
默認(rèn)下載最新的yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
-
指定版本號(hào)下載對(duì)應(yīng)的yaml
如下載ingress-nginx 0.17.0對(duì)應(yīng)的yamlwget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.17.0/deploy/mandatory.yaml
部署文件介紹
-
namespace.yaml
創(chuàng)建一個(gè)獨(dú)立的命名空間 ingress-nginx -
configmap.yaml
ConfigMap是存儲(chǔ)通用的配置變量的炬转,類似于配置文件,使用戶可以將分布式系統(tǒng)中用于不同模塊的環(huán)境變量統(tǒng)一到一個(gè)對(duì)象中管理算灸;而它與配置文件的區(qū)別在于它是存在集群的“環(huán)境”中的扼劈,并且支持K8S集群中所有通用的操作調(diào)用方式。
從數(shù)據(jù)角度來(lái)看菲驴,ConfigMap的類型只是鍵值組荐吵,用于存儲(chǔ)被Pod或者其他資源對(duì)象(如RC)訪問(wèn)的信息。這與secret的設(shè)計(jì)理念有異曲同工之妙赊瞬,主要區(qū)別在于ConfigMap通常不用于存儲(chǔ)敏感信息先煎,而只存儲(chǔ)簡(jiǎn)單的文本信息。
ConfigMap可以保存環(huán)境變量的屬性巧涧,也可以保存配置文件薯蝎。
創(chuàng)建pod時(shí),對(duì)configmap進(jìn)行綁定褒侧,pod內(nèi)的應(yīng)用可以直接引用ConfigMap的配置良风。相當(dāng)于configmap為應(yīng)用/運(yùn)行環(huán)境封裝配置。
pod使用ConfigMap闷供,通常用于:設(shè)置環(huán)境變量的值、設(shè)置命令行參數(shù)统诺、創(chuàng)建配置文件歪脏。
default-backend.yaml
如果外界訪問(wèn)的域名不存在的話,則默認(rèn)轉(zhuǎn)發(fā)到default-http-backend這個(gè)Service粮呢,其會(huì)直接返回404:rbac.yaml
負(fù)責(zé)Ingress的RBAC授權(quán)的控制婿失,其創(chuàng)建了Ingress用到的ServiceAccount、ClusterRole啄寡、Role豪硅、RoleBinding、ClusterRoleBindingwith-rbac.yaml
是Ingress的核心挺物,用于創(chuàng)建ingress-controller懒浮。前面提到過(guò),ingress-controller的作用是將新加入的Ingress進(jìn)行轉(zhuǎn)化為Nginx的配置
2.2 部署ingress
第一步: 準(zhǔn)備鏡像,從這里mandatory.yaml查看需要哪些鏡像
已經(jīng)準(zhǔn)備好砚著, 可以直接點(diǎn)擊下載
鏡像名稱 | 版本 | 下載地址 |
---|---|---|
k8s.gcr.io/defaultbackend-amd64 | 1.5 | registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64 |
quay.io/kubernetes-ingress-controller/nginx-ingress-controller | 0.20.0 | registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller |
如:
docker pull registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0
將鏡像上傳到自己的私有倉(cāng)庫(kù)次伶,以供下面的步驟使用。
第二步: 更新mandatory.yaml中的鏡像地址
替換成自己的鏡像地址:
-
替換defaultbackend-amd64鏡像地址
sed -i 's#k8s.gcr.io/defaultbackend-amd64#registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64#g' mandatory.yaml
-
替換nginx-ingress-controller鏡像地址
sed -i 's#quay.io/kubernetes-ingress-controller/nginx-ingress-controller#registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller#g' mandatory.yaml
第三步: 部署nginx-ingress-controller
kubectl apply -f mandatory.yaml
第四步: 查看ingress-nginx組件狀態(tài)稽穆?
-
查看相關(guān)pod狀態(tài)
kubectl get pods -n ingress-nginx -owide
[root@master ingress-nginx]# kubectl get pods -n ingress-nginx -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE default-http-backend-7f594549df-nzthj 1/1 Running 0 3m59s 192.168.1.90 slave1 <none> nginx-ingress-controller-9fc7f4c5f-dr722 1/1 Running 0 3m59s 192.168.2.110 slave2 <none> [root@master ingress-nginx]#
-
查看service狀態(tài)
[root@master ingress-nginx]# kubectl get service -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default-http-backend ClusterIP 10.104.146.218 <none> 80/TCP 5m37s [root@master ingress-nginx]#
三冠王、測(cè)試
3.1 測(cè)試default-http-backend 是否起作用?
系統(tǒng)自動(dòng)安裝了一個(gè)default-http-backend pod舌镶, 這是一個(gè)缺省的http后端服務(wù)柱彻, 用于返回404結(jié)果,如下所示:
接下會(huì)做一些關(guān)于ingress的詳細(xì)測(cè)試