controller-manager学习三部曲之一:通过脚本文件寻找程序入口

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

关于《controller-manager学习三部曲》

  • 《controller-manager学习三部曲》是欣宸原创的kubernetes深入学习系列之一,在前面的《client-go实战》系列中,咱们通过反复的实践,对controller的开发和使用已经很熟练了,接下来就该称热打铁去研究kubernetes的源码,了解它的controller是如何设计和实现的,这里面一定有很多值得学习的地方,掌握了这些,反过来又能对咱们自己开发controller有所帮助,所以,别犹豫啦,一起来看看kubernetes的controller吧
  • 整个《controller-manager学习三部曲》由以下三部分内容组成
  1. 寻找入口:kubernetes博大精深,那么多代码和脚本,如何找到controller-manager的代码,以及程序启动的入口?
  2. 源码分析:这个整个系列的核心,面对诸多controller,kubernetes如何做到这两件事情:第一,将启动命令中的各种flag(cobra中的flag)传递给各个controller,第二,创建和启动每个controller
  3. 典型controller:controller-manager只负责将controller启动,具体的controller功能是各不相同的,这里会挑一个典型的controller来学习
  • 注意:整个系列用的源码来自kubernetes的master分支,go版本是1.20

关于controller-manager

  • 下图是kube-system这个namespace下面所有pod的信息,黄色箭头所指即controller-manager,它负责诸多内置controller的创建和启动,还有就是从启动命令中搜集参数,以便各controller使用
    在这里插入图片描述

本篇概览

  • 本文是《三部曲》的第一篇,咱们要从kubernetes源码中找到controller-manager的入口,以便后续的学习
  • controller-manager是个典型的go模块工程,所以结构和脚本也是咱们常见的格式(只不过内容多了些)
  • 本篇从Makefile入手开始分析,找到编译controller-manager的详细逻辑,没什么难度,只是几个脚本的阅读而已

编译文件

  • 执行make命令会用到Makefile文件,里面会调用hack/make-rules/build.sh
    在这里插入图片描述
  • 打开build.sh,里面调用了kube::golang::build_binaries
    在这里插入图片描述
  • 在golang.sh文件中查看kube::golang::build_binaries方法,下面摘取最重要的内容,可见构建用的参数来自KUBE_ALL_TARGETS这个全局变量,咱们先记住这个KUBE_ALL_TARGETS,然后继续看构建的逻辑
    在这里插入图片描述
  • 这时候应该看到了build_binaries_for_platform,可见binaries的内容会被分别存入statics和nonstatics
kube::golang::build_binaries_for_platform() {# This is for sanity.  Without it, user umasks can leak through.umask 0022local platform=$1local -a statics=()local -a nonstatics=()local -a tests=()for binary in "${binaries[@]}"; doif [[ "${binary}" =~ ".test"$ ]]; thentests+=("${binary}")kube::log::info "    ${binary} (test)"elif kube::golang::is_statically_linked_library "${binary}"; thenstatics+=("${binary}")kube::log::info "    ${binary} (static)"elsenonstatics+=("${binary}")kube::log::info "    ${binary} (non-static)"fidone
  • 然后调用build_some_binaries方法
  if [[ "${#statics[@]}" != 0 ]]; thenbuild_args=(-installsuffix=static${goflags:+"${goflags[@]}"}-gcflags="${gogcflags}"-asmflags="${goasmflags}"-ldflags="${goldflags}"-tags="${gotags:-}")CGO_ENABLED=0 kube::golang::build_some_binaries "${statics[@]}"fiif [[ "${#nonstatics[@]}" != 0 ]]; thenbuild_args=(${goflags:+"${goflags[@]}"}-gcflags="${gogcflags}"-asmflags="${goasmflags}"-ldflags="${goldflags}"-tags="${gotags:-}")kube::golang::build_some_binaries "${nonstatics[@]}"fi
  • 最终在build_some_binaries方法中完成编译构建
    在这里插入图片描述
  • 至此,输入make后的大致流程算是知道了,接下来该回头看看那个重要的参数KUBE_SERVER_TARGETS

关于KUBE_ALL_TARGETS

  • 前面曾经提到,构建参数来自KUBE_ALL_TARGETS,这里来看下这个变量里面是啥,定义在golang.sh文件中,如下所示,是由多个变量组成的
readonly KUBE_ALL_TARGETS=("${KUBE_SERVER_TARGETS[@]}""${KUBE_CLIENT_TARGETS[@]}""${KUBE_TEST_TARGETS[@]}""${KUBE_TEST_SERVER_TARGETS[@]}"
)
  • 选其中一个来看看,这里选KUBE_SERVER_TARGETS,可见是每个需要构建的模块的路径
kube::golang::server_targets() {local targets=(cmd/kube-proxycmd/kube-apiservercmd/kube-controller-managercmd/kubeletcmd/kubeadmcmd/kube-schedulervendor/k8s.io/component-base/logs/kube-log-runnervendor/k8s.io/kube-aggregatorvendor/k8s.io/apiextensions-apiservercluster/gce/gci/mounter)echo "${targets[@]}"
}IFS=" " read -ra KUBE_SERVER_TARGETS <<< "$(kube::golang::server_targets)"
  • 现在终于清楚了,在编译构建kubernetes源码的时候,kube-controller-manager模块是用go install命令编译cmd/kube-controller-manager包下的源码生成的,也就是说这个服务的入口在下图位置
    在这里插入图片描述

启动命令分析

  • 找到了程序的入口,还要了解启动服务时的参数,这样在阅读源码时,面对各种不同入参的处理,也能做到心里有数,找准关键代码去看

查看启动命令

  • 找个现成的kubernetes系统,看一下真正运行的controller-manager的启动命令是啥样的
  • 以我自己测试用的kubernetes环境为例,先查看pod名
kubectl get pods -n kube-system
NAME                           READY   STATUS    RESTARTS       AGE
coredns-78fcd69978-jztff       1/1     Running   6 (35d ago)    125d
coredns-78fcd69978-ts7gq       1/1     Running   6 (35d ago)    125d
etcd-hedy                      1/1     Running   6 (35d ago)    125d
kube-apiserver-hedy            1/1     Running   7 (35d ago)    125d
kube-controller-manager-hedy   1/1     Running   11 (30h ago)   125d
kube-proxy-2qx6k               1/1     Running   6              125d
kube-scheduler-hedy            1/1     Running   11 (30h ago)   125d
  • 可见controller-manager的pod名是kube-controller-manager-hedy,执行以下命令即可查看看pod的详细信息
kubectl describe pod kube-controller-manager-hedy -n kube-system
  • 上述命令会输出大量信息,这里只展示我们最关心的内容,即controller-manager的启动命令
    Command:kube-controller-manager--allocate-node-cidrs=true--authentication-kubeconfig=/etc/kubernetes/controller-manager.conf--authorization-kubeconfig=/etc/kubernetes/controller-manager.conf--bind-address=0.0.0.0--client-ca-file=/etc/kubernetes/pki/ca.crt--cluster-cidr=100.64.0.0/10--cluster-name=kubernetes--cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt--cluster-signing-key-file=/etc/kubernetes/pki/ca.key--controllers=*,bootstrapsigner,tokencleaner--experimental-cluster-signing-duration=876000h--feature-gates=TTLAfterFinished=true,EphemeralContainers=true--kubeconfig=/etc/kubernetes/controller-manager.conf--leader-elect=true--port=0--requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt--root-ca-file=/etc/kubernetes/pki/ca.crt--service-account-private-key-file=/etc/kubernetes/pki/sa.key--service-cluster-ip-range=10.96.0.0/22--use-service-account-credentials=true
  • 可见启动controller-manager的时候,kubernetes向其传递了大量的flag
  • 至此,本篇的任务已经完成,咱们找到了应用的入口,也清楚了启动时会大概传入哪些参数,在接下来的文章该一同去深入学习controller-manager的源码了

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147536.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

弧度、圆弧上的点、圆的半径(r)、弧长(s)之间的关系

要计算弧度和圆弧上的点&#xff0c;需要知道以下几个要素&#xff1a; 圆的半径&#xff08;r&#xff09;&#xff1a;即圆的中心到圆周上任意一点的距离。 弧长&#xff08;s&#xff09;&#xff1a;从圆周上的一个点到另一个点所经过的弧长。 弧度&#xff08;θ&#x…

ADO连接Access的前期绑定方法实例(下)

【分享成果&#xff0c;随喜正能量】眾生多悲苦&#xff0c;發願‬菩提心。願今天所有聽見我、看見我、憶念我的眾生&#xff0c;因我心而‬生喜悅&#xff01;除消身心的痛苦&#xff01;種下脫解‬的種子&#xff01;願我等‬身心念力所及之處一切眾切‬生因佛得度&#xff0…

CSS基础语法第二天

目录 一、复合选择器 1.1 后代选择器 1.2 子代选择器 1.3 并集选择器 1.4 交集选择器 1.4.1超链接伪类 二、CSS特性 2.1 继承性 2.2 层叠性 2.3 优先级 基础选择器 复合选择器-叠加 三、Emmet 写法 3.1HTML标签 3.2CSS 四、背景属性 4.1 背景图 4.2 平铺方式 …

CF505B Mr. Kitayuta‘s Colorful Graph

Mr. Kitayuta’s Colorful Graph 题面翻译 给出一个 n n n 个点&#xff0c; m m m 条边的无向图&#xff0c;每条边上是有颜色的。有 q q q 组询问 对于第 i i i 组询问&#xff0c;给出点对 u i , v i u_i,v_i ui​,vi​。求有多少种颜色 c c c 满足&#xff1a;有至…

【DRAM存储器九】SDRAM介绍-read、write、Precharge、DQM、Power down、Clock Suspend命令

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光SDRAM数据手册》、《PC SDRAM specification》 目录…

JUC第十三讲:JUC锁: ReentrantLock详解

JUC第十三讲&#xff1a;JUC锁: ReentrantLock详解 本文是JUC第十三讲&#xff0c;JUC锁&#xff1a;ReentrantLock详解。可重入锁 ReentrantLock 的底层是通过 AbstractQueuedSynchronizer 实现&#xff0c;所以先要学习上一章节 AbstractQueuedSynchronizer 详解。 文章目录 …

HTML的学习 Day02(列表、表格、表单)

文章目录 一、列表列表主要分为以下三种类型&#xff1a;1. 无序列表&#xff08;Unordered List&#xff09;&#xff1a;2. 有序列表&#xff08;Ordered List&#xff09;&#xff1a;将有序列表的数字改为字母或自定义内容li.../li 列表项标签中value属性&#xff0c;制定列…

MySQL 索引优化实践(单表)

目录 一、前言二、表数据准备三、常见业务无索引查询耗时测试3.1、通过订单ID / 订单编号 查询指定订单3.2、查询订单列表 四、订单常见业务索引优化实践4.1、通过唯一索引和普通索引优化通过订单编号查询订单信息4.2、通过普通联合索引优化订单列表查询4.2.1、分析查询字段的查…

考虑源荷不确定性的热电联供微网优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Blender 导出 fbx 到虚幻引擎中丢失材质!!!(使用Blender导出内嵌材质的fbx即可解决)

目录 0 引言1 Blender导出内嵌纹理的fbx模型 0 引言 我在Blender处理了一些fbx模型后再次导出到UE中就经常出现&#xff0c;材质空白的情况&#xff08;如下图所示&#xff09;&#xff0c;今天终于找到问题原因&#xff0c;记录下来&#xff0c;让大家避免踩坑。 其实原因很简…

Git使用【上】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 前言 先前有些git命令我在我的其它文章里面已经写过&#xff0c;若要查看可参考【Linu…

leetCode 55.跳跃游戏 贪心算法

给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入…

安防视频/集中云存储平台EasyCVR(V3.3)部分通道显示离线该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

知识分享 钡铼网关功能介绍:使用SSLTLS 加密,保证MQTT通信安全

背景 为了使不同的设备或系统能够相互通信&#xff0c;让旧有系统和新的系统可以集成&#xff0c;通信更加灵活和可靠。以及将数据从不同的来源收集并传输到不同的目的地&#xff0c;实现数据的集中管理和分发。 通信网关完美克服了这一难题&#xff0c;485或者网口的设备能通过…

深度学习(1)---卷积神经网络(CNN)

文章目录 一、发展历史1.1 CNN简要说明1.2 猫的视觉实验1.3 新认知机1.4 LeNet-51.5 AlexNet 二、卷积层2.1 图像识别特点2.2 卷积运算2.3 卷积核2.4 填充和步长2.5 卷积计算公式2.6 多通道卷积 三、池化层 一、发展历史 1.1 CNN简要说明 1. 卷积神经网络&#xff08;Convolut…

PyCharm中使用pyqt5的方法2-2

1.2 是否下载成功 按照以上步骤安装了“pyqt5”、“pyqt5-tools”模块和“pyqt5designer”模块后&#xff0c;可以打开保存这三个模块的路径&#xff0c;找到其对应的文件夹&#xff0c;即可验证是否下载成功。 获取PyCharm保存下载模块路径的方法是&#xff0c;在PyCharm界面…

Sound/播放提示音, Haptics/触觉反馈, LocalNotification/本地通知 的使用

1. Sound 播放提示音 1.1 音频文件: tada.mp3&#xff0c; badum.mp3 1.2 文件位置截图: 1.3 实现 import AVKit/// 音频管理器 class SoundManager{// 单例对象 Singletonstatic let instance SoundManager()// 音频播放var player: AVAudioPlayer?enum SoundOption: Stri…

Linux系统编程系列之线程

一、什么是线程 线程&#xff08;Thread&#xff09;是计算机中的基本执行单元&#xff0c;是操作系统调度的最小单位。线程是进程内的一个独立执行流程&#xff0c;一个进程可以包含多个线程&#xff0c;这些线程共享进程的资源&#xff0c;但每个线程都有自己的独立栈空间以及…

挺进欧洲:中国汽车如何破解品牌与成本双重困境?

摘要&#xff1a;2022年&#xff0c;中国超越德国&#xff0c;跻身全球第二大汽车出口大国&#xff0c;仅次于日本。历经国内市场的激烈竞争和技术积累,中国汽车品牌凭借在新能源技术上的优势和制造力,决定挑战欧洲-BBA(奔驰、宝马、奥迪)的主场。令人惊讶的是,尽管在21世纪初,…

PCB放置过孔技巧

合理的放置过孔能有效的节约面积。 我们根据嘉立创的pcb工艺能力中写出单双面板最小过孔为0.3mm(内径)/0.5mm(外径) 设置过孔尺寸外直径为24mil&#xff08;0.61mm&#xff09;&#xff09;内直径为12mil&#xff08;0.305mm&#xff09; 嘉立创PCB工艺加工能力范围说明-嘉立…