溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何使用httpd鏡像創(chuàng)建一個(gè)Deployment資源對(duì)象及其它關(guān)聯(lián)

發(fā)布時(shí)間:2020-04-20 10:35:47 來(lái)源:億速云 閱讀:438 作者:三月 欄目:云計(jì)算


下文給大家?guī)?lái)如何使用httpd鏡像創(chuàng)建一個(gè)Deployment資源對(duì)象及其它關(guān)聯(lián),希望能夠給大家在實(shí)際運(yùn)用中帶來(lái)一定的幫助,負(fù)載均衡涉及的東西比較多,理論也不多,網(wǎng)上有很多書(shū)籍,今天我們就用億速云在行業(yè)內(nèi)累計(jì)的經(jīng)驗(yàn)來(lái)做一個(gè)解答。


1、使用httpd鏡像創(chuàng)建一個(gè)Deployment資源對(duì)象
[root@master ~]# vim lvjianzhao.yaml    #編寫(xiě)yaml文件

kind: Deployment            #指定要?jiǎng)?chuàng)建的資源對(duì)象類(lèi)型
apiVersion: extensions/v1beta1        #指定deployment所對(duì)應(yīng)的API版本
metadata:
  name: lvjianzhao-deploy      #定義deployment的名稱(chēng)
spec:
  replicas: 4            #定義需要?jiǎng)?chuàng)建pod副本的數(shù)量
  template:
    metadata:
      labels:                           #指定pod的標(biāo)簽
        user: lvjianzhao
    spec:
      containers:                                 
      - name: httpd                    #指定容器的名稱(chēng)
        image: httpd                #指定基于哪個(gè)鏡像運(yùn)行容器
[root@master ~]# kubectl apply -f lvjianzhao.yaml     #執(zhí)行編寫(xiě)的文件
[root@master ~]# kubectl explain deployment     
#注:如果不知道某個(gè)資源對(duì)象所對(duì)應(yīng)的API版本,可以通過(guò)此命令查看
KIND:     Deployment
VERSION:  extensions/v1beta1             #這就是Deployment資源所對(duì)應(yīng)的API版本
                        ........................#省略部分內(nèi)容
[root@master ~]# kubectl get deployment lvjianzhao-deploy     
#確定所執(zhí)行的yaml文件生成了我們所需數(shù)量的pod

查看其pod標(biāo)簽,是否是我們定義的label:

[root@master ~]# kubectl describe deployment lvjianzhao-deploy    #查看這個(gè)資源對(duì)象的詳細(xì)信息
Name:                   lvjianzhao-deploy
Namespace:              default
CreationTimestamp:      Thu, 07 Nov 2019 17:50:44 +0800
Labels:                 "user=lvjianzhao"              #這里就是該資源對(duì)象的標(biāo)簽
2、創(chuàng)建一個(gè)svc資源對(duì)象與上述Deployment資源對(duì)象關(guān)聯(lián)。且能夠?qū)ν饩W(wǎng)提供服務(wù)。映射節(jié)點(diǎn)端口為:32123.

如何使用httpd鏡像創(chuàng)建一個(gè)Deployment資源對(duì)象及其它關(guān)聯(lián)

[root@master ~]# vim httpd-service.yaml    #編寫(xiě)service的yaml文件

kind: Service
apiVersion: v1
metadata:
  name: httpd-service
spec:
  type: NodePort              #這里需要指定類(lèi)型為“NodePort”,否則默認(rèn)是cluster IP
  selector:
    user: lvjianzhao                #與deployment資源對(duì)象的這個(gè)標(biāo)簽進(jìn)行關(guān)聯(lián)
  ports:
  - protocol: TCP
    port: 79                #這里指定要映射到的Cluster  IP的端口
    targetPort: 80              #這里指定的是要映射pod中的端口
    nodePort: 32123     #這里指定的是映射到宿主機(jī)的端口
[root@master ~]# kubectl apply -f httpd-service.yaml        #執(zhí)行該yaml文件
[root@master ~]# kubectl get svc httpd-service     #查看創(chuàng)建的svc(service)
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
httpd-service   NodePort   10.97.13.198   <none>        79:32123/TCP   2m1s
#可以看到將指定的群集端口映射到了本地的32123

現(xiàn)在就可以使用client訪(fǎng)問(wèn)k8s群集中任意一個(gè)節(jié)點(diǎn)的32123端口,即可看到pod所提供的服務(wù),如下:
如何使用httpd鏡像創(chuàng)建一個(gè)Deployment資源對(duì)象及其它關(guān)聯(lián)

[root@master ~]# kubectl describe svc httpd-service       #查看該service的詳細(xì)信息

返回的信息如下(只能顯示少量IP,剩下的只是被省略了,而不是未指定):
如何使用httpd鏡像創(chuàng)建一個(gè)Deployment資源對(duì)象及其它關(guān)聯(lián)

既然上面說(shuō)到了,endpoint指定的都是后端pod的IP地址,那么就來(lái)查看驗(yàn)證一下,是否正確,如下:

[root@master ~]# kubectl get pod -o wide | awk '{print $6}'   #輸出后端pod的IP地址
IP
10.244.1.18
10.244.2.21
10.244.1.17
10.244.2.20
#可以確認(rèn)查看的IP能對(duì)應(yīng)上上面service的endpoint指定的IP

查看svc映射endpoint的詳細(xì)情況,并詳細(xì)說(shuō)明負(fù)載均衡的底層原理。

3、當(dāng)我們做完上述操作后,client是可以訪(fǎng)問(wèn)我們pod提供的服務(wù)的(并且是負(fù)載均衡的效果),那么這是一個(gè)什么樣的實(shí)現(xiàn)過(guò)程呢?依賴(lài)什么實(shí)現(xiàn)的?

其實(shí),背后的原理并沒(méi)有那么高大上,kube-proxy通過(guò)iptables的轉(zhuǎn)發(fā)機(jī)制來(lái)實(shí)現(xiàn)負(fù)載均衡的效果的,先定義目標(biāo)IP是service提供的群集IP,然后使用“-j”選項(xiàng)轉(zhuǎn)發(fā)到其他iptables規(guī)則,如下:

[root@master ~]# kubectl get svc httpd-service | awk '{print $3}'
#我們需要先查看到service的群集IP
CLUSTER-IP   
10.97.13.198
[root@master ~]# iptables-save > a.txt          #將iptables規(guī)則輸出到文件中,方便我們查找
[root@master ~]# vim a.txt         #打開(kāi)iptables規(guī)則

搜索我們的群集IP,可以看到,當(dāng)目標(biāo)地址是群集IP地址時(shí),就會(huì)轉(zhuǎn)發(fā)到另一個(gè)規(guī)則“KUBE-SVC-X2P42VLQEZCHLPKZ”,如下:

如何使用httpd鏡像創(chuàng)建一個(gè)Deployment資源對(duì)象及其它關(guān)聯(lián)
那么,現(xiàn)在繼續(xù)搜索它轉(zhuǎn)發(fā)到的規(guī)則上,如下:
如何使用httpd鏡像創(chuàng)建一個(gè)Deployment資源對(duì)象及其它關(guān)聯(lián)

上面的圖中,就是與他實(shí)現(xiàn)負(fù)載均衡相關(guān)的策略的,我們一共四個(gè)pod,所以上圖中的第一個(gè)規(guī)則使用了random的算法,只有0.25(1/4)的幾率采用這個(gè)規(guī)則,當(dāng)?shù)竭_(dá)第二條規(guī)則后,則有0.33的幾率,因?yàn)槿コ耙粋€(gè)pod,還剩下三個(gè)pod,10/3=0.33,這就是這個(gè)幾率的由來(lái),依次類(lèi)推,當(dāng)?shù)竭_(dá)最后一個(gè)規(guī)則后,那么就不用指定幾率了,肯定是它來(lái)處理這條請(qǐng)求。

附加:為node節(jié)點(diǎn)打標(biāo)簽,以便使pod運(yùn)行在指定的節(jié)點(diǎn)。
[root@master ~]# kubectl label nodes node01 disktype=ssd  
#給節(jié)點(diǎn)node01打標(biāo)簽“disktype=ssd”(自定義的標(biāo)簽)

#相應(yīng)的yaml文件如下:
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: httpd
spec:
  revisionHistoryLimit: 10
  replicas: 3
  template:
    metadata:
      labels:
        app: httpd-server
    spec:
      containers:
      - name: httpd
        image: 192.168.1.1:5000/httpd:v1
        ports:
        - containerPort: 80
      nodeSelector:                //指定標(biāo)簽選擇器

       disktype: ssd


看了以上關(guān)于如何使用httpd鏡像創(chuàng)建一個(gè)Deployment資源對(duì)象及其它關(guān)聯(lián),如果大家還有什么地方需要了解的可以在億速云行業(yè)資訊里查找自己感興趣的或者找我們的專(zhuān)業(yè)技術(shù)工程師解答的,億速云技術(shù)工程師在行業(yè)內(nèi)擁有十幾年的經(jīng)驗(yàn)了。

 



向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI