kubeadm源码解读与实战
1.1-go语言核心开发之go module依赖管理系统
在Go快速发展的过程中他出现了一些比较优秀的依赖管理工具,比 govendor、dep、glide等 ,有-些差不成了半官方的工具了,但这工具都还是需要依赖于 GOPATH,不过官方并不认同这种方式,在v1.11 中加入了 Go Module作为官方包管理形式,不过在 1.11 和1.12的 Go 版本 gomod 是不能直接使用的,可以通过 go env命令返回值的 GOMOD字段是否为空,来判断是否已经开启了gomod,如果没有开启,可以通过设置环境变量export GO111MODULE=on 开启。
目前 gomod在Go v1.12 功能基本稳定,目前从版本 v1.13 将默认开启,当然现在我使用的是1.16.3,这个go mod默认已经可以直接使用
首先,您需要确保已安装G0 1.16.3。但是,如果您是docker的狂热者,并且现在不想安装G0 1.16.3,则可以启动G0 1.16.3容器,并使用它来使用Go module.
如果你还没有安装docker,可以在此链接进行安装https://docsdockercom/engine/install/centos/
docker run
-itd
--rm
--name golang golang:1.16.3-alpine3.13
我们的第一个应用程序!在容器内,您可以看到go路径设置为 /go
# docker exec -it golang sh
# echo $GOPATH
# /go
我将进入自己的主目录,并为我们的应用程序创建一个文件夹,并在Testapp而不是在GOPATH中设置我的应用
~# mkdir Testapp
~# lS
~# Testapp
现在,让我们在TestApp文件夹中编写应用程序并将其命名 main.go你要知道任何Go源文件中的第一行始终是一条package语句,用于定义文件所属的代码束,对于像这样的可执行文件,该package语句必须指向该main软件包
接下来,添加一条import语句,你可以在其中列出该应用程序所需的所有库这里的导入的是fmt库,提供了格式化的文本输入输出
package main
import (
"fmt"
)
func main(){
fmt.PrintIn("Running the TestApp")
}
现在运行它。
1 ~/Testapp # go run main.go
Running the TestApp
现在我们发现可以在GOPATH之外运行Go程序了!
但是此应用程序运行时不会引发任何错误,这是因为它仅使用go里面一个正常不过的标准库fmt。
但是,我们工作当中会使用第三方库,比如我们感兴趣的kubernetes,我们找到kubernetes/apiserver.go at release-1.21 · kubernetes/kubernetes · GitHub
apiserver.go的代码,导入了第三方的库,并使用里面的依赖
"github.com/spf13/pflag"
1.2-go语言核心开发之go module之引用第三方库的使用
让我们尝试添加第三方库,看看它是如何工作的。我将使用go-randomdata作为我们的第三方库如果你对这个go-randomdata感兴趣,可以链接到https://github.com/Pallinder/go-randomdata
它主要就是使您可以生成随机数据的这么一个开源的帮助套件,比如打印一个随机的傻名字,打印随机一个女性名字,打印随机电子邮件,打印随机城市的名称
下面在这种情况下,我将SillyName()在第一个print语句之后调用该函数,这个函数则进行随机打印一个愚蠢的名字。
这就是更新代码的样子。
~/Testapp # cat main.go
package main
import (
"fmt"
"github.com/Pallinder/go-randomdata"
)
func main(){
fmt.PrintIn("Running the TestApp")
fmt.PrintIn(randomdata.SillyName())
}
出现一个问题,它抱怨找不到软件包,没有必要的模块提供包github.com/Pallinder/go-randomdata:在当前目录或任何父目录找不到go mod。
要将go模块初始化为您的应用程序,您可以运行go modules init xxx
go mod init Testapp
应用程序目录中看到一个名为go.mod的新文件,除了模块的定义之外,目go.mod中没有任何内容,现在我们尝试再次go run运行,这里会告诉我们没有依赖的模块,需要运行go get,默认情况
下,Goang 不会去自动更新模块的,如果自动更新的话是不是又会造成依赖管理的混乱了,所以我们需要明确告诉 golang 我们需要更新模需要单独运行go get将依赖下载下来,才能运行go run
main.go
~/Testapp #go run maln.go
main.go:4:9: no required module provides package github.com/Pallinder/go-randomdata; to add it:
go get github.com/Pallinder/go-randomdata
运行go get -u -v 指定依赖的第三方库地址
这个地方我们还用到了go get的命令
课程也有可能刚入门go语言的同学,这个地方,我们也介绍一下go get的使用
go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。整个过程就像安装一个 App 一样简单。这个命令在内部实际上分成了两步操作: 第一步是下载源码包,第二步是执行 go install。需要注意的go get依赖git命令,前提需要安装git
参数介绍:
。-d 只下载不安装
。-f 只有在你包含了-u 参数的时候才有效,不让-u 去验证 import 中的每一个都已经获取了,这对于本地 fork 的包特别有用
。-fix 在获取源码之后先运行 fix,然后再去做其他的事情
。-t 同时也下载需要为运行测试所需要的包
。-u 强制使用网络去更新包和它的依赖包
。-v 显示执行的命令
比如下面我们将要安装的go-randomdata,我们用到了-u -v去获取go-randomdata的源码包,第二步也就是去用go install,很多时候我们也会用到go build来编译,这个go build命今和go install类似。附加参数绝大多数都可以与 go build 通用。go install 只是将编译的中间文件放在 GOPATH 的 pkg 目录下,以及固定地将编译结果放在 GOPATH 的 bin 目录下.
当我们go get还发现一个间题,我们可以看到请求的是proxy.golang.org,这个地默认是国外,一般需要科学上网才能获取到,所以我们需要国内的维护的goproxy.cn,这个是中国受信任的go
modules管理开源地址,由此我们一般不能科学上网,需要使用此代理解决此问题,https:/github.com/goproxy/goproxy.cn
go get -u -v github.com/Pallinder/go-randomdata
# 强烈推荐配置该环境变量,配置国内gomod的代理地址
~/Testapp # export GOPROXY=https://goproxy.cn
当使用此变量之后我们这样就可以直接获取到第三方库的依赖了
当依赖拉取成功之后,我们可以看到,它向我们显示,为了运行我们的应用,go-randomdata软件包需要v1.2.0
go get之后您还将看到一个名为go.sum的文件。该文件的目的是跟踪您正在使用的程序包的哪个代码库。
它在我们拥有的每个依赖项上都有一个加密哈希。如果您正在忙于同时处理多个人的繁忙代码库,这将非常有帮助
如果某人使用的软件包版本与应用程席打算使用的版本不同,它将发出投诉,如果您的第三方库具有多个版本,并且您想使用其地版本,则可以更改版本号go get再次运行,假设我想改用v1.1.0的go-randomdata。我只是将v1.2.0更改为v1.1.0
运行go get package@version命令来更新到指定版本的模块
您将看到go.mod和go.sum文件的相应更改
go get -u -v github.com/Pallinder/go-randomdata@v1.1.0
现在我相当于切换了分支代码,换到了1.1.0分支当中去了
让我们尝试运行,发现还有其他的依赖项,我们想一下如果第三方库里面如果有很多的依赖怎么办
不过我们接着让我们看一下Go模块随附的一些其他命令。go mod tidy:使用此命令可以获取在模块中测试所需的所有依赖项
go mod tidy
观察一下go.mod,这里增加了x/text的项目地址
尝试我们再次调用第三方库里面go-randomdata里面的SillyName(),现在没有问题了。
1.3-go语言核心开发cobra库探索认识Cobra库
这几年由于kubernetes、docker、istio等云原生技术涌入,已经成为我们it基础设施当中,运维开发人员一门必会的技术了,而这些技术都是采用go语言去开发出来的,当您学习golang时,经常会遇到golang非常适合构建cli工具”的知识。
什么是CLI? (命令行界面)
CLI根据软件工程的基本原理进行工作,接受输入,对其进行处理并给出输出
在Mac或linux中、它的名称是众所周知的terminal,当我们使用令进行传入的时候它将进行处理并输出到页面,您可以使用许多CLI,例如npm,node,go,python,docker,Kubemnetes等,所有这
些CLI都是与软件进行交互的理想界面。
为什么他们仍在使用CLI?
- 它轻巧,快速。
- 最小或没有依赖性
- 最适合系统管理和基于任务的自动化等。
对此我们下面将会介绍一个go核心开发会使用到的cobra库Cobra(眼镜蛇)既是用于创建功能强大的现代CLI应用程序的库,又是用于生成应用程序和命令文件的程序。cobra被用于许多Go项目中,例如Kubernetes、Hugo和Github CLl、docker、istio等。包含使用Cobra的项目的更广泛的列表。
这些项目也比较多,还有我们云原生场景应用比较多的etcd、helm、istio等等https://github.com/spf13/cobra/blob/v1.1.3/projects_using_cobra.md
大家可以在上面的链接这里去找到关于使用cobra的项目
当然kubeadm的源码使用的库也是是Cobra做的,而且大量使用,Go语言中,我们可以使用Cobra很方便的进行命令行工具的开发,Cobra提供了自己的程序,该程序将创建您的应用程序并添加所需的任何命令。
Cobra 是构建在命今、参数和标识符之上的
· Commands 表示执行动作
· Aras 就是执行参数
· flags 是这些动作的标识符
比如我们使用的kubeadm
我们看到了kubeadm token增加了执行参数,以及执行的动作,还有动作的flags
# kubeadm token --help
Usage:
kubeadm token [flags]
kubeadm token [command]
Available Commands :
create Create bootstrap tokens on the server
delete Delete bootstrap tokens on the server
generate Generate and print a bootstrap token, but do not create it on the server
list List bootstrap tokens on the server
话不多说,下面开始安装cobra的库工具并且熟悉一下它的原理
首先我的演示环境使用的go版本是1.16.3,推荐版本不低于1.11,因为我们要使用go module
接着上个章节的课程,我们继续使用上次的环境
1.4-go语言核心开发cobra库探索安装Cobra库开发环境
1.5-go语言核心开发cobra库探索Cobra源码解读
2.1-kubeadm的诞生
2.2-谈谈kubeadm的架构及组件
2.3-kubeadm核心源码部分
2.4-kubeadm reset源码
文章来源地址https://www.toymoban.com/news/detail-436319.html文章来源:https://www.toymoban.com/news/detail-436319.html
3.1-kubeadm init初始化流程核心代码剖析
3.2-kubeadm init初始化流程核心代码prelfight源码
3.3-kubeadm init初始化流程核心代码certs源码
3.4-kubeadm init初始化流程核心代码KubeConfig源码
3.5-kubeadm init初始化流程核心代码KubeletStart源码
3.6-kubeadm init初始化流程核心代码Control-plane源码
3.7-kubeadm init初始化流程核心代码Etcd源码
3.8-kubeadm init初始化流程核心代码WaitControl源码
3.9-kubeadm init初始化流程核心代码UploadConfig源码
3.10-kubeadm init初始化流程核心代码UploadCerts源码
3.11-kubeadm init初始化流程核心代码MarkControlPlane源码
3.12-kubeadm init初始化流程核心代码BootstrapToken源码
3.13-kubeadm init初始化流程核心代码KubeletFinalize源码
3.14-kubeadm init初始化流程核心代码Addons源码
4.1-kubeadm join工作流程剖析 (源码到实践深入浅出)
5.1-kubeadm-ansible环境配置介绍
5.2-ansible-site入口配置介绍
5.3-kubeadm-ansible roles角色介绍之系统初始化
5.4-kubeadm-ansible roles角色介绍之全局变量
5.5-kubeadm-ansible roles角色介绍之容器运行时(docker离线p
5.6-kubeadm-ansible roles角色介绍之容器运行时(docker da
5.7-kubeadm-ansible roles角色介绍之kubeadm init自动化
5.8-kubeadm-ansible roles角色介绍之kubeadm init co
5.9-kubeadm-ansible roles角色介绍之join节点自动化流程实现
5.10-kubernetes-operator概念介绍
5.11-kubeadm-ansible网络CNI插件 Calico-operator插件
5.12-kubeadm-ansible实现一键安装k8s集群
5.13-kubeadm-ansible实现一键扩容k8s-Node节点
5.14-kubeadm-ansible实现一键卸载(清理整个部署环境)整个集群
到了这里,关于kubeadm源码解读与实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!