kubeadm源码解读与实战

这篇具有很好参考价值的文章主要介绍了kubeadm源码解读与实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

kubeadm源码解读与实战

1.1-go语言核心开发之go module依赖管理系统

kubeadm源码解读与实战

在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默认已经可以直接使用

kubeadm源码解读与实战

首先,您需要确保已安装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"

kubeadm源码解读与实战

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())
}

kubeadm源码解读与实战

出现一个问题,它抱怨找不到软件包,没有必要的模块提供包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

kubeadm源码解读与实战

 go get之后您还将看到一个名为go.sum的文件。该文件的目的是跟踪您正在使用的程序包的哪个代码库。 

kubeadm源码解读与实战

它在我们拥有的每个依赖项上都有一个加密哈希。如果您正在忙于同时处理多个人的繁忙代码库,这将非常有帮助
如果某人使用的软件包版本与应用程席打算使用的版本不同,它将发出投诉,如果您的第三方库具有多个版本,并且您想使用其地版本,则可以更改版本号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分支当中去了

让我们尝试运行,发现还有其他的依赖项,我们想一下如果第三方库里面如果有很多的依赖怎么办 

kubeadm源码解读与实战

不过我们接着让我们看一下Go模块随附的一些其他命令。go mod tidy:使用此命令可以获取在模块中测试所需的所有依赖项

go mod tidy

观察一下go.mod,这里增加了x/text的项目地址

kubeadm源码解读与实战

尝试我们再次调用第三方库里面go-randomdata里面的SillyName(),现在没有问题了。

1.3-go语言核心开发cobra库探索认识Cobra库

kubeadm源码解读与实战

这几年由于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

kubeadm源码解读与实战

话不多说,下面开始安装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

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包