真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

kubernetesV1.6.4分布式集群的部署及如何進(jìn)行service負(fù)載均衡

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

目前成都創(chuàng)新互聯(lián)已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、河?xùn)|網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1,kubernetes的基本概念和術(shù)語

1.1 kubernetes與微服務(wù)的簡介

最近幾年,微服務(wù)一詞經(jīng)常被IT的技術(shù)界人士提及,簡單介紹的話,微服務(wù)架構(gòu)就是將原本單獨(dú)部署運(yùn)行的大型軟件拆分為一個個可獨(dú)立部署的又可互相聯(lián)系的微小型服務(wù)。容器化技術(shù)軟件docker的興起,更將微服務(wù)推向了高潮。docker由單機(jī)走向集群是運(yùn)算發(fā)展的必然過程,但隨之而來的分布式容器治理是一個難點(diǎn)。而kubernetes就是為此而生,它是目前被一致看好的docker分布式系統(tǒng)的解決方案,而且其全面擁抱微服務(wù),為微服務(wù)提供多實(shí)例副本的支撐,而且其內(nèi)部Service內(nèi)嵌了負(fù)載均衡,為其他資源提供了高可靠的服務(wù)。

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

1.2 kubernetes的兩類節(jié)點(diǎn)

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)或者說是用于運(yùn)算的節(jié)點(diǎn),此外還會跑一些kubernetes的注冊組件等服務(wù),是從節(jié)點(diǎn) 
硬件上面一般表現(xiàn)為一臺master主機(jī)管理多臺node主機(jī)

1.3 kubernetes提供的幾種資源對象簡介

kubernetes包含了多種資源,例如:Pod,RC,Service,Ingress,以及上面一節(jié)提到的node節(jié)點(diǎn)等等。 這些資源是kubernetes內(nèi)部的小單元,可以通過kubectl工具進(jìn)行增刪查改的操作,同時這些資源為最終的微服務(wù)運(yùn)算提供了支撐。以下會對其中的幾個資源進(jìn)行簡單介紹。

1.3.1 最小的資源單位Pod

Pod是kubernetes最重要也是最基本的概念,也是kubernetes中能被創(chuàng)建,調(diào)度,管理的最小單元。其取名為Pod,通英文單詞pod,即豌豆莢的意思,也非常形象地展示了該資源的結(jié)構(gòu)和作用。
如下圖所示:

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

Pod就像一個豌豆莢一樣,里面裝了一個一個container的小豆子。其中,pause container是每一個Pod都一定會包含的container,pause是作為Pod的根容器,也就是該pause container在Pod創(chuàng)建的時候是會默認(rèn)自動創(chuàng)建的,無需用戶顯式創(chuàng)建,其用于判斷Pod的活性以及記錄Pod的IP,共享給本Pod中的其他container使用。
以下是一個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

1.3.2 副本控制器RC

副本控制器RC的英文全稱是:Replication Controller。它其實(shí)是定義了一個期望值的場景,即要求某種Pod的副本的運(yùn)行數(shù)量在任意的時候,都應(yīng)該盡快盡量符合該期望值。所以,一般RC的配置文件里面包含了Pod的期望副本數(shù)量,篩選的Pod的Label Selector,以及創(chuàng)建Pod的image模板內(nèi)容。 以下是一個簡單的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能自動創(chuàng)建期望值的Pod,所以一開始甚至可以跳過Pod的yaml配置文件的編寫,直接編寫RC來創(chuàng)建Pod。

1.3.3 微服務(wù)Service

Service是kubernetes中的核心資源之一,其實(shí)這里的Service就是相當(dāng)于我們微服務(wù)架構(gòu)中所指的微服務(wù)了。實(shí)際上前面的Pod和RC,都是為Service這一微服務(wù)而服務(wù)的。
以下是一個簡單的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)起來。是的,它們就是通過內(nèi)置的標(biāo)簽來聯(lián)系的。 如下圖所示:

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

可以看出Pod,RC,Service通過一個叫Lable Selector的標(biāo)簽選擇器關(guān)聯(lián)到了一起。這里的Service實(shí)際上有3個Pod為它提供真正的服務(wù)。關(guān)于Label Selector以及Label,我們其實(shí)通過前面的yaml文件中也能看到:

selector:
  app: loadbalancetest

還有:

labels:
  app: loadbalancetest

以及

labels:   
   name: php-test

等等。其中,Pod定義好自己的Label標(biāo)簽,這個Label標(biāo)簽可以是任意的key:value形式的鍵值對。Label標(biāo)簽對于一個Pod可以定義多個。這樣的Label就是為了讓RC以及Service通過定義Label Selector去找到對應(yīng)的Pod。這樣就達(dá)到了RC控制Pod的副本,而這些副本又為Service真正提供服務(wù)。而Service也可以通過自己內(nèi)部的負(fù)載均衡去調(diào)用副本中的Pod來提供最終的服務(wù),返回給上一級調(diào)用者。

補(bǔ)充:Service的負(fù)載均衡是內(nèi)嵌的通過Label Selector對應(yīng)得到的多個Pod后的負(fù)載均衡。默認(rèn)是輪詢機(jī)制的負(fù)載均衡,另外還有一種是當(dāng)客戶端請求時會優(yōu)先返回上一次給該客戶端提供服務(wù)的Pod的機(jī)制的負(fù)載均衡。
但無論是默認(rèn)的負(fù)載均衡還是其他,這些負(fù)載均衡都是針對Service的內(nèi)置負(fù)載均衡。由于Service的創(chuàng)建,Kubernetes給予的是虛擬的ClusterIP,該IP只能是內(nèi)部的Kubernetes資源能訪問,例如Pod可以訪問,但外部的系統(tǒng)或者客戶端不能通過該IP訪問到該服務(wù),所以如果外部系統(tǒng)想跳過Service去訪問Pod,則可以嘗試自己去創(chuàng)建自己的硬件或者軟件級的負(fù)載均衡。一般Pod的IP+端口可以對應(yīng)上一個container。

1.3.4 入口資源Ingress

既然Service需要Kubernetes內(nèi)部資源才能訪問,而Service難得自帶了內(nèi)嵌的負(fù)載均衡,我們又想訪問Service讓其提供服務(wù),除了Pod外,有沒有其他kubernetes資源可以先訪問Service然后讓其暴露服務(wù)給外界?答案是有的,其中一個就是基于Nginx的Ingress。
Ingress是Kubernetes v1.1后新增的,它能將不同的URL訪問請求轉(zhuǎn)發(fā)到后端不同的Service上,實(shí)現(xiàn)HTTP層的業(yè)務(wù)路由機(jī)制。 以下是一個簡單的RC的yaml配置文件的例子:

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: myingress
spec: 
  rules: 
  - host: myingress.com
    http: 
      paths: 
      - path: /LoadBalanceTest
        backend: 
          serviceName: loadbalancetest
          servicePort: 8080

這里簡單地配置了一個路由轉(zhuǎn)發(fā)機(jī)制,即通過訪問 http://myingress.com/LoadBalanceTest 的URL地址,Ingress可以轉(zhuǎn)發(fā)到loadbalancetest:8080的這一個Service上。

1.4 搭建kubernetes分布式系統(tǒng)所需要的核心組件簡介

kubernetes分布式系統(tǒng)是由一組可執(zhí)行程序或說組件組成,這些組件包括:
(1)kube-apiserver -- API服務(wù)組件,提供kubernetes系統(tǒng)內(nèi)所有對象的增刪查改等restful式的服務(wù)端接口。
(2)kube-Controller Manager,資源管控器,主要負(fù)責(zé)集群內(nèi)的資源(如Pod,Node等)管理。 
(3)kube-Scheduler,將pod調(diào)度到指定的node中的調(diào)度器。
(4)kubelet,管理和維護(hù)一臺Node主機(jī)的所有容器,并將該主機(jī)注冊為Node節(jié)點(diǎn)的進(jìn)程。
(5)kube-proxy,網(wǎng)絡(luò)服務(wù)代理組件。

2,kubernetes分布式集群實(shí)例搭建、部署

本章節(jié)將以創(chuàng)建一個能在多臺分布式主機(jī)運(yùn)行的實(shí)例,來講解kubernetes的分布式集群的搭建和部署。

2.1 分布式主機(jī)集群的簡介

本案例將準(zhǔn)備4臺主機(jī)(虛擬機(jī)),其中一臺是作為master主機(jī),另外三臺作為node主機(jī)。那么首先我們來了解一下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)如下圖所示:
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

(圖:Master主機(jī)和Node主機(jī)的組件安裝與集群示意圖)

如果是一臺機(jī)器內(nèi)建立的多臺虛擬機(jī),可能不會存在跨主機(jī)跨虛擬機(jī)的互聯(lián)互通問題。
但如果是局域網(wǎng)內(nèi)的多臺主機(jī),或多臺主機(jī)內(nèi)再建立的虛擬機(jī)來模擬集群環(huán)境的時候,就可能需要進(jìn)行一定的設(shè)置了。
一般局域網(wǎng)間建立集群,我們會遇到這樣的問題:
(1)無線局域網(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)互通。

對于這些問題,網(wǎng)絡(luò)上有比較好的解答,例如使用網(wǎng)線直接連接主機(jī)組網(wǎng),虛擬機(jī)網(wǎng)絡(luò)設(shè)置橋接模式訪問等。
對于我們案例的測試,我們可以使用一臺手機(jī)WLAN熱點(diǎn)進(jìn)行多主機(jī)的組網(wǎng)。這樣可以繞開許多網(wǎng)絡(luò)互聯(lián)互通的問題。
參考上面的“Master主機(jī)和Node主機(jī)的組件安裝與集群示意圖”,我們按以下的大致步驟進(jìn)行組網(wǎng):
(1)設(shè)置Master主機(jī)和3臺Node主機(jī)在同一網(wǎng)段中,例如在192.168.43.0/24中。
(2)設(shè)置Master主機(jī)和3臺Node主機(jī)的網(wǎng)關(guān)為同一網(wǎng)關(guān):192.168.43.1。
(3)對于Master和Node主機(jī)都進(jìn)行關(guān)閉防火墻的操作。

2.2 master主機(jī)的環(huá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

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡
選擇“Y”進(jìn)行進(jìn)一步的download,這里可能需要VPN輔助。

download完成后,會有新的兩個文件出現(xiàn):“kubernetes-server-linux-amd64.tar.gz”和“kubernetes-client-linux-amd64.tar.gz”。其中我們重點(diǎn)使用的是server的那一個軟件包。
該軟件包會download到kubernetes下的server文件夾內(nèi)。我們對其進(jìn)行解壓,參考命令:

tar -zxvf kubernetes-server-linux-amd64.tar.gz

這樣就可以得到一批新的kubernetes集群的組件。
我們進(jìn)入解壓后的文件夾查閱。參考代碼:

cd kubernetes/server/bin/
ls

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡 
這樣,一些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

-- 啟動etcd,指定監(jiān)聽的url地址和對外提供的客戶端訪問地址,參考命令:

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"}'

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡
(master主機(jī)運(yùn)行etcd和設(shè)置成功截圖)

-- 啟動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

-- 啟動controller manager,指定apiserver的地址,參考命令:

kube-controller-manager --logtostderr=true --master=http://192.168.43.199:8080

-- 啟動kubernetes scheduler,指定apiserver的地址,參考命令:

kube-scheduler --logtostderr=true --v=0 --master=http://192.168.43.199:8080

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡
(kube-apiserver,kube-controller-manager,kube-scheduler成功啟動截圖)

若設(shè)置成功了,就可以再master主機(jī)進(jìn)行kubectl的操作了,我們可以使用kubectl命令,進(jìn)行相關(guān)kubernetes資源的操作,參考命令:

kubectl get nodes

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

可以看出,由于目前任意一臺node主機(jī)都還沒啟動,所以這一時刻master主機(jī)查詢nodes資源,并沒有已經(jīng)ready的node主機(jī),可以供master主機(jī)使用。

2.3 node主機(jī)的環(huán)境搭建

node主機(jī)的環(huán)境搭建,首先需要先安裝好docker,另外還需要將Master機(jī)器上的kubelet, kube-proxy,flannel給到每一個node節(jié)點(diǎn)機(jī)器上(如果確定版本一致的前提下,也可以重新download這些組件,而不用從Master主機(jī)復(fù)制)。
做好以上的準(zhǔn)備工作后,我們就可以node主機(jī)的操作了。

復(fù)制相關(guān)文件到系統(tǒng)資源文件夾中,方便日后簡化操作,參考代碼:

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

-- 啟動docker后,立即關(guān)閉,這是為了讓docker的網(wǎng)卡顯示,然后關(guān)閉docker,等待flannel來設(shè)置docker的新網(wǎng)卡,參考命令:

service docker start 
service docker stop

-- 啟動flannel,指定etcd的地址,以及說明使用的etcd前綴值,參考命令:

flanneld -etcd-endpoints=http://192.168.43.199:2379 -etcd-prefix=/coreos.com/network

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡
(成功設(shè)置了flannel的截圖)

-- 重新規(guī)劃docker的網(wǎng)絡(luò)地址,參考命令:

mk-docker-opts.sh -i
source /run/flannel/subnet.env
ifconfig docker0 ${FLANNEL_SUBNET}

-- 對于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

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡 (成功設(shè)置docker的網(wǎng)絡(luò)截圖)
這樣,docker就統(tǒng)一規(guī)劃到flannel所指定的子網(wǎng)當(dāng)中了。

-- 啟動kubelet,指定apiserver地址,設(shè)置Node主機(jī)注冊名,設(shè)置docker的啟動驅(qū)動systemd,完成node注冊,參考命令:

kubelet --api_servers=http://192.168.43.199:8080 --hostname-override=192.168.43.101 --cgroup-driver=systemd

-- 啟動kube-proxy,指定apiserver地址,參考命令:
kube-proxy --logtostderr=true --v=0 --master=http://192.168.43.199:8080

當(dāng)我們?nèi)_node都成功設(shè)置好后,通過Master主機(jī),就可以查詢到nodes的狀態(tài)了,參考命令:

kubectl get nodes

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡(master獲取nodes狀態(tài)截圖)
可以看到,我們設(shè)置的3臺nodes都已經(jīng)可以在Master主機(jī)查詢到,并且狀態(tài)為"Ready"。

3,容器云及service的創(chuàng)建

當(dāng)我們的kubernetes的分布式集群環(huán)境搭建好后,就可以開始創(chuàng)建相關(guān)的微服務(wù)Service了。
本章節(jié)當(dāng)中的Service是一個建立在tomcat上的web應(yīng)用,訪問該Service的時候,會返回服務(wù)器的IP地址和Mac地址。
在本例中,該Service通過RC的設(shè)置,提供了3個Pod副本來提供真正的服務(wù),所以每次訪問該Service的時候,實(shí)際上是負(fù)載均衡到了后面的3個Pod中的其中一個來提供服務(wù)的。

3.1 建立RC

這里,我們將建立一個包含3個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

這個配置的大致意思是:RC要求創(chuàng)建期望值數(shù)量為3的Pods,這些Pods是參考鏡像“docker.io/webin/loadbalancetest:1.0”而創(chuàng)建的,并且?guī)в袠?biāo)簽“app: loadbalancetest”。同時RC通過selector也指定了集群中帶有“app: loadbalancetest”標(biāo)簽的Pods,都?xì)w為它管理。
另外containerPort與hostPort,基本上等同于docker run -p 8087:8080 命令的作用,即指定好容器內(nèi)和外的端口映射。但一般的,特別是要求大量副本的情況下,不建議設(shè)置hostPort,因?yàn)榭赡軙?dǎo)致Pod分配和轉(zhuǎn)移的時候,分配到同一個node下導(dǎo)致端口沖突。

將上面的配置保存到一個文件后,就可以參考下面的命令將其運(yùn)行起來:

kubectl create -f loadbalancetest-rc.yaml

建立成功后,我們可以通過以下命令查閱rc,以及rc所創(chuàng)建的pods副本,參考命令如下:

kubectl get rc
kubectl get pods

效果圖如下:
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡
可以看到一個loadbalancetest的RC控制器的創(chuàng)建了三個Pod副本。

3.2 建立Service

由于RC建立后,會立即創(chuàng)建Pod,所以我們可以直接跳過Pod的手動創(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通過selector指定了特定的標(biāo)簽,意思是如果Pod中包含的標(biāo)簽與這里面的值相等,則視為是應(yīng)該為該Service提供服務(wù)的Pod。
另外該配置文件出現(xiàn)了幾個端口相關(guān)的配置:targetPort指出了Service要取Pod的container的服務(wù)端口,nodePort指Node主機(jī)可以通過該P(yáng)ort和Node主機(jī)的IP訪問到container。而port參數(shù)則代表整個Service的端口。

將配置保存成文件,按下面的參考命令運(yùn)行:

kubectl create -f loadbalancetest-svc.yaml

成功建立好Service后,我們可以通過下面的命令查閱Service的信息:

kubectl get svc

效果圖如下:

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡
可以看到loadbalancetest的微服務(wù)Service已經(jīng)建立好,并且被kubernetes分配了一個虛擬IP:10.254.0.242,以及把8080端口給到了這個Service,集群里面的資源包括Pod在內(nèi),都可以通過虛擬IP和端口進(jìn)行對該服務(wù)的調(diào)用。另外的一個端口30001是創(chuàng)建Service的時候特地暴露出來,給外界訪問的節(jié)點(diǎn)端口??梢酝ㄟ^nodeIP+nodePort的形式訪問到一個Node上面的一個Service選中的Pod副本所提供的服務(wù)。

3.3 查閱容器云以及微服務(wù)Service

上一節(jié)的Service實(shí)際上是一個分布式容器云組成的一個微服務(wù)。
由于前面的RC設(shè)置了3個副本,而3個副本Pod都包含了Service的標(biāo)簽選擇器所選擇的標(biāo)簽“app: loadbalancetest”,所以之前RC建立的3個Pod都是為該Service而服務(wù)的。多副本的Service能讓其更健壯,而且kubernetes的Service在多副本的情況下,還自帶了負(fù)載均衡的效果,這也是微服務(wù)的一種體現(xiàn)。
我們可以通過下面的命令,更詳細(xì)地查閱微服務(wù)Service的詳細(xì)情況。 參考命令:

kubectl describe svc loadbalancetest

效果圖如下:

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡 
可以看出,一共有三個Endpoint: 10.1.67.2:8080,10.1.70.2:8080,10.1.88.2:8080 
其實(shí)這些都是RC創(chuàng)建的三個Pod副本的IP地址和該服務(wù)的Container的8080端口組成的。
也就是實(shí)際上loadbalancetest這一個微服務(wù)Service,經(jīng)過內(nèi)置的負(fù)載均衡后最終是由這三個Pod來提供服務(wù)。

現(xiàn)在,我們可以先通過以下兩種方式,嘗試訪問到為Service提供服務(wù)的container:
(1)通過node主機(jī)IP + nodePort,可以對外提供服務(wù)訪問。

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡 
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

到目前為止,loadbalancetest的微服務(wù)Service已經(jīng)建立好了,但由于Service屬于Kubernetes內(nèi)部資源,只能Kubernetes的內(nèi)部才能訪問,也就是外部是不能直接進(jìn)行訪問的,所以要測試該Service是否真的是負(fù)載均衡的,可以通過下一節(jié)的Nginx Ingress進(jìn)行kubernetes資源的內(nèi)外訪問的代理。

4,使用Nginx-Ingress進(jìn)行Service的負(fù)載均衡測試

本節(jié)將通過創(chuàng)建Ingress,使外界能通過URL地址訪問到kubernetes微服務(wù)Service,驗(yàn)證Service的負(fù)載均衡。

4.1 創(chuàng)建default-http-backend 作為Ingress的默認(rèn)后端

default-http-backend是Nginx-ingress-controlloer的默認(rèn)后端,該默認(rèn)后端能檢測Nginx的健康情況,以及當(dāng)用戶訪問的url錯誤的時候,能返回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建立好了,我們再使用下面的簡易命令將其創(chuàng)建成Service:

kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend

這個命令其實(shí)就相當(dāng)于運(yùn)行一個Service的yaml配置文件,創(chuàng)建Service。
效果圖如下:

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

創(chuàng)建好后,我們可以在default-http-backend的Node主機(jī)上面直接通過的Podip/healthz或者serive的ip+port進(jìn)行測試,如下圖所示:
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡 
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡
若能見到如上圖返回的ok,則表示部署成功。

4.2 創(chuàng)建nginx-ingress-controller

nginx-ingress-controller其實(shí)是一個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      #訪問master 獲取service信息
        args:
        - /nginx-ingress-controller
        - --default-backend-service=default/default-http-backend

保存成文件,然后使用下面的參考命令,把這個RC運(yùn)行起來:

kubectl create -f nginx-ingress-rc.yaml

這時候,我們可以查閱運(yùn)行了nginx-ingress-controller的Pod詳細(xì)情況,然后通過運(yùn)行nginx-ingress-controller的那臺Node機(jī)器,驗(yàn)證nginx-ingress-controller是否運(yùn)行成功。

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

打開瀏覽器,輸入該node的ip以及加上路徑/healthz,如下圖所示:

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

如果有返回ok則表示配置成功。

4.3 創(chuàng)建Ingress,讓訪問路由到一個微服務(wù)Service

按下面的Ingress配置,創(chuàng)建url供外界訪問,并且路由到一個Service上:

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: myingress
spec: 
  rules: 
  - host: myingress.com
    http: 
      paths: 
      - path: /LoadBalanceTest
        backend: 
          serviceName: loadbalancetest
          servicePort: 8080

在要發(fā)起請求的機(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ā)起訪問,參考效果圖如下:

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

可以看出,對同一個URL地址發(fā)起的訪問中,每次的訪問返回的IP和主機(jī)名都與上一次的不同,而且是3個值循環(huán)地出現(xiàn),這是因?yàn)檫@個URL對應(yīng)的微服務(wù)Service是由3個Pod副本提供最終的運(yùn)算的,這個也是Service內(nèi)部負(fù)載均衡的體現(xiàn)。

5 kubectl的簡易命令總結(jié)

前面幾節(jié)中,我們完成了kubernetes分布式集群的搭建,以及運(yùn)行了微服務(wù)Service,也通過了ingress驗(yàn)證了微服務(wù)Service的內(nèi)置負(fù)載均衡。
在這個過程中,我們也使用了幾個kubectl的命令,這些命令都是非常實(shí)用的,在這里我進(jìn)行一個匯總:

5.1 kubectl的create命令

kubectl的create命令,能創(chuàng)建pod,service,ingress等資源,一般使用這樣的格式進(jìn)行創(chuàng)建:

kubectl create -f 資源的yaml配置文件名

5.2 kubectl的delete命令

如果有一些kubernetes資源不需要了,可以使用delete命令,一般的格式如下:

kubectl delete 資源類別 資源名稱

5.3 kubectl的replace命令

對于一些資源的配置更新,可以使用replace命令,一般格式如下:

kubectl replace -f 資源的yaml配置文件名

5.4 kubectl的資源獲取命令:get

獲取資源的信息,可以使用get,一般格式為:

kubectl get 資源類別 資源名稱

5.5 kubectl的資源詳細(xì)信息獲取命令:describe

kubectl describe 資源類別 資源名稱

另外如果一些配置文件中,有寫明命名空間的,則需要在查詢的時候,加入--namespace參數(shù)。如果不加,默認(rèn)查詢和創(chuàng)建的都是default的命名空間下的資源。

附錄:docker的基本操作簡介

1 CentOS7 下docker的安裝

對于CentOS7,在網(wǎng)絡(luò)連接良好的情況下,使用一句命令,即可安裝。參考命令如下:

yum -y install docker-io

安裝完成后,切換為root用戶,然后啟動docker即可。參考命令如下:

service docker start

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

2 docker 常用命令簡介

docker的命令有十幾種,但如果適當(dāng)?shù)姆诸?,會非常容易記住?/p>

2.1 docker中拉取和推送image的命令

一般剛安裝的docker,本地是沒有images可以運(yùn)行的,所以需要到docker hub鏡像登記中心(或者其他的非官方docker hub以及自建的docker hub中心)去獲取。
首先,我們可以先進(jìn)行images的拉取,參考命令:

docker pull hello-world

確保網(wǎng)絡(luò)暢通的情況下,就能將該image “hello-world” download下來了。 一般的,docker pull 命令后面加 image地址,而images地址一般是“服務(wù)器/庫/鏡像名”這樣的格式,上面的命令只寫了鏡像名hello-world,是因?yàn)槭÷苑?wù)器和庫的情況下,docker會先自動去docker官方的docker hub登記中心中尋找,補(bǔ)充docker自己的服務(wù)器和庫名,如下圖所示:

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

如果你的鏡像不是docker hub官方登記中心中的,就需要填寫完整的路徑。
同樣的,既然有拉取,就會有對應(yīng)的推送命令,即docker push 命令,但本小節(jié)不詳細(xì)講,這個將放入第三節(jié)的docker hub登記中心一并敘述。

2.2 docker中針對本地image類的命令

docker中針對image的常用命令有:docker images 、docker rmi 、以及上一節(jié)的docker pull等。 查閱本地images,參考命令:

docker images

效果如下圖所示:

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

這樣就會列出當(dāng)前該docker下所包含的本地images。

刪除某個image, 參考命令:

docker rmi 1815c82652c0

或者

docker rmi hello-world:latest

效果圖:
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

2.3 docker中針對本地container的命令

container是image的運(yùn)行態(tài)。
docker中針對container的常用命令有:docker ps 、 docker run 、 docker rm 、 docker stop 、 docker kill等。 參考命令:

docker run hello-world

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

另外,我們還可以將一些container中運(yùn)行的軟件或進(jìn)程,通過端口映射,如 -p 8080:80,將其80端口映射到外部的8080端口,暴露給外界,這樣外界就能使用暴露的端口來訪問container內(nèi)部端口所對應(yīng)的進(jìn)程了。 以下是一個container運(yùn)行的時候,將內(nèi)部端口8080映射到外部端口8081的例子,參考代碼:

docker run -p 8081:8080 docker.io/tomcat:V8

效果如下圖所示:
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

可以看到,運(yùn)行完該docker命令后,在本機(jī)器內(nèi),可以通過127.0.0.1 + 8081端口,訪問到tomcat,而這個tomcat,實(shí)際上是docker的一個container提供的服務(wù),tomcat在這個container中(該container內(nèi)部已經(jīng)包含了一個linux系統(tǒng)的image),其實(shí)是通過8080端口對內(nèi)提供服務(wù)的。 參數(shù) -p 8081:8080做到了內(nèi)外端口映射的作用。

另外,如果本地的docker images中,包含了centos或者ubuntu這樣的鏡像,還可以通過這樣的命令,運(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

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

刪除一個container, 參考命令:

docker rm 81346941533c

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

此外還可以使用以下命令,進(jìn)行全部的container刪除:

docker rm $(docker ps -a -q)

有時候,container正在運(yùn)行甚至對外提供TCP長連接的時候,我們不能隨便進(jìn)行docker rm操作,這時,我們需要先進(jìn)行docker stop或者docker kill命令后,才能成功地進(jìn)行docker rm操作。
參考命令:

docker stop 81346941533c
docker kill 81346941533c

其中 docker stop系優(yōu)雅停止一個container,其會發(fā)一則信號給到container,讓其在一定時間內(nèi)做好準(zhǔn)備后關(guān)閉,而docker kill系立即殺掉進(jìn)程,即立即停止。

3 docker hub登記中心簡介

前面的章節(jié)簡單介紹docker拉取和推送image的時候,提到了一下docker hub登記中心,該中心是用于存放docker images,并登記相關(guān)信息例如版本號、簡要描述等等,方便以后image的遷移或升級,復(fù)用等。
docker hub的官網(wǎng)地址: https://hub.docker.com/ 
kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

docker hub 除了docker自己的官方docker hub外,還有許多其他公司自建的docker hub,甚至還對外開放,例如目前國內(nèi)市場上的:
靈雀云(https://hub.alauda.cn/)
時速云(https://hub.tenxcloud.com/)
阿里巴巴的阿里云hub中心(https://dev.aliyun.com/search.html)
等等。

一般的,我們?nèi)绻约簞?chuàng)建了一個image,感覺日后會經(jīng)常用到,則可以上傳到相關(guān)的docker hub中。步驟為:
(1)提交container或者運(yùn)行dockerfile,將其變?yōu)橐粋€本地的image。
(2)登錄docker hub官網(wǎng)或者其他鏡像登記中心,前提是你已經(jīng)在此docker hub中心注冊了。
(3)將本地的要上傳的image打上tag,最主要是記錄好image名以及版本號。
(4)使用docker push 命令,將鏡像上傳到該docker hub。

參考命令:

docker commit 21d2f661627f mytest/hello-world         #提交一個container,變?yōu)橐粋€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上傳。

4 使用dockerfile 創(chuàng)建鏡像

docker中創(chuàng)建image的方法,除了pull遠(yuǎn)端的image,以及將container commit成image外,還可以通過dockerfile來創(chuàng)建,這樣的創(chuàng)建方法,能在自動化運(yùn)維中,起到良好的體驗(yàn)。這里簡單介紹一下通過dockerfile創(chuàng)建image的方法。
首先我們要在一個自己的測試路徑下面,建立一個名為“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 .

這時候,docker系統(tǒng)將會按照dockerfile的定義一步一步往下走。效果圖如下:

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

完成后,就可以通過docker images 命令看到該image了。

kubernetes V1.6.4 分布式集群的部署及如何進(jìn)行service負(fù)載均衡

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。


分享文章:kubernetesV1.6.4分布式集群的部署及如何進(jìn)行service負(fù)載均衡
文章出自:http://weahome.cn/article/pcodis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部