K8S 使用NFS存储 动态创建 PVC/PV
1、创建
vim statefulset-nginx.yaml
# 内容
apiVersion: v1
kind: Service
metadata:
name: nginx-headless-svc
spec:
ports:
- protocol: TCP
port: 80
clusterIP: None
selector:
app: nginx-headless
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-headless
spec:
selector:
matchLabels:
app: nginx-headless
serviceName: nginx-headless-svc
replicas: 2
template:
metadata:
labels:
app: nginx-headless
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: "/usr/share/nginx/html"
volumeClaimTemplates:
- metadata:
name: html
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "nfs-storage"
resources:
requests:
storage: 1Gi
2、查看 PVC,自动创建 2个 PVC,并绑定到下面创建的 PV,名称是 volumeClaimTemplates + StatefulSet + -{0...N} 的 Name 组合
kubectl get pvc
# 显示
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
html-nginx-headless-0 Bound pvc-50c169b5-f546-49b3-95d5-6ad364a57546 1Gi RWO nfs-storage 11s
html-nginx-headless-1 Bound pvc-321fba4e-0cf2-4422-a3ff-0022c3acbe5f 1Gi RWO nfs-storage 5s
3、查看 PV,自动创建 2 个 PV
kubectl get pv
# 显示
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-321fba4e-0cf2-4422-a3ff-0022c3acbe5f 1Gi RWO Delete Bound default/html-nginx-headless-1 nfs-storage 96s
pvc-50c169b5-f546-49b3-95d5-6ad364a57546 1Gi RWO Delete Bound default/html-nginx-headless-0 nfs-storage 102s
4、查看 SVC, 这是一个无头服务,Cluster-IP 为 None
kubectl get svc -o wide
# 显示
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx-headless-svc ClusterIP None <none> 80/TCP 8m44s app=nginx-headless
5、访问
# 进入 NFS 服务器创建数据
echo "hello,nginx-headless-0" > /nfsdata/default-html-nginx-headless-0-pvc-50c169b5-f546-49b3-95d5-6ad364a57546/index.html
echo "hello,nginx-headless-1" > /nfsdata/default-html-nginx-headless-1-pvc-321fba4e-0cf2-4422-a3ff-0022c3acbe5f/index.html
# 创建一个 POD 访问集群
kubectl run busybox --image=busybox -it
# 访问集群内的指定 POD, 服务之间通过 podname + headless service name 进行通信
wget -q -O- nginx-headless-0.nginx-headless-svc
# 成功
hello,nginx-headless-0
# 也可以直接通过 SVC 名访问
wget -q -O- nginx-headless-svc
# 这时会随机显示
/ # wget -q -O- nginx-headless-svc
hello,nginx-headless-1
/ # wget -q -O- nginx-headless-svc
hello,nginx-headless-0