다음과 같이 systemctl status kubelet
을 통해서 kubelet의 상태를 확인해보면
Drop-in에 10-kubeadm.conf
라는 파일이 존재한다.
이 파일의 용도가 궁금해져서 이를 글로 남겨 둔다.
● 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 2022-02-28 19:43:49 EST; 5h 42min ago
Docs: https://kubernetes.io/docs/
Main PID: 91537 (kubelet)
Tasks: 14 (limit: 23812)
Memory: 50.6M
CGroup: /system.slice/kubelet.service
└─91537 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubecon>
2월 28 19:44:01 master1 kubelet[91537]: I0228 19:44:01.146748 91537 reconciler.go:224] operationExecutor>
2월 28 19:44:01 master1 kubelet[91537]: I0228 19:44:01.146813 91537 reconciler.go:224] operationExecutor>
2월 28 19:44:01 master1 kubelet[91537]: I0228 19:44:01.146851 91537 reconciler.go:224] operationExecutor>
2월 28 19:44:01 master1 kubelet[91537]: I0228 19:44:01.146890 91537 reconciler.go:224] operationExecutor>
2월 28 19:44:01 master1 kubelet[91537]: I0228 19:44:01.146919 91537 reconciler.go:224] operationExecutor>
2월 28 19:44:01 master1 kubelet[91537]: I0228 19:44:01.146971 91537 reconciler.go:224] operationExecutor>
2월 28 19:44:01 master1 kubelet[91537]: I0228 19:44:01.147007 91537 reconciler.go:224] operationExecutor>
2월 28 19:44:01 master1 kubelet[91537]: I0228 19:44:01.147034 91537 reconciler.go:224] operationExecutor>
2월 28 19:44:01 master1 kubelet[91537]: I0228 19:44:01.147060 91537 reconciler.go:224] operationExecutor>
2월 28 19:44:01 master1 kubelet[91537]: I0228 19:44:01.147082 91537 reconciler.go:157] Reconciler: start>
kubeadm init을 통해서 kubelet을 activate 시키면 /etc/systemd/system/kubelet.service.d
경로에 10-kubeadm.conf
를 확인할 수 있다.
이 파일은 kubeadm이 생성한 파일로써, systemd가 kubelet을 어떻게 실행시켜야 하는지에 대한 configuration이다.
(참고로 kubeadm cli는 drop-in file을 건드리지 않는다)
즉 정리하면, kubeadm에 의해서 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
라는 파일이 생성되고, systemd는 이 파일을 가지고 kubelet을 실행한다.
다음은 10-kubeadm.conf 파일의 내용이다.
[root@master1 ~]# cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# 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
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
10-kubeadm.conf 파일은 kubelet을 실행시키기 위한 모든 파일들의 default location을 관리한다.
상단에서 Environment와 EnvironmentFile을 정의하고, 이를 가지고 ExecStart에서 kubelet 실행에 대한 커맨드를 완성한 뒤, systemd가 kubelet 프로세스를 실행시키는 것이다.
root 91537 2.2 2.8 1783824 109428 ? Ssl 2월28 8:39
/usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
--kubeconfig=/etc/kubernetes/kubelet.conf
--config=/var/lib/kubelet/config.yaml
--container-runtime=remote
--container-runtime-endpoint=/var/run/crio/crio.sock
다음은 10-kubeadm.conf에 정의된 파일에 대한 간단한 내용이다.
/etc/kubernetes/bootstrap-kubelet.conf
: TLS bootstrap을 위해서 사용되는 파일로 /etc/kubernetes/kubelet.conf
가 없다면 사용되지 않는다. /etc/kubernetes/kubelet.conf
: unique kubelet identity를 위해서 사용되는 파일[root@master1 ~]# cat /etc/kubernetes/kubelet.conf
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJ~~
server: https://192.168.9.10:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: system:node:master1
name: system:node:master1@kubernetes
current-context: system:node:master1@kubernetes
kind: Config
preferences: {}
users:
- name: system:node:master1
user:
client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem
/var/lib/kubelet/config.yaml
: kubelet의 component config를 포함하는 파일[root@master1 ~]# cat /var/lib/kubelet/config.yaml
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
cgroupDriver: systemd
clusterDNS:
- 172.1.1.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
logging: {}
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
rotateCertificates: true
runtimeRequestTimeout: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s
/var/lib/kubelet/kubeadm-flags.env
: KUBELET_KUBEADM_ARGS
를 포함하는 dynamic environment파일 [root@master1 ~]# cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/var/run/crio/crio.sock"
etc/default/kubelet(DEB)
or /etc/sysconfig/kubelet(RPM)
: user-specified flag를 override를 할 수 있는 KUBELET_EXTRA_ARGS
를 포함https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/kubelet-integration/