您好,登錄后才能下訂單哦!
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
最近幾年,微服務(wù)一詞經(jīng)常被IT的技術(shù)界人士提及,簡(jiǎn)單介紹的話,微服務(wù)架構(gòu)就是將原本單獨(dú)部署運(yùn)行的大型軟件拆分為一個(gè)個(gè)可獨(dú)立部署的又可互相聯(lián)系的微小型服務(wù)。容器化技術(shù)軟件docker的興起,更將微服務(wù)推向了高潮。docker由單機(jī)走向集群是運(yùn)算發(fā)展的必然過(guò)程,但隨之而來(lái)的分布式容器治理是一個(gè)難點(diǎn)。而kubernetes就是為此而生,它是目前被一致看好的docker分布式系統(tǒng)的解決方案,而且其全面擁抱微服務(wù),為微服務(wù)提供多實(shí)例副本的支撐,而且其內(nèi)部Service內(nèi)嵌了負(fù)載均衡,為其他資源提供了高可靠的服務(wù)。
kubernetes 由兩種節(jié)點(diǎn)組成:
1,master節(jié)點(diǎn),即主節(jié)點(diǎn),用于跑kubernetes的核心組件等程序,是管理節(jié)點(diǎn)
2,node節(jié)點(diǎn),即容器運(yùn)行節(jié)點(diǎn)或者說(shuō)是用于運(yùn)算的節(jié)點(diǎn),此外還會(huì)跑一些kubernetes的注冊(cè)組件等服務(wù),是從節(jié)點(diǎn)
硬件上面一般表現(xiàn)為一臺(tái)master主機(jī)管理多臺(tái)node主機(jī)
kubernetes包含了多種資源,例如:Pod,RC,Service,Ingress,以及上面一節(jié)提到的node節(jié)點(diǎn)等等。 這些資源是kubernetes內(nèi)部的小單元,可以通過(guò)kubectl工具進(jìn)行增刪查改的操作,同時(shí)這些資源為最終的微服務(wù)運(yùn)算提供了支撐。以下會(huì)對(duì)其中的幾個(gè)資源進(jìn)行簡(jiǎn)單介紹。
Pod是kubernetes最重要也是最基本的概念,也是kubernetes中能被創(chuàng)建,調(diào)度,管理的最小單元。其取名為Pod,通英文單詞pod,即豌豆莢的意思,也非常形象地展示了該資源的結(jié)構(gòu)和作用。
如下圖所示:
Pod就像一個(gè)豌豆莢一樣,里面裝了一個(gè)一個(gè)container的小豆子。其中,pause container是每一個(gè)Pod都一定會(huì)包含的container,pause是作為Pod的根容器,也就是該pause container在Pod創(chuàng)建的時(shí)候是會(huì)默認(rèn)自動(dòng)創(chuàng)建的,無(wú)需用戶顯式創(chuàng)建,其用于判斷Pod的活性以及記錄Pod的IP,共享給本Pod中的其他container使用。
以下是一個(gè)Pod的yaml配置文件的例子:
apiVersion: v1 kind: Pod metadata: name: php-test labels: name: php-test spec: containers: - name: php-test image: 192.168.174.131:5000/php-base:1.0 ports: - containerPort: 80 hostPort: 80
副本控制器RC的英文全稱是:Replication Controller。它其實(shí)是定義了一個(gè)期望值的場(chǎng)景,即要求某種Pod的副本的運(yùn)行數(shù)量在任意的時(shí)候,都應(yīng)該盡快盡量符合該期望值。所以,一般RC的配置文件里面包含了Pod的期望副本數(shù)量,篩選的Pod的Label Selector,以及創(chuàng)建Pod的image模板內(nèi)容。 以下是一個(gè)簡(jiǎn)單的RC的yaml配置文件的例子:
apiVersion: v1 kind: ReplicationController metadata: name: loadbalancetest1 spec: replicas: 3 selector: app: loadbalancetest template: metadata: labels: app: loadbalancetest spec: containers: - name: loadbalancetest image: docker.io/webin/loadbalancetest:1.0 ports: - containerPort: 8080 hostPort: 8087
由于RC能自動(dòng)創(chuàng)建期望值的Pod,所以一開始甚至可以跳過(guò)Pod的yaml配置文件的編寫,直接編寫RC來(lái)創(chuàng)建Pod。
Service是kubernetes中的核心資源之一,其實(shí)這里的Service就是相當(dāng)于我們微服務(wù)架構(gòu)中所指的微服務(wù)了。實(shí)際上前面的Pod和RC,都是為Service這一微服務(wù)而服務(wù)的。
以下是一個(gè)簡(jiǎn)單的Service的yaml配置文件的例子:
apiVersion: v1 kind: Service metadata: name: loadbalancetest spec: type: NodePort ports: - port: 8080 targetPort: 8080 nodePort: 30001 protocol: TCP name: http selector: app: loadbalancetest
Pod,RC既然都為Service而服務(wù),那么它們肯定有關(guān)系關(guān)聯(lián)起來(lái)。是的,它們就是通過(guò)內(nèi)置的標(biāo)簽來(lái)聯(lián)系的。 如下圖所示:
可以看出Pod,RC,Service通過(guò)一個(gè)叫Lable Selector的標(biāo)簽選擇器關(guān)聯(lián)到了一起。這里的Service實(shí)際上有3個(gè)Pod為它提供真正的服務(wù)。關(guān)于Label Selector以及Label,我們其實(shí)通過(guò)前面的yaml文件中也能看到:
selector: app: loadbalancetest
還有:
labels: app: loadbalancetest
以及
labels: name: php-test
等等。其中,Pod定義好自己的Label標(biāo)簽,這個(gè)Label標(biāo)簽可以是任意的key:value形式的鍵值對(duì)。Label標(biāo)簽對(duì)于一個(gè)Pod可以定義多個(gè)。這樣的Label就是為了讓RC以及Service通過(guò)定義Label Selector去找到對(duì)應(yīng)的Pod。這樣就達(dá)到了RC控制Pod的副本,而這些副本又為Service真正提供服務(wù)。而Service也可以通過(guò)自己內(nèi)部的負(fù)載均衡去調(diào)用副本中的Pod來(lái)提供最終的服務(wù),返回給上一級(jí)調(diào)用者。
補(bǔ)充:Service的負(fù)載均衡是內(nèi)嵌的通過(guò)Label Selector對(duì)應(yīng)得到的多個(gè)Pod后的負(fù)載均衡。默認(rèn)是輪詢機(jī)制的負(fù)載均衡,另外還有一種是當(dāng)客戶端請(qǐng)求時(shí)會(huì)優(yōu)先返回上一次給該客戶端提供服務(wù)的Pod的機(jī)制的負(fù)載均衡。
但無(wú)論是默認(rèn)的負(fù)載均衡還是其他,這些負(fù)載均衡都是針對(duì)Service的內(nèi)置負(fù)載均衡。由于Service的創(chuàng)建,Kubernetes給予的是虛擬的ClusterIP,該IP只能是內(nèi)部的Kubernetes資源能訪問(wèn),例如Pod可以訪問(wèn),但外部的系統(tǒng)或者客戶端不能通過(guò)該IP訪問(wèn)到該服務(wù),所以如果外部系統(tǒng)想跳過(guò)Service去訪問(wèn)Pod,則可以嘗試自己去創(chuàng)建自己的硬件或者軟件級(jí)的負(fù)載均衡。一般Pod的IP+端口可以對(duì)應(yīng)上一個(gè)container。
既然Service需要Kubernetes內(nèi)部資源才能訪問(wèn),而Service難得自帶了內(nèi)嵌的負(fù)載均衡,我們又想訪問(wèn)Service讓其提供服務(wù),除了Pod外,有沒(méi)有其他kubernetes資源可以先訪問(wèn)Service然后讓其暴露服務(wù)給外界?答案是有的,其中一個(gè)就是基于Nginx的Ingress。
Ingress是Kubernetes v1.1后新增的,它能將不同的URL訪問(wèn)請(qǐng)求轉(zhuǎn)發(fā)到后端不同的Service上,實(shí)現(xiàn)HTTP層的業(yè)務(wù)路由機(jī)制。 以下是一個(gè)簡(jiǎn)單的RC的yaml配置文件的例子:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: myingress spec: rules: - host: myingress.com http: paths: - path: /LoadBalanceTest backend: serviceName: loadbalancetest servicePort: 8080
這里簡(jiǎn)單地配置了一個(gè)路由轉(zhuǎn)發(fā)機(jī)制,即通過(guò)訪問(wèn) http://myingress.com/LoadBalanceTest 的URL地址,Ingress可以轉(zhuǎn)發(fā)到loadbalancetest:8080的這一個(gè)Service上。
kubernetes分布式系統(tǒng)是由一組可執(zhí)行程序或說(shuō)組件組成,這些組件包括:
(1)kube-apiserver -- API服務(wù)組件,提供kubernetes系統(tǒng)內(nèi)所有對(duì)象的增刪查改等restful式的服務(wù)端接口。
(2)kube-Controller Manager,資源管控器,主要負(fù)責(zé)集群內(nèi)的資源(如Pod,Node等)管理。
(3)kube-Scheduler,將pod調(diào)度到指定的node中的調(diào)度器。
(4)kubelet,管理和維護(hù)一臺(tái)Node主機(jī)的所有容器,并將該主機(jī)注冊(cè)為Node節(jié)點(diǎn)的進(jìn)程。
(5)kube-proxy,網(wǎng)絡(luò)服務(wù)代理組件。
本章節(jié)將以創(chuàng)建一個(gè)能在多臺(tái)分布式主機(jī)運(yùn)行的實(shí)例,來(lái)講解kubernetes的分布式集群的搭建和部署。
本案例將準(zhǔn)備4臺(tái)主機(jī)(虛擬機(jī)),其中一臺(tái)是作為master主機(jī),另外三臺(tái)作為node主機(jī)。那么首先我們來(lái)了解一下master主機(jī)和node主機(jī)分別需要安裝的組件和工具:
(1)master機(jī)器--APIServer,kube-scheduler,kube-controller;輔助類的中間件有:etcd
(2)node機(jī)器--kubelet,kube-proxy ,docker;輔助類中間件有flannel
由于docker以及kubernetes相關(guān)的軟件,需要運(yùn)行在Linux類的系統(tǒng)中,所以本次的案例選用了CentOS7作為Master和Node主機(jī)的操作系統(tǒng)。
大致的分布式架構(gòu)如下圖所示:
(圖:Master主機(jī)和Node主機(jī)的組件安裝與集群示意圖)
如果是一臺(tái)機(jī)器內(nèi)建立的多臺(tái)虛擬機(jī),可能不會(huì)存在跨主機(jī)跨虛擬機(jī)的互聯(lián)互通問(wèn)題。
但如果是局域網(wǎng)內(nèi)的多臺(tái)主機(jī),或多臺(tái)主機(jī)內(nèi)再建立的虛擬機(jī)來(lái)模擬集群環(huán)境的時(shí)候,就可能需要進(jìn)行一定的設(shè)置了。
一般局域網(wǎng)間建立集群,我們會(huì)遇到這樣的問(wèn)題:
(1)無(wú)線局域網(wǎng)中設(shè)置了客戶端隔離(client isolation),導(dǎo)致局域網(wǎng)主機(jī)間不能互聯(lián)互通。
(2)局域網(wǎng)中的主機(jī)設(shè)置了防火墻。
(3)虛擬機(jī)由于網(wǎng)絡(luò)設(shè)置不合理,導(dǎo)致不能進(jìn)行跨主機(jī)的虛擬機(jī)之間互聯(lián)互通。
對(duì)于這些問(wèn)題,網(wǎng)絡(luò)上有比較好的解答,例如使用網(wǎng)線直接連接主機(jī)組網(wǎng),虛擬機(jī)網(wǎng)絡(luò)設(shè)置橋接模式訪問(wèn)等。
對(duì)于我們案例的測(cè)試,我們可以使用一臺(tái)手機(jī)WLAN熱點(diǎn)進(jìn)行多主機(jī)的組網(wǎng)。這樣可以繞開許多網(wǎng)絡(luò)互聯(lián)互通的問(wèn)題。
參考上面的“Master主機(jī)和Node主機(jī)的組件安裝與集群示意圖”,我們按以下的大致步驟進(jìn)行組網(wǎng):
(1)設(shè)置Master主機(jī)和3臺(tái)Node主機(jī)在同一網(wǎng)段中,例如在192.168.43.0/24中。
(2)設(shè)置Master主機(jī)和3臺(tái)Node主機(jī)的網(wǎng)關(guān)為同一網(wǎng)關(guān):192.168.43.1。
(3)對(duì)于Master和Node主機(jī)都進(jìn)行關(guān)閉防火墻的操作。
我們可以先前往gitHub開源代碼托管服務(wù)網(wǎng)站,download相關(guān)的軟件:
(1)kubernetes:https://github.com/kubernetes/kubernetes
(2)etcd:https://github.com/coreos/etcd
(3)flannel:https://github.com/coreos/flannel
可以點(diǎn)擊“release”一欄,進(jìn)入到版本選擇,然后download,建議選用較新的release版本。
使用 tar命令,進(jìn)行軟件包的解壓。 參考命令:
tar -zxvf kubernetes.tar.gz tar -zxvf etcd-v3.2.0-rc.1-linux-amd64.tar.gz tar -zxvf flannel-v0.7.1-linux-amd64.tar.gz
由于新版本的kubernetes軟件包,只包含基本的單機(jī)應(yīng)用組件,如果需要部署成分布式集群的,還需要進(jìn)行二次download操作。
進(jìn)入kubernetes的目錄下的Cluster文件夾,執(zhí)行g(shù)et-kube-binaries.sh 腳本,參考代碼如下:
cd kubernetes/cluster/ ./get-kube-binaries.sh
選擇“Y”進(jìn)行進(jìn)一步的download,這里可能需要VPN輔助。
download完成后,會(huì)有新的兩個(gè)文件出現(xiàn):“kubernetes-server-linux-amd64.tar.gz”和“kubernetes-client-linux-amd64.tar.gz”。其中我們重點(diǎn)使用的是server的那一個(gè)軟件包。
該軟件包會(huì)download到kubernetes下的server文件夾內(nèi)。我們對(duì)其進(jìn)行解壓,參考命令:
tar -zxvf kubernetes-server-linux-amd64.tar.gz
這樣就可以得到一批新的kubernetes集群的組件。
我們進(jìn)入解壓后的文件夾查閱。參考代碼:
cd kubernetes/server/bin/ ls
這樣,一些kubernetes的核心組件都可以在這里找到了。
將這些組件復(fù)制到系統(tǒng)資源目錄當(dāng)中,方便執(zhí)行,參考命令:
cp -rp hyperkube /usr/local/bin/ cp -rp kube-apiserver /usr/local/bin/ cp -rp kube-controller-manager /usr/local/bin/ cp -rp kubectl /usr/local/bin/ cp -rp kubelet /usr/local/bin/ cp -rp kube-proxy /usr/local/bin/ cp -rp kubernetes /usr/local/bin/ cp -rp kube-scheduler /usr/local/bin/
類似的etcd也需要將執(zhí)行文件放入系統(tǒng)資源中,參考命令:
cp -rp etcd* /usr/local/bin/
接著,我們?yōu)閙aster主機(jī)進(jìn)行下面的操作。
-- 添加默認(rèn)路由,參考命令:
route add default gw 192.168.43.1
-- 去防火墻,參考命令:
systemctl stop firewalld.service systemctl disable firewalld.service
-- 啟動(dòng)etcd,指定監(jiān)聽的url地址和對(duì)外提供的客戶端訪問(wèn)地址,參考命令:
etcd --listen-client-urls 'http://192.168.43.199:2379,http://127.0.0.1:2379' --advertise-client-urls 'http://192.168.43.199:2379,http://127.0.0.1:2379'
-- 設(shè)置子網(wǎng)的鍵值,預(yù)留給Node主機(jī),好讓其使用flannel進(jìn)行數(shù)據(jù)讀取,參考命令:
etcdctl set /coreos.com/network/config '{"Network":"10.1.0.0/16"}'
(master主機(jī)運(yùn)行etcd和設(shè)置成功截圖)
-- 啟動(dòng)kubernetes 服務(wù)端,設(shè)置etcd的服務(wù)地址,綁定主機(jī)安全端口,設(shè)置Service集群虛擬IP段,參考代碼:
kube-apiserver --etcd_servers=http://localhost:2379 --insecure-bind-address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range=10.254.0.0/24
-- 啟動(dòng)controller manager,指定apiserver的地址,參考命令:
kube-controller-manager --logtostderr=true --master=http://192.168.43.199:8080
-- 啟動(dòng)kubernetes scheduler,指定apiserver的地址,參考命令:
kube-scheduler --logtostderr=true --v=0 --master=http://192.168.43.199:8080
(kube-apiserver,kube-controller-manager,kube-scheduler成功啟動(dòng)截圖)
若設(shè)置成功了,就可以再master主機(jī)進(jìn)行kubectl的操作了,我們可以使用kubectl命令,進(jìn)行相關(guān)kubernetes資源的操作,參考命令:
kubectl get nodes
可以看出,由于目前任意一臺(tái)node主機(jī)都還沒(méi)啟動(dòng),所以這一時(shí)刻master主機(jī)查詢nodes資源,并沒(méi)有已經(jīng)ready的node主機(jī),可以供master主機(jī)使用。
node主機(jī)的環(huán)境搭建,首先需要先安裝好docker,另外還需要將Master機(jī)器上的kubelet, kube-proxy,flannel給到每一個(gè)node節(jié)點(diǎn)機(jī)器上(如果確定版本一致的前提下,也可以重新download這些組件,而不用從Master主機(jī)復(fù)制)。
做好以上的準(zhǔn)備工作后,我們就可以node主機(jī)的操作了。
復(fù)制相關(guān)文件到系統(tǒng)資源文件夾中,方便日后簡(jiǎn)化操作,參考代碼:
cp -rp kubelet /usr/local/bin/ cp -rp kube-proxy /usr/local/bin/ cp -rp flanneld /usr/local/bin/ cp -rp mk-docker-opts.sh /usr/local/bin/
-- 設(shè)置網(wǎng)關(guān),參考命令:
route add default gw 192.168.43.1
-- 去防火墻,參考命令:
systemctl stop firewalld.service systemctl disable firewalld.service
-- 啟動(dòng)docker后,立即關(guān)閉,這是為了讓docker的網(wǎng)卡顯示,然后關(guān)閉docker,等待flannel來(lái)設(shè)置docker的新網(wǎng)卡,參考命令:
service docker start service docker stop
-- 啟動(dòng)flannel,指定etcd的地址,以及說(shuō)明使用的etcd前綴值,參考命令:
flanneld -etcd-endpoints=http://192.168.43.199:2379 -etcd-prefix=/coreos.com/network
(成功設(shè)置了flannel的截圖)
-- 重新規(guī)劃docker的網(wǎng)絡(luò)地址,參考命令:
mk-docker-opts.sh -i source /run/flannel/subnet.env ifconfig docker0 ${FLANNEL_SUBNET}
-- 對(duì)于CentOS7 等默認(rèn)安裝的docker,還需要加入以下命令,新docker網(wǎng)卡才能起效,參考命令:
echo DOCKER_NETWORK_OPTIONS= --bip=${FLANNEL_SUBNET} > /etc/sysconfig/docker-network systemctl daemon-reload
-- 重啟docker:
service docker restart
(成功設(shè)置docker的網(wǎng)絡(luò)截圖)
這樣,docker就統(tǒng)一規(guī)劃到flannel所指定的子網(wǎng)當(dāng)中了。
-- 啟動(dòng)kubelet,指定apiserver地址,設(shè)置Node主機(jī)注冊(cè)名,設(shè)置docker的啟動(dòng)驅(qū)動(dòng)systemd,完成node注冊(cè),參考命令:
kubelet --api_servers=http://192.168.43.199:8080 --hostname-override=192.168.43.101 --cgroup-driver=systemd
-- 啟動(dòng)kube-proxy,指定apiserver地址,參考命令:
kube-proxy --logtostderr=true --v=0 --master=http://192.168.43.199:8080
當(dāng)我們?nèi)_(tái)node都成功設(shè)置好后,通過(guò)Master主機(jī),就可以查詢到nodes的狀態(tài)了,參考命令:
kubectl get nodes
(master獲取nodes狀態(tài)截圖)
可以看到,我們?cè)O(shè)置的3臺(tái)nodes都已經(jīng)可以在Master主機(jī)查詢到,并且狀態(tài)為"Ready"。
當(dāng)我們的kubernetes的分布式集群環(huán)境搭建好后,就可以開始創(chuàng)建相關(guān)的微服務(wù)Service了。
本章節(jié)當(dāng)中的Service是一個(gè)建立在tomcat上的web應(yīng)用,訪問(wèn)該Service的時(shí)候,會(huì)返回服務(wù)器的IP地址和Mac地址。
在本例中,該Service通過(guò)RC的設(shè)置,提供了3個(gè)Pod副本來(lái)提供真正的服務(wù),所以每次訪問(wèn)該Service的時(shí)候,實(shí)際上是負(fù)載均衡到了后面的3個(gè)Pod中的其中一個(gè)來(lái)提供服務(wù)的。
這里,我們將建立一個(gè)包含3個(gè)Pod的RC,參考配置如下:
apiVersion: v1 kind: ReplicationController metadata: name: loadbalancetest1 spec: replicas: 3 selector: app: loadbalancetest template: metadata: labels: app: loadbalancetest spec: containers: - name: loadbalancetest image: docker.io/webin/loadbalancetest:1.0 ports: - containerPort: 8080 hostPort: 8087
這個(gè)配置的大致意思是:RC要求創(chuàng)建期望值數(shù)量為3的Pods,這些Pods是參考鏡像“docker.io/webin/loadbalancetest:1.0”而創(chuàng)建的,并且?guī)в袠?biāo)簽“app: loadbalancetest”。同時(shí)RC通過(guò)selector也指定了集群中帶有“app: loadbalancetest”標(biāo)簽的Pods,都?xì)w為它管理。
另外containerPort與hostPort,基本上等同于docker run -p 8087:8080 命令的作用,即指定好容器內(nèi)和外的端口映射。但一般的,特別是要求大量副本的情況下,不建議設(shè)置hostPort,因?yàn)榭赡軙?huì)導(dǎo)致Pod分配和轉(zhuǎn)移的時(shí)候,分配到同一個(gè)node下導(dǎo)致端口沖突。
將上面的配置保存到一個(gè)文件后,就可以參考下面的命令將其運(yùn)行起來(lái):
kubectl create -f loadbalancetest-rc.yaml
建立成功后,我們可以通過(guò)以下命令查閱rc,以及rc所創(chuàng)建的pods副本,參考命令如下:
kubectl get rc kubectl get pods
效果圖如下:
可以看到一個(gè)loadbalancetest的RC控制器的創(chuàng)建了三個(gè)Pod副本。
由于RC建立后,會(huì)立即創(chuàng)建Pod,所以我們可以直接跳過(guò)Pod的手動(dòng)創(chuàng)建,直接進(jìn)行Service的設(shè)置。
Service的參考配置如下:
piVersion: v1 kind: Service metadata: name: loadbalancetest spec: type: NodePort ports: - port: 8080 targetPort: 8080 nodePort: 30001 protocol: TCP name: http selector: app: loadbalancetest
這里的Service通過(guò)selector指定了特定的標(biāo)簽,意思是如果Pod中包含的標(biāo)簽與這里面的值相等,則視為是應(yīng)該為該Service提供服務(wù)的Pod。
另外該配置文件出現(xiàn)了幾個(gè)端口相關(guān)的配置:targetPort指出了Service要取Pod的container的服務(wù)端口,nodePort指Node主機(jī)可以通過(guò)該P(yáng)ort和Node主機(jī)的IP訪問(wèn)到container。而port參數(shù)則代表整個(gè)Service的端口。
將配置保存成文件,按下面的參考命令運(yùn)行:
kubectl create -f loadbalancetest-svc.yaml
成功建立好Service后,我們可以通過(guò)下面的命令查閱Service的信息:
kubectl get svc
效果圖如下:
可以看到loadbalancetest的微服務(wù)Service已經(jīng)建立好,并且被kubernetes分配了一個(gè)虛擬IP:10.254.0.242,以及把8080端口給到了這個(gè)Service,集群里面的資源包括Pod在內(nèi),都可以通過(guò)虛擬IP和端口進(jìn)行對(duì)該服務(wù)的調(diào)用。另外的一個(gè)端口30001是創(chuàng)建Service的時(shí)候特地暴露出來(lái),給外界訪問(wèn)的節(jié)點(diǎn)端口??梢酝ㄟ^(guò)nodeIP+nodePort的形式訪問(wèn)到一個(gè)Node上面的一個(gè)Service選中的Pod副本所提供的服務(wù)。
上一節(jié)的Service實(shí)際上是一個(gè)分布式容器云組成的一個(gè)微服務(wù)。
由于前面的RC設(shè)置了3個(gè)副本,而3個(gè)副本Pod都包含了Service的標(biāo)簽選擇器所選擇的標(biāo)簽“app: loadbalancetest”,所以之前RC建立的3個(gè)Pod都是為該Service而服務(wù)的。多副本的Service能讓其更健壯,而且kubernetes的Service在多副本的情況下,還自帶了負(fù)載均衡的效果,這也是微服務(wù)的一種體現(xiàn)。
我們可以通過(guò)下面的命令,更詳細(xì)地查閱微服務(wù)Service的詳細(xì)情況。 參考命令:
kubectl describe svc loadbalancetest
效果圖如下:
可以看出,一共有三個(gè)Endpoint: 10.1.67.2:8080,10.1.70.2:8080,10.1.88.2:8080
其實(shí)這些都是RC創(chuàng)建的三個(gè)Pod副本的IP地址和該服務(wù)的Container的8080端口組成的。
也就是實(shí)際上loadbalancetest這一個(gè)微服務(wù)Service,經(jīng)過(guò)內(nèi)置的負(fù)載均衡后最終是由這三個(gè)Pod來(lái)提供服務(wù)。
現(xiàn)在,我們可以先通過(guò)以下兩種方式,嘗試訪問(wèn)到為Service提供服務(wù)的container:
(1)通過(guò)node主機(jī)IP + nodePort,可以對(duì)外提供服務(wù)訪問(wèn)。
到目前為止,loadbalancetest的微服務(wù)Service已經(jīng)建立好了,但由于Service屬于Kubernetes內(nèi)部資源,只能Kubernetes的內(nèi)部才能訪問(wèn),也就是外部是不能直接進(jìn)行訪問(wèn)的,所以要測(cè)試該Service是否真的是負(fù)載均衡的,可以通過(guò)下一節(jié)的Nginx Ingress進(jìn)行kubernetes資源的內(nèi)外訪問(wèn)的代理。
本節(jié)將通過(guò)創(chuàng)建Ingress,使外界能通過(guò)URL地址訪問(wèn)到kubernetes微服務(wù)Service,驗(yàn)證Service的負(fù)載均衡。
default-http-backend是Nginx-ingress-controlloer的默認(rèn)后端,該默認(rèn)后端能檢測(cè)Nginx的健康情況,以及當(dāng)用戶訪問(wèn)的url錯(cuò)誤的時(shí)候,能返回404信息。參考的配置如下:
apiVersion: v1 kind: ReplicationController metadata: name: default-http-backend spec: replicas: 1 selector: app: default-http-backend template: metadata: labels: app: default-http-backend spec: terminationGracePeriodSeconds: 60 containers: - name: default-http-backend # Any image is permissable as long as: # 1. It serves a 404 page at / # 2. It serves 200 on a /healthz endpoint image: webin/defaultbackend:1.0 livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 10 ports: - containerPort: 8080 hostPort: 8085 resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 20Mi
將配置保存成文件,使用下面的參考命令運(yùn)行:
kubectl create -f default-http-backend-rc.yaml
默認(rèn)后端的RC建立好了,我們?cè)偈褂孟旅娴暮?jiǎn)易命令將其創(chuàng)建成Service:
kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend
這個(gè)命令其實(shí)就相當(dāng)于運(yùn)行一個(gè)Service的yaml配置文件,創(chuàng)建Service。
效果圖如下:
創(chuàng)建好后,我們可以在default-http-backend的Node主機(jī)上面直接通過(guò)的Podip/healthz或者serive的ip+port進(jìn)行測(cè)試,如下圖所示:
若能見(jiàn)到如上圖返回的ok,則表示部署成功。
nginx-ingress-controller其實(shí)是一個(gè)Nginx,并且該Nginx帶有Ingress的管理功能。參考配置如下:
apiVersion: v1 kind: ReplicationController metadata: name: nginx-ingress-lb labels: name: nginx-ingress-lb namespace: kube-system spec: replicas: 1 template: metadata: labels: name: nginx-ingress-lb spec: terminationGracePeriodSeconds: 60 hostNetwork: true containers: - image: docker.io/webin/nginx-ingress-controller:0.8 name: nginx-ingress-lb readinessProbe: httpGet: path: /healthz #定義ingress-controller自檢的url 和端口 port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 3 ports: - containerPort: 80 hostPort: 80 env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: KUBERNETES_MASTER value: http://192.168.43.199:8080 #訪問(wèn)master 獲取service信息 args: - /nginx-ingress-controller - --default-backend-service=default/default-http-backend
保存成文件,然后使用下面的參考命令,把這個(gè)RC運(yùn)行起來(lái):
kubectl create -f nginx-ingress-rc.yaml
這時(shí)候,我們可以查閱運(yùn)行了nginx-ingress-controller的Pod詳細(xì)情況,然后通過(guò)運(yùn)行nginx-ingress-controller的那臺(tái)Node機(jī)器,驗(yàn)證nginx-ingress-controller是否運(yùn)行成功。
打開瀏覽器,輸入該node的ip以及加上路徑/healthz,如下圖所示:
如果有返回ok則表示配置成功。
按下面的Ingress配置,創(chuàng)建url供外界訪問(wèn),并且路由到一個(gè)Service上:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: myingress spec: rules: - host: myingress.com http: paths: - path: /LoadBalanceTest backend: serviceName: loadbalancetest servicePort: 8080
在要發(fā)起請(qǐng)求的機(jī)器中,去到/etc/hosts 文件新增內(nèi)部的域名ip解析,把nginx-ingress-controller的nodeip與ingress的域名綁定:
192.168.43.102 myingress.com
其中192.168.43.102是指運(yùn)行了nginx-ingress-controller的node機(jī)器的IP。
打開瀏覽器,發(fā)起訪問(wèn),參考效果圖如下:
可以看出,對(duì)同一個(gè)URL地址發(fā)起的訪問(wèn)中,每次的訪問(wèn)返回的IP和主機(jī)名都與上一次的不同,而且是3個(gè)值循環(huán)地出現(xiàn),這是因?yàn)檫@個(gè)URL對(duì)應(yīng)的微服務(wù)Service是由3個(gè)Pod副本提供最終的運(yùn)算的,這個(gè)也是Service內(nèi)部負(fù)載均衡的體現(xiàn)。
前面幾節(jié)中,我們完成了kubernetes分布式集群的搭建,以及運(yùn)行了微服務(wù)Service,也通過(guò)了ingress驗(yàn)證了微服務(wù)Service的內(nèi)置負(fù)載均衡。
在這個(gè)過(guò)程中,我們也使用了幾個(gè)kubectl的命令,這些命令都是非常實(shí)用的,在這里我進(jìn)行一個(gè)匯總:
kubectl的create命令,能創(chuàng)建pod,service,ingress等資源,一般使用這樣的格式進(jìn)行創(chuàng)建:
kubectl create -f 資源的yaml配置文件名
如果有一些kubernetes資源不需要了,可以使用delete命令,一般的格式如下:
kubectl delete 資源類別 資源名稱
對(duì)于一些資源的配置更新,可以使用replace命令,一般格式如下:
kubectl replace -f 資源的yaml配置文件名
獲取資源的信息,可以使用get,一般格式為:
kubectl get 資源類別 資源名稱
kubectl describe 資源類別 資源名稱
另外如果一些配置文件中,有寫明命名空間的,則需要在查詢的時(shí)候,加入--namespace參數(shù)。如果不加,默認(rèn)查詢和創(chuàng)建的都是default的命名空間下的資源。
對(duì)于CentOS7,在網(wǎng)絡(luò)連接良好的情況下,使用一句命令,即可安裝。參考命令如下:
yum -y install docker-io
安裝完成后,切換為root用戶,然后啟動(dòng)docker即可。參考命令如下:
service docker start
docker的命令有十幾種,但如果適當(dāng)?shù)姆诸?,?huì)非常容易記住。
一般剛安裝的docker,本地是沒(méi)有images可以運(yùn)行的,所以需要到docker hub鏡像登記中心(或者其他的非官方docker hub以及自建的docker hub中心)去獲取。
首先,我們可以先進(jìn)行images的拉取,參考命令:
docker pull hello-world
確保網(wǎng)絡(luò)暢通的情況下,就能將該image “hello-world” download下來(lái)了。 一般的,docker pull 命令后面加 image地址,而images地址一般是“服務(wù)器/庫(kù)/鏡像名”這樣的格式,上面的命令只寫了鏡像名hello-world,是因?yàn)槭÷苑?wù)器和庫(kù)的情況下,docker會(huì)先自動(dòng)去docker官方的docker hub登記中心中尋找,補(bǔ)充docker自己的服務(wù)器和庫(kù)名,如下圖所示:
如果你的鏡像不是docker hub官方登記中心中的,就需要填寫完整的路徑。
同樣的,既然有拉取,就會(huì)有對(duì)應(yīng)的推送命令,即docker push 命令,但本小節(jié)不詳細(xì)講,這個(gè)將放入第三節(jié)的docker hub登記中心一并敘述。
docker中針對(duì)image的常用命令有:docker images 、docker rmi 、以及上一節(jié)的docker pull等。 查閱本地images,參考命令:
docker images
效果如下圖所示:
這樣就會(huì)列出當(dāng)前該docker下所包含的本地images。
刪除某個(gè)image, 參考命令:
docker rmi 1815c82652c0
或者
docker rmi hello-world:latest
效果圖:
container是image的運(yùn)行態(tài)。
docker中針對(duì)container的常用命令有:docker ps 、 docker run 、 docker rm 、 docker stop 、 docker kill等。 參考命令:
docker run hello-world
另外,我們還可以將一些container中運(yùn)行的軟件或進(jìn)程,通過(guò)端口映射,如 -p 8080:80,將其80端口映射到外部的8080端口,暴露給外界,這樣外界就能使用暴露的端口來(lái)訪問(wèn)container內(nèi)部端口所對(duì)應(yīng)的進(jìn)程了。 以下是一個(gè)container運(yùn)行的時(shí)候,將內(nèi)部端口8080映射到外部端口8081的例子,參考代碼:
docker run -p 8081:8080 docker.io/tomcat:V8
效果如下圖所示:
可以看到,運(yùn)行完該docker命令后,在本機(jī)器內(nèi),可以通過(guò)127.0.0.1 + 8081端口,訪問(wèn)到tomcat,而這個(gè)tomcat,實(shí)際上是docker的一個(gè)container提供的服務(wù),tomcat在這個(gè)container中(該container內(nèi)部已經(jīng)包含了一個(gè)linux系統(tǒng)的image),其實(shí)是通過(guò)8080端口對(duì)內(nèi)提供服務(wù)的。 參數(shù) -p 8081:8080做到了內(nèi)外端口映射的作用。
另外,如果本地的docker images中,包含了centos或者ubuntu這樣的鏡像,還可以通過(guò)這樣的命令,運(yùn)行并進(jìn)入container下的centos/ubuntu中:
docker run -i -t centos /bin/bash
這樣就能進(jìn)入到container中的centos系統(tǒng)了。
查閱目前docker中的container,例如列出所有的container,參考命令:
docker ps -a
刪除一個(gè)container, 參考命令:
docker rm 81346941533c
此外還可以使用以下命令,進(jìn)行全部的container刪除:
docker rm $(docker ps -a -q)
有時(shí)候,container正在運(yùn)行甚至對(duì)外提供TCP長(zhǎng)連接的時(shí)候,我們不能隨便進(jìn)行docker rm操作,這時(shí),我們需要先進(jìn)行docker stop或者docker kill命令后,才能成功地進(jìn)行docker rm操作。
參考命令:
docker stop 81346941533c docker kill 81346941533c
其中 docker stop系優(yōu)雅停止一個(gè)container,其會(huì)發(fā)一則信號(hào)給到container,讓其在一定時(shí)間內(nèi)做好準(zhǔn)備后關(guān)閉,而docker kill系立即殺掉進(jìn)程,即立即停止。
前面的章節(jié)簡(jiǎn)單介紹docker拉取和推送image的時(shí)候,提到了一下docker hub登記中心,該中心是用于存放docker images,并登記相關(guān)信息例如版本號(hào)、簡(jiǎn)要描述等等,方便以后image的遷移或升級(jí),復(fù)用等。
docker hub的官網(wǎng)地址: https://hub.docker.com/
docker hub 除了docker自己的官方docker hub外,還有許多其他公司自建的docker hub,甚至還對(duì)外開放,例如目前國(guó)內(nèi)市場(chǎng)上的:
靈雀云(https://hub.alauda.cn/)
時(shí)速云(https://hub.tenxcloud.com/)
阿里巴巴的阿里云hub中心(https://dev.aliyun.com/search.html)
等等。
一般的,我們?nèi)绻约簞?chuàng)建了一個(gè)image,感覺(jué)日后會(huì)經(jīng)常用到,則可以上傳到相關(guān)的docker hub中。步驟為:
(1)提交container或者運(yùn)行dockerfile,將其變?yōu)橐粋€(gè)本地的image。
(2)登錄docker hub官網(wǎng)或者其他鏡像登記中心,前提是你已經(jīng)在此docker hub中心注冊(cè)了。
(3)將本地的要上傳的image打上tag,最主要是記錄好image名以及版本號(hào)。
(4)使用docker push 命令,將鏡像上傳到該docker hub。
參考命令:
docker commit 21d2f661627f mytest/hello-world #提交一個(gè)container,變?yōu)橐粋€(gè)image快照。 docker login #登錄到docker hub 官網(wǎng);如果是其他的docker hub中心,后面需要加服務(wù)器地址。 docker tag 94000117f92e username/hello-world:v1.0 #為準(zhǔn)備上傳的image打標(biāo)簽。 docker push username/hello-world:1.0 #將該image上傳。
docker中創(chuàng)建image的方法,除了pull遠(yuǎn)端的image,以及將container commit成image外,還可以通過(guò)dockerfile來(lái)創(chuàng)建,這樣的創(chuàng)建方法,能在自動(dòng)化運(yùn)維中,起到良好的體驗(yàn)。這里簡(jiǎn)單介紹一下通過(guò)dockerfile創(chuàng)建image的方法。
首先我們要在一個(gè)自己的測(cè)試路徑下面,建立一個(gè)名為“dockerfile”的文件,該文件不需要后綴名。參考代碼:
touch dockerfile
將以下代碼寫入到該文件中:
FROM jenkins USER root RUN apt-get update \ && apt-get install -y sudo \ && rm -rf /var/lib/apt/lists/* RUN echo "jenkins ALL=NOPASSWD: ALL">
在當(dāng)前目錄下輸入以下命令:
docker build -t myjenkins .
這時(shí)候,docker系統(tǒng)將會(huì)按照dockerfile的定義一步一步往下走。效果圖如下:
完成后,就可以通過(guò)docker images 命令看到該image了。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。