k8s的ReplicaSet,DaemonSet及標籤

環境介紹

主機 IP地址 服務
master 192.168.1.21 k8s
node01 192.168.1.22 k8s
node02 192.168.1.23 k8s

基於[ http://www.javashuo.com/article/p-wzdhboob-dy.html]() 的實驗繼續進行前端

ReplicaSet簡單介紹

1. RC:ReplicationController(老一代的pod控制器)

用來確保由其管控的Pod對象副本數量,可以知足用戶指望,多則刪除,少則經過模本建立node

特色:

  • 確保Pod資源對象的數量精準。
  • 確保pod健康運行。
  • 彈性伸縮

一樣,它也能夠經過yaml或json格式的資源清單來建立。其中spec字段通常嵌套如下字段:nginx

  • replicas:指望的Pod對象副本數量。
  • selector:當前控制器匹配Pod對此項副本的標籤選擇器
  • template:pod副本的模板

與RC相比而言,RS不只支持基於等值的標籤選擇器,並且還支持基於集合的標籤選擇器。web

2. 標籤:解決同類型的資源對象,爲了更好的管理,按照標籤分組。

經常使用的標籤分類:

  • release(版本):stable(穩定版)、canary(金絲雀版本)、beta(測試版本)
  • environment(環境變量):dev(開發)、qa(測試)、production(生產)
  • application(應用):ui、as(application software應用軟件)、pc、sc
  • tier(架構層級):frontend(前端)、backend(後端)、cache(緩存)
  • partition(分區):customerA(客戶A)、customerB(客戶B)
  • track(品控級別):daily(天天)、weekly(每週)

標籤要作到:見名知意。json

3.測試

(1)編寫一個pod的yaml文件

[root@master ~]# vim label.yaml 

kind: Pod
apiVersion: v1
metadata:
  name: labels
  labels:
    env: qa
    tier: frontend
spec:
  containers:
  - name: myapp
    image: httpd

<1>執行一下

[root@master ~]# kubectl apply -f label.yaml  --record

<2>查看一下

[root@master ~]# kubectl get pod  --show-labels 
//經過--show-labels顯示資源對象的

k8s的ReplicaSet,DaemonSet及標籤

[root@master ~]# kubectl get po -L env,tier
//顯示某個鍵對應的值

k8s的ReplicaSet,DaemonSet及標籤

[root@master ~]# kubectl get po -l env,tier
//經過-l 查看僅包含某個標籤的資源。

k8s的ReplicaSet,DaemonSet及標籤

(2)添加標籤

[root@master ~]# kubectl label pod  labels app=pc
//給pod資源添加標籤

(3)修改標籤

[root@master ~]# kubectl label pod labels env=dev --overwrite
//修改標籤
[root@master ~]# kubectl get pod -l tier --show-labels 
//查看標籤

k8s的ReplicaSet,DaemonSet及標籤

(4)編寫一個service的yaml文件

[root@master ~]# vim service.yaml
kind: Service
apiVersion: v1
metadata:
  name: service
spec:
  type: NodePort
  selector:
    env: qa
  ports:
  - protocol: TCP
    port: 90
    targetPort: 80
    nodePort: 30123

<1>執行一下

[root@master ~]# kubectl apply -f service.yaml

<2>查看一下

[root@master ~]# kubectl describe svc

k8s的ReplicaSet,DaemonSet及標籤

<3>訪問一下

[root@master ~]# curl 127.0.0.1:30123

k8s的ReplicaSet,DaemonSet及標籤

若是標籤有多個,標籤選擇器選擇其中一個,也能夠關聯成功。相反,若是選擇器有多個,那麼標籤必須徹底知足條件,才能夠關聯成功。vim

4. 標籤選擇器:標籤的查詢過濾條件。

[基於等值關係的(equality-based)]():「=」,「==」,「! =」前面兩個都是相等,最後一個是不等於。後端

[基於集合關係(set-based)]():in、notin、exists三種。選擇器列表間爲「邏輯與」關係,使用ln或者NotIn操做時,其valuas不強制要求爲非空的字符串列表,而使用Exists或DostNotExist時,其values必須爲空api

使用標籤選擇器的邏輯:

  • 同時指定的多個選擇器之間的邏輯關係爲「與」操做。
  • 使用空值的標籤選擇器意味着每一個資源對象都將把選中。
  • 空的標籤選擇器沒法選中任何資源。

(1)例子

k8s的ReplicaSet,DaemonSet及標籤

編寫一個selector的yaml'文件

[root@master ~]# vim selector.yaml
selector:
  matchLabels:
    app: nginx
  mathExpressions:
    - {key: name,operator: In,values: [zhangsan,lisi]}
    - {key: age,operator: Exists,values:}
  • selector:當前控制器匹配Pod對此項副本的標籤選擇器
  • matchLabels: 指定鍵值對錶示的標籤選擇器。
  • mathExpressions::基於表達式來指定的標籤選擇器。

DaemonSet

它也是一種pod控制器。緩存

RC,RS , deployment , daemonset.都是pod控制器。statfukSet,RBAC架構

1. 使用場景:

若是必須將pod運行在固定的某個或某幾個節點,且要優先於其餘的pod的啓動。一般狀況下,默認會將每個節點都運行,而且只能運行一個pod。這種狀況推薦使用DeamonSet資源對象。

  • 監控程序;
  • 日誌收集程序;
  • 集羣存儲程序;
[root@master ~]# kubectl get ds -n kube-system 
//查看一下DaemonSet

2. DaemonSet 與 Deployment 的區別

  • Deployment 部署的副本 Pod 會分佈在各個 Node 上,每一個 Node 均可能運行好幾個副本。
  • DaemonSet 的不一樣之處在於:每一個 Node 上最多隻能運行一個副本。

3. 運行一個web服務,在每個節點運行一個pod。

[root@master ~]# vim daemonset.yaml

kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: test-ds
spec:
  template:
    metadata:
      labels:
        name: test-ds
    spec:
      containers:
      - name: test-ds
        image: httpd

<1>執行一下

[root@master ~]# kubectl apply -f daemonset.yaml

<2>查看一下

[root@master ~]# kubectl get ds

k8s的ReplicaSet,DaemonSet及標籤

總結

1)總結RC、RS、Deplyment、DaemonSet控制器的特色及使用場景。

<1>Replication Controller(RC)

介紹及使用場景

Replication Controller簡稱RCRCKubernetes系統中的核心概念之一,簡單來講,RC能夠保證在任意時間運行Pod的副本數量,可以保證Pod老是可用的。若是實際Pod數量比指定的多那就結束掉多餘的,若是實際數量比指定的少就新啓動一些Pod,當Pod失敗、被刪除或者掛掉後,RC都會去自動建立新的Pod來保證副本數量,因此即便只有一個Pod,咱們也應該使用RC來管理咱們的Pod

主要功能

  • 確保pod數量:RC用來管理正常運行Pod數量,一個RC能夠由一個或多個Pod組成,在RC被建立後,系統會根據定義好的副本數來建立Pod數量。在運行過程當中,若是Pod數量小於定義的,就會重啓中止的或從新分配Pod,反之則殺死多餘的。
  • 確保pod健康:當pod不健康,運行出錯或者沒法提供服務時,RC也會殺死不健康的pod,從新建立新的。
  • 彈性伸縮 :在業務高峯或者低峯期的時候,能夠經過RC動態的調整pod的數量來提升資源的利用率。同時,配置相應的監控功能(Hroizontal Pod Autoscaler),會定時自動從監控平臺獲取RC關聯pod的總體資源使用狀況,作到自動伸縮。
  • 滾動升級:滾動升級爲一種平滑的升級方式,經過逐步替換的策略,保證總體系統的穩定,在初始化升級的時候就能夠及時發現和解決問題,避免問題不斷擴大。

<2>Replication Set(RS)

被認爲 是「升級版」的RC。RS也是用於保證與label selector匹配的pod數量維持在指望狀態。

實際上RSRC的功能基本一致,目前惟一的一個區別就是RC只支持基於等式的selector(env=dev或app=nginx),但RS還支持基於集合的selector(version in (v1, v2)),這對複雜的運維管理就很是方便了。

kubectl命令行工具中關於RC的大部分命令一樣適用於咱們的RS資源對象。不過咱們也不多會去單獨使用RS,它主要被Deployment這個更加高層的資源對象使用,除非用戶須要自定義升級功能或根本不須要升級Pod,在通常狀況下,咱們推薦使用Deployment而不直接使用Replica Set

區別在於

一、RC只支持基於等式的selector(env=dev或environment!=qa),但RS還支持新的,基於集合的selector(version in (v1.0, v2.0)或env notin (dev, qa)),這對複雜的運維管理很方便。

二、升級方式

  • RS不能使用kubectlrolling-update進行升級
  • kubectl rolling-update專用於rc
  • RS升級使用deployment或者kubectl replace命令
  • 社區引入這一API的初衷是用於取代vl中的RC,也就是說當v1版本被廢棄時,RC就完成了它的歷史使命,而由RS來接管其工做

<3>DaemonSet

1. 特色:

若是必須將pod運行在固定的某個或某幾個節點,且要優先於其餘的pod的啓動。一般狀況下,默認會將每個節點都運行,而且只能運行一個pod。這種狀況推薦使用DeamonSet資源對象。

一個DaemonSet對象能確保其建立的Pod在集羣中的每一臺(或指定)Node上都運行一個副本。若是集羣中動態加入了新的Node,DaemonSet中的Pod也會被添加在新加入Node上運行。刪除一個DaemonSet也會級聯刪除全部其建立的Pod。

2. 使用環境

  • 監控程序;
  • 日誌收集程序;
  • 集羣存儲程序;

<4>Deployment

1. 什麼是Deployment

Kubernetes Deployment提供了官方的用於更新Pod和Replica Set(下一代的Replication Controller)的方法,您能夠在Deployment對象中只描述您所指望的理想狀態(預期的運行狀態),Deployment控制器爲您將如今的實際狀態轉換成您指望的狀態,例如,您想將全部的webapp:v1.0.9升級成webapp:v1.1.0,您只需建立一個Deployment,Kubernetes會按照Deployment自動進行升級。如今,您能夠經過Deployment來建立新的資源(pod,rs,rc),替換已經存在的資源等。

你只須要在Deployment中描述你想要的目標狀態是什麼,Deployment controller就會幫你將Pod和Replica Set的實際狀態改變到你的目標狀態。你能夠定義一個全新的Deployment,也能夠建立一個新的替換舊的Deployment。

2. 典型的用例

  • 使用Deployment來建立ReplicaSet。ReplicaSet在後臺建立pod。檢查啓動狀態,看它是成功仍是失敗。
  • 而後,經過更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態。這會建立一個新的ReplicaSet,Deployment會按照控制的速率將pod從舊的ReplicaSet移動到新的ReplicaSet中。
  • 若是當前狀態不穩定,回滾到以前的Deployment revision。每次回滾都會更新Deployment的revision。
  • 擴容Deployment以知足更高的負載。
  • 暫停Deployment來應用PodTemplateSpec的多個修復,而後恢復上線。
  • 根據Deployment 的狀態判斷上線是否hang住了。
  • 清除舊的沒必要要的ReplicaSet。

3. 使用環境

Deployment集成了上線部署、滾動升級、建立副本、暫停上線任務,恢復上線任務,回滾到之前某一版本(成功/穩定)的Deployment等功能,在某種程度上,Deployment能夠幫咱們實現無人值守的上線,大大下降咱們的上線過程的複雜溝通、操做風險。

  • 定義Deployment來建立Pod和ReplicaSet
  • 滾動升級和回滾應用
  • 擴容和縮容
  • 暫停和繼續Deployment

3. DaemonSet 與 Deployment 的區別

  • Deployment 部署的副本 Pod 會分佈在各個 Node 上,每一個 Node 均可能運行好幾個副本。
  • DaemonSet 的不一樣之處在於:每一個 Node 上最多隻能運行一個副本。

2)使用DaemonSet控制器運行httpd服務,要求名稱以本身的名稱命名。標籤爲:tier=backend,env=dev.

[root@master ~]# vim daemonset.yaml 
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: xgp-ds
spec:
  template:
    metadata:
      labels:
        tier: backend
        env: dev
    spec:
      containers:
      - name: xgp-ds
        image: httpd

查看一下

[root@master ~]# kubectl get pod  --show-labels

k8s的ReplicaSet,DaemonSet及標籤

[root@master ~]# kubectl get pod -L env,tier

k8s的ReplicaSet,DaemonSet及標籤

3) 建立service資源對象與上述資源進行關聯,要有驗證。

[root@master ~]# vim service.yaml 
kind: Service
apiVersion: v1
metadata:
  name: service
spec: 
  type: NodePort
  selector: 
    env: dev
  ports:    
  - protocol: TCP
    port: 90 
    targetPort: 80
    nodePort: 30123

執行一下

[root@master ~]# kubectl apply -f service.yaml

查看一下

[root@master ~]# kubectl describe svc

k8s的ReplicaSet,DaemonSet及標籤

訪問一下

[root@master ~]# curl 127.0.0.1:30123

k8s的ReplicaSet,DaemonSet及標籤

4)整理關於標籤和標籤選擇器都有什麼做用?

<1>標籤:解決同類型的資源對象,爲了更好的管理,按照標籤分組。

<2>標籤選擇器:標籤的查詢過濾條件。

相關文章
相關標籤/搜索