Wiki

Kubernetes Patterns

Run-once DaemonSet Pattern

Some Kubernetes providers, such as GKE and AKS, do not support custom node images. The run-once DaemonSet pattern is useful to prime worker nodes for security hardening or image prefetch. Regular DaemonSet does not work since they restart the Pod when the setup task is done. We want the DaemonSet to run once.

We can do so by running the setup script in the init container, and run the pause container afterwards, which consumes little resources.

Below is an example of run-once DaemonSet to implement the GKE CIS benchmark recommendation of enalbing --protect-kernel-defaults on the kubelet.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: cis-protect-kernel-defaults
  namespace: kube-system
  labels:
    app: protect-kernel-defaults
spec:
  selector:
    matchLabels:
      name: protect-kernel-defaults
  template:
    metadata:
      labels:
        name: protect-kernel-defaults
    spec:
      hostNetwork: true
      hostPID: true
      hostIPC: true
      volumes:
        - name: root-mount
          hostPath:
            path: /

      initContainers:
        - image: alpine:3.18
          name: protect-kernel-defaults
          command: ["/bin/sh", "-c"]
          # The advantage of args over mounting a configmap is that
          # when the script is updated, kubernetes will rolling
          # update Pods.
          # By using chroot, you can run commands as if you were
          # executing them directly on the node, not just inside
          # a container.
          args:
            - |
              ROOT_MOUNT_DIR="/node_root"
              KUBELET_CONFIG_FILE="/home/kubernetes/kubelet-config.yaml"
              WANT_SETTING="protectKernelDefaults: true"

              echo "Current kubelet config:"
              cat "${ROOT_MOUNT_DIR}/${KUBELET_CONFIG_FILE}"

              # This check ensures `protectKernelDefaults' is defined once.
              # It is invalid YAML to have duplicated keys.
              found=$(grep "${WANT_SETTING}" "${ROOT_MOUNT_DIR}/${KUBELET_CONFIG_FILE}")
              if [[ ! -z "${found}" ]]; then
                echo "protectKernelDefaults is already set to true. Done."
                exit 0
              fi

              echo "Updating kubelet config file."
              echo "${WANT_SETTING}" >> "${ROOT_MOUNT_DIR}/${KUBELET_CONFIG_FILE}"

              echo "Restarting kubelet."
              chroot "${ROOT_MOUNT_DIR}" systemctl restart kubelet

              echo "Done."
          securityContext:
            privileged: true
          volumeMounts:
            - name: root-mount
              mountPath: /node_root

      containers:
        - name: pause
          image: gcr.io/google_containers/pause:3.2

Best practices

See How to Configure Applications for High Availability in Kubernetes