文檔說明
實驗環境:kubernetes Version v1.9.6
網絡CNI:fannel
本地卷:
更好的利用本地高性能介質(SSD,Flash)提升數據庫服務能力 QPS/TPS
更閉環的運維成本,現在越來越多的數據庫支持基于Replicated的技術實現數據多副本和數據一致性(比如MySQL Group Replication / MariaDB Galera Cluster / Percona XtraDB Cluster的),DBA可以處理所有問題,而不在依賴存儲工程師或者SA的支持。
為了使用本地存儲需要啟動FeatureGate:PersistentLocalVolumes支持本地存儲,1.9是alpha版本,1.10是beta版,默認開啟, v1.9版本需要api-server, controller-manager, scheduler, and all kubelets 開啟 feature-gates的功能
--feature-gates=PersistentLocalVolumes=true
--VolumeScheduling=true
--MountPropagation=true
實戰示例:
一、創建PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
annotations:
"volume.alpha.kubernetes.io/node-affinity": '{
"requiredDuringSchedulingIgnoredDuringExecution": {
"nodeSelectorTerms": [
{ "matchExpressions": [
{ "key": "kubernetes.io/hostname",
"operator": "In",
"values": ["k8s-node1-product"]
}
]}
]}
}'
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
二、創建Storage Class
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
三、創建Statefulset
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: local-test
spec:
serviceName: "local-service"
replicas: 1
template:
metadata:
labels:
app: local-test
spec:
containers:
- name: test-container
image: [gcr.io/google_containers/busybox:1.24]
command:
- "/bin/sh"
args:
- "-c"
- "count=0; count_file=\"/usr/test-pod/count\"; test_file=\"/usr/test-pod/test_file\"; if [ -e $count_file ]; then count=$(cat $count_file); fi; echo $((count+1)) > $count_file; while [ 1 ]; do date >> $test_file; echo \"This is $MY_POD_NAME, count=$(cat $count_file)\" >> $test_file; sleep 10; done"
volumeMounts:
- name: local-vol
mountPath: /usr/test-pod
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
securityContext:
fsGroup: 1234
volumeClaimTemplates:
- metadata:
annotations:
volume.alpha.kubernetes.io/storage-class: local-storage
name: local-vol
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "local-storage"
resources:
requests:
storage: 10Gi
該Statefulset的Pod將會調度到k8s-node1-product,并使用本地存儲“local-pv”
“PersistentLocalVolumes”和“VolumeScheduling”的局限
使用局限需要考慮:
具體部署時,針對PersistentLocalVolumes 只能應用在特定的有狀態服務的場景下
- 資源利用率降低。一旦本地存儲使用完,即使CPU、Memory剩余再多,該節點也無法提供服務;
- 需要做好本地存儲規劃,譬如每個節點Volume的數量、容量等,就像原來使用存儲時需要把LUN規劃好一樣,在一個大規模運行的環境,存在落地難度。
高可用風險需要考慮:
當Pod調度到某個節點后,將會跟該節點產生親和,一旦Node發生故障,Pod不能調度到其他節點,只能等待該節點恢復,你能做的就是等待“Node恢復”,如果部署3節點MySQL集群,再掛一個Node,集群將無法提供服務,你能做的還是“等待Node恢復”。這么設計也是合理的,社區認為該Node為Stateful節點,Pod被調度到其他可用Node會導致數據丟失
最后,借用Google工程師Kelsey Hightower的一句話:
“We very receptive this Kubernetes can’t be everything to everyone.”
參考文檔:
http://dockone.io/article/5260
https://blog.zhoulouzi.com/2018/03/kubernetes-local/
https://www.kubernetes.org.cn/2280.html?tdsourcetag=s_pctim_aiomsg
https://kubernetes.io/docs/concepts/storage/volumes/#local