kubelet說明
首先kubelet的運行環境是在node上
在Kubernetes集群中的每個workNode需要運行kubelet用於與apiServer通信
kubeadm join過程
如果使用kubeadm集群管理工具安裝的集群,官方提供二種方式將worknode加入到Kubernetes集群中
- 使用共享令牌、apiserver地址:端口(具體命令形式 kubeadm join apiserver地址:6443 --token --discovery-token-ca-cert-hash sha256: --v=5 )
- 提供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公鑰的哈希值
加入過程
- 預加入檢測(環境檢查,鏡像下載)
- 從control-plane節點的kubeadm-certs密鑰下載需要的證書
- 生成kubelet配置文件,生成的源文件位於Kubernetes集群中的kubelet-config ConfigMap中,並寫入
/var/lib/kubelet/config.yaml
中 - 加載新的kubelet配置后,kubeadm 將寫入
/etc/kubernetes/bootstrap-kubelet.conf
KubeConfig 文件中, 該文件包含 CA 證書和引導程序令牌。 kubelet 使用這些證書執行 TLS 引導程序並獲取唯一的憑據,該憑據被存儲在/etc/kubernetes/kubelet.conf
中。當/etc/kubernetes/kubelet.conf
文件被寫入后,kubelet 就完成了 TLS 引導過程。 Kubeadm 在完成 TLS 引導過程后將刪除/etc/kubernetes/bootstrap-kubelet.conf
文件
到此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 參數
具體二種方式配置如下
- 修改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
- 生成一個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
-
如何查看默認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/
大致過程如下
- 准備自定義一個kubelet config.yaml配置文件
- 將此文件生成Kubernetes ConfigMap資源用於集中管理(保存在Kubernetes Control-plane節點)
- 修改WorkNode節點對象從此ConfigMap獲取配置配置文件
被廢除的功能,不詳細說明
方案三
使用Kubernetes ConfigMap集中管理kubelet config.yaml
引用官方文檔,地址如下
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/kubelet-integration/
使用kubeadm配置kubelet模式共有二種,如下
- 集群中心配置傳播到節點的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] 生成一個默認的,然后再加以修改
-
在集群中特殊的節點配置指定的參數
通常在初始化完成 & 加入集群之后進行調整,通過調整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,如下
- 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...
- 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
在標志鏈中排在最后,並且在設置沖突時具有最高優先級。
-