【Kubernetes】控制器Statefulset

Statefulset控制器

  • 一、概念
  • 二、Statefulset資源清單文件編寫技巧
    • 2.1、查看定義Statefulset資源需要的字段
    • 2.2、查看statefulset.spec字段如何定義
    • 2.3、查看statefulset的spec.template字段如何定義
  • 三、Statefulset使用案例:部署web站點
    • 3.1、編寫一個Statefulset資源清單文件
    • 3.2、更新資源清單文件
    • 3.3、查看相關資源
  • 四、StatefulSet組成部分
    • 4.1、 Headless Service
      • 【1】headless service會為service分配一個域名
      • 【2】StatefulSet會為關聯的Pod保持一個不變的Pod Name
      • 【3】StatefulSet會為關聯的Pod分配一個dnsName
    • 4.2、volumeClaimTemplates
    • 4.3、總結
  • 五、Statefulset管理pod:擴容、縮容、更新
    • 5.1、動態擴縮容
    • 5.2、滾動更新

一、概念

StatefulSet是為了管理有狀態服務的問題而設計的.

擴展:
有狀態服務?

StatefulSet是有狀態的集合,管理有狀態的服務,它所管理的Pod的名稱不能隨意變化。數據持久化的目錄也是不一樣,每一個Pod都有自己獨有的數據持久化存儲目錄。比如MySQL主從、redis集群等。

無狀態服務?

RC、Deployment、DaemonSet都是管理無狀態的服務,它們所管理的Pod的IP、名字,啟停順序等都是隨機的。個體對整體無影響,所有pod都是共用一個數據卷的,部署的tomcat就是無狀態的服務,tomcat被刪除,在啟動一個新的tomcat,加入到集群即可,跟tomcat的名字無關。

二、Statefulset資源清單文件編寫技巧

2.1、查看定義Statefulset資源需要的字段

[root@master ~]# kubectl explain statefulset
KIND:     StatefulSet
VERSION:  apps/v1DESCRIPTION:StatefulSet represents a set of pods with consistent identities. Identitiesare defined as:- Network: A single stable DNS and hostname.- Storage: As many VolumeClaims as requested.The StatefulSet guarantees that a given network identity will always map tothe same storage identity.FIELDS:apiVersion   <string> # 定義資源需要使用的api版本kind <string>         # 定義資源類型metadata     <Object> # 定義元數據spec <Object>         # 定義容器相關的信息  

2.2、查看statefulset.spec字段如何定義

[root@master ~]#  kubectl explain statefulset.spec
KIND:     StatefulSet
VERSION:  apps/v1RESOURCE: spec <Object>DESCRIPTION:Spec defines the desired identities of pods in this set.A StatefulSetSpec is the specification of a StatefulSet.FIELDS:podManagementPolicy  <string>      # POD管理策略replicas     <integer>             # 副本數revisionHistoryLimit <integer>     # 保留的歷史版本selector     <Object> -required-   # 標簽選擇器,選擇它所關聯的podserviceName  <string> -required-   # headless service的名字template     <Object> -required-   # 生成pod的模板updateStrategy       <Object>      # 更新策略volumeClaimTemplates <[]Object>    # 存儲卷申請模板

2.3、查看statefulset的spec.template字段如何定義

對于template而言,其內部定義的就是pod,pod模板是一個獨立的對象。
.spec.template里的內容是聲明Pod對象時要定義的各種屬性,所以這部分也叫做PodTemplate(Pod模板)

[root@master ~]# kubectl explain statefulset.spec.template
KIND:     StatefulSet
VERSION:  apps/v1RESOURCE: template <Object>
DESCRIPTION:......
FIELDS:metadata     <Object>  # 定義多少個Pod副本(默認將僅部署1個Pod)、匹配Pod標簽的選擇器、創建pod的模板、存儲卷申請模板 spec <Object>  # Pod里的容器屬性等配置 # 在spec.template.spec.selector中定義的標簽選擇器必須能夠匹配到spec.template.metadata.labels里定義的Pod標簽,否則Kubernetes將不允許創建statefulset。

三、Statefulset使用案例:部署web站點

3.1、編寫一個Statefulset資源清單文件

[root@master 12]# cat statefulset.yaml
apiVersion: v1   # 定義api版本
kind: Service    # 定義要創建的資源:service
metadata:name: nginx    # 定義service的名字labels: app: nginx  # service的標簽
spec:ports:- port: 80name: webclusterIP: None  # 創建一個沒有ip的serviceselector:app: nginx     # 選擇擁有app=nginx標簽的pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:selector:matchLabels:app: nginxserviceName: "nginx"   # headless service的名字replicas: 2            # 副本數template:metadata:            # 定義pod的模板labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80  # 容器服務的端口name: web          # 端口別名volumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:     # 存儲卷申請模板- metadata:name: wwwspec:accessModes: ["ReadWriteOnce"] # 訪問模式:單路讀寫storageClassName: "nfs"  # 指定從哪個存儲類申請pvresources:requests:storage: 1Gi   # 需要1G的pvc,會自動跟符合條件的pv綁定 

3.2、更新資源清單文件

[root@master 12]# kubectl apply -f statefulset.yaml
service/nginx created
statefulset.apps/web created
# 查看statefulset是否創建成功
[root@master 12]# kubectl get statefulset
NAME   READY   AGE
web    2/2     2m7s
# 查看pod
[root@master 12]# kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          2m50s
web-1   1/1     Running   0          2m8s
# 通過上面可以看到創建的pod是有序的

3.3、查看相關資源

[root@master 12]# kubectl get svc -l app=nginx
NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   None         <none>        80/TCP    3m50s
[root@master 12]# kubectl get pvc
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
www-web-0     Bound    pvc-223fc042-1b1b-4516-a1b5-a5572434d3ee   1Gi        RWO            nfs            4m8s
www-web-1     Bound    pvc-b4f026b2-4984-4302-b45d-00c57a74a162   1Gi        RWO            nfs            3m26s
[root@master 12]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                 STORAGECLASS   REASON   AGE
pvc-223fc042-1b1b-4516-a1b5-a5572434d3ee   1Gi        RWO            Delete           Bound      default/www-web-0     nfs                     4m39s
pvc-b4f026b2-4984-4302-b45d-00c57a74a162   1Gi        RWO            Delete           Bound      default/www-web-1     nfs                     3m56s
[root@master 12]# for i in 0 1; do kubectl exec web-$i -- sh -c 'hostname';done
web-0
web-1

四、StatefulSet組成部分

4.1、 Headless Service

用來定義pod網路標識,生成可解析的DNS記錄

Headless service不分配clusterIP,headless service可以通過解析service的DNS,返回所有Pod的dns和ip地址 (statefulSet部署的Pod才有DNS),普通的service,只能通過解析service的DNS返回service的ClusterIP。

【1】headless service會為service分配一個域名

<service name>.$<namespace name>.svc.cluster.local

K8s中資源的全局FQDN格式:
  Service_NAME.NameSpace_NAME.Domain.LTD.
  Domain.LTD.=svc.cluster.local #這是默認k8s集群的域名。

擴展:FQDN

FQDN 全稱 Fully Qualified Domain Name
即全限定域名:同時帶有主機名和域名的名稱
FQDN = Hostname + DomainName
如 主機名是 xianchao 域名是 baidu.com
FQDN= xianchao.baidu.com

【2】StatefulSet會為關聯的Pod保持一個不變的Pod Name

statefulset中Pod的名字格式為$(StatefulSet name)-$(pod序號)

【3】StatefulSet會為關聯的Pod分配一個dnsName

$<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local

4.2、volumeClaimTemplates

為什么要用volumeClaimTemplate?

對于有狀態應用都會用到持久化存儲,比如mysql主從,由于主從數據庫的數據是不能存放在一個目錄下的,每個mysql節點都需要有自己獨立的存儲空間。
而在deployment中創建的存儲卷是一個共享的存儲卷,多個pod使用同一個存儲卷,它們數據是同步的,而statefulset定義中的每一個pod都不能使用同一個存儲卷,這就需要使用volumeClainTemplate。
當在使用statefulset創建pod時,volumeClainTemplate會自動生成一個PVC,從而請求綁定一個PV,每一個pod都有自己專用的存儲卷。

Pod、PVC和PV對應的關系圖如下:
在這里插入圖片描述
使用kubectl run運行一個提供nslookup命令的容器,這個命令來自于dnsutils包,通過對pod主機名執行nslookup,可以檢查它們在集群內部的DNS地址

kubectl run busybox --image docker.io/library/busybox:1.28  --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # nslookup web-0.nginx.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName:      web-0.nginx.default.svc.cluster.local # 查詢service dns,會把對應的pod ip解析出來
Address 1: 10.244.196.144 web-0.nginx.default.svc.cluster.local

4.3、總結

  • 1、Statefulset管理的pod,pod名字是有序的,由statefulset的名字-0、1、2這種格式組成
  • 2、創建statefulset資源的時候,必須事先創建好一個service,如果創建的service沒有ip,那對這個service做dns解析,會找到它所關聯的pod ip,如果創建的service有ip,那對這個service做dns解析,會解析到service本身ip。
  • 3、statefulset管理的pod,刪除pod,新創建的pod名字跟刪除的pod名字是一樣的
  • 4、statefulset具有volumeclaimtemplate這個字段,這個是卷申請模板,會自動創建pv,pvc也會自動生成,跟pv進行綁定,那如果創建的statefulset使用了volumeclaimtemplate這個字段,那創建pod,數據目錄是獨享的
  • 5、ststefulset創建的pod,是有域名的(域名組成:pod-name.svc-name.svc-namespace.svc.cluster.local)

五、Statefulset管理pod:擴容、縮容、更新

5.1、動態擴縮容

如果我們覺得兩個副本太少了,想要增加,只需要修改配置文件statefulset.yaml里的replicas的值即可,原來replicas: 2,現在變成replicaset: 3,修改之后,執行如下命令更新:

[root@master 12]# kubectl apply -f statefulset.yaml
service/nginx unchanged
statefulset.apps/web configured
[root@master 12]# kubectl get sts
NAME   READY   AGE
web    3/3     80m
[root@master 12]# kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          81m
web-1   1/1     Running   0          80m
web-2   1/1     Running   0          28s

也可以直接編輯控制器實現擴容,這個是我們把請求提交給了apiserver,實時修改
在這里插入圖片描述

[root@master 12]# kubectl edit sts web  # 副本改成4
statefulset.apps/web edited
[root@master 12]# kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          82m
web-1   1/1     Running   0          81m
web-2   1/1     Running   0          90s
web-3   1/1     Running   0          7s

5.2、滾動更新

kubectl explain sts.spec.updateStrategy

[root@master 12]# kubectl explain sts.spec.updateStrategy
KIND:     StatefulSet
VERSION:  apps/v1RESOURCE: updateStrategy <Object>DESCRIPTION:updateStrategy indicates the StatefulSetUpdateStrategy that will beemployed to update Pods in the StatefulSet when a revision is made toTemplate.StatefulSetUpdateStrategy indicates the strategy that the StatefulSetcontroller will use to perform updates. It includes any additionalparameters necessary to perform the update for the indicated strategy.FIELDS:rollingUpdate        <Object>RollingUpdate is used to communicate parameters when Type isRollingUpdateStatefulSetStrategyType.type <string>Type indicates the type of the StatefulSetUpdateStrategy. Default isRollingUpdatePossible enum values:- `"OnDelete"`  - `"RollingUpdate"`  
[root@master 12]# cat statefulset.yaml
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:updateStrategy:  # 1、添加更新策略rollingUpdate:partition: 1  # 序號大于等于1的pod做更新maxUnavailable: 0  # 滾動更新時允許不可用 Pod 的最大數量selector:matchLabels:app: nginxserviceName: "nginx"replicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: ikubernetes/myapp:v2  # 2、修改鏡像:容器才會更新imagePullPolicy: IfNotPresentports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: ["ReadWriteOnce"]storageClassName: "nfs"resources:requests:storage: 1Gi
# 在一個終端執行如下命令:kubectl apply -f statefulset.yaml
# 在另一個終端動態查看pod
[root@master ~]# kubectl get pods -l app=nginx -w
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          102m
web-1   1/1     Running   0          101m
web-2   1/1     Running   0          22m
web-3   1/1     Running   0          20m
web-3   1/1     Terminating   0          20m
web-3   1/1     Terminating   0          20m
web-3   0/1     Terminating   0          20m
web-3   0/1     Terminating   0          20m
web-3   0/1     Terminating   0          20m
web-2   1/1     Terminating   0          22m
web-2   1/1     Terminating   0          22m
web-2   0/1     Terminating   0          22m
web-2   0/1     Terminating   0          22m
web-2   0/1     Terminating   0          22m
web-2   0/1     Pending       0          0s
web-2   0/1     Pending       0          0s
web-2   0/1     ContainerCreating   0          0s
web-2   0/1     ContainerCreating   0          1s
web-2   1/1     Running             0          10s
web-1   1/1     Terminating         0          102m
web-1   1/1     Terminating         0          102m
web-1   0/1     Terminating         0          102m
web-1   0/1     Terminating         0          102m
web-1   0/1     Terminating         0          102m
web-1   0/1     Pending             0          0s
web-1   0/1     Pending             0          0s
web-1   0/1     ContainerCreating   0          0s
web-1   0/1     ContainerCreating   0          0s
web-1   1/1     Running             0          9s
web-2   1/1     Running             0          42s
web-1   1/1     Running             0          52s# 從上面結果可以看出來,pod在更新的時候,只是更新了web-1、2、3 
# partition: 1表示更新的時候會把pod序號大于等于1的進行更新

如果更新策略是OnDelete,那不會自動更新pod,需要手動刪除,重新常見的pod才會實現更新
修改策略:

  updateStrategy:type: OnDelete# rollingUpdate:#   partition: 1#   maxUnavailable: 0
[root@master 12]# kubectl apply -f statefulset.yaml
service/nginx unchanged
statefulset.apps/web configured
[root@master 12]# kubectl get pod  -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          121m
web-1   1/1     Running   0          18m
web-2   1/1     Running   0          18m
[root@master 12]# kubectl delete pod web-0
pod "web-0" deleted
# 在另一種終端動態查看
[root@master ~]# kubectl get pod -w
NAME                              READY   STATUS    RESTARTS      AGE
web-0                             1/1     Running   0             122m
web-1                             1/1     Running   0             19m
web-2                             1/1     Running   0             19m
web-0                             1/1     Terminating   0             122m
web-0                             1/1     Terminating   0             122m
web-0                             0/1     Terminating   0             122m
web-0                             0/1     Terminating   0             122m
web-0                             0/1     Terminating   0             122m
web-0                             0/1     Pending       0             0s
web-0                             0/1     Pending       0             0s
web-0                             0/1     ContainerCreating   0             0s
web-0                             0/1     ContainerCreating   0             1s
web-0                             1/1     Running             0             2s

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535664.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535664.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535664.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Scala 函數

scala定義函數的標準格式為&#xff1a; def 函數名(參數名1: 參數類型1, 參數名2: 參數類型2) : 返回類型 {函數體} 函數示例1&#xff1a;返回Unit類型的函數 def shout1(content: String) : Unit {println(content) }函數示例2&#xff1a;返回Unit類型的函數&#xff0…

ubuntu7.10中的apache的一些設置

在/etc/apache2/mods-available目錄下是apache2可用的模塊.出現在這里的模塊不代表你可以用.只是表明你的apache2已經安裝了這些模塊.可用的模塊在/etc/apache2/mods-enabled這個目錄下.(從redhat系列轉過來看ubuntu,雖然感覺不習慣,但覺得ubuntu的這種分目錄的方法很不錯.) 如…

Java并發篇_Java內存模型

在并發編程中&#xff0c;我們通常會遇到以下三個問題&#xff1a;原子性問題&#xff0c;可見性問題&#xff0c;有序性問題。那么它們產生的原因和在Java中解決的辦法又是什么呢&#xff1f; 一、內存模型的相關概念 ? 計算機在執行程序時&#xff0c;每條指令都是在CPU中執…

rz的安裝

以前,在redhat系列的linux中,通過終端工具操作服務器,經常使用rz來上傳小文件.但是有些系統默認情況下不能使用此命令.今天通過ubuntu.看到這條命令.即使ubunt沒有裝這個命令,你輸入此命令時,它會提示你進行安裝. rootubuntu:~# rzThe program rz is currently not installed. …

Java并發篇_synchronized

synchronized是Java語言的關鍵字&#xff0c;當它用來修飾一個方法或者一個代碼塊的時候&#xff0c;能夠保證在同一時刻最多只有一個線程執行該段代碼。本文給大家介紹java中的用法。 一、為什么要使用synchronized 在并發編程中存在線程安全問題&#xff0c;主要原因有&…

mysqlreport的學習

mysqlreport是一個腳本. 需要先安裝perl-DBI和perl-DBD-MySQL這2個包 mysqlreport 使用DBI 需要有http://hackmysql.com/mysqlreportdocperl ./mysqlreport --help 看幫助 perl ./mysqlreport --user root --password 密碼mysqlreport 文檔mysqlreport 以很友好的方式顯示 My…

Java并發篇_volatile

volatile是Java提供的一種輕量級的同步機制。Java 語言包含兩種內在的同步機制&#xff1a;同步塊&#xff08;或方法&#xff09;和 volatile 變量&#xff0c;相比于synchronized&#xff08;synchronized通常稱為重量級鎖&#xff09;&#xff0c;volatile更輕量級&#xff…

vi 語法著色

我所在部門的經理極其鄙視我用vi,這到不是說他看不慣vi,而是因為那句話"只有黑客級的人才用VI".而我只是一只小小萊鳥.所以只好被他們鄙視了. 現在說一說vi 著色的問題. 首先安裝 vim-enhanced &#xff0c; # yum -y install vim-enhanced 然后&#xff0c; # vi ~/…

Docker Dockerfile詳解

一、什么是Dockerfile Dockerfile是一個包含用于組合映像的命令的文本文檔。可以使用在命令行中調用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。 docker build命令用于從Dockerfile構建映像。可以在docker build命令中使用-f標志指向文件系統中任何位置的Doc…

公司臺灣主站的url重寫

今天對公司臺灣主站的url地址進行優化.主站采用的是joomla,而joomla初建好后用的url對搜索引擎非常的不友好. Joomla中的SEF說白了就是一個對URL的重寫的過程將原來參數眾多&#xff0c;層次很深的URL改寫為一個簡單的更容易被記住被搜索的URL。通過分析Joomla站點的URL結果就…

編寫第一個Spring程序——IOC實現

第一個Spring程序 IOC范例 1、新建maven工程 2、在pom.xml文件中導入相關jar包 <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core&l…

改變centos系統的時區

兩條命令都可以: 1.timeconfig 2.tzselect

分布式文件系統:原理、問題與方法

本地文件系統如ext3&#xff0c;reiserfs等&#xff08;這里不討論基于內存的文件系統&#xff09;&#xff0c;它們管理本地的磁盤存儲資源、提供文件到存儲位置的映射&#xff0c;并抽象出一套文件訪問接口供用戶使用。但隨著互聯網企業的高速發展&#xff0c;這些企業對數據…

編寫第二個Spring程序——AOP實現

第二個Spring程序 AOP范例 1、新建maven工程 2、在pom.xml文件導入相關jar包 <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core<…

linux高負載下徹底優化mysql數據庫

同時在線訪問量繼續增大 對于1G內存的服務器明顯感覺到吃力嚴重時甚至每天都會死機 或者時不時的服務器卡一下 這個問題曾經困擾了我半個多月MySQL使用是很具伸縮性的算法&#xff0c;因此你通常能用很少的內存運行或給MySQL更多的被存以得到更好的性能。 安裝好mysql后&#x…

Java注釋說明以及IDEA中的快捷鍵

一、單行注釋 說明&#xff1a;單行注釋 一般注釋少量的代碼或者說明內容 格式&#xff1a;//注釋的內容 IDEA中的快捷鍵&#xff1a;使用Ctrl /&#xff0c; 添加行注釋&#xff0c;再次使用&#xff0c;去掉行注釋 二、多行注釋 說明&#xff1a;多行注釋 一般注釋大量的…

redhat系統雙網卡綁定

Redhat Linux的網絡配置&#xff0c;基本上是通過修改幾個配置文件來實現的&#xff0c;雖然也可以用ifconfig來設置IP&#xff0c;用route來配置默認網關&#xff0c;用hostname來配置主機名&#xff0c;但是重啟后會丟失。 1.相關的配置文件: /ect/hosts 配置主機名和IP地址…

JDK源碼解析之java.util.Iterator和java.lang.Iterable

在Java中&#xff0c;我們可以對List集合進行如下幾種方式的遍歷&#xff1a;第一種就是普通的for循環&#xff0c;第二種為迭代器遍歷&#xff0c;第三種是for each循環。后面兩種方式涉及到Java中的iterator和iterable對象&#xff0c;接下來我們通過源碼來看看這兩個對象的區…

為了讓你的網頁能在更多的服務器上正常地顯示,還是加上“SET NAMES UTF8”吧

Repinted:http://blog.csdn.net/class1/archive/2006/12/30/1469298.aspx 為了讓你的網頁能在更多的服務器上正常地顯示&#xff0c;還是加上“SET NAMES UTF8”吧(可以根據你的喜歡選擇相應的編碼,如gb2312)&#xff0c;即使你現在沒有加上這句也能正常訪問。 先說MySQL的字…

WebLogic11g 安裝配置規范

目錄 1 文檔控制... 3 1.1 修改記錄... 3 1.2 分發者... 3 1.3 審閱記錄... 3 1.4 相關文檔... 3 2 安裝準備... 4 2.1 安裝前需要開發單位提供的信息... 4 2.2 本地磁盤空間配置規范... 4 2.3 版本要求規范... 4 2.4 weblogic部署配置規范... 5 2.4.1操作系統要求.…