今天要干嘛?

今天我要给 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. 理解Kubernetes(1):手工搭建Kubernetes测试环境

    系列文章: 1. 手工搭建环境 1. 基础环境准备 准备 3个Ubuntu节点,操作系统版本为 16.04,并做好以下配置: 系统升级 设置 /etc/hosts 文件,保持一致 设置从 0 节点上无 ...

  2. mac上利用minikube搭建kubernetes(k8s)环境

    友情提示:对于初次接触k8s的同学,强烈建议先看看本文最后的参考文章. 环境: mac os(Mojave) 前提:先安装好kubectl (brew install kubectl) .docker ...

  3. 15分钟在笔记本上搭建 Kubernetes + Istio开发环境

    11月13~15日,KubeCon 上海大会召开,云原生是这个秋天最火热的技术.很多同学来问如何上手 Kubernetes和Istio 服务网格开发.本文将帮助你利用Docker CE桌面版,15分钟 ...

  4. 二进制搭建kubernetes多master集群【开篇、集群环境和功能介绍】

    本文主要说明kubernetes集群使用组建的版本和功能介绍.. 一.组件版本 Kubernetes 1.12.3 Docker 18.06.1-ce Etcd 3.3.10 Flanneld 0.1 ...

  5. PC(win10)上搭建 kubernetes + docker 集群环境

    最近kubernetes很火,加上我又在寻找适合快速搭建测试环境的方法,kubernetes的理念很适合用于测试环境的搭建. 因此在学习的过程中写下此教程(记录)以供回顾. 0x00 环境准备 0x0 ...

  6. 使用 kind 快速搭建 kubernetes 环境

    使用 kind 快速搭建 Kubernetes 环境 Intro kind(Kubernetes IN Docker) 是一个基于 docker 构建 Kubernetes 集群的工具,非常适合用来在 ...

  7. kubeadm 搭建kubernetes集群环境

    需求 kubeadm 搭建kubernetes集群环境 准备条件 三台VPS(本文使用阿里云香港 - centos7.7) 一台能SSH连接到VPS的本地电脑 (推荐连接工具xshell) 安装步骤 ...

  8. 使用Kubeadm(1.13+)快速搭建Kubernetes集群

    Kubeadm是管理集群生命周期的重要工具,从创建到配置再到升级,Kubeadm处理现有硬件上的生产集群的引导,并以最佳实践方式配置核心Kubernetes组件,以便为新节点提供安全而简单的连接流程并 ...

  9. 使用Kubeadm搭建Kubernetes(1.12.2)集群

    Kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,在2018年将进入GA状态,说明离生产环境中使用的距离越来 ...

随机推荐

  1. 简单的axios请求返回数据解构赋值

    本地  data.json 文件 { "name": "大熊", "age": 18, "fnc": [ 1, 2, 3 ...

  2. CSS简单样式练习(三)

    运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...

  3. pytest-mark 参数化

    在类前或用例前用pytest.mark.parametrize ,可进行参数化 传参方式比较灵活,有很多种,下面是列出的几种方式,其他的可自行研究 @pytest.mark.parametrize(& ...

  4. Python入门-面向对象三大特性-多态

    Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚"鸭子类型".

  5. 数据库基础知识详解三:MVCC、范式以及表连接方式

    写在文章前:本系列文章用于博主自己归纳复习一些基础知识,同时也分享给可能需要的人,因为水平有限,肯定存在诸多不足以及技术性错误,请大佬们及时指正. 8.MVCC 多版本并发控制(Multi-Versi ...

  6. Java核心知识1:泛型机制详解

    1 理解泛型的本质 JDK 1.5开始引入Java泛型(generics)这个特性,该特性提供了编译时类型安全检测机制,允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,即给类型指定一个参 ...

  7. 新手小白入门C语言第四章:变量与常量

    C 变量 变量其实只不过是程序可操作的存储区的名称. C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字和 ...

  8. 输入一个字符串,内有数字和非数字字符。例如:a123x456 17960 302tab5876。将其中连续的数字作为一个整数,依次存放到一维数组a中,例如123放在a[0],456放在a[1]……统计共有多少个整数,并输出这些数。

    题目内容:输入一个字符串,内有数字和非数字字符.例如:a123x456 17960 302tab5876.将其中连续的数字作为一个整数,依次存放到一维数组a中,例如123放在a[0],456放在a[1 ...

  9. jsp第七周作业

    1.p78-p79的例4-9 <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  10. Linux中信号量的实现

    如果一个任务获取信号量失败,该任务就必须等待,直到其他任务释放信号量.本文的重点是,在Linux中,当有任务释放信号量之后,如何唤醒正在等待该信号量的任务. 信号量定义如下: struct semap ...