Как изменить параметры Linux kerner в Azure Kubernetes? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть кластер Azure Kubernetes с 4 узлами (Linux ящики). Я подготовил кластер AKS, используя манифесты yaml. Я хочу обновить следующие параметры ядра: 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

---

1 Ответ

0 голосов
/ 06 апреля 2020

Взгляните на этот официальный раздел документации kubernetes. В вашей Pod.

есть вся информация, необходимая для установки упомянутых параметров ядра или использования другой терминологии - sysctls . Обратите внимание, что существуют так называемые safe и unsafe sysctls.

Что касается настройки net.ipv4.ip_local_port_range=1024 65500, она считается safe * , и вы можете установить ее для своего Pod с использованием securityContext, как показано ниже, без необходимости перенастраивать 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.

...