jjzjj

使用 KubeKey 搭建 Kubernetes/KubeSphere 环境的"心路(累)历程"

胡说云原生 2023-03-28 原文

今天要干嘛?

今天我要给 KubeKey 挑个刺!

身为一个 KubeSphere Community Member,至今为止我居然没有用过 KubeKey,是不是很过分?说出来都觉得没脸在 KubeSphere 社区立足啊!

想当年开始玩 KubeSphere 时,每走一步我都觉得“不和谐”。虽说 KubeSphere 早已经有了足够的知名度和大量的企业用户,但是我总能挑出“刺”,天天给 KubeSphere 社区提意见建议……

没错,最终他们“受不了”了,决定邀请我加入 KubeSphere 社区,成为一名光荣的 Member!

现在我自己也搞开源社区了。自从开始管理 DevStream 开源社区后,我基本就没有精力参与 KubeSphere 社区了。哎,一颗躁动的心,一双不安分的手!我得做点啥,但是开发我是没精力参与了,要不,发挥一下我的“臭毛病” - 晚期的强迫症和极致的细节洞察力,去挑挑刺吧!

没错!

我决定试用一下 KubeKey!一方面把这些“刺”反馈给 KubeSphere 社区,帮助他们进一步完善 KubeKey 的使用体验!另外一方面在这个过程中熟悉 KubeKey 的用法,看下能不能找到 DevStream 和 KubeSphere 协作的点,比如用 DevStream 简化 KubeSphere 的安装部署和配置过程。

在哪里干?

KubeSphere 社区给了我一个开发机,一台 Linux vm,酷!我就在这个 Linux vm 上“干”它吧!

从哪里开始干?

这还不简单,README 文档呀!

快速开干!

我们在文档里找 Quick Start,没错,有,大致长这样:

{{<

开炮!

看到这个日志,是不是看着特别像“no errors, no warnings”,一派祥和,歌舞升平,马上可以用 kubectl 命令看下崭新的 Kubernetes 集群了!(不要和我杠单节点 k8s 环境是不是集群,官方称之为“单节点集群”)

我就不演示 kubectl get xxx 了,结果惨不忍睹!我们仔细看这个输出日志,对,细品,有没有发现这里用了几行非 error 级别的日志告诉我们需要先安装:

  • conntrack
  • socat
给 KubeKey 的建议1:这里是不是用 error level logs 更合理一些?

给 KubeKey 的建议2:能不能日志里直接告诉用户需要先安装 conntrack 和 socat,并且同时打印出安装命令?(我知道 centos 和 ubuntu 安装方式不一样,不过可选的命令集合其实很有限,kk 获取系统类型也很容易,给用户更友好的提示其实很容易做到)

给 KubeKey 的建议3:表格里那么多项没有 y 的,到底哪些是必须有的哪些是不必须的?这个结果让用户看得心慌:我需要先安装那么多东西才能开始用 kk?望而却步啊!

解决依赖问题再继续干!

回到文档,其实仔细看可以在这里发现前置依赖,就是这段文字太长了,让人有点没耐心仔细看完。

还是 Google 大法好用!我们照着这个思路执行下面命令:

yum -y install conntrack-tools yum -y install socat 不出意外的话这一步很难失败。对,如果你失败了,那就是意外。真的失败了,那就是 yum 配置问题了,明白怎么处理吧?

然后继续执行 ./kk create cluster,看下能不能得到和谐的输出。(记得如果环境不够“科学”,要先执行export KKZONE=cn,否则你会在某一步卡半天,卡到怀疑人生,无法判断是网络太慢还是网络不通)

给 KubeKey 的建议4:当命令卡住的时候,比如镜像下载太慢时,有没有超时逻辑?或者能不能定时输出一个日志告诉用户“没有卡死”?或者显示一下下载的进度条?总之不要长时间没有日志,用户会忍不住去 Ctrl+c,然后一脸迷茫,下一步干啥?

比刚才和谐了,不过第一行日志很不和谐。

如果 Failed 影响大,比如会让某个功能不可用,那么应该用 error 级别,这样我会尝试去修复;反之 WARN 级别的意思就是“你可以忽略,忽略也能用”。OK,我选择忽略。(我不一定真的忽略,但是很多用户肯定会这样想。)

给 KubeKey 的建议5:尽量避免 WARN 日志,尤其是 WARN 配合 Failed 一起用,让用户又觉得这个错误很严重,又觉得可以忽略。

接着就看网络环境了。

顺利的话,最后可以看到这样的日志:

Installation is complete. Please check the result using the command: kubectl get pod -A 让我们执行 kubectl get pod -A,看下“豌豆荚”们是不是正常:

$ kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-75ddb95444-6dg9b 1/1 Running 0 30m kube-system calico-node-rqqrk 1/1 Running 0 30m kube-system coredns-5495dd7c88-9hlrp 1/1 Running 0 30m kube-system coredns-5495dd7c88-nlp5d 1/1 Running 0 30m kube-system kube-apiserver-i-hmqwjh0m 1/1 Running 0 30m kube-system kube-controller-manager-i-hmqwjh0m 1/1 Running 0 30m kube-system kube-proxy-x69p9 1/1 Running 0 30m kube-system kube-scheduler-i-hmqwjh0m 1/1 Running 0 30m kube-system nodelocaldns-vd77n 1/1 Running 0 30m 我勒个乖乖,Amazing 啊!清一色的 Running、1/1 且 0 restarts,堪称完美!

如何干翻重来?

装好了,然后呢?

干翻重来吧,因为直接执行 ./kk create cluster 并不带 KubeSphere。我们体验过 k8s 的安装过程了,整体还是挺简单易用的。下面试下带 KubeSphere 的玩法吧。

干翻操作:

./kk delete cluster 执行完这个命令后,k8s 集群会被删掉。当然,对应的 kubectl 和 docker images 我不希望被删掉,事实证明 KubeKey 也不会把它们删掉。对,我验证了:

连着 KubeSphere 一起干!

命令是如此的简单,只需要加一个 flag 就够了:

./kk create config --with-kubesphere

干不过,输了。

结果不美丽啊:

{{<

我。。。

你。。。

你给我一个 WARN 后就直接挂了?

给 KubeKey 的建议6:WARN 日志前面提到了,这里再次印证我的观点,日志级别要严谨,WARN 要少用。

这个错误,,,看起来是要 Google 一会了。但是我懒啊!这不就是和 docker 安装方式有关嘛(我猜可能和版本也有关系),我卸掉 docker,让 KubeKey 来安装总行了吧!

给 KubeKey 的建议7:如果你们知道这个错误的解决方案,请把方法(或者参考资料链接)贴到日志里,不要期待用户可以轻松 Google 一下解决。当然,我不能接受你说我解决不了,哈哈,不过现在是晚上10:30分,我想快点打完收工了,不查了。

其实这个机子本来没有 docker,为什么我会提前安装呢?因为我勤劳?不存在的。我是被这段内容误导的:

看这个缩进级别,你瞟一眼,是不是最显眼的是下面的 Note?Note 里说先安装 docker,然后假如你很熟悉 docker,是不是就顺手先装了 docker 在继续看文档?

对,我就跪在了这里。装了 docker 才发现,这个 Note 是针对 Build Binary from Source Code 的 Note。。。

给 KubeKey 的建议8:这里的文档也优化下吧,让 Note 看起来不那么像全局 Note。

重整旗鼓,继续干!

上来就是一套组合拳:

yum remove docker ./kk create cluster --with-kubesphere 不出我所料,错误绕过去了!

对,我就是这么心安理得,可以忍住不去查前面这个错误是怎么回事,我选择绕过后晚上还是可以睡得香喷喷!我相信 KubeSphere 社区过几天会告诉我答案的。

截图看不到效果,大家脑补一下上面这个箭头会左右移动,对,动态的!太可爱了吧!明天我要去问下谁写的这个代码,真是个可爱的程序员!

在等这个箭头停下来的时间里,再给 KubeKey 加一个建议吧:

给 KubeKey 的建议9:这里的文档也优化下吧,风格一致更优雅,要么都写一个“示例”版本,要么都用[version]占位。

给 KubeKey 的建议10:y 和 yes 在用户意图里绝对是一模一样,要不要兼容下?包括大小写(我没有测试大小写是不是兼容)

给 KubeKey 的建议11:如果一次安装长时间卡住,可能是网络问题。这时候如果 Ctrl+c 然后重新执行安装,会出现这种情况,没错,两个 ks-installer。当然,我知道需要先 delete 一下就能绕过去,但是或许 kk 能够识别到用户没有 delete 并且给出提示,那就更“优雅”了。

再次重整旗鼓,继续干!

由于我用的云主机,前面安装过程太久,我去洗了个澡,回来后终端断开连接了。没错,再次进去的时候我忘记执行 export KKZONE=cn 了,所以失败了一次。再次执行的时候忘记 delete 了,所以再失败了一次。

于是,我要 delete 了:

惨不忍睹,惨绝人寰啊!!!

你给我装的 docker 呀,怎么还能有这个错误?

同样,你告诉我 WARN,我是不会上心的。

无视

and

继续!

好玩的事情是,这次看着错误信息似乎,,,和前面没啥区别呀。。。但是没有直接退出程序,而是继续往下走了!好吧,我是不会去研究这个错误的!

又到了这个“可爱到爆”的箭头了,继续漫长的等待吧~

不对劲啊,为什么那么久,是不是挂了?

好吧,唤醒一下我沉睡多年(准确说是大半年)的 k8s 排错技能!

我看到了 ks-installer pod 的错误 events 信息:

有意思,这是个大 bug 了吧,镜像不存在?我得去问一下内部人员:

给 KubeKey 的建议11:对着文档走不通安装过程,这算大 bug 了,不用我细说怎么 fix 了吧。

一鼓作气,再而衰,三而竭,竭前最后挣扎着干一次

没力气打“组合拳”了,一条简单的命令,然后小拳拳敲个回车:

./kk create cluster --with-kubesphere v3.2.1

好家伙,一把给我整到了晚上11点。。。我不要面子的啊,我在家办公还要加班啊,我是朝十晚四午休三小时的男人啊……

不过说实话,看到这个熟悉的日志,还是很亲切的!毕竟去年不知道看了多少遍这个日志!(别不信,我是深度玩过的,有视频为证)

继续看下 pod

很和谐!Amazing 啊!

(其实没有特别和谐,restarts 不是全0。不过没关系,我知道这不影响功能,只是安装过程还有优化的空间而已。)

你想看最后的 Dashboard ?我也想!

不过我没有 ELB,焦急等待中……(委托大佬给我配置 ELB 去了)

半小时后……

登录页面来了!

进去后,熟悉的感觉,熟悉的味道!

后面我一定要再写几篇文章介绍下 KubeSphere 怎么玩!当年那一堆笔记,那些付在 KubeSphere 上的青春,不写点啥可惜了!

最后的总结

  1. 官方文档比 GitHub 的 README 更适合“普通用户”;
  2. 好困啊!!!我要睡觉了,总结啥嘛,没啥好总结的。

最后的最后

转载请注明出处!

更多我的文章,请移步我的个人网站:https://www.danielhu.cn

更多 DevStream 团队的文章,请移步 DevStream 博客网站:https://blog.devstream.io

想要及时收到我的最新文章,请关注我的个人公众号:胡说云原生

有关使用 KubeKey 搭建 Kubernetes/KubeSphere 环境的"心路(累)历程"的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐