在我的Kubernetes集群中,当我尝试打开吊舱时,我看到以下错误:
Pod forbidden sysctl: “***” not whitelisted
从文档中,我需要运行kubelet --experimental-allowed-unsafe-sysctls:***
。
我正在Google Kubernetes Engine中运行,那么如何运行它?我已经尝试过使用控制台,但是看不到如何运行此命令。
答案 0 :(得分:2)
security.alpha.kubernetes.io/sysctls字段仅允许在cgroup命名空间内运行的sysctls,因此更改设置不会影响不相关的Pod。
正如您所建议的那样,Kubernetes k8s的默认解决方案是在kubelet启动中添加--experimental-allowed-unsafe-sysctls
标志,但是在 GKE 中无法添加kubelet标志,因为它们不是可访问的。
您可以通过修改其中一个节点上的/ etc / default / kubelet文件以包含实验性标志,然后尝试向其添加Pod来解决此问题。但是,这只能作为临时解决方法,因为它将被主服务器覆盖。即使您编辑kubelet文件,主服务器也会在一段时间后恢复默认配置设置。
在 GKE 中无法覆盖此行为,但是有一些解决方法。您可以选择以下两种解决方案之一。请注意,您必须将<ctl name>
替换为您要访问的sysctl pod。
解决方案:
1)第一种选择是将特权授予容器为可读写状态,然后在底部添加命令行sysctl -w [<ctl name> operation]
。
pod yaml文件如下所示:
kind: Pod
metadata:
name: sample
labels:
app: gpdb
spec:
hostname: sample
containers:
- name: gpdb
image: ubuntu
securityContext:
privileged: true
command:
- /bin/sh
- -c
- |
sysctl -w [<ctl name> operation] && sleep 5000
2)第二个选项是创建一个DaemonSet,它可以手动运行sysctl命令。您可以通过以下方式对DockerFile进行此操作:
sysctl-change
FROM alpine
CMD sysctl -w [<ctl name> operation] ; sleep 365d
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: sysctl-change
spec:
template:
metadata:
labels:
name: sysctl-change
spec:
containers:
- name: sysctl-change
image: sysctl-change # remember to set this correctly. It is the Docker image
securityContext:
privileged: true
restartPolicy: Always
nodeSelector: # update this appropriately to the nodes
pool: elasticsearch
在上面的示例中,请确保将nodeSelector设置为适当的值(要设置sysctl的所有节点),并且映像名称正确。
有关此问题的更多讨论,您可以查看following StackOverflow page。