【问题标题】:Whitelisting sysctl parameters for helm chart将 helm chart 的 sysctl 参数列入白名单
【发布时间】:2021-05-05 22:20:18
【问题描述】:

我有一个 helm chart,它部署了一个应用程序,但还需要重新配置一些 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"
   

【问题讨论】:

    标签: kubernetes kubernetes-helm sysctl


    【解决方案1】:

    kernel.sem sysctl 被认为是 unsafe sysctl,因此默认禁用(默认情况下仅启用 safe sysctl)。您可以在逐节点基础上允许一个或多个 unsafe 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 都将无法启动.

    【讨论】:

    • 是的,我尝试使用配置文件设置允许通过kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file 发生此行为,但我收到此错误:没有为版本 kubelet.config.k8s 注册任何类型的“KubeletConfiguration”。 io/v1beta1 我希望能够通过文件设置这些权限,这样如果我将掌舵图移动到另一台机器;所有配置都将包含在文件中,因此只需要做很少的事情即可使应用程序正常工作。
    • 你使用kubeadm 吗?您能否提供有关您的配置文件以及如何将此配置文件传递给kubelet 的更多信息?
    • 我已将配置文件包含在我的答案中,并使用命令kublet --config filename.yml
    • @Eddie fsq.mqueue.msg_max 不存在,请改用fs.mqueue.msg_max 并将绝对路径传递给filename.yml 配置。你使用kubeadm 还是别的什么?我需要此信息来重现您的问题。
    • 是的,我的意思是使用“fs.mqueue.msg.max”,只是一个错字。当我尝试通过运行helm install random_name name_of_chart(而不是使用 kubelet 命令)来安装 helm chart 时,我也会收到此错误。我不直接使用 Kubernetes;我正在使用 helm 创建 kubernetes 对象,因此我试图限制我必须在命令行上执行的工作量,以便 helm 图表可以正常工作,而无需直接篡改 kubernetes。
    猜你喜欢
    • 2020-06-27
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多