前面的實驗,咱們經過Deployment+PV/PVC,部署了mysql,wordpress,並經過NodePort類型的Service對服務進行暴露,使集羣外能夠訪問,可是當replicas大於1時,Deployment產生的多個POD是共享一個PV的,這樣在性能及業務上都有多是有問題的,這種狀況咱們就應該考慮StatefulSet,在官網上StatefulSet用了Mysql的主從做爲例子,可是筆者認爲Mysql主從自己與Mysql的知識有關,而且例子更偏向於實踐拓撲結構的有狀態服務,因此後面的實驗,我基於目前比較流行,也比較簡單的監控系統Grafana+Prometheus來進行實驗。java
使用StatefulSet部署grafana,使用PV & PVC持久化保存數據。 本文實驗全部的源碼保存在: github.com/zrbcool/blo…node
✗ kubectl apply -f 01-1-grafana-pvc.yaml
persistentvolumeclaim/grafana-pv-claim created
✗ mkdir -p /data/pv/grafana
✗ kubectl apply -f 01-2-grafana-pv.yaml
persistentvolume/grafana-pv-volume created
✗ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
grafana-pv-claim Bound grafana-pv-volume 2Gi RWX 24m
複製代碼
若是此處不明白或者有問題,請參考前面講過的K8S本身動手系列 - 2.3 - PV & PVCmysql
✗ kubectl apply -f 01-3-grafana-statefulset.yaml
statefulset.apps/monitor-grafana created
✗ kubectl get pods
NAME READY STATUS RESTARTS AGE
monitor-grafana-0 0/1 CrashLoopBackOff 3 2m2s
✗ kubectl logs monitor-grafana-0
GF_PATHS_DATA='/var/lib/grafana' is not writable.
You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later
mkdir: cannot create directory '/var/lib/grafana/plugins': Permission denied
複製代碼
啓動失敗了,提示也很清楚是權限問題,也給瞭解決方案git
# 參考文章 http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later
# 修改文件權限
✗ chown -R 472:472 /data/pv/grafana
# 增長POD配置(咱們的01-3-grafana-statefulset.yaml已經加好了)
securityContext:
runAsGroup: 472
runAsUser: 472
fsGroup: 472
複製代碼
執行上述操做後仍然是不行,最後通過排查發現,POD被調度到worker02節點上了,由於咱們的PV使用的Local類型,worker02上並無這個目錄,因此沒法建立成功,參考前面的K8S本身動手系列 - 1.3 - Taint & Affinity增長nodeSelector指定節點調度github
...
template:
metadata:
labels:
app: monitor
type: grafana
spec:
nodeSelector:
kubernetes.io/hostname: worker01 #這個請根據須要修改到你指定的節點上,或者你使用其餘的持久化存儲方式,則可能沒有我這個問題,好比nfs
複製代碼
成功!sql
✗ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
monitor-grafana-0 1/1 Running 0 3m19s 10.244.0.93 worker01 <none> <none>
複製代碼
最後生效的yaml文件以下:docker
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: monitor
type: grafana
name: monitor-grafana
spec:
replicas: 1
selector:
matchLabels:
app: monitor
type: grafana
serviceName: grafana
template:
metadata:
labels:
app: monitor
type: grafana
spec:
nodeSelector:
kubernetes.io/hostname: worker01 #保證調度到咱們建立了本地目錄的主機上
containers:
- name: grafana
image: grafana/grafana:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
name: grafana
volumeMounts:
- name: grafana-pv-storage
mountPath: /var/lib/grafana
securityContext:
runAsGroup: 472
runAsUser: 472
fsGroup: 472
volumes:
- name: grafana-pv-storage
persistentVolumeClaim:
claimName: grafana-pv-claim
複製代碼
✗ kubectl apply -f 01-4-grafana-svc.yaml
service/grafana-svc created
複製代碼
若是這塊有疑問,能夠回顧K8S本身動手系列 - 2.4 - Service 如今咱們的grafana能夠訪問了,如圖所示: shell