This post uses a statefulset to deploy nginx with pvc and load balancer services into a Kubernetes cluster running in VMware Cloud Director enabled with Container Service Extension.
VCD has a cloud provider named vmware-cloud-director-ccm-0 and a CSI provider named csi-vcd-controllerplugin-0.
If you sent the following command to a Kubernetes cluster
kubectl get po -n kube-system
You would see output like this
csi-vcd-controllerplugin-0 3/3 Running 0 11h csi-vcd-nodeplugin-lh2gs 2/2 Running 0 13h vmware-cloud-director-ccm-99fd59464-79z8r 1/1 Running 0 11h
Contents of web-statefulset.yaml, available on my GitHub here.
apiVersion: v1 kind: Service metadata: name: nginx-service namespace: web-statefulset spec: selector: app: nginx ports: - port: 80 targetPort: 80 type: LoadBalancer --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web-statefulset namespace: web-statefulset spec: selector: matchLabels: app: nginx serviceName: "nginx-service" replicas: 1 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: k8s.gcr.io/nginx-slim:0.8 ports: - containerPort: 80 name: nginx volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "vcd-disk-dev" resources: requests: storage: 1Gi
Lets deploy into a new namespace, for that we create a new namespace first.
kubectl create ns web-statefulset
Deploy the statefulset with the following command
kubectl apply -f web-statefulset.yaml
You’ll see named disks and ingress services create in VCD and Avi respectively.
If you tried to access the nginx webpage using the service IP address, you wouldn’t see any web page, although the connection is working. This is because the nginx app using the /usr/share/nginx/html mount point to an empty PVC. We need to copy a basic index.html into that directory to get a webpage.
We can do that by logging into the pod and downloading a sample index.html for nginx.
kubectl exec -it web-statefulset-0 -n web-statefulset -- bash
curl https://raw.githubusercontent.com/hugopow/cse/main/index.html -o /usr/share/nginx/html/index.html
Now when you connect to the external IP you would get a very simple webpage.
The index.html file is stored on /usr/share/nginx/html/index.html, which is mounted to /sdb1 backed by the PVC.