溫馨提示×

溫馨提示×

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

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

K8S statefulset 詳解

發(fā)布時間:2020-06-28 22:04:50 來源:網(wǎng)絡(luò) 閱讀:528 作者:hexuyong 欄目:系統(tǒng)運(yùn)維

概述

StatefulSet
????RC、Deployment、DaemonSet都是面向無狀態(tài)的服務(wù),它們所管理的Pod的IP、名字,啟停順序等都是隨機(jī)的,而StatefulSet是什么?顧名思義,有狀態(tài)的集合,管理所有有狀態(tài)的服務(wù),比如MySQLMongoDB集群等。
StatefulSet本質(zhì)上是Deployment的一種變體,在v1.9版本中已成為GA版本,它為了解決有狀態(tài)服務(wù)的問題,它所管理的Pod擁有固定的Pod名稱,啟停順序,在StatefulSet中,Pod名字稱為網(wǎng)絡(luò)標(biāo)識(hostname),還必須要用到共享存儲。
在Deployment中,與之對應(yīng)的服務(wù)是service,而在StatefulSet中與之對應(yīng)的headless service,headless service,即無頭服務(wù),與service的區(qū)別就是它沒有Cluster IP,解析它的名稱時將返回該Headless Service對應(yīng)的全部Pod的Endpoint列表。
除此之外,StatefulSet在Headless Service的基礎(chǔ)上又為StatefulSet控制的每個Pod副本創(chuàng)建了一個DNS域名,這個域名的格式為

   $(podname).(headless server name)   

   FQDN: $(podname).(headless server name).namespace.svc.cluster.local

StorageClass
????storageclass 是基于pv和pvc的擴(kuò)展,可以幫助應(yīng)用程序動態(tài)的創(chuàng)建pv和pvc,但是目前還不支持自動擴(kuò)容。

以部署一個nginx為例子,Ceph的rbd磁盤為后端做列子

一.部署一個statefulset應(yīng)用

rbac配置文件,這里為了防止出現(xiàn)權(quán)限的問題直接綁定了admin使用

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: rbd-provision
  namespace: xuyong-test-storage
subjects:
- kind: ServiceAccount
  name: rbd-provisioner
  namespace: xuyong-test-storage
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
---
kind: ServiceAccount
apiVersion: v1
metadata:
  name: rbd-provisioner
  namespace: xuyong-test-storage

storage-class 配置文件

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
  namespace: xuyong-test-storage
type: kubernetes.io/rbd
#type: kubernetes.io/rbd
data:
  key: ................
#上面的key填寫,base64編碼之后的真實(shí)的ceph的key,要不然會報錯
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rbd
  namespace: xuyong-test-storage
parameters:
##這里的id填寫ceph的用戶
  adminId: kubernetes-online
  adminSecretName: ceph-secret
  adminSecretNamespace: xuyong-test-storage
  imageFormat: "2"
  imagefeatures: layering
  monitors: saas-ceph.internal.weimob.com:6789
  pool: kubernetes-online
  userId: kubernetes-online
  userSecretName: ceph-secret
  userSecretNamespace: xuyong-test-storage
#類型默認(rèn)
provisioner: kubernetes.io/rbd
reclaimPolicy: Delete

statefulset配置文件

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: xuyong-test-storage
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: xuyong-test-storage
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"  #聲明它屬于哪個Headless Service.
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: ccr.ccs.tencentyun.com/weimob-public/nginx:1.16-centos7
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:   #可看作pvc的模板
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "rbd"  #存儲類名,改為集群中已存在的
      resources:
        requests:
          storage: 50Gi

注:rbd模式accessModes只支持 ReadWriteOnce和ReadonlyMany,且上面的service必須指定clusterip:none ,要不然會有問題。
查看效果:
K8S statefulset 詳解
排坑:

1.ecret的key必須base64編碼
2.如果出現(xiàn)rbac問題,執(zhí)行上面的rbac的文件
3.如果出現(xiàn)cpeh is not in $PATH這樣的報錯,這個是因?yàn)橐粋€鏡像拉不到,可以本地部署,使用本地部署的鏡像,或者***拉鏡像。
4.ceph-common的版本要同你服務(wù)器端使用的版本一致。


二.擴(kuò)容磁盤

參考文檔:https://www.520mwx.com/view/21456

由于statefulset默認(rèn)不支持磁盤的擴(kuò)容,所以需要利用ceph的接口來擴(kuò)容磁盤,實(shí)施步驟如下:

1.查看pv對應(yīng)的rbd image

[root@sh-saas-k8s1-master-pl-01 ceph-statefulset]# kubectl get pv pvc-ccb2ce5f-97e6-11e9-ac4b-52540006de2d -n=xuyong-test-storage -o yaml |grep image
image: kubernetes-dynamic-pvc-ccb7c9b1-97e6-11e9-be31-0a580afb018c

2.直接連接ceph需改rbd塊大小

rbd resize --image kubernetes-dynamic-pvc-ccb7c9b1-97e6-11e9-be31-0a580afb018c --size 100000

3.找到pod所在的node節(jié)點(diǎn),然后重新探測磁盤

blockdev --getsize64 /dev/rbd0
resize2fs /dev/rbd0

4.然后登入pod查看就能發(fā)現(xiàn)對應(yīng)的磁盤大小已經(jīng)被更改了

注:這個方法可以更改磁盤大小,但是pv和pvc還有storage-class的數(shù)據(jù)顯示是假的,而且當(dāng)是多個實(shí)例的時候,只能一個個改,比較麻煩。

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

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

AI