【k8s读书笔记】Kubelet - 1

111 阅读2分钟

【k8s读书笔记】Kubelet - 1

Kubelet一般是从API Server获取Pod清单(manifest),但也可以从指定目录获取Pod清单来运行Pod。

  • 相关参数:--config=/path/to/kubelet-config.yaml

  • 在该配置文件中定义配置项staticPodPath: "/tmp/test_pod.yaml"

  • 测试用配置文件

    apiVersion: kubelet.config.k8s.io/v1beta1
    kind: KubeletConfiguration
    address: "192.168.0.8"
    port: 20250
    serializeImagePulls: false
    evictionHard:
        memory.available:  "200Mi"
    staticPodPath: "/tmp/test_pod.yaml"
    

控制平面的组件正是利用该特性以Pod的形式运行的。

控制平面的组件包括:

  • etcd
  • API Server
  • Scheduler
  • Controller Manager

在minikube中,以上组件运行在命名空间kube-system中。

➜  ~ kubectl get node
NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   26h   v1.27.4

➜  ~ kubectl get ns
NAME              STATUS   AGE
default           Active   28h
kube-node-lease   Active   28h
kube-public       Active   28h
kube-system       Active   28h

➜  ~ kubectl get pods -n kube-system
NAME                               READY   STATUS    RESTARTS      AGE
coredns-5d78c9869d-wqzs2           1/1     Running   0             28h
etcd-minikube                      1/1     Running   0             28h
kube-apiserver-minikube            1/1     Running   0             28h
kube-controller-manager-minikube   1/1     Running   0             28h
kube-proxy-gbg2z                   1/1     Running   0             28h
kube-scheduler-minikube            1/1     Running   0             28h
storage-provisioner                1/1     Running   1 (28h ago)   28h

**“来”**字表示被动

  • 尔大哥长枪刺坏
  • 控制平面的组件正是利用该特性以pod的形式运行的。 = ……作为pod运行的。

相关代码

  • kubelet命令相关的代码在 kubernetes/cmd/kubelet/kubelet.go
  • 在文件 kubernetes/cmd/kubelet/app/server.go 中
    • 在构造*cobra.Command类型的变量时,定义了回调函数RunE: func(cmd *cobra.Command, args []string) error {。该函数会调用Run()函数,Run()又会调用小写字母开头的run()
    • run()中调用了RunKubelet(),后者又继续调用createAndInitKubelet()
    • createAndInitKubelet()返回的类型为type kubelet.Bootstrap interface
  • 至此,开始执行kubernetes/pkg/kubelet中的代码
// Bootstrap is a bootstrapping interface for kubelet, targets the initialization protocol
type Bootstrap interface {
	GetConfiguration() kubeletconfiginternal.KubeletConfiguration
	BirthCry()
	StartGarbageCollection()
	ListenAndServe(kubeCfg *kubeletconfiginternal.KubeletConfiguration, tlsOptions *server.TLSOptions, auth server.AuthInterface, tp trace.TracerProvider)
	ListenAndServeReadOnly(address net.IP, port uint)
	ListenAndServePodResources()
	Run(<-chan kubetypes.PodUpdate)
	RunOnce(<-chan kubetypes.PodUpdate) ([]RunPodResult, error)
}
  • Bootstrap定义了kubelet server的行为,可以仅运行一次(RunOnce()),也可以监听Pod资源的变化(ListenAndServePodResources()
  • 该接口的唯一实现是type Kubelet struct
  • struct Kubelet上的func (kl *Kubelet) HandleXXX系列函数用于实际处理Pod(与podManager: kubepod.ManagerpodWorkers PodWorkers联动)