【问题标题】:How to change Linux kerner parameters in Azure Kubernetes?如何更改 Azure Kubernetes 中的 Linux 内核参数?
【发布时间】:2020-07-18 12:45:34
【问题描述】:

我有一个带有 4 个节点(Linux 机器)的 Azure Kubernetes 集群。我使用 yaml 清单配置了 AKS 集群。我想更新以下内核参数:net.ipv4.tcp_fin_timeout=30, net.ipv4.ip_local_port_range=1024 65500。yaml 清单如下。如何更新 yaml 以包含我必须更改的内核参数?

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: jmeter-slaves
  labels:
    jmeter_mode: slave
spec:
  replicas: 1
  selector:
    matchLabels:
      jmeter_mode: slave
  template:
    metadata:
      labels:
        jmeter_mode: slave
    spec:
      securityContext:
        sysctls:
        - name: net.ipv4.ip_local_port_range
          value: "1024 65500"
      containers:
      - name: jmslave
        image: prabhaharanv/jmeter-slave:latest
        command: ["/jmeter/apache-jmeter-$(JMETERVERSION)/bin/jmeter-server"]
        args: ["-Dserver.rmi.ssl.keystore.file /jmeter/apache-jmeter-$(JMETERVERSION)/bin/rmi_keystore.jks","-Djava.rmi.server.hostname=$(MY_POD_IP)", "-Dserver.rmi.localport=50000", "-Dserver_port=1099"]
        resources:
          limits:
            cpu: "1"
          requests:
            cpu: "0.5"
        imagePullPolicy: Always
        ports:
        - containerPort: 1099
        - containerPort: 50000
        env:
          - name: MY_POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
          - name: JMETERVERSION
            value: "5.1.1"

---

apiVersion: v1
kind: Service
metadata:
  name: jmeter-slaves-svc
  labels:
    jmeter_mode: slave
spec:
  clusterIP: None
  ports:
    - port: 1099
      name: first
      targetPort: 1099
    - port: 50000
      name: second
      targetPort: 50000
  selector:
    jmeter_mode: slave

---

【问题讨论】:

    标签: kubernetes linux-kernel yaml azure-aks


    【解决方案1】:

    查看this 官方 kubernetes 文档部分。在您的Pod 中包含设置上述内核参数 或使用不同术语 - sysctls 所需的所有信息。

    请注意,有所谓的 safeunsafe sysctl。

    至于设置net.ipv4.ip_local_port_range=1024 65500,它被认为是安全的,您可以使用securityContext 为您的Pod 设置它,如下所示,无需重新配置kubelet 在您的节点上:

    apiVersion: v1
    kind: Pod
    metadata:
      name: sysctl-example
    spec:
      securityContext:
        sysctls:
        - name: net.ipv4.ip_local_port_range
          value: "1024 65500"
        - name: net.ipv4.tcp_fin_timeout
          value: "30"
      ...
    

    但是,如果您也尝试以这种方式设置net.ipv4.tcp_fin_timeout,您会看到很多尝试创建Pod 状态为SysctlForbidden 的失败尝试:

    kubectl get pods
    ...
    nginx-deployment-668d699fd8-zlvdm   0/1     SysctlForbidden   0          31s
    nginx-deployment-668d699fd8-ztzpr   0/1     SysctlForbidden   0          58s
    nginx-deployment-668d699fd8-zx4vq   0/1     SysctlForbidden   0          24s
    ...
    

    这是因为 net.ipv4.tcp_fin_timeout 是一个不安全的 sysctl,需要通过重新配置您的 kubelet 在节点级别明确允许它。

    要允许它,您需要编辑您的 kubelet 配置,特别是在已经启动的配置中再添加一个选项。您通常会在文件 /etc/default/kubelet 中找到这些选项。您只需要再添加一个:

    --allowed-unsafe-sysctls 'net.ipv4.tcp_fin_timeout'
    

    并重新启动您的 kubelet

    systemctl restart kubelet.service
    

    一旦在节点级别允许net.ipv4.tcp_fin_timeout,您就可以像任何安全的sysctls一样设置它,即通过securityContext 在您的Pod 规范中设置。

    【讨论】:

    • 谢谢马里奥。我在上面的文件中包含了这个 sn-p,但我收到了以下错误。你知道为什么会抛出这个吗?错误:验证“jmeter_master_deploy.yaml”时出错:验证数据时出错:ValidationError(Pod.spec):io.k8s.api.core.v1.PodSpec 中缺少必填字段“containers”;如果您选择忽略这些错误,请使用 --validate=false 关闭验证
    • 请注意SecurityCotext 必须与containers 处于相同的缩进级别,它们都是spec 部分的一部分。看起来在您当前的 yaml 中,containers 不在spec 之下。如果您在更正时仍有困难,请将您编辑的yaml 发布在您的问题中,我会看一下。
    • 我刚刚对我的 yaml 进行了一些更改,并且问题随着更改而更新。我在 Kubernetes 仪表板上打开了一个到其中一个 pod 的 shell 会话,以允许不安全的 sysctl,但我在 /etc/default/ 中找不到 kubelet 文件。
    • 因为你应该在nodes 上配置它,而不是在Pod 上。这就是为什么 unsafe sysctl 被称为 unsafe - 启用它们可能会影响节点的稳定性,从而影响整个集群。但是,如果您出于某种原因需要它们并且您知道自己在做什么,那么有一种方法可以允许它们。然而,当涉及到诸如 azure-aks 之类的托管 kubernetes 解决方案时,有一个重要的警告。我对 Azure 平台不是很熟悉,但例如在 GKE 上,您默认启用了 自动升级自动修复 功能,这可能会覆盖您的更改。
    • 我能够成功验证 net.ipv4.ip_local_port_range 根据 yaml 文件进行了更改。但是除了这里给出的步骤docs.microsoft.com/en-us/azure/aks/ssh 之外,还有其他方法可以与 AKS 节点通信以设置不安全的 sysctl
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多