一 kubelet概述
1.1 kubelet作用
在Kubernetes集群中,在每个Node(又称Minion)上都会启动一个kubelet服务进程。该进程用于处理Master下发到本节点的任务,管理Pod及Pod中的容器。每个kubelet进程都会在API Server上注册节点自身的信息,定期向Master汇报节点资源的使用情况,并通过cAdvisor监控容器和节点资源。二 节点管理
节点通过设置kubelet的启动参数“--register-node”,来决定是否向API Server注册自己。如果该参数的值为true,那么kubelet将试着通过API Server注册自己。在自注册时,kubelet启动时还包含下列参数。- --api-servers:API Server的位置。
- --kubeconfig:kubeconfig文件,用于访问API Server的安全配置文件。
- --cloud-provider:云服务商(IaaS)地址,仅用于公有云环境。
三 Pod管理
kubelet通过以下几种方式获取自身Node上要运行的Pod清单。- 文件:kubelet启动参数“--config”指定的配置文件目录下的文件(默认目录为“/etc/kubernetes/manifests/”)。通过--file-checkfrequency设置检查该文件目录的时间间隔,默认为20s。
- HTTP端点(URL):通过“--manifest-url”参数设置。通过--http-check-frequency设置检查该HTTP端点数据的时间间隔,默认为20s。
- API Server:kubelet通过API Server监听etcd目录,同步Pod列表。
所有以非API Server方式创建的Pod都叫作Static Pod。kubelet将Static Pod的状态汇报给API Server,API Server为该Static Pod创建一个Mirror Pod和其相匹配。Mirror Pod的状态将真实反映Static Pod的状态。当Static Pod被删除时,与之相对应的Mirror Pod也会被删除。 对于通过API Server获得Pod清单的方式,kubelet会使用API Server Client的Watch加List的方式监听“/registry/nodes/$”当前节点的名称和“/registry/pods”目录,将获取的信息同步到本地缓存中。 kubelet监听etcd,所有针对Pod的操作都会被kubelet监听。如果发现有新的绑定到本节点的Pod,则按照Pod清单的要求创建该Pod。如果发现本地的Pod被修改,则kubelet会做出相应的修改,比如在删除Pod中的某个容器时,会通过Docker Client删除该容器。 如果发现删除本节点的Pod,则删除相应的Pod,并通过Docker Client删除Pod中的容器。 kubelet读取所监听的信息,如果是创建和修改Pod任务,则做如下处理:
- 为该Pod创建一个数据目录。
- 从API Server读取该Pod清单。
- 为该Pod挂载外部卷(ExternalVolume)。
- 下载Pod用到的Secret。
- 检查已经运行在节点上的Pod,如果该Pod没有容器或Pause容器(“kubernetes/pause”镜像创建的容器)没有启动,则先停止Pod里所有容器的进程。如果在Pod中有需要删除的容器,则删除这些容器。
- 用“kubernetes/pause”镜像为每个Pod都创建一个容器。该Pause容器用于接管Pod中所有其他容器的网络。每创建一个新的Pod,kubelet都会先创建一个Pause容器,然后创建其他容器。“kubernetes/pause”镜像大概有200KB,是个非常小的容器镜像。
- 为Pod中的每个容器做如下处理:
- 为容器计算一个Hash值,然后用容器的名称去查询对应Docker容器的Hash值。若查找到容器,且二者的Hash值不同,则停止Docker中容器的进程,并停止与之关联的Pause容器的进程;若二者相同,则不做任何处理。
- 如果容器被终止了,且容器没有指定的restartPolicy(重启策略),则不做任何处理。
- 调用Docker Client下载容器镜像,调用Docker Client运行容器。
四 容器健康检查
4.1 健康检查方法
Pod通过两类探针来检查容器的健康状态,LivenessProbe探针和ReadinessProbe探针。4.2 LivenessProbe探针
LivenessProbe探针,用于判断容器是否健康并反馈给kubelet。如果LivenessProbe探针探测到容器不健康,则kubelet将删除该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe探针返回的值永远是Success。 kubelet定期调用容器中的LivenessProbe探针来诊断容器的健康状况。LivenessProbe包含以下3种实现方式:- ExecAction:在容器内部执行一个命令,如果该命令的退出状态码为0,则表明容器健康。
- TCPSocketAction:通过容器的IP地址和端口号执行TCP检查,如果端口能被访问,则表明容器健康。
- HTTPGetAction:通过容器的IP地址和端口号及路径调用HTTPGet方法,如果响应的状态码大于等于200且小于等于400,则认为容器状态健康。
LivenessProbe探针被包含在Pod定义的spec.containers.{某个容器}中。 示例1:HTTP检查方式 [root@k8smaster01 study]# vi myweb-liveness.yaml
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 labels: 5 test: liveness 6 name: myweb 7 spec: 8 containers: 9 - name: myweb 10 image: kubeguide/tomcat-app:v1 11 ports: 12 - containerPort: 8080 13 livenessProbe: 14 httpGet: 15 path: /index.html 16 port: 8080 17 httpHeaders: 18 - name: X-Custom-Header 19 value: Awesome 20 initialDelaySeconds: 5 21 timeoutSeconds: 1 22 #kubelet发送一个HTTP请求到本地主机、端口及指定的路径,来检查容器的健康状态。示例2:运行一个具体的命令。 [root@k8smaster01 study]# vi myweb-liveness.yaml
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 labels: 5 test: liveness 6 name: myweb 7 spec: 8 containers: 9 - name: myweb 10 image: kubeguide/tomcat-app:v1 11 ports: 12 - containerPort: 8080 13 livenessProbe: 14 exec: 15 command: 16 - cat 17 - /tmp/health 18 initialDelaySeconds: 5 19 timeoutSeconds: 1 20 #kubelet在容器中执行“cat /tmp/health”命令,如果该命令返回的值为0,则表明容器处于健康状态,否则表明容器处于不健康状态。