【问题标题】:Changing restricted fields of templates in kubernetes and openshift更改 kubernetes 和 openshift 中模板的受限字段
【发布时间】:2020-03-07 00:12:40
【问题描述】:

我正在使用 openshift 游乐场。我部署了一个示例应用程序,并为 pod 导出了 yaml。 在尝试编辑某些字段时,我遇到了此消息 Forbidden: unsafe sysctl "kernel.msgmax" is not allowed

搜索链接https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/#listing-all-sysctl-parameters 描述了一些参数如何被标记为不安全且无法更改但安全的参数可以

但即使是安全的 sysctls 也会抛出错误,

spec: Forbidden: pod updates may not change fields other than spec.containers[*].image, spec.initContainers[*].image, spec.activeDeadlineSeconds or spec.tolerations
  1. 是操场环境限制了内核参数的更改吗?我是否需要安装自己的 minikube 才能更改不安全的 sysctl 参数?
  2. 除了为编辑/启用不安全的 sysctls 提供的 minikube/kubelet 替代方案之外,还有其他方法吗?为 pod 自定义内核参数的好方法是什么?

【问题讨论】:

    标签: kubernetes openshift


    【解决方案1】:

    引发该错误的安全 sysctls 是预期行为。您需要做的是在将编辑后的 ​​yaml 应用到集群之前删除 pod。如果您直接使用部署而不是 pod,也可以避免此错误。

    【讨论】:

      【解决方案2】:

      请仔细阅读this 文档部分。一切都清楚地解释在那里。

      至于设置Unsafe Sysctls,需要额外在节点级别启用:

      默认启用所有安全 sysctl。

      所有不安全 sysctl 默认是禁用的,必须允许 由集群管理员在每个节点的基础上手动进行。已禁用的 Pod 将安排不安全的 sysctl,但无法启动。

      考虑到上述警告,集群管理员可以允许某些 unsafe sysctl 用于非常特殊的情况,例如高性能或实时应用程序调整。 不安全 sysctl 在一个 带有 kubelet 标志的逐节点基础;例如:

      kubelet --allowed-unsafe-sysctls \
        'kernel.msg*,net.core.somaxconn' ...
      

      对于 Minikube,这可以通过 extra-config 标志来完成:

      minikube start --extra-config="kubelet.allowed-unsafe-sysctls=kernel.msg*,net.core.somaxconn"...
      

      只有 namespaced sysctl 可以通过这种方式启用。

      至于……

      但即使是安全的 sysctls 也会抛出错误,

      spec: Forbidden: pod updates may not change fields other than spec.containers[*].image, spec.initContainers[*].image, spec.activeDeadlineSeconds or spec.tolerations
      

      这是完全不同的错误消息,它与更改 Pod 定义中的 sysctls 相关的限制无关。请注意,您不能通过kubectl edit 更改大部分Pod 规范,除了上面消息中列出的一些例外情况。具体来说,如果不重新创建 Pod 就无法更改它们,因此在这种情况下,您可以简单地运行而不是编辑它:

      kubectl get pod pod-name -o yaml > my-pod.yaml
      

      然后您可以编辑所需的 Pod 规范字段,然后重新部署它:

      kubectl apply -f my-pod.yaml
      

      或者,您可以编辑您的Deployment,正如@Arghya Sadhu 在他的回答中已经建议的那样。 Deployment controller 将使用更新的规范为您重新创建 Pods


      是操场环境限制了内核的变化吗 参数?我需要自己安装 minikube 吗? 启用更改不安全的 sysctl 参数?

      不是真的。您可以通过重新配置 kubelets 在集群中的每个节点上启用它们。至于更改 kubelet 配置,可能会根据您的 kubernetes 安装而有所不同。如果它是使用 kubeadm 创建的,您只需编辑以下文件:

      /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
      

      然后运行:

      sudo systemctl daemon-reload
      

      并通过运行重新启动您的 kubelet:

      sudo systemctl restart kubelet.service
      

      除了给编辑/启用的 minikube/kubelet 替代方案 不安全的 sysctls,有不同的方法吗?有什么好方法 自定义 pod 的内核参数?

      上面已经回答了。

      我希望它能澄清您对在 Kubernetes 集群中同时设置 safeunsafe sysctl 的疑虑。

      【讨论】:

        猜你喜欢
        • 2018-12-16
        • 2018-02-05
        • 2023-03-03
        • 1970-01-01
        • 2010-12-31
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多