kubelet

kubelet 进程用于处理master 下发的任务, 管理pod 中的容器, 注册 自身所在的节点.

节点管理

启动参数说明

--register-node #如果设置为true 则会向api server 注册自身node,如果设置为false 需要管理员手工配置
--api-server # api server 的位置 ip 地址或域名
--kubeconfig # kubeconfig 文件, 用于访问 api server 的安全配置文件
--cloud-provider: #云服务商地址, 仅用于公有云
--node-status-update-frequency #设置 kubelet 上报时间间隔.
 
  • 1
  • 2
  • 3
  • 4
  • 5

pod 管理

kubelet 通过以下方式获取node 上运行的 pod 信息

  1. 文件: kubelet 通过启动参数 --config 指定配置文件目录下的文件(默认为 /etc/kubernetes/manifests/ 静态pod读取位置), 通过 --file-check-frequency 设置检查目录的间隔时间, 默认20s
  2. http 端点(url): 通过 --manifest-url 参数设置. 通过 --http-check-frequency 设置检查间隔时间, 默认20秒 (另外一种静态pod读取位置)
  3. api server: kubelet 通过 api server 监听 etcd 目录, 同步pod 列表

kubelet watch 加 list的方式监听 /registry/nodes/$NODENAME 当前节点名称, 和 registry/pods , 将获取的信息同步到本地缓存.

kubelet 读取监听信息, 对创建和修改做如下处理

  1. 为该 POD 创建一个数据目录
  2. 从 api server 读取 pod 清单
  3. 为该 pod 挂载外部卷 (External Volume)
  4. 下载 pod 用到 secret
  5. 检查已经运行在该节点的 pod, 如果 pod 没有容器, 或者 kubernetes/pause 容器没启动, 则先停止所有容器进程, 如果有需要删除的容器则删除
  6. 创建 kubernetes/pause 容器到pod中, 该 pause 容器 用于接管 pod 中所有其他容器的网络. 然后再创建其他容器.
  7. 为每个pod 中的容器做如下处理
    1. 为容器计算一个hash值, 然后用容器名称去查询对应的hash值, 如果发现不对,则停止容器中的进程, 停止与pause 容器的关联. 如果相同不做处理
    2. 如果容器被终止, 其容器没有指定 restartPolicy 则不做处理
    3. 调用docker client 下载容器镜像, 调用docker client 运行容器

容器健康检查

检查容器健康的两类探针

  1. LivenessProbe 探针, 用于判断容器是否健康, 并反馈给kubelet, 如果返回结果为不健康, kubelet 则删除容器,并根据重启策略做相应处理. 如果容器的yaml 定义中不包含 LivenessProbe 探针, 则认为该容器健康永远返回 success.
  2. ReadinessProbe 探针, 用于判断容器是否启动完成, 并且开始接受请求. 如果 ReadinessProbe 返回失败, 则容器状态被修改 Endpoint Controller 将从 service 的 Endpoint 中删除改 容器所在的 POD 的 IP

LivenessProbe 探针的实现方式

  1. ExecAction: 在容器内部执行一个命令, 如果改命令退出码为 0 , 则表示容器健康
  2. TCPSocketAction: 通过容器的 IP 地址和端口执行 TCP 检查, 如果端口能通, 则表明容器健康
  3. HttpGetAction: 通过 http get 访问容器 IP 的地址和端口 , 如果返回的状态吗大于200 小于 400 则认为容器状态健康

kube-proxy 运行机制解析

kube-proxy 本质上,类似一个反向代理. 我们可以把每个节点上运行的 kube-proxy 看作 service 的透明代理兼LB.

第二代转发机制: iptables 直接 nat

kube-proxy 监听 apiserver 中service 与Endpoint 的信息, 配置iptables 规则,请求通过iptables 直接转发给 pod

  • 优点:效率高
  • 缺点: 当 service 与pod 增加后 iptables 规则急剧膨胀, 性能下降与丢失请求.

第三代转发机制 IPVS + ipset

ipvs 是一个基于iptables 的高性能的负载均衡, 并使用高效的数据结构(hash), 允许无限规模扩张

ipvs 优势

  • 更好的扩展性和性能
  • 支持比 iptables 更复杂的LB 算法
  • 支持服务健康检查及连接充实
  • 可以动态修改ipset的集合, 即使iptables 的规则正在使用这个集合

ipvs 缺陷

无法提供包过滤, airpin-masquerade tricks (地址伪装) , SNAT 等功能, 因此需要与iptables 搭配使用. 在 IPVS 模式下, kube-proxy 使用 iptables 的扩展 ipset 来生成规则链.

iptables 是一个线性数据结构, ipset 则引入了带索引的数据结构,可以高效匹配.

kube-proxy主要的iptables 规则

  1. KUBE-CLUSTER-IP: 在 masquerade-all=true 或 clusterCIDR 指定的情况下, 对 service cluster ip 地址进行伪装, 以解决数据包欺骗问题.
  2. KUBE-EXTERNAL-IP: 将数据包装为 service 的外部 ip 地址
  3. KUBE-LOAD-BALANCER, KUBE-LOAD-BALANCER-LOCAL: 伪装 Loadbalance 类型的 service 流量
  4. KUBE-NODE-PORT-TCP, KUBE-NODE-PORT-LOCAL-TCP, KUBE-NODE-PORT-UDP, KUBE-NODE-LOCAL-UDP: 伪装 Nodeport 类型的service 流量.

IPVS启用方式

添加内核配置

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF # 授权
chmod 755 /etc/sysconfig/modules/ipvs.modules # 加载模块
bash /etc/sysconfig/modules/ipvs.modules # 查看加载
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 # 输出如下:
-----------------------------------------------------------------------
nf_conntrack_ipv4 20480 0
nf_defrag_ipv4 16384 1 nf_conntrack_ipv4
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs 147456 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 110592 2 ip_vs,nf_conntrack_ipv4
libcrc32c 16384 2 xfs,ip_vs
-----------------------------------------------------------------------
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

K8S 配置

配合kubeadm 使用:

kubeadm config print init-defaults > init-config.yaml
 
  • 1

在config.yaml 中添加
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1

kubeProxy:
config:
featureGates: SupportIPVSProxyMode=true
mode: ipvs

或者添加

---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
 
  • 1
  • 2
  • 3
  • 4

两者二选一

然后使用

kubeadm init --config init-config.yaml 进行安装
 
  • 1

kubeadm 默认配置查看

kubeadm config print init-defaults #查看默认配置
kubeadm config print init-defaults --component-configs KubeProxyConfiguration #查看某个组件的默认配置
 
  • 1
  • 2
 
文章知识点与官方知识档案匹配,可进一步学习相关知识

K8S 核心组件 kubelet 与 kube-proxy 分析的更多相关文章

  1. 11.深入k8s:kubelet工作原理及源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 kubelet信息量是很大的,通过我这一篇文章肯定是讲不全的,大家可 ...

  2. 12.深入k8s:kubelet创建pod流程源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 在上一篇中,我们知道在kubelet中,工作核心就是围绕着整个syn ...

  3. heapster源码分析——kubelet的api调用分析

    一.heapster简介 什么是Heapster? Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS.Kubernetes有个出名的监控agent---cAd ...

  4. K8s中Pod健康检查源代码分析

    了解k8s中的Liveness和Readiness Liveness: 表明是否容器正在运行.如果liveness探测为fail,则kubelet会kill掉容器,并且会触发restart设置的策略. ...

  5. K8S CoreDNS部署失败,问题分析

    1. 查询k8s集群部署pod的基本情况 如下图,我们可知容器coredns和dnsutils都部署成功,但是由于域名解析的问题,导致coredns和dnsutils的容器不断重启(原因heath检查 ...

  6. 031.核心组件-kubelet

    一 kubelet概述 1.1 kubelet作用 在Kubernetes集群中,在每个Node(又称Minion)上都会启动一个kubelet服务进程.该进程用于处理Master下发到本节点的任务, ...

  7. Spring Security(1):认证和授权的核心组件介绍及源码分析

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方式的安全框架.它包括认证(Authentication)和授权(Authorization)两个部 ...

  8. 1.k8s概述、安装、名词解释、资源清单

    一.k8s概述 1.简介 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernete ...

  9. 【k8s连载系列】2. k8s整体架构

    # 一.Kubernetes的整体架构 学习k8s,最终目的是为了部署应用,部署一个完整的k8s, 就要知道k8s的组成.k8s主要包含两大部分: 中间包含三个绿色包的是master服务器. 下面是n ...

  10. docker 和 k8s 调研总结

    一. docker简介 环境配置 软件开发最大的麻烦事之一,就是环境配置.用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来? 用户必须保证两件事:操作系统的设置,各种库和组件的安装. ...

随机推荐

  1. Fluentd 使用 multiline 解析器来处理多行日志

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247500439&idx=1&sn=45e9e0e0ef ...

  2. Rook Toolbox

    官方文档:https://rook.io/docs/rook/v1.8/ceph-toolbox.html Rook工具箱是一个包含用于Rook调试和测试的常用工具的容器.工具箱基于CentOS,因此 ...

  3. 在 K8S 上部署以 mysql 数据库作为后端存储的单机版 nacos

    Nacos 被用于: 服务发现 微服务配置信息管理 部署 nacos 时,需要用到如下两个镜像,这两个镜像均来自于 nacos 官方发布到 docker hub 的镜像, nacos/nacos-se ...

  4. 使用yum方式安装的openresty参数

    nginx version: openresty/1.19.3.1 built by gcc 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC) built with Ope ...

  5. 9. Fluentd部署:日志

    Fluentd是用来处理其他系统产生的日志的,它本身也会产生一些运行时日志.Fluentd包含两个日志层:全局日志和插件级日志.每个层次的日志都可以进行单独配置. 日志级别 Fluentd的日志包含6 ...

  6. Linux+Proton without Steam玩红警3指南

    首先你需要Proton5.13 without Steam,使用说明和下载链接看这里https://www.cnblogs.com/tubentubentu/p/16716612.html 然后在/e ...

  7. SpringBoot的starter到底是什么?

    前言 我们都知道,Spring的功能非常强大,但也有些弊端.比如:我们需要手动去配置大量的参数,没有默认值,需要我们管理大量的jar包和它们的依赖. 为了提升Spring项目的开发效率,简化一些配置, ...

  8. JavaScript根据参数获取url中参数名的值

    //假设ulr如下var localhost="http://127.0.0.1?name=tom&sex=男&id=1";//正则方法封装function Get ...

  9. ArrayList LinkedList Vector之间的区别

    List主要有ArrayList,LinkedList和vector三种实现.这三种都实现了List接口,使用方式也很相似,主要区别在于其实现方式的不同! 这三种数据结构中,ArrayList和Vec ...

  10. springboot+bootstrap实现图书商城管理(大三下学期课程设计)

    在csdn上记一次自己的课程设计过程(已经实习两个月了.感觉这个很容易做.支付可能需要多花点时间.): 在此框架基础之上权限认证管理设置成功:https://blog.csdn.net/weixin_ ...