问题描述
我有一个部署应用程序的舵图,但还需要重新配置一些 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"
解决方法
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 都将无法启动.