Kubernete nfs storage yapılandirma
Öncelikle elimize bir nfs sunucu olmalıdır eğer mevcutta bir nfs sunucunuz var ise bu kısım ile işiniz yok
yetkilendirme işlemi için rbac kurulumunu yapmalıyız
Yetkilendirme için rbac aşağıdaki gibi bir yaml hazırlayarak ekleyebilirsiniz
--- Cluster Role tanımı yapıyoruz
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-provisioner-runner
namespace: storage
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get"]
- apiGroups: ["extensions"]
resources: ["podsecuritypolicies"]
resourceNames: ["nfs-provisioner"]
verbs: ["use"]
--- #Servis hesabına Bind işlemini yapıyoruz hesabı aşağıda oluşturacağız
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: storage
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
--- #Role tanımı yapıyoruz
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-provisioner
namespace: storage
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
--- #Bind işlemini yapıyoruz.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: storage
roleRef:
kind: Role
name: leader-locking-nfs-provisioner
apiGroup: rbac.authorization.k8s.io
aşağıdaki gibi bir yaml hazırlıyoruz bu yaml içerisinde kullanacağı disk bölümü vs kendimize göre yapılandırıyoruz
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: mynamespace-nfs
namespace: storage
provisioner: <myhost>/nfs
mountOptions:
- vers=4.1
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
namespace: storage
---
kind: Service
apiVersion: v1
metadata:
name: nfs-provisioner
namespace: storage
labels:
app: nfs-provisioner
spec:
clusterIP: <10.99.106.163> --- #bu bölümü önce boş bırakıp çalıştırdıktan sonra deployment ın aldığı ip yi buraya yazabilirsiniz.
ports:
- name: port111-tcp
port: 111
protocol: TCP
- name: port111-udp
port: 111
protocol: UDP
- name: port662-tcp
port: 662
protocol: TCP
- name: port662-udp
port: 662
protocol: UDP
- name: port875-tcp
port: 875
protocol: TCP
- name: port875-udp
port: 875
protocol: UDP
- name: port2049-tcp
port: 2049
protocol: TCP
- name: port2049-udp
port: 2049
protocol: UDP
- name: port20048-tcp
port: 20048
protocol: TCP
- name: port20048-udp
port: 20048
protocol: UDP
- name: port32803-tcp
port: 32803
protocol: TCP
- name: port32803-udp
port: 32803
protocol: UDP
selector:
app: nfs-provisioner
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-provisioner
namespace: storage
spec:
selector:
matchLabels:
app: nfs-provisioner
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-provisioner
spec:
serviceAccount: nfs-provisioner
nodeSelector:
kubernetes.io/hostname: <my-host-name>
containers:
- name: nfs-provisioner
image: quay.io/kubernetes_incubator/nfs-provisioner:v2.3.0
ports:
- name: port111-tcp
containerPort: 111
protocol: TCP
- name: port111-udp
containerPort: 111
protocol: UDP
- name: port662-tcp
containerPort: 662
protocol: TCP
- name: port662-udp
containerPort: 662
protocol: UDP
- name: port875-tcp
containerPort: 875
protocol: TCP
- name: port875-udp
containerPort: 875
protocol: UDP
- name: port2049-tcp
containerPort: 2049
protocol: TCP
- name: port2049-udp
containerPort: 2049
protocol: UDP
- name: port20048-tcp
containerPort: 20048
protocol: TCP
- name: port20048-udp
containerPort: 20048
protocol: UDP
- name: port32803-tcp
containerPort: 32803
protocol: TCP
- name: port32803-udp
containerPort: 32803
protocol: UDP
securityContext:
capabilities:
add:
- DAC_READ_SEARCH
- SYS_RESOURCE
args:
- "-provisioner=<myhost>/nfs"
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: SERVICE_NAME
value: nfs-provisioner
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
imagePullPolicy: "IfNotPresent"
volumeMounts:
- name: export-volume
mountPath: /export
volumes:
- name: export-volume
hostPath:
path: <my-data-folder> --- #fiziksel suncu üzerinde data kaydedeceğimiz path
tolerations:
- key: node.kubernetes.io/unschedulable
operator: Exists
effect: NoSchedule
Şimdi oluşturduğumuz nfs sunucuyu kubernate üzerinde diğer podların erişebilmesi için global olarak tanımlıyoruz`bunun için aşağıdaki yaml dosyasını kendimize göre düzenleyip apply etmeliyiz.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: <myhost>-nfs
provisioner: <myhost>/nfs
mountOptions:
- vers=4.1
oluşturuğumuz storage ilgili podlarda kullanmak için aşağıdaki gibi pvc oluşturup ilgili container a mount edebiliriz. bu pvc silindiğinde bütün datalarınız silinecektir. mount ederken <myapp>-storage
adı ile mount edebilrisiniz
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: <myapp>-storage
namespace: <mynamespace>
annotations:
volume.beta.kubernetes.io/storage-class: "<myhost>-nfs"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi --- ayırmak istediğimiz bölüm
Katkıları için Kazım Sarıkaya‘ya teşekkür ederim