溫馨提示×

溫馨提示×

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

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

Deployment的概述及其使用場景

發(fā)布時間:2020-04-17 14:43:30 來源:億速云 閱讀:504 作者:三月 欄目:云計算

下文給大家?guī)鞤eployment的概述及其使用場景,希望能夠給大家在實際運用中帶來一定的幫助,負載均衡涉及的東西比較多,理論也不多,網(wǎng)上有很多書籍,今天我們就用億速云在行業(yè)內(nèi)累計的經(jīng)驗來做一個解答。

Deployment介紹

Deployment是kubernetes 1.2引入的概念,用來解決Pod的編排問題。Deployment可以理解為RC的升級版(RC+Reolicat Set)。特點在于可以隨時知道Pod的部署進度,即對Pod的創(chuàng)建、調(diào)度、綁定節(jié)點、啟動容器完整過程的進度展示。

Deployment的概述及其使用場景

使用場景

創(chuàng)建一個Deployment對象來生成對應(yīng)的Replica Set并完成Pod副本的創(chuàng)建過程。
檢查Deployment的狀態(tài)來確認部署動作是否完成(Pod副本的數(shù)量是否達到預(yù)期值)。
更新Deployment以創(chuàng)建新的Pod(例如鏡像升級的場景)。
如果當前Deployment不穩(wěn)定,回退到上一個Deployment版本。
掛起或恢復(fù)一個Deployment。

Service介紹

Deployment的概述及其使用場景

Service定義了一個服務(wù)的訪問入口地址,前端應(yīng)用通過這個入口地址訪問其背后的一組由Pod副本組成的集群實例,Service與其后端的Pod副本集群之間是通過Label Selector來實現(xiàn)“無縫對接”。RC保證Service的Pod副本實例數(shù)目保持預(yù)期水平。

外部系統(tǒng)訪問Service的問題

IP類型說明
Node IPNode節(jié)點的IP地址
Pod IPPod的IP地址
Cluster IPService的IP地址

環(huán)境介紹

主機IP地址服務(wù)
master192.168.1.21k8s
node01192.168.1.22k8s
node02192.168.1.23k8s

基于https://blog.51cto.com/14320361/2464655 的實驗繼續(xù)進行

一,Delpoyment和service的簡單使用

1.練習(xí)寫一個yaml文件,要求使用自己的私有鏡像,要求副本數(shù)量為三個。

[root@master ~]# vim xgp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: xgp-web
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: xgp-server
    spec:
      containers:
      - name: web
        image: 192.168.1.21:5000/web:v1
(1)執(zhí)行一下
[root@master ~]# kubectl apply -f xgp.yaml  --record
(2)查看一下
[root@master ~]# kubectl get pod

Deployment的概述及其使用場景

(3)訪問一下
[root@master ~]# curl 10.244.2.16

Deployment的概述及其使用場景

(4)更新一下yaml文件,副本加一
[root@master ~]# vim xgp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: xgp-web
spec:
  replicas: 4
  template:
    metadata:
      labels:
        app: xgp-server
    spec:
      containers:
      - name: web
        image: 192.168.1.21:5000/web:v1
<1>執(zhí)行一下
[root@master ~]# kubectl apply -f xgp.yaml --recore
<2>查看一下
[root@master ~]# kubectl get pod

Deployment的概述及其使用場景

副本數(shù)量加一,如果yaml文件的副本為0,則副本數(shù)量還是之前的狀態(tài),并不會更新。

2.練習(xí)寫一個service文件

[root@master ~]# vim xgp-svc.yaml
kind: Service
apiVersion: v1
metadata:
  name: xgp-svc
spec:
  selector:
    app: xgp-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
(1)執(zhí)行一下
[root@master ~]# kubectl apply -f xgp-svc.yaml 
(2)查看一下
[root@master ~]# kubectl get svc

Deployment的概述及其使用場景

(3)訪問一下
[root@master ~]# curl 10.107.119.49

Deployment的概述及其使用場景

3.修改yaml文件

[root@master ~]# vim xgp.yaml 
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: xgp-web
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: xgp-server
    spec:
      containers:
      - name: web
        image: 192.168.1.21:5000/web:v1
        ports:
          - containerPort: 80  #提示端口

注意:在Delpoyment資源對象中,可以添加Port字段,但此字段僅供用戶查看,并不實際生效

執(zhí)行一下
[root@master ~]# kubectl apply -f xgp.yaml 

4.service文件映射端口

[root@master ~]# vim xgp-svc.yaml 
kind: Service
apiVersion: v1
metadata:
  name: xgp-svc
spec:
  type: NodePort
  selector:
    app: xgp-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30123
執(zhí)行一下
[root@master ~]# kubectl apply -f xgp-svc.yaml 
查看一下
[root@master ~]# kubectl get svc

Deployment的概述及其使用場景

訪問一下
[root@master ~]# curl 127.0.0.1:30123

Deployment的概述及其使用場景

5.修改三個pod頁面內(nèi)容

(1)查看一下pod信息
[root@master ~]# kubectl get pod -o wide

Deployment的概述及其使用場景

(2)修改POD頁面內(nèi)容(三臺不一樣)
[root@master ~]# kubectl exec -it xgp-web-8d5f9656f-8z7d9 /bin/bash
//根據(jù)pod名稱進入pod之中
進入容器后修改頁面內(nèi)容
root@xgp-web-8d5f9656f-8z7d9:/usr/local/apache2# echo xgp-v1 > htdocs/index.html 
root@xgp-web-8d5f9656f-8z7d9:/usr/local/apache2# exit
訪問一下
[root@master ~]# curl 127.0.0.1:30123

Deployment的概述及其使用場景

二.分析一下k8s負載均衡原理

(1)查看service的暴露IP
[root@master ~]# kubectl get svc

Deployment的概述及其使用場景

(2)查看一下iptabes規(guī)則
[root@master ~]# iptables-save 
//查看已配置的規(guī)則

SNAT:Source NAT(源地址轉(zhuǎn)換)

DNAT:Destination NAT(目標地址轉(zhuǎn)換)

MASQ:動態(tài)的源地址轉(zhuǎn)換

(3)根據(jù)service的暴露IP,查看對應(yīng)的iptabes規(guī)則
[root@master ~]# iptables-save | grep 10.107.119.49

Deployment的概述及其使用場景

[root@master ~]# iptables-save | grep KUBE-SVC-ESI7C72YHAUGMG5S

Deployment的概述及其使用場景

(4)對應(yīng)一下IP是否一致
[root@master ~]# iptables-save | grep KUBE-SEP-ZHDQ73ZKUBMELLJB

Deployment的概述及其使用場景

[root@master ~]# kubectl get pod -o wide

Deployment的概述及其使用場景

Service實現(xiàn)的負載均衡:默認使用的是iptables規(guī)則。IPVS

三.回滾到指定版本

(1)刪除之前創(chuàng)建的delpoy和service
[root@master ~]# kubectl  delete -f xgp.yaml 
[root@master ~]# kubectl  delete -f xgp-svc.yaml 
(2)準備三個版本所使用的私有鏡像,來模擬每次升級不同的鏡像
[root@master ~]# vim xgp1.yaml  (三個文件名不相同)
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: xgp-web
spec:
  revisionHistoryLimit: 10
  replicas: 3
  template:
    metadata:
      labels:
        app: xgp-server
    spec:
      containers:
      - name: web
        image: 192.168.1.21:5000/web:v1  (三臺版本不同)
        ports:
          - containerPort: 80

此處3個yaml文件 指定不同版本的鏡像

(3)運行三個服務(wù),并記錄三個版本信息
[root@master ~]# kubectl apply -f xgp-1.yaml --record 
[root@master ~]# kubectl apply -f xgp-2.yaml --record 
[root@master ~]# kubectl apply -f xgp-3.yaml --record 
(4)查看有哪些版本信息
[root@master ~]# kubectl rollout history deployment xgp-web 

Deployment的概述及其使用場景

(5)運行之前的service文件
[root@master ~]# kubectl apply -f xgp-svc.yaml
(6)查看service暴露端口
[root@master ~]# kubectl get svc

Deployment的概述及其使用場景

(7)測試訪問
[root@master ~]# curl 127.0.0.1:30123

Deployment的概述及其使用場景

(8)回滾到指定版本
[root@master ~]# kubectl rollout undo deployment xgp-web --to-revision=1
//這里指定的是版本信息的編號
<1>訪問一下
[root@master ~]# curl 127.0.0.1:30123

Deployment的概述及其使用場景

<2>查看有哪些版本信息
[root@master ~]# kubectl rollout history deployment xgp-web 

Deployment的概述及其使用場景
編號1已經(jīng)被編號2替代,從而生的是一個新的編號4

四.用label控制pod的位置

默認情況下,scheduler會將pod調(diào)度到所有可用的Node,不過有些情況我們希望將 Pod 部署到指定的 Node,比如將有大量磁盤 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要運行在配置了 GPU 的節(jié)點上。

kubernetes通過label來實現(xiàn)這個功能

label 是 key-value 對,各種資源都可以設(shè)置 label,靈活添加各種自定義屬性。比如執(zhí)行如下命令標注 k8s-node1 是配置了 SSD 的節(jié)點

首先我們給node1節(jié)點打上一個ssd的標簽
[root@master ~]# kubectl label nodes node02 disk=ssd
(1)查看標簽
[root@master ~]# kubectl get nodes --show-labels | grep node02

Deployment的概述及其使用場景

(2)刪除副本一
[root@master ~]# kubectl delete -f xgp-1.yaml 
deployment.extensions "xgp-web" deleted
[root@master ~]# kubectl delete svc xgp-svc 
(3)修改副本一的yaml文件
[root@master ~]# vim xgp-1.yaml 

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: xgp-web
spec:
  revisionHistoryLimit: 10
  replicas: 3
  template:
    metadata:
      labels:
        app: xgp-server
    spec:
      containers:
      - name: web
        image: 192.168.1.21:5000/web:v1
        ports:
          - containerPort: 80
      nodeSelector:    #添加節(jié)點選擇器
        disk: ssd      #和標簽內(nèi)容一致
(4)執(zhí)行一下
[root@master ~]# kubectl apply -f xgp-1.yaml 
查看一下
[root@master ~]# kubectl get pod -o wide

Deployment的概述及其使用場景

現(xiàn)在pod都在node02上運行

(5)刪除標簽
[root@master ~]# kubectl  label nodes node02 disk-
查看一下
[root@master ~]# kubectl get nodes --show-labels | grep node02

Deployment的概述及其使用場景

沒有disk標簽了

五,小實驗

1)使用私有鏡像v1版本部署一個Deployment資源對象,要求副本Pod數(shù)量為3個,并創(chuàng)建一個Service資源對象相互關(guān)聯(lián),指定要求3個副本Pod全部運行在node01節(jié)點上,記錄一個版本。
(1)用label控制pod的位置
[root@master ~]# kubectl label nodes node01 disk=ssd
(2)編寫源yaml文件
[root@master ~]# vim xgp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: xgp-web
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: xgp-server
    spec:
      containers:
      - name: web
        image: 192.168.1.21:5000/web:v1
        ports:
          - containerPort: 80
      nodeSelector:    
        disk: ssd  
(3)編寫源service文件
[root@master ~]# vim xgp-svc.yaml
kind: Service
apiVersion: v1
metadata:
  name: xgp-svc
spec:
  type: NodePort
  selector:
    app: xgp-server
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30123
(4)執(zhí)行yaml文件,創(chuàng)建控制器。執(zhí)行service文件創(chuàng)建映射端口
[root@master ~]# kubectl apply -f  xgp.yaml  --recore
[root@master ~]# kubectl apply -f xgp-svc.yaml 
(5)查看一下pod節(jié)點
[root@master ~]# kubectl get pod -o wide

Deployment的概述及其使用場景

(6)記錄一個版本
[root@master ~]# kubectl rollout history deployment xgp-web > pod.txt

Deployment的概述及其使用場景

(7)訪問一下

Deployment的概述及其使用場景

2)根據(jù)上述Deployment,升級為v2版本,記錄一個版本。
(1)修改yaml文件鏡像版本
[root@master ~]# vim xgp.yaml 
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: xgp-web
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: xgp-server
    spec:
      containers:
      - name: web
        image: 192.168.1.21:5000/web:v2    #修改版本為二
        ports:
          - containerPort: 80
      nodeSelector:
        disk: ssd
(2)刷新一下yaml文件
[root@master ~]# kubectl apply -f xgp.yaml --record 
(3)訪問一下

Deployment的概述及其使用場景

(4)記錄一個版本
[root@master ~]# kubectl rollout history deployment xgp-web > pod.txt

Deployment的概述及其使用場景

3)最后升級到v3版本,這時,查看Service關(guān)聯(lián),并且分析訪問流量的負載均衡詳細情況。
1)修改yaml文件鏡像版本
[root@master ~]# vim xgp.yaml 
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: xgp-web
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: xgp-server
    spec:
      containers:
      - name: web
        image: 192.168.1.21:5000/web:v3   #修改版本為二
        ports:
          - containerPort: 80
      nodeSelector:
        disk: ssd
(2)刷新一下yaml文件
[root@master ~]# kubectl apply -f xgp.yaml --record
(3)訪問一下

Deployment的概述及其使用場景

(5)分析訪問流量的負載均衡詳細情況
<1>查看一下service映射端口

Deployment的概述及其使用場景

<2>以ip為起點,分析訪問流量的負載均衡詳細情況

Service實現(xiàn)的負載均衡:默認使用的是iptables規(guī)則。IPVS

[root@master ~]# iptables-save | grep 10.107.27.229
//根據(jù)service的暴露IP,查看對應(yīng)的iptabes規(guī)則

Deployment的概述及其使用場景

[root@master ~]# iptables-save | grep KUBE-SVC-ESI7C72YHAUGMG5S

Deployment的概述及其使用場景

這里顯示了各節(jié)點的負載比例

<3>對應(yīng)一下IP是否一致
[root@master ~]# iptables-save | grep KUBE-SEP-VDKW5WQIWOLZMJ6G

Deployment的概述及其使用場景

[root@master ~]# kubectl get pod -o wide

Deployment的概述及其使用場景

4)回滾到指定版本v1,并作驗證。
<1>回滾到指定版本
[root@master ~]# kubectl rollout undo deployment xgp-web --to-revision=1
//這里指定的是版本信息的編號
<2>訪問一下
[root@master ~]# curl 127.0.0.1:30123

Deployment的概述及其使用場景

排錯思路

[root@master ~]# less /var/log/messages  | grep kubelet
[root@master ~]# kubectl  logs -n  kube-system kube-scheduler-master 
[root@master ~]# kubectl describe pod xgp-web-7d478f5bb7-bd4bj 

看了以上關(guān)于Deployment的概述及其使用場景,如果大家還有什么地方需要了解的可以在億速云行業(yè)資訊里查找自己感興趣的或者找我們的專業(yè)技術(shù)工程師解答的,億速云技術(shù)工程師在行業(yè)內(nèi)擁有十幾年的經(jīng)驗了。

 



向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI