我正在尝试在Kubernetes Kind集群中部署一个容器。我要部署的容器需要设置几个sysctls标志。
部署失败,并显示
forbidden sysctl: "kernel.msgmnb" not whitelisted
更新
此后,我按照建议添加了群集策略,创建了一个授予使用权限的角色,并将群集角色分配给了默认服务帐户:
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: sysctl-psp
spec:
privileged: false # Don't allow privileged pods!
# The rest fills in some required fields.
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
allowedUnsafeSysctls:
- kernel.msg*
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: role_allow_sysctl
rules:
- apiGroups: ['policy']
resources: ['podsecuritypolicies']
verbs: ['*']
resourceNames:
- sysctl-psp
- apiGroups: ['']
resources:
- replicasets
- services
- pods
verbs: ['*']
- apiGroups: ['apps']
resources:
- deployments
verbs: ['*']
集群角色绑定是这样的:
kubectl -n <namespace> create rolebinding default:role_allow_sysctl --clusterrole=role_allow_sysctl --serviceaccount=<namespace>:default
然后,我试图在同一名称空间中创建部署和服务:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-app
labels:
app: test-app
spec:
selector:
matchLabels:
app: test-app
tier: dev
strategy:
type: Recreate
template:
metadata:
labels:
app: test-app
tier: dev
spec:
securityContext:
sysctls:
- name: kernel.msgmnb
value: "6553600"
- name: kernel.msgmax
value: "1048800"
- name: kernel.msgmni
value: "32768"
- name: kernel.sem
value: "128 32768 128 4096"
containers:
- image: registry:5000/<container>:1.0.0
name: test-app
imagePullPolicy: IfNotPresent
ports:
- containerPort: 10666
name:port-1
---
问题仍然存在,但是,我生成了多个Pod,但都失败,并显示相同的消息forbidden sysctl: "kernel.msgmnb" not whitelisted
答案 0 :(得分:1)
在您的用例中需要做的是Setting Sysctls for a Pod:
使用pod securityContext配置命名空间的sysctls。的 securityContext适用于同一容器中的所有容器。
在上面的文档中,您将找到必要的详细信息以及如何配置Pod的securityContext的示例。
还请记住:
警告:如果您通过allowedUnsafeSysctls将不安全的系统列入白名单 在PodSecurityPolicy中的字段中,使用此类sysctl的任何Pod均无法 如果sysctl未通过列入白名单,则开始 该节点上的
--allowed-unsafe-sysctls
kubelet标志也是如此。
请告诉我是否有帮助。
答案 1 :(得分:1)
我认为--alowed-unsafe-sysctls
标志不适用于Kind节点,因为Kind节点本身是容器,其sysctl FS是只读的。
我的解决方法是在主机上更改所需的sysctl值。同类节点(进而是它们的容器)将重用这些值。