k8s攻略之有状态服务StatefulSet
有状态服务:比较常见的mongo复制集,redis cluster,rabbitmq cluster等等。使用StatefulSet 进行创建。
无状态服务:相互之前都是独立的,很适合用横向扩充来增加服务的资源量。通常使用Deployment、DaemonSet进行创建。很多无状态应用也通过 StatefulSet 来管理。
创建pv
root@node1:~# cat web-pv.yaml# mkdir -p /nfs_dir/{web-pv0,web-pv1}apiVersion: v1kind: PersistentVolumemetadata:name: web-pv0labels:type: web-pv0spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: my-storage-classnfs:path: /nfs_dir/web-pv0server: 10.0.1.201---apiVersion: v1kind: PersistentVolumemetadata:name: web-pv1labels:type: web-pv1spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: my-storage-classnfs:path: /nfs_dir/web-pv1server: 10.0.1.201
[root@node-1 wgw-tmp]# kubectl apply -f web-pv01.yamlpersistentvolume/web-pv0 createdpersistentvolume/web-pv1 created[root@node-1 wgw-tmp]# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv1 1Gi RWO Recycle Bound default/pvc1 nfs 20hweb-pv0 1Gi RWO Retain Available my-storage-class 10sweb-pv1 1Gi RWO Retain Available my-storage-class 10s
2、创建pvc
PVC_name = volumeClaimTemplates_name + "-" + pod_namewww-web-0 = www + "-" + web-0www-web-1 = www + "-" + web-1
:~# cat web-pvc.yamlkind: PersistentVolumeClaimapiVersion: v1metadata:name: www-web-0spec:accessModes:ReadWriteOnceresources:requests:storage: 1GistorageClassName: my-storage-classselector:matchLabels:type: web-pv0---kind: PersistentVolumeClaimapiVersion: v1metadata:name: www-web-1spec:accessModes:ReadWriteOnceresources:requests:storage: 1GistorageClassName: my-storage-classselector:matchLabels:type: web-pv1
创建pvc
[root@node-1 wgw-tmp]# kubectl apply -f web-pvc.yamlpersistentvolumeclaim/www-web-0 createdpersistentvolumeclaim/www-web-1 created[root@node-1 wgw-tmp]#[root@node-1 wgw-tmp]#[root@node-1 wgw-tmp]# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpvc-sc Pending nfs-boge 20hpvc1 Bound pv1 1Gi RWO nfs 20hwww-web-0 Bound web-pv0 1Gi RWO my-storage-class 15swww-web-1 Bound web-pv1 1Gi RWO my-storage-class 15s
3、创建Service 和 StatefulSet
:~# cat web.yamlapiVersion: v1kind: Servicemetadata:name: web-headlesslabels:app: nginxspec:ports:port: 80name: webclusterIP: Noneselector:app: nginx---apiVersion: v1kind: Servicemetadata:name: weblabels:app: nginxspec:ports:port: 80name: webselector:app: nginx---apiVersion: apps/v1kind: StatefulSetmetadata:name: webspec:selector:matchLabels:app: nginx # has to match .spec.template.metadata.labelsserviceName: "nginx"replicas: 2 # by default is 1template:metadata:labels:app: nginx # has to match .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10containers:name: nginximage: nginximagePullPolicy: IfNotPresentports:containerPort: 80name: webvolumeMounts:name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "my-storage-class"resources:requests:storage: 1Gi
kubectl apply -f web05.yamlservice/web-headless unchangedservice/web createdstatefulset.apps/web createdkubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.68.0.1 <none> 443/TCP 114dmysvc ClusterIP 10.68.164.5 <none> 80/TCP 10dnginx ClusterIP 10.68.50.26 <none> 80/TCP 7d22hweb ClusterIP 10.68.55.99 <none> 80/TCP 96sweb-headless ClusterIP None <none> 80/TCP 2m19s[root@node-1 wgw-tmp]# kubectl get statefulsets.apps -o wideNAME READY AGE CONTAINERS IMAGESweb 2/2 2m20s nginx nginx# kubectl get pod -o wideweb-0 1/1 Running 0 3m10s 172.20.139.79 10.0.1.203 <none> <none>web-1 1/1 Running 0 3m8s 172.20.139.78 10.0.1.203 <none> <none>
校验
[][][]this is web-1[]this is web-0[]this is web-0[]wgw frist comeing[]this is web-1
