将 helm chart 的 sysctl 参数列入白名单

时间:2021-02-01 18:00:44

标签: kubernetes kubernetes-helm sysctl

我有一个部署应用程序的舵图,但还需要重新配置一些 sysctl 参数才能正常运行。当我安装 helm chart 并在已部署的 pod 上运行 kubectl describe pod/pod_name 时,我得到 forbidden sysctl: "kernel.sem" not whitelisted。我已经添加了一个像这样的 podsecuritypolicy 但没有这样的运气。

apiVersion:policy/v1beta1
kind:PodSecurityPolicy
metadata:
 name: policy
spec:
  allowedUnsafeSysctls:
    - kernel.sem
    - kernel.shmmax
    - kernel.shmall
    - fs.mqueue.msg_max
 seLinux:
   rule: 'RunAsAny'
 runAsUser:
   rule: 'RunAsAny'
 supplementalGroups:
   rule: 'RunAsAny'
 fsGroup:
   rule:'RunAsAny'

---更新--- 我还尝试通过配置文件设置 kubelet 参数以允许不安全的 ctls,但我收到一个错误,没有为版本“kubelet.config.k8s.io/v1beta1”注册“KubeletConfiguration”。 这是配置文件:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
allowedUnsafeSysctls:
 - "kernel.sem"
 - "kernel.shmmax"
 - "kernel.shmall"
 - "fs.mqueue.msg_max"
   

1 个答案:

答案 0 :(得分:0)

kernel.sem sysctl 被视为不安全 sysctl,因此默认情况下被禁用(默认情况下仅启用安全 sysctl)。您可以在逐个节点的基础上允许一个或多个不安全 sysctl,为此您需要将 --allowed-unsafe-sysctls 标志添加到 kubelet
看看"Enabling Unsafe Sysctls"


我创建了一个简单的示例来向您说明它是如何工作的。

首先,我在 --allowed-unsafe-sysctls 中添加了 kubelet 标志。
就我而言,我使用 kubeadm,因此我需要将此标志添加到 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 文件:

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --allowed-unsafe-sysctls=kernel.sem"
...

注意:您必须在每个节点上添加此标志,以便在启用 kernel.sem 的情况下运行 Pod。

然后我重新加载了 systemd 管理器配置并使用以下命令重新启动了 kubelet

# systemctl daemon-reload && systemctl restart kubelet

接下来我使用这个清单文件创建了一个简单的 Pod

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: web
  name: web
spec:
  securityContext:
    sysctls:
    - name: kernel.sem
      value: "250 32000 100 128"
  containers:
  - image: nginx
    name: web

最后我们可以检查它是否正常工作:

# sysctl -a | grep "kernel.sem"
kernel.sem = 32000      1024000000      500     32000 // on the worker node
# kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
web    1/1     Running   0          110s
# kubectl exec -it web -- bash
root@web:/# cat /proc/sys/kernel/sem
250     32000   100     128 // inside the Pod

您的 PodSecurityPolicy 没有按预期工作,因为正如您在 documentation 中看到的那样:

<块引用>

警告:如果您通过 PodSecurityPolicy 中的 allowedUnsafeSysctls 字段允许不安全的 sysctl,如果该节点上的 --allowed-unsafe-sysctls kubelet 标志也不允许使用 sysctl,则任何使用此类 sysctl 的 pod 都将无法启动.