zoukankan      html  css  js  c++  java
  • kubelet 配置管理 (一)

    kubelet说明


    首先kubelet的运行环境是在node上

    在Kubernetes集群中的每个workNode需要运行kubelet用于与apiServer通信

    kubeadm join过程

    如果使用kubeadm集群管理工具安装的集群,官方提供二种方式将worknode加入到Kubernetes集群中

    1. 使用共享令牌、apiserver地址:端口(具体命令形式 kubeadm join apiserver地址:6443 --token  --discovery-token-ca-cert-hash sha256: --v=5 )
    2. 提供kubeconfig相关文件,该文件的形式可以是一个本地文件,或者是URL的形式(kubeadm join --discovery-file apth/to/file.conf  或者  kubeadm join --discovery-file https://usr/file.conf)

    token 提供标识的令牌

    --discovery-token-ca-cert-hash,提供Kubernetes集群根证书颁发机构CA公钥的哈希值

    加入过程

    1. 预加入检测(环境检查,镜像下载)
    2. 从control-plane节点的kubeadm-certs 下载需要的证书
    3. 生成kubelet配置文件,生成的源文件位于Kubernetes集群中的kubelet-config ConfigMap中,用于集中管理
    4. 启动kubelet

    到此WorkNode注册完成,然后持续监控API服务器调度指令,同时kubelet也会将自身节点状态信息(节点资源CPU/MEM/DISK、资源消耗/资源空闲信息、故障事件、)报告于API服务器

    同时接收API服务器的调度指令,如创建Pod、故障转移、状态检测

    kubelet配置管理


    kubelet的配置文件管理方式如下3种

    • 单独维护自身节点的配置文件(/var/lib/kubelet/config.yaml)可以直接修改需要重启kubelet,存在一定的风险,如果在高并发情况下,服务短暂停止也有可能hang住
    • 动态配置kubelet运行环境(kubernetes v1.22已经废掉该功能,不推荐使用)
    • kubelet配置集中管理,初始化文件被Kubernetes kubelet-config ConfigMap集中管理,统一下发到各个WorkNode下

    方案一

    通过配置文件设置 Kubelet 参数

    具体二种方式配置如下

    1. 修改kubelet启动参数,参考阿里云ACK配置,如下

      /etc/systemd/system/kubelet.service.d

        具体kubelet参数请参考官方文档,如下

        https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/

      [root@iZj6c9xktnoxcwok6asqa9Z kubelet.service.d]# cat 10-kubeadm.conf
      [Service]
      EnvironmentFile=-/etc/kubernetes/kubelet-customized-args.conf
      Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
      Environment="KUBELET_SYSTEM_PODS_ARGS=--max-pods 23 --pod-max-pids 16384 --pod-manifest-path=/etc/kubernetes/manifests"
      Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --dynamic-config-dir=/etc/kubernetes/kubelet-config --v=3"
      Environment="KUBELET_DNS_ARGS=--enable-controller-attach-detach=true --cluster-dns=192.168.0.10         --pod-infra-container-image=registry-vpc.cn-hongkong.aliyuncs.com/acs/pause:3.2
      --enable-load-reader --cluster-domain=demo.local --cloud-provider=external         --hostname-override=cn-hongkong.172.31.34.242 --provider-id=cn-hongkong.i-j6c9xktnoxcwok6asqa9"
      Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --authentication-token-webhook=true --anonymous-auth=false --client-ca-file=/etc/kubernetes/pki/ca.crt"
      Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
      Environment="KUBELET_CERTIFICATE_ARGS=--tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_R
      SA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 --tls-cert-file=/v
      ar/lib/kubelet/pki/kubelet.crt --tls-private-key-file=/var/lib/kubelet/pki/kubelet.key --rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
      ExecStart=
      ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CGROUP_ARGS $KUBELET_CERTIFICATE_ARGS $
      KUBELET_EXTRA_ARGS $KUBELET_CUSTOMIZED_ARGS

      ps -ef查看进程如下效果

      [root@iZj6c9xktnoxcwok6asqa9Z kubelet.service.d]# ps -ef | grep kubelet
      root        3288       1  2 Oct26 ?        1-08:52:32 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --max-pods
      23 --pod-max-pids 16384 --pod-manifest-path=/etc/kubernetes/manifests --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --dynamic-config-dir=/etc/kubernetes/k
      ubelet-config --v=3 --enable-controller-attach-detach=true --cluster-dns=192.168.0.10 --pod-infra-container-image=registry-vpc.cn-hongkong.aliyuncs.com/acs/pause:3.2 --enable-load-reader
       --cluster-domain=demo.local --cloud-provider=external --hostname-override=cn-hongkong.172.31.34.242 --provider-id=cn-hongkong.i-j6c9xktnoxcwok6asqa9 --authorization-mode=Webhook --authe
      ntication-token-webhook=true --anonymous-auth=false --client-ca-file=/etc/kubernetes/pki/ca.crt --cgroup-driver=systemd --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_EC
      DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
      TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 --tls-cert-file=/var/lib/kubelet/pki/kubelet.crt --tls-private-key-file=/var/lib/kubelet/pki/kubelet.key --rotate-certific
      ates=true --cert-dir=/var/lib/kubelet/pki --eviction-hard=imagefs.available<15%,memory.available<300Mi,nodefs.available<10%,nodefs.inodesFree<5% --system-reserved=memory=300Mi --kube-res
      erved=memory=400Mi --kube-reserved=pid=1000 --system-reserved=pid=1000
    2. 生成一个config.yaml文件,如下

      可以在原有基础上修改或者新增一些必要的参数

        具体config.yaml配置文件,结构可参考官方文档

        https://kubernetes.io/zh/docs/reference/config-api/kubelet-config.v1beta1/

      apiVersion: kubelet.config.k8s.io/v1beta1
      authentication:
        anonymous:
          enabled: false
        webhook:
          cacheTTL: 0s
          enabled: true
        x509:
          clientCAFile: /etc/kubernetes/pki/ca.crt
      authorization:
        mode: Webhook
        webhook:
          cacheAuthorizedTTL: 0s
          cacheUnauthorizedTTL: 0s
      clusterDNS:
      - 10.12.0.10
      maxPods: 32 
      systemReserved: 
        cpu: 300m 
        memory: 300Mi 
      kubeReserved: 
        cpu: 300m 
        memory: 200Mi 
      evictionHard: 
        memory.available: "300Mi" 
        nodefs.available: "15%" 
        nodefs.inodesFree: "5%" 
        imagefs.available: "15%" 
      evictionMinimumReclaim: 
        memory.available: "0Mi" 
        nodefs.available: "20Gi" 
        imagefs.available: "10Gi"
      clusterDomain: cluster.local
      cpuManagerReconcilePeriod: 0s
      evictionPressureTransitionPeriod: 0s
      fileCheckFrequency: 0s
      healthzBindAddress: 127.0.0.1
      healthzPort: 10248
      httpCheckFrequency: 0s
      imageMinimumGCAge: 0s
      kind: KubeletConfiguration
      nodeStatusReportFrequency: 0s
      nodeStatusUpdateFrequency: 0s
      rotateCertificates: true
      runtimeRequestTimeout: 0s
      staticPodPath: /etc/kubernetes/manifests
      streamingConnectionIdleTimeout: 0s
      syncFrequency: 0s
      volumeStatsAggPeriod: 0s
    3. 如何查看默认kubelet的配置,如下

      curl -sk https://kubernetes.default.svc/api/v1/nodes/pre-be-k8s-wn1/proxy/configz | jq -r

    方案二

    动态配置kubelet运行环境

    既然官方明确指出,此功能已在Kubernetes v1.22版本被废除,运行环境需低于1.22版本

      引用官方文档,地址如下

      https://v1-22.docs.kubernetes.io/zh/docs/tasks/administer-cluster/reconfigure-kubelet/

     大致过程如下

    1. 准备自定义一个kubelet config.yaml配置文件
    2. 将此文件生成Kubernetes ConfigMap资源用于集中管理(保存在Kubernetes Control-plane节点)
    3. 修改WorkNode节点对象从此ConfigMap获取配置配置文件

    被废除的功能,不详细说明

    方案三

    使用Kubernetes ConfigMap集中管理kubelet config.yaml

       引用官方文档,地址如下

       https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/kubelet-integration/

     使用kubeadm配置kubelet模式共有二种,如下

    1. 集群中心配置传播到节点的kubelet

      方式一,在kubeadm init  &  kubeadm join 可以使用默认值,在初始化 & 加入集群后节点的默认配置文件位置位于/var/lib/kubelet/config.yaml并且上传至集群的ConfigMap命名是kubelet-config-1.x,其中x代表的是你当前使用的kubernetes版本。如果在初始化完成后,也可以及时修改ConfigMap配置(根据你需要的参数,比如DNS地址,clusterDomain),同时生成kubelet与集群API交互的通信加密文档kubelet.conf,存放在/etc/kubernetes/kubelet.conf,配置范围边界为整个集群内

      方式二,当然也可以在初始化前,自定义kubeadm-config配置文件,这个有点复杂,具体参考官方文档,https://kubernetes.io/docs/reference/config-api/kubeadm-config.v1beta2/。可以使用 kubeadm config print init-defaults --component-configs [KubeProxyConfiguration KubeletConfiguration] 生成一个默认的,然后再加以修改

    2. 在集群中特殊的节点配置指定的参数

      通常在初始化完成 & 加入集群之后进行调整,通过调整kubelet的启动参数,如 KUBELET_KUBECONFIG_ARGS

      [Service]
      Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
      Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
      # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
      EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
      # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
      # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
      EnvironmentFile=-/etc/sysconfig/kubelet
      ExecStart=
      ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

      比如你需要自定义,集群中node的名称(默认情况下是使用 .metadata.name 即主机的名字)当然你可以使用kubelet参数 --hostname-override覆盖默认值

      指定cgroup驱动,现在kubernetes不推荐使用cgroups,则推荐使用systemd成为默认值,具体参数--cgroup-driver,此参数定义的值必须与CRI运行时的环境的值匹配,否则kubelet报错。参考官方文档 https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/

      指定--network-plugin 容器网络驱动模型,默认情况下kubernetes采用的CNI模型,并永久不更换

    kubelet systemd


    如果使用yum安装Kubernetes程序,则可以使用以下命令来定位kubelet.service,如下

    1. kubelet.serivce
      <root@PROD-BE-K8S-WN18 ~># systemctl status kubelet
      ● kubelet.service - kubelet: The Kubernetes Node Agent
         Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
        Drop-In: /usr/lib/systemd/system/kubelet.service.d
                 └─10-kubeadm.conf
         Active: active (running) since Mon 2021-12-20 15:06:27 CST; 1 day 20h ago
           Docs: https://kubernetes.io/docs/
       Main PID: 10413 (kubelet)
          Tasks: 43
         Memory: 84.3M
         CGroup: /system.slice/kubelet.service
                 └─10413 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=systemd --network-plugin=cni --pod-infra-container-imag...
    2. 10-kubelet.conf,该文件是kubelet启动时指定配置文件
      # Note: This dropin only works with kubeadm and kubelet v1.11+
      [Service]
      Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
      Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
      # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
      # 该文件是在运行kubeadm ini & kubead join 时生成的,用于动态调整KUBELET_KUBEADM_ARGS变量指定的参数 EnvironmentFile
      =-/var/lib/kubelet/kubeadm-flags.env
      # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
      # /etc/sysconfig/kubelet 主要用于配置一些外置参数,比如日志,文件内置变量为KUBELET_EXTAR_ARGS EnvironmentFile
      =-/etc/sysconfig/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

      该文件为 kubelet 指定由 kubeadm 管理的所有文件的默认位置。

      • 用于 TLS 引导程序的 KubeConfig 文件为 /etc/kubernetes/bootstrap-kubelet.conf, 但仅当 /etc/kubernetes/kubelet.conf 不存在时才能使用。

      • 具有唯一 kubelet 标识的 KubeConfig 文件为 /etc/kubernetes/kubelet.conf

      • 包含 kubelet 的组件配置的文件为 /var/lib/kubelet/config.yaml

      • 包含的动态环境的文件 KUBELET_KUBEADM_ARGS 是来源于 /var/lib/kubelet/kubeadm-flags.env

      • 包含用户指定标志替代的文件 KUBELET_EXTRA_ARGS 是来源于 /etc/default/kubelet(对于 DEB),或者 /etc/sysconfig/kubelet(对于 RPM)。 KUBELET_EXTRA_ARGS 在标志链中排在最后,并且在设置冲突时具有最高优先级。

  • 相关阅读:
    常用的SQL语句
    解决Pycharm中module 'pip' has no attribute 'main'的问题
    [转]如何使用Fiddler抓取指定浏览器的数据包
    Linux常用命令
    Android:JACK编译错误汇总及解决
    Linux学习:使用 procrank 测量系统内存使用情况
    Android:动态库(.so)调试技巧
    Android 显示系统:Vsync机制
    Android:cmake开发指南
    Android:高通平台性能调试
  • 原文地址:https://www.cnblogs.com/apink/p/15715972.html
Copyright © 2011-2022 走看看