一 前期準備 1.1 前置條件 集群部署:Kubernetes集群部署參考003——019。 glusterfs-Kubernetes部署:參考《附010.Kubernetes永久存儲之GlusterFS超融合部署》。 1.2 部署規劃 本實驗使用StatefulSet部署MongoDB集群,同時每 ...
一 前期準備
1.1 前置條件
- 集群部署:Kubernetes集群部署參考003——019。
- glusterfs-Kubernetes部署:參考《附010.Kubernetes永久存儲之GlusterFS超融合部署》。
1.2 部署規劃
本實驗使用StatefulSet部署MongoDB集群,同時每個MongoDB實例使用glusterfs實現永久存儲。從而部署無單點故障、高可用、可動態擴展的MongoDB集群。 部署架構如下:二 創建StatefulSet
2.1 創建storageclass存儲類型
1 [root@k8smaster01 ~]# vi heketi-secret.yaml #創建用於保存密碼的secret 2 apiVersion: v1 3 kind: Secret 4 metadata: 5 name: heketi-secret 6 namespace: heketi 7 data: 8 # base64 encoded password. E.g.: echo -n "mypassword" | base64 9 key: YWRtaW4xMjM= 10 type: kubernetes.io/glusterfs
1 [root@k8smaster01 heketi]# kubectl create -f heketi-secret.yaml #創建heketi 2 [root@k8smaster01 heketi]# kubectl get secrets -n heketi 3 NAME TYPE DATA AGE 4 default-token-6n746 kubernetes.io/service-account-token 3 144m 5 heketi-config-secret Opaque 3 142m 6 heketi-secret kubernetes.io/glusterfs 1 3m1s 7 heketi-service-account-token-ljlkb kubernetes.io/service-account-token 3 143m 8 [root@k8smaster01 ~]# mkdir mongo 9 [root@k8smaster01 ~]# cd mongo
1 [root@k8smaster01 heketi]# vi storageclass-fast.yaml 2 apiVersion: storage.k8s.io/v1 3 kind: StorageClass 4 metadata: 5 name: fast 6 parameters: 7 resturl: "http://10.254.82.26:8080" 8 clusterid: "d96022e907f82045dcc426a752adc47c" 9 restauthenabled: "true" 10 restuser: "admin" 11 secretName: "heketi-secret" 12 secretNamespace: "default" 13 volumetype: "replicate:3" 14 provisioner: kubernetes.io/glusterfs 15 reclaimPolicy: Delete
1 [root@k8smaster01 heketi]# kubectl create -f storageclass-fast.yaml 2 [root@k8smaster01 heketi]# kubectl get storageclasses/fast
2.2 授權ServiceAccount
本實驗2.4步驟需要使用mongo-sidecar的pod來配置管理mongo pod。 由於預設的service account僅僅只能獲取當前Pod自身的相關屬性,無法觀察到其他名稱空間Pod的相關屬性信息。如果想要擴展Pod,或者一個Pod需要用於管理其他Pod或者是其他資源對象,是無法通過自身的名稱空間的serviceaccount進行獲取其他Pod的相關屬性信息的,因此需要進行手動創建一個serviceaccount,併在創建Pod時進行定義。或者直接將預設的serviceaccount進行授權。1 [root@uk8s-m-01 mongo]# vi defaultaccout.yaml 2 --- 3 apiVersion: rbac.authorization.k8s.io/v1beta1 4 kind: ClusterRoleBinding 5 metadata: 6 name: DDefault-Cluster-Admin 7 subjects: 8 - kind: ServiceAccount 9 # Reference to upper's `metadata.name` 10 name: default 11 # Reference to upper's `metadata.namespace` 12 namespace: default 13 roleRef: 14 kind: ClusterRole 15 name: cluster-admin 16 apiGroup: rbac.authorization.k8s.io 17 18 [root@uk8s-m-01 mongo]# kubectl apply -f defaultaccout.yaml
2.3 創建headless Service
1 [root@k8smaster01 mongo]# vi mongo-headless-service.yaml
略
提示:本實驗直接將headless結合在StatefulSet同一個yaml文件中,參考2.4。
2.4 創建StatefulSet
1 [root@k8smaster01 mongo]# vi statefulset-mongo.yaml 2 --- 3 apiVersion: v1 4 kind: Service 5 metadata: 6 name: mongo 7 labels: 8 name: mongo 9 spec: 10 ports: 11 - port: 27017 12 targetPort: 27017 13 clusterIP: None 14 selector: 15 role: mongo 16 --- #以上為headless-service 17 apiVersion: apps/v1beta1 18 kind: StatefulSet 19 metadata: 20 name: mongo 21 spec: 22 serviceName: "mongo" 23 replicas: 3 24 template: 25 metadata: 26 labels: 27 role: mongo 28 environment: test 29 spec: 30 terminationGracePeriodSeconds: 10 31 containers: 32 - name: mongo 33 image: mongo:3.4 #新版可能不支持smallfiles參數,因此指定為3.4版本 34 command: 35 - mongod 36 - "--replSet" 37 - rs0 38 - "--bind_ip" 39 - 0.0.0.0 40 - "--smallfiles" #使用較小的預設文件 41 - "--noprealloc" #禁用數據文件預分配 42 ports: 43 - containerPort: 27017 44 volumeMounts: 45 - name: mongo-persistent-storage 46 mountPath: /data/db 47 - name: mongo-sidecar 48 image: cvallance/mongo-k8s-sidecar 49 env: 50 - name: MONGO_SIDECAR_POD_LABELS 51 value: "role=mongo,environment=test" 52 - name: KUBERNETES_MONGO_SERVICE_NAME 53 value: "mongo" 54 volumeClaimTemplates: 55 - metadata: 56 name: mongo-persistent-storage 57 annotations: 58 volume.beta.kubernetes.io/storage-class: "fast" 59 spec: 60 accessModes: [ "ReadWriteOnce" ] 61 resources: 62 requests: 63 storage: 2Gi釋義:
- 該StatefulSet定義了兩個容器:mingo和mongo-sidecar。mongo是主服務程式,mongo-sidecar是將多個mongo實例進行集群設置的工具。同時mongo-sidecar中設置瞭如下環境變數:
- MONGO_SIDECAR_POD_LABELS:設置為mongo容器的標簽,用於sidecar查詢它所要管理的MongoDB集群實例。
- KUBERNETES_MONGO_SERVICE_NAME:它的值為mongo,表示sidecar將使用mongo這個服務名來完成MongoDB集群的設置。
- replicas=3表示MongoDB集群由3個mongo實例組成。
- volumeClaimTemplates是StatefulSet最重要的存儲設置。在annotations段設置volume.beta.kubernetes.io/storage-class="fast"表示使用名為fast的StorageClass自動為每個mongo Pod實例分配後端存儲。
- resources.requests.storage=2Gi表示為每個mongo實例都分配2GiB的磁碟空間。
1 [root@k8smaster01 mongo]# kubectl create -f statefulset-mongo.yaml #創建mongo
提示:由於國內mongo鏡像可能無法pull,建議通過VPN等方式提前pull鏡像,然後上傳至所有node節點。
1 [root@VPN ~]# docker pull cvallance/mongo-k8s-sidecar:latest 2 [root@VPN ~]# docker pull mongo:3.4.4 3 [root@VPN ~]# docker save -o mongo-k8s-sidecar.tar cvallance/mongo-k8s-sidecar:latest 4 [root@VPN ~]# docker save -o mongo_3_4_4.tar mongo:3.4.4 5 [root@k8snode01 ~]# docker load -i mongo-k8s-sidecar.tar 6 [root@k8snode01 ~]# docker load -i mongo.tar 7 [root@k8snode01 ~]# docker images創建異常可通過如下方式刪除,重新創建:
1 kubectl delete -f statefulset-mongo.yaml 2 kubectl delete -f mongo-headless-service.yaml 3 kubectl delete pvc -l role=mongo
三 確認驗證
3.1 查看資源
1 [root@k8smaster01 mongo]# kubectl get pod -l role=mongo #查看集群pod 2 NAME READY STATUS RESTARTS AGE 3 mongo-0 2/2 Running 0 9m44s 4 mongo-1 2/2 Running 0 7m51s 5 mongo-2 2/2 Running 0 6m1sStatefulSet會用volumeClaimTemplates中的定義為每個Pod副本都創建一個PVC實例,每個PVC的名稱由StatefulSet定義中volumeClaimTemplates的名稱和Pod副本的名稱組合而成。
1 [root@k8smaster01 mongo]# kubectl get pvc
1 [root@k8smaster01 mongo]# kubectl get pods mongo-0 -o yaml | grep -A 3 volumes #查看掛載
3.2 查看mongo集群
登錄任意一個mongo Pod,在mongo命令行界面用rs.status()命令查看MongoDB集群的狀態,該mongodb集群已由sidecar完成了創建。在集群中包含3個節點 每個節點的名稱都是StatefulSet設置的DNS功能變數名稱格式的網路標識名稱: mongo-0.mongo.default.svc.cluster.local mongo-1.mongo.default.svc.cluster.local mongo-2.mongo.default.svc.cluster.local 同時,可以查看每個mongo實例各自的角色(PRIMARY或SECONDARY)。1 [root@k8smaster01 mongo]# kubectl exec -ti mongo-0 -- mongo 2 …… 3 rs0:PRIMARY> rs.status()
四 集群常見管理
4.1 MongoDB擴容
運行環境過程中,若3個mongo實例不足以滿足業務的要求,可對mongo集群進行擴容。僅需要通過對StatefulSet進行scale操作,從而實現在mongo集群中自動添加新的mongo節點。1 [root@k8smaster01 ~]# kubectl scale statefulset mongo --replicas=4 #擴容為4個 2 [root@k8smaster01 ~]# kubectl get pod -l role=mongo 3 NAME READY STATUS RESTARTS AGE 4 mongo-0 2/2 Running 0 105m 5 mongo-1 2/2 Running 0 103m 6 mongo-2 2/2 Running 0 101m 7 mongo-3 2/2 Running 0 50m
4.2 查看集群成員
1 [root@k8smaster01 mongo]# kubectl exec -ti mongo-0 -- mongo 2 …… 3 rs0:PRIMARY> rs.status() 4 ……
4.3 故障自動恢復
若在系統運行過程中,某個mongo實例或其所在主機發生故障,則StatefulSet將會自動重建該mongo實例,並保證其身份(ID)和使用的數據(PVC) 不變。以下為mongo-0實例發生故障進行模擬,StatefulSet將會自動重建mongo-0實例,併為其掛載之前分配的PVC“mongo-persistent-storage-mongo-0”。新的服務“mongo-0”在重新啟動後,原資料庫中的數據不會丟失,可繼續使用。1 [root@k8smaster01 ~]# kubectl get pvc 2 [root@k8smaster01 ~]# kubectl delete pod mongo-0 3 [root@k8smaster01 mongo]# kubectl exec -ti mongo-0 -- mongo 4 …… 5 rs0:PRIMARY> rs.status() 6 ……提示:進入某個實例查看mongo集群的狀態,mongo-0發生故障前在集群中的角色為PRIMARY,在其脫離集群後,mongo集群會自動選出一個SECONDARY節點提升為PRIMARY節點(本例中為mongo-2)。重啟後的mongo-0則會成為一個新的SECONDARY節點。