本文所有相關(guān)鏈接pdf:https://tungstenfabric.org.cn/assets/uploads/files/tf-ceg-case-2.pdf
公司主營業(yè)務(wù):網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出寧都免費(fèi)做網(wǎng)站回饋大家。
Kubernetes的Ingress文檔頁面將其描述為:
“用于管理對集群中服務(wù)的外部訪問的API對象,通常是HTTP。Ingress可以提供負(fù)載均衡、SSL終結(jié)和基于名稱的虛擬主機(jī)。”
CNI不提供Ingress功能。這意味著Kubernetes集群管理者通常要為其集群安裝、管理和支持單獨(dú)的Ingress控制器解決方案。
對于沒有內(nèi)置Ingress支持的本地和公共云中的Kubernetes部署,Tungsten Fabric捆綁了自己的Ingress控制器。它在后臺使用HAProxy并實(shí)現(xiàn)了Kubernetes Ingress文檔頁面中所述的所有基本功能。
在AWS上運(yùn)行時(shí),可以將Kubernetes 配置為使用AWS的Application Load Balancer (ALB)為其Ingress服務(wù)。通過這種方式的設(shè)置,沙箱中的Kubernetes可以最緊密地反映典型的現(xiàn)實(shí)部署場景。
下圖概述了示例應(yīng)用程序的最終部署架構(gòu):
Ingress控制器選項(xiàng)僅與使用HTTP或HTTPS的應(yīng)用程序兼容。如果您的應(yīng)用程序是這種情況,可能需要考慮使用Ingress來實(shí)現(xiàn)以下目標(biāo):
在探討上述三種情況之前,讓我們部署一個(gè)簡單的Ingress示例應(yīng)用程序,類似于我們對 LoadBalancer的做法,然后在此基礎(chǔ)上進(jìn)行構(gòu)建。
確保您位于沙箱控制節(jié)點(diǎn)上,以root用戶身份登錄,并且位于正確的目錄中:
#確認(rèn)您是root賬戶
whoami | grep root || sudo -s
#切換為清單目錄
cd /home/centos/yelb/deployments/platformdeployment/Kubernetes/yaml
#部署具有Ingress的示例程序
kubectl create -f cnawebapp-ingress-alb.yaml
幾分鐘后,部署過程應(yīng)該完成了,我們應(yīng)該能夠從Internet訪問示例應(yīng)用程序。首先找到Ingress的DNS名稱:
根據(jù)上面的輸出,現(xiàn)在可以從Internet上的http://539db10e-default-yelbui-3c9c-1330819777.us-west-1.elb.amazonaws.com上訪問我們的示例應(yīng)用程序。
利用在環(huán)境中運(yùn)行上述命令獲得的DNS名稱訪問Yelb,以確保其有效。
對于此練習(xí),我們需要生成自簽名證書,并將其添加到AWS Certificate Manager。提供Ingress功能的AWS Application Load Balancer(ALB)需要使用此功能來執(zhí)行加密。
注意:對于生產(chǎn)用途,可能需要通過AWS Certificate Manager的相應(yīng)功能來獲得完整注冊域名的“適當(dāng)”證書。由于我們只是在進(jìn)行練習(xí),因此將使用自簽名的虛構(gòu)域。
在安裝了具有Access和Secret密鑰的AWS CLI工具的主機(jī)上執(zhí)行以下步驟。這里的密鑰允許您對Certificate Manager進(jìn)行更改。
#為虛構(gòu)的域名(yelb.mydomain.com)生成自簽名證書:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=yelb.mydomain.com"
#將新的證書加入到AWS Certificate Manager
#注意“--region” -這必須是同一個(gè)AWS區(qū)域
#在我們的例子中,運(yùn)行Tungsten 沙箱時(shí),它是“us-west-1”
aws acm import-certificate --certificate file://tls.crt --private-key file://tls.key --region us-west-1
如果一切順利,最后一條命令將顯示類似內(nèi)容:
{
"CertificateArn": "arn:aws:acm:us-west-1:180612498884:certificate/e7341ff5-52ef-4a7b-94b5-05643ef6ab46"
}
我們將需要CertificateArn后面的值,以進(jìn)行下一步。
確保您位于沙箱控制節(jié)點(diǎn)上,以root用戶身份登錄,并且位于正確的目錄中:
#確定您是root身份
whoami | grep root || sudo -s
#切換為清單目錄
cd /home/centos/yelb/deployments/platformdeployment/Kubernetes/yaml
現(xiàn)在,讓我們創(chuàng)建一個(gè)新的Ingress定義:
接下來,我們將CertificateArn放入。在運(yùn)行該命令之前對其進(jìn)行編輯,并用執(zhí)行步驟1時(shí)獲得arn:aws:acm:us-west-1:180612498884:certificate/e7341ff5-52ef-4a7b-94b5-05643ef6ab46的值替換該命令CertificateArn。
sed-i"s#INSERT_CERT_ARN_HERE#arn:aws:acm:us-west-1:180612498884:certificate/e7341ff5-52ef-4a7b-94b5-05643ef6ab46#" ingress-https.yaml
如果命令成功運(yùn)行,則ingress-https.yaml文件將具有自簽名證書的ARN,而不是字符串INSERT_CERT_ARN_HERE。
#創(chuàng)建新的 Ingress
kubectl create -f ingress-https.yaml
運(yùn)行上述命令后,請等待幾分鐘,以使新的ALB Ingress出現(xiàn)。然后,讓我們找到已為其分配的DNS名稱,并嘗試連接到它:
從上面的輸出中,我們可以看到新Ingress的地址;讓我們看看它是否有效:
這說明它有效——我們可以通過加密連接訪問Yelb應(yīng)用程序!
新拓?fù)淇雌饋硐襁@樣(請注意,我們?nèi)匀痪哂形丛诖藞D中顯示的原始HTTP Ingress):
除了增加最終用戶的連接安全性、隱私性和數(shù)據(jù)完整性外,實(shí)現(xiàn)HTTPS Ingress還有一些好處:
讓我們刪除添加的HTTPS Ingress,因?yàn)樵诒菊碌钠溆嗖糠种形覀儾辉傩枰?/p>
kubectl delete -f ingress-https.yaml
然后,在執(zhí)行步驟1(生成自簽名證書并將其安裝到AWS Certificate Manager中)的計(jì)算機(jī)上,運(yùn)行以下命令以刪除該證書,并確保使用您自己的值CertificateArn:
aws acm delete-certificate --certificate-arn arn:aws:acm:us-west-1:180612498884:certificate/e7341ff5-52ef-4a7b-94b5-05643ef6ab46
在某些情況下,您可能想在同一個(gè)DNS域名下運(yùn)行多個(gè)應(yīng)用程序。例如,www.corp.com可能支持您的主應(yīng)用程序,而諸如WordPress之類的其他應(yīng)用程序可能正在處理www.corp.com/blog。
對于本練習(xí),我們假設(shè)您在“通過Ingress公開示例應(yīng)用程序”這一章的開頭按照說明運(yùn)行了Yelb副本。如果您是從頭開始,請?zhí)猎摬糠?,按照說明進(jìn)行部署,然后再回來。
為了演示通過URL路徑進(jìn)行的路由,我們將在環(huán)境中添加另一個(gè)部署,并相應(yīng)地更新Ingress的配置。在此新配置下,Ingress會將對/路徑的請求定向到我們的主應(yīng)用程序yelb,而對/echo的路徑請求將定向?yàn)樾碌膽?yīng)用程序EchoServer。
這是目標(biāo)狀態(tài)的圖:
我們應(yīng)該已經(jīng)將Yelb的部分放置到位,所以我們添加EchoServer:
#創(chuàng)建EchoServer Deployment and Service 清單:
#現(xiàn)在部署它:
kubectl create -f echoserver.yaml
接下來,我們將為Ingress創(chuàng)建一個(gè)更新的配置。為此,我們將從中復(fù)制Ingress資源cnawebapp-ingress-alb.yaml,并在路由部分進(jìn)行兩項(xiàng)更改:
將yelb的路徑從/*更新到/以免干擾echoserver;和
注意:我們之所以要包含完整的資源定義而不是僅僅應(yīng)用差異部分,是因?yàn)镮ngress對象不支持戰(zhàn)略性合并修補(bǔ)。
#更新的Ingress資源:
#現(xiàn)在部署它:
kubectl apply -f ingress-paths.yaml
這里會顯示一個(gè)關(guān)于kubectl apply的警告,這個(gè)警告可以忽略。因?yàn)槲覀兊母沦Y源在本質(zhì)上與rules配置相同。
更新的配置在幾秒鐘內(nèi)生效,之后我們就可以檢查基于URL的路由是否有效。當(dāng)我們請求基本URL /(或?yàn)榭眨r(shí),我們應(yīng)該到達(dá)Yelb,如果請求/echo,我們應(yīng)該返回的輸出是EchoServer。
#獲得Ingress的基本URL
baseUrl=$(kubectl get ing yelb-ui | grep amaz | awk '{print $3}')
echo "Our Ingress is at: ${baseUrl}"
#嘗試訪問$baseUrl ; 應(yīng)當(dāng)可以得到Y(jié)elb UI頁面的內(nèi)容
curl http://${baseUrl}
#現(xiàn)在嘗試/echo ; 應(yīng)當(dāng)?shù)玫紼choServer的輸出
curl http://${baseUrl}/echo
當(dāng)您擁有多個(gè)域名,并且為每個(gè)域提供不同的應(yīng)用程序,同時(shí)希望共享相同的Ingress基礎(chǔ)結(jié)構(gòu),此場景中的解決方案就很有用。這有助于節(jié)省成本,并且在某些情況下,與每個(gè)域名擁有專用的Ingress實(shí)例相比,其復(fù)雜性更低。
此練習(xí)建立在上一個(gè)基于URL定向請求的練習(xí)的基礎(chǔ)上。如果尚未完成,請回顧此前步驟,簡單地剪切并粘貼創(chuàng)建和部署echoserver.yaml清單的步驟。我們將為Ingress新建一個(gè),因此無需創(chuàng)建和部署ingress-paths.yaml。
準(zhǔn)備好后,您應(yīng)該已經(jīng)有了yelb的副本和echoserver的副本。您的Ingress配置是什么都無所謂,因?yàn)槲覀儗⒏采w它。
在我們的目標(biāo)狀態(tài)下,Ingress將定義兩個(gè)域名yelb.mydomain.com和echo.mydomain.com,并將根據(jù)Host:HTTP頭中的值來路由傳入的請求,Web瀏覽器會自動為您請求的URL的主機(jī)部分插入這些請求。
這是目標(biāo)狀態(tài)的圖:
讓我們?yōu)镮ngress創(chuàng)建并部署配置,該配置將執(zhí)行所需的路由:
#更新的Ingress 資源:
#現(xiàn)在部署它:
kubectl apply -f ingress-hosts.yaml
配置成功應(yīng)用后,我們就可以進(jìn)行測試了。由于域名和主機(jī)形成映射,因此我們將利用curl添加正確的Host:標(biāo)頭。當(dāng)設(shè)置為yelb.mydomain.com,應(yīng)該到達(dá)Yelb,設(shè)置為echo.mydomain.com時(shí),應(yīng)該返回輸出EchoServer。
#Get the base URL of our Ingress
baseUrl=$(kubectl get ing yelb-ui | grep amaz | awk '{print $3}')
echo "Our Ingress is at: ${baseUrl}"
#訪問Ingress Host: 設(shè)置成 yelb; 我們應(yīng)當(dāng)可以得到Y(jié)elb UI頁面的內(nèi)容
curl http://${baseUrl} -H "Host: yelb.mydomain.com"
#現(xiàn)場嘗試訪問Host:設(shè)置成 echo;我們應(yīng)當(dāng)可以得到 EchoServer的輸出
curl http://${baseUrl} -H "Host: echo.mydomain.com"
一旦進(jìn)行了足夠的測試,請隨時(shí)清理:
#刪除“yelb”和“hoserver”應(yīng)用:
kubectl delete -f cnawebapp-ingress-alb.yaml
kubectl delete -f echoserver.yaml
#刪除我們創(chuàng)建的額外的清單:
rm -f echoserver.yaml ingress-paths.yaml ingress-hosts.yaml
Kubernetes提供了三種將應(yīng)用程序公開給外界的基本方式:LoadBalancer或NodePort服務(wù)類型以及Ingress。前兩個(gè)協(xié)議支持任意協(xié)議,但在協(xié)議智能方面并沒有增加太多。另一方面,Ingress提供了基于協(xié)議的功能,這使其僅與HTTP或HTTPS的應(yīng)用程序兼容。
與其他功能類似,Kubernetes需要一個(gè)控制器來實(shí)現(xiàn)實(shí)際的Ingress功能——簡單地在Kubernetes API中創(chuàng)建Ingress資源并不能執(zhí)行任何操作。Ingress控制器是Kubernetes集群管理員必須安裝、監(jiān)視、修補(bǔ)和升級的軟件的一部分。Tungsten Fabric隨附有Ingress控制器,這將使此過程更加容易。
一旦確定了應(yīng)用程序該如何公開于Internet,就需要考慮如何處理有關(guān)網(wǎng)絡(luò)訪問控制的問題。閱讀本指南中的用例3和用例4,我們將介紹其中的一些場景。
(本公眾號將陸續(xù)發(fā)布幾個(gè)用例的詳細(xì)內(nèi)容,敬請關(guān)注)
MORE
更多TF+K8s文章
第一篇:TF Carbide 評估指南--準(zhǔn)備篇
第二篇:通過Kubernetes的服務(wù)進(jìn)行基本應(yīng)用程序連接
關(guān)注微信:TF中文社區(qū)