K8S 核心组件 kubelet 与 kube-proxy 分析
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 信息
- 文件: kubelet 通过启动参数 --config 指定配置文件目录下的文件(默认为 /etc/kubernetes/manifests/ 静态pod读取位置), 通过 --file-check-frequency 设置检查目录的间隔时间, 默认20s
- http 端点(url): 通过 --manifest-url 参数设置. 通过 --http-check-frequency 设置检查间隔时间, 默认20秒 (另外一种静态pod读取位置)
- api server: kubelet 通过 api server 监听 etcd 目录, 同步pod 列表
kubelet watch 加 list的方式监听 /registry/nodes/$NODENAME 当前节点名称, 和 registry/pods , 将获取的信息同步到本地缓存.
kubelet 读取监听信息, 对创建和修改做如下处理
- 为该 POD 创建一个数据目录
- 从 api server 读取 pod 清单
- 为该 pod 挂载外部卷 (External Volume)
- 下载 pod 用到 secret
- 检查已经运行在该节点的 pod, 如果 pod 没有容器, 或者 kubernetes/pause 容器没启动, 则先停止所有容器进程, 如果有需要删除的容器则删除
- 创建 kubernetes/pause 容器到pod中, 该 pause 容器 用于接管 pod 中所有其他容器的网络. 然后再创建其他容器.
- 为每个pod 中的容器做如下处理
- 为容器计算一个hash值, 然后用容器名称去查询对应的hash值, 如果发现不对,则停止容器中的进程, 停止与pause 容器的关联. 如果相同不做处理
- 如果容器被终止, 其容器没有指定 restartPolicy 则不做处理
- 调用docker client 下载容器镜像, 调用docker client 运行容器
容器健康检查
检查容器健康的两类探针
- LivenessProbe 探针, 用于判断容器是否健康, 并反馈给kubelet, 如果返回结果为不健康, kubelet 则删除容器,并根据重启策略做相应处理. 如果容器的yaml 定义中不包含 LivenessProbe 探针, 则认为该容器健康永远返回 success.
- ReadinessProbe 探针, 用于判断容器是否启动完成, 并且开始接受请求. 如果 ReadinessProbe 返回失败, 则容器状态被修改 Endpoint Controller 将从 service 的 Endpoint 中删除改 容器所在的 POD 的 IP
LivenessProbe 探针的实现方式
- ExecAction: 在容器内部执行一个命令, 如果改命令退出码为 0 , 则表示容器健康
- TCPSocketAction: 通过容器的 IP 地址和端口执行 TCP 检查, 如果端口能通, 则表明容器健康
- 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 规则
- KUBE-CLUSTER-IP: 在 masquerade-all=true 或 clusterCIDR 指定的情况下, 对 service cluster ip 地址进行伪装, 以解决数据包欺骗问题.
- KUBE-EXTERNAL-IP: 将数据包装为 service 的外部 ip 地址
- KUBE-LOAD-BALANCER, KUBE-LOAD-BALANCER-LOCAL: 伪装 Loadbalance 类型的 service 流量
- 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 分析的更多相关文章
- 11.深入k8s:kubelet工作原理及源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 kubelet信息量是很大的,通过我这一篇文章肯定是讲不全的,大家可 ...
- 12.深入k8s:kubelet创建pod流程源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 在上一篇中,我们知道在kubelet中,工作核心就是围绕着整个syn ...
- heapster源码分析——kubelet的api调用分析
一.heapster简介 什么是Heapster? Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS.Kubernetes有个出名的监控agent---cAd ...
- K8s中Pod健康检查源代码分析
了解k8s中的Liveness和Readiness Liveness: 表明是否容器正在运行.如果liveness探测为fail,则kubelet会kill掉容器,并且会触发restart设置的策略. ...
- K8S CoreDNS部署失败,问题分析
1. 查询k8s集群部署pod的基本情况 如下图,我们可知容器coredns和dnsutils都部署成功,但是由于域名解析的问题,导致coredns和dnsutils的容器不断重启(原因heath检查 ...
- 031.核心组件-kubelet
一 kubelet概述 1.1 kubelet作用 在Kubernetes集群中,在每个Node(又称Minion)上都会启动一个kubelet服务进程.该进程用于处理Master下发到本节点的任务, ...
- Spring Security(1):认证和授权的核心组件介绍及源码分析
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方式的安全框架.它包括认证(Authentication)和授权(Authorization)两个部 ...
- 1.k8s概述、安装、名词解释、资源清单
一.k8s概述 1.简介 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernete ...
- 【k8s连载系列】2. k8s整体架构
# 一.Kubernetes的整体架构 学习k8s,最终目的是为了部署应用,部署一个完整的k8s, 就要知道k8s的组成.k8s主要包含两大部分: 中间包含三个绿色包的是master服务器. 下面是n ...
- docker 和 k8s 调研总结
一. docker简介 环境配置 软件开发最大的麻烦事之一,就是环境配置.用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来? 用户必须保证两件事:操作系统的设置,各种库和组件的安装. ...
随机推荐
- docker-compose安装harbor
目录 Harbor 安装环境说明 获取安装包(离线安装方式) 安装harbor 用docker-compose查看Harbor容器的运行状态 Harbor访问测试 上传镜像到Harbor服务器 Har ...
- Maven+SpringMVC+Dubbo 简单的入门demo配置
转载自:https://cloud.tencent.com/developer/article/1010636 之前一直听说dubbo,是一个很厉害的分布式服务框架,而且巴巴将其开源,这对于咱们广大程 ...
- docker相关总结
Docker 的相关使用记录 一.安装docker linux环境使用yum命令安装docker 第一步:确保自己的虚拟机没有安装过docker,如果安装过的需要将原先的docker进行卸载,命令如下 ...
- 【前端必会】webpack loader 到底是什么
概述 webpack的使用中我们会遇到各种各样的插件.loader. webpack的功力主要体现在能理解各个插件.loader的数量上.理解的越多功力越深 loader是什么呢? 背景 了解load ...
- Node.js(四)json
npm init -y(初始化项目) npm install express(引入express) npx express-generator -e(自动生成模板.添加对 ejs 模板引擎的支持) n ...
- PHP全栈开发(四): HTML 学习(2. div 布局)
无序列表,有序列表,自定义列表 无序列表是ul表示,每个元素用li表示 有序列表是ol表示,每个元素用li表示 <ul> <li>首页</li><li> ...
- 1、小程序Vant_WebApp组件库的安装步骤和简单使用
Vant 1.小程序对于npm的支持 目前,小程序当中已经支持使用npm安装的第三方包,通过使用这些第三方包,我们可以提高对小程序开发的效率,但是在小程序当中使用所谓的npm包有如下的三个限制 不能支 ...
- python face_recognition安装及各种应用
1.安装 首先,必须提前安装cmake.numpy.dlib,其中,由于博主所用的python版本是3.6.4(为了防止不兼容,所以用之前的版本),只能安装19.7.0及之前版本的dlib,所以直接p ...
- Mybatis 报错Mapper method 'xxx' has an unsupported return type
报错原因: 出现这种错误,说明sql语句执行成功,只是返回类型出了问题. 解决方法: insert.delete.update操作默认返回一个int类型的整数,将增删改的接口改成int或者void即可 ...
- FastAPI + tortoise-orm基础使用
更改sqlite为mysql from tortoise import Tortoise import asyncio async def init(): user = 'root' password ...