如何从GKE执行kubelet

时间:2018-07-25 12:54:35

标签: google-kubernetes-engine

在我的Kubernetes集群中,当我尝试打开吊舱时,我看到以下错误:

Pod forbidden sysctl: “***” not whitelisted

从文档中,我需要运行kubelet --experimental-allowed-unsafe-sysctls:***

我正在Google Kubernetes Engine中运行,那么如何运行它?我已经尝试过使用控制台,但是看不到如何运行此命令。

1 个答案:

答案 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进行此操作:

Dockerfile sysctl-change

FROM alpine
CMD sysctl -w [<ctl name> operation]  ; sleep 365d

DaemonSet资源文件

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