前面的实验,咱们经过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