Goal:
This article explains how to use nodeSelector to constrain POD csi-controller-kdf-0 to only be able to run on particular Node(s).Env:
MapR 6.1 (secured)MapR CSI 1.0.0
Kubernetes Cluster in GKE
Use case:
For MapR CSI, we want the POD from StatefulSet "csi-controller-kdf" to only run on specific node(s).Solution:
1. List current nodes from Kubernetes cluster
$ kubectl get nodes NAME STATUS ROLES AGE VERSION gke-standard-cluster-1-default-pool-f6e6e4c1-45ql Ready <none> 22m v1.13.11-gke.14 gke-standard-cluster-1-default-pool-f6e6e4c1-fbhp Ready <none> 22m v1.13.11-gke.14 gke-standard-cluster-1-default-pool-f6e6e4c1-hzh5 Ready <none> 22m v1.13.11-gke.14 gke-standard-cluster-1-default-pool-f6e6e4c1-r20n Ready <none> 22m v1.13.11-gke.14 gke-standard-cluster-1-default-pool-f6e6e4c1-xr3s Ready <none> 22m v1.13.11-gke.14
For example, we want the POD from StatefulSet "csi-controller-kdf" to only run on node "gke-standard-cluster-1-default-pool-f6e6e4c1-hzh5".
2. Attach a label to this node
kubectl label nodes gke-standard-cluster-1-default-pool-f6e6e4c1-hzh5 for-csi-controller=trueHere the label key is "for-csi-controller" and the label value is "true".
Verify that the label is attached on that node:
$ kubectl get nodes -l for-csi-controller=true NAME STATUS ROLES AGE VERSION gke-standard-cluster-1-default-pool-f6e6e4c1-hzh5 Ready <none> 34m v1.13.11-gke.14
3. Modify csi-maprkdf-v1.0.0.yaml
cp csi-maprkdf-v1.0.0.yaml csi-maprkdf-v1.0.0_modified.yaml vi csi-maprkdf-v1.0.0_modified.yamlAdd below to the bottom of the definiton for StatefulSet "csi-controller-kdf"
nodeSelector:
for-csi-controller: "true"
One full example for StatefulSet "csi-controller-kdf" is:kind: StatefulSet
apiVersion: apps/v1beta1
metadata:
name: csi-controller-kdf
namespace: mapr-csi
spec:
serviceName: "kdf-provisioner-svc"
replicas: 1
template:
metadata:
labels:
app: csi-controller-kdf
spec:
serviceAccount: csi-controller-sa
containers:
- name: csi-attacher
image: quay.io/k8scsi/csi-attacher:v1.0.1
args:
- "--v=5"
- "--csi-address=$(ADDRESS)"
env:
- name: ADDRESS
value: /var/lib/csi/sockets/pluginproxy/csi.sock
imagePullPolicy: "Always"
volumeMounts:
- name: socket-dir
mountPath: /var/lib/csi/sockets/pluginproxy/
- name: csi-provisioner
image: quay.io/k8scsi/csi-provisioner:v1.0.1
args:
- "--provisioner=com.mapr.csi-kdf"
- "--csi-address=$(ADDRESS)"
- "--volume-name-prefix=mapr-pv"
- "--v=5"
env:
- name: ADDRESS
value: /var/lib/csi/sockets/pluginproxy/csi.sock
imagePullPolicy: "Always"
volumeMounts:
- name: socket-dir
mountPath: /var/lib/csi/sockets/pluginproxy/
- name: csi-snapshotter
image: quay.io/k8scsi/csi-snapshotter:v1.0.1
imagePullPolicy: "Always"
args:
- "--snapshotter=com.mapr.csi-kdf"
- "--csi-address=$(ADDRESS)"
- "--snapshot-name-prefix=mapr-snapshot"
- "--v=5"
env:
- name: ADDRESS
value: /var/lib/csi/sockets/pluginproxy/csi.sock
volumeMounts:
- name: socket-dir
mountPath: /var/lib/csi/sockets/pluginproxy/
- name: liveness-probe
image: quay.io/k8scsi/livenessprobe:v1.0.1
imagePullPolicy: "Always"
args:
- "--v=5"
- "--csi-address=$(ADDRESS)"
- "--connection-timeout=60s"
- "--health-port=9809"
env:
- name: ADDRESS
value: /var/lib/csi/sockets/pluginproxy/csi.sock
volumeMounts:
- name: socket-dir
mountPath: /var/lib/csi/sockets/pluginproxy/
- name: mapr-kdfprovisioner
image: maprtech/csi-kdfprovisioner:1.0.0
imagePullPolicy: "Always"
args :
- "--nodeid=$(NODE_ID)"
- "--endpoint=$(CSI_ENDPOINT)"
- "-v=5"
env:
- name: NODE_ID
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: CSI_ENDPOINT
value: unix://plugin/csi.sock
ports:
- containerPort: 9809
name: healthz
protocol: TCP
livenessProbe:
failureThreshold: 20
httpGet:
path: /healthz
port: healthz
initialDelaySeconds: 10
timeoutSeconds: 3
periodSeconds: 5
volumeMounts:
- name: socket-dir
mountPath: /plugin
- name: k8s-log-dir
mountPath: /var/log/csi-maprkdf
- name: timezone
mountPath: /etc/localtime
readOnly: true
volumes:
- name: socket-dir
emptyDir: {}
- name: k8s-log-dir
hostPath:
path: /var/log/csi-maprkdf
type: DirectoryOrCreate
- name: timezone
hostPath:
path: /etc/localtime
nodeSelector:
for-csi-controller: "true"
4. Create StatefulSet "csi-controller-kdf" using the modified version when configuring MapR CSI
kubectl apply -f csi-maprkdf-v1.0.0_modified.yamlOther steps to configure MapR CSI are the same as this blog.
5. Verify that POD "csi-controller-kdf-0" is running on that specific node
$ kubectl get pods -n mapr-csi -o wide |grep csi-controller-kdf-0 csi-controller-kdf-0 5/5 Running 0 56m xx.xx.xx.4 gke-standard-cluster-1-default-pool-f6e6e4c1-hzh5 <none> <none>
Disaster Recovery Test:
1. Drain this specific node and evict all the PODs except those for DaemonSets.
$ kubectl drain gke-standard-cluster-1-default-pool-f6e6e4c1-hzh5 --ignore-daemonsets --delete-local-data node/gke-standard-cluster-1-default-pool-f6e6e4c1-hzh5 already cordoned WARNING: ignoring DaemonSet-managed Pods: kube-system/fluentd-gcp-v3.2.0-hzrq7, kube-system/prometheus-to-sd-jxhrm, mapr-csi/csi-nodeplugin-kdf-ssbxp evicting pod "csi-controller-kdf-0" evicting pod "kube-dns-79868f54c5-rggws" pod/csi-controller-kdf-0 evicted pod/kube-dns-79868f54c5-rggws evicted node/gke-standard-cluster-1-default-pool-f6e6e4c1-hzh5 evicted
2. Check if the POD "csi-controller-kdf-0" will be rescheduled on other nodes or not.
$ kubectl get pods --all-namespaces -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ... mapr-csi csi-controller-kdf-0 0/5 Pending 0 16m <none> <none> <none> <none> ...As we can see, the POD "csi-controller-kdf-0" will be pending and can not be rescheduled on other nodes.
This proves that the label is working.
3. Mark the specific node available again
kubectl uncordon gke-standard-cluster-1-default-pool-f6e6e4c1-hzh5
4. Verify that POD "csi-controller-kdf-0" is running on the specific node again
$ kubectl get pods --all-namespaces -o wide |grep -i csi-controller-kdf-0 mapr-csi csi-controller-kdf-0 5/5 Running 0 17m xx.xx.xx.5 gke-standard-cluster-1-default-pool-f6e6e4c1-hzh5 <none> <none>
5. Verify the mount point is working in the test POD
$ kubectl exec -ti testpod -n testns -- ls -altr /mapr total 6 drwxrwxrwt 3 5000 5000 1 Nov 25 11:17 kafka-streams drwxrwxrwt 3 5000 5000 1 Nov 25 11:18 ksql drwxrwxrwx 3 5000 5000 2 Dec 6 12:38 spark drwxr-xr-x 1 root root 4096 Dec 12 22:11 .. drwxr-xr-x 5 5000 5000 3 Dec 12 23:45 .
ReplyDeleteSosyal medya hesaplarınızı büyütmek ve daha fazla kişiye ulaşmak için güvenilir bir smm panel kullanmanız oldukça faydalı olabilir. Bu panel sayesinde hızlı ve etkili sosyal medya hizmetleri alarak dijital varlığınızı güçlendirebilirsiniz. Güvenilirlik ve kalite açısından tercih edilebilecek olan smm panel ile zaman kazanabilirsiniz. Bu sayede organik ve hızlı büyüme sağlayabilirsiniz.