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 上报时间间隔.

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
-----------------------------------------------------------------------

K8S 配置

配合kubeadm 使用:

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

在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"

两者二选一

然后使用

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

kubeadm 默认配置查看

kubeadm config print init-defaults #查看默认配置
kubeadm config print init-defaults --component-configs KubeProxyConfiguration #查看某个组件的默认配置

K8S 核心组件 kubelet 与 kube-proxy 分析相关推荐

  1. k8s组件说明:kubelet 和 kube proxy

    k8s的node节点需要安装三个组件:docker/kubelet/kube proxy pod是存储容器的容器,但容器不止docker一种. CRI:container runtime interf ...

  2. K8S原来如此简单(一)K8S核心组件与基本原理

    k8s视频课程 K8S核心组件与工作原理 k8s官方文档:https://kubernetes.io/zh/docs/home/ 前提 掌握容器技术:Docker,Containerd等 K8S优势 ...

  3. k8s核心组件详细介绍教程(配超详细实例演示)

    本文实验环境基于上篇文章手把手从零开始搭建k8s集群超详细教程 本文根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps学习总结而来 k8s核心组件介绍 1 ...

  4. CoreOS集成Kubernetes核心组件Kubelet

    本文讲的是CoreOS集成Kubernetes核心组件Kubelet,[编者的话]本文为CoreOS官方博客发布的新闻和说明,介绍了CoreOS中对Kubernetes的核心组件kubelet的集成和 ...

  5. 手动安装k8s,但kubelet.service 启动失败

    k8s的kubelet.service 启动失败 #systemctl status kubelet.service ● kubelet.service - Kubernetes API Server ...

  6. 【kubernetes/k8s源码分析】kubelet cri源码分析

    CRI基本原理 早期的 kubernetes 使用 docker 作为默认的 runtime,后来又加入 rkt,每加入一种新运行时,k8s 都要修改接口.container runtime 加入,不 ...

  7. Kubernetes 核心组件 kubelet

    Kubelet Kubernetes 的初始化系统(init system) • 从不同源获取 Pod 清单,并按需求启停 Pod 的核心组件: • Pod 清单可从本地文件目录,给定的 HTTPSe ...

  8. kubernetes(六)k8s核心组件学习

    1.1 Master和Node Master K8S集群中的控制节点,负责整个集群的管理和控制,可以做成高可用,防止一台Master不可用. 其中有一些关键的组件:API Server,Control ...

  9. K8S架构设计及工作流程分析

    Kubernetes架构设计 核心组件 api server 功能 controller manager 负责维护集群的状态 scheduler 负责资源的调度按照预定的调度策略将Pod调度到相应的机 ...

最新文章

  1. 【stanford C++】容器III——Vector类
  2. 构造函数 原型对象 对象实例 图
  3. JVM 1.类的加载、连接、初始化
  4. 登录mysql报错2059,navicat连接mysql报错2059如何解决
  5. DNS原理及简单配置
  6. 毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割
  7. 阿姆斯特朗数 matlab,数学实验报告
  8. 关于二叉堆(优先队列)的其他操作及其应用
  9. 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并
  10. KVC、KVO实现过程
  11. 求你了,听我一句劝吧,这几个玩意就别学了!
  12. 模块目录下site.php,使用apache配置为每个站点指定PHP包含目录
  13. 数据结构 5分钟带你搞定哈希表(建议收藏)!!!
  14. 使用win10 hyper-v安装linux系统
  15. 看见几篇文章,收藏一下。
  16. Linux系统软件看门狗
  17. 三维绘图plot3命令ezplot3命令三维网格命令mesh命令
  18. 初学者如何快速入门深度学习?
  19. 职场新人必修之苦逼初感悟
  20. 手把手教你免费、批量转换HEIC图片到JPG

热门文章

  1. 小熊的人生回忆(八)
  2. 诗和远方:无题(五十)
  3. Android学习之四大组件简单介绍
  4. 叶修手速900什么概念_什么是数学?数学是探索的过程
  5. 华为v5服务器安装操作系统,v5服务器
  6. openresty + nginx-http-sysguard 调研使用
  7. DDGScreenShot —图片加各种滤镜高逼格操作
  8. 用DELETE删除的文件怎么免费找回不用购买不用注册码
  9. 13.SpringMVC核心技术-异常处理
  10. js-jquery-插件开发(一)