真快!10秒内将k8s集群运行起来

大家好,我是小碗汤,今天演示一个项目,可以在一分钟内用容器将k8s集群运行起来,真的很方便。

您可能已经知道,将 Kubernetes 集群安装在 VM 上。但在 Docker 容器中安装一个 Kubernetes 集群,还没有太多的实践。

本文我将简要演示如何在 Docker 容器中创建 Kubernetes 集群。如果你想看细节,可以查看 GitHub仓库[1]

创建集群

下载脚本

git clone --depth=1 [https://github.com/ManasPecenek/clinco.git](https://github.com/ManasPecenek/clinco.git "https://github.com/ManasPecenek/clinco.git") && cd clinco && chmod +x initial-script.sh add-worker.sh

查看目录结构

# ls 
add-worker.sh  initial-script.sh  LICENSE  master image  README.md  worker image

现在您可以设置工作节点数,然后运行脚本。例如./initial-script.sh 1将产生一个 worker-node 集群:

./initial-script.sh <worker-node-count>

稍等片刻,即可看到1 master 1 worker集群创建好了:

# docker ps -a
CONTAINER ID   IMAGE                              COMMAND        CREATED          STATUS          PORTS                                                                          NAMES
7521c916e92e   petschenek/ubuntu-systemd:worker   "/sbin/init"   11 minutes ago   Up 11 minutes                                                                                  worker-1
a2e5bcf92c92   petschenek/ubuntu-systemd:master   "/sbin/init"   15 minutes ago   Up 15 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:6443->6443/tcp, :::6443->6443/tcp   master

master会将80、6443端口映射到宿主机上。

我们将容器中的kubectl命令复制到宿主机上,方便操作:

# docker cp master:/usr/local/bin/kubectl /usr/local/bin/

在clinco目录中默认存在了admin.kubeconfig文件,我们查看集群:

# kubectl get nodes -o wide --kubeconfig admin.kubeconfig
NAME       STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE       KERNEL-VERSION                CONTAINER-RUNTIME
worker-1   Ready    <none>   29m   v1.21.0   172.172.1.1   <none>        Ubuntu 21.10   3.10.0-1160.31.1.el7.x86_64   containerd://1.5.8# kubectl cluster-info --kubeconfig admin.kubeconfig
Kubernetes control plane is running at https://127.0.0.1:6443To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

添加工作节点

运行下面的脚本,例如./add-worker.sh 1 将向现有集群添加1个工作节点:

./add-worker.sh <worker-node-count>

查看添加的节点:

# docker ps -a
CONTAINER ID   IMAGE                              COMMAND        CREATED          STATUS          PORTS                                                                          NAMES
bfc68af79191   petschenek/ubuntu-systemd:worker   "/sbin/init"   14 seconds ago   Up 13 seconds                                                                                  worker-2
7521c916e92e   petschenek/ubuntu-systemd:worker   "/sbin/init"   33 minutes ago   Up 33 minutes                                                                                  worker-1
a2e5bcf92c92   petschenek/ubuntu-systemd:master   "/sbin/init"   36 minutes ago   Up 36 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:6443->6443/tcp, :::6443->6443/tcp   master

稍等片刻,节点会变成Ready:

# kubectl get nodes -o wide --kubeconfig admin.kubeconfig
NAME       STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE       KERNEL-VERSION                CONTAINER-RUNTIME
worker-1   Ready    <none>   33m   v1.21.0   172.172.1.1   <none>        Ubuntu 21.10   3.10.0-1160.31.1.el7.x86_64   containerd://1.5.8
worker-2   Ready    <none>   38s   v1.21.0   172.172.1.2   <none>        Ubuntu 21.10   3.10.0-1160.31.1.el7.x86_64   containerd://1.5.8

为了方便,可以设置环境变量,或者将admin.kubeconfig复制到~/.kube/config文件中,这里设置个KUBECONFIG环境变量:

export KUBECONFIG=admin.kubeconfig

部署服务

部署2个实例的nginx deployment做测试:

kubectl create deploy nginx --image nginx --replicas 4

稍等片刻即可启动成功:

# kubectl  get pod  -o wide
NAME                     READY   STATUS              RESTARTS   AGE     IP       NODE       NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-b5xhx   1/1     Running   0          2m10s   <none>   worker-2   <none>           <none>
nginx-6799fc88d8-ch2x9   1/1     Running   0          2m10s   <none>   worker-2   <none>           <none>

修复集群

如果使用delete node命令删除节点后,例如:

kubectl  delete node worker-2

则直接执行以下命令重启容器即可:

docker restart worker-2

如果容器被删除,删除的是主节点,想恢复集群,可以运行以下命令:

# docker stop master ; docker rm master
# docker run -dt --network clinco --hostname master --name master -v master:/root -v etcd:/lib/etcd -v /sys/fs/cgroup:/sys/fs/cgroup:ro --ip=172.172.0.1 -p 6443:6443 -p 80:80 --privileged --user root petschenek/ubuntu-systemd:master && docker exec -it --privileged --user root master bash -c "./master.sh"

如果容器被删除,删除的是工作节点之一(例如worker-2),可以运行以下命令来重新创建:

# docker stop worker-2 ; docker rm worker-2
# j=2 && docker run -dt --network clinco --hostname worker-$j --name worker-$j -v /lib/modules:/lib/modules:ro -v worker-$j:/root -v /sys/fs/cgroup:/sys/fs/cgroup:ro --ip=172.172.0.$j --privileged --user root petschenek/ubuntu-systemd:worker && docker exec -it --privileged --user root worker-$j bash -c "./worker.sh"

原理

其实在master node容器中运行了系统组件:

# docker exec -ti master ps -ef  | grep kube
root        1452       1  3 13:10 ?        00:01:33 /usr/local/bin/kube-apiserve
root        1453       1  0 13:10 ?        00:00:21 /usr/local/bin/kube-controll
root        1454       1  0 13:10 ?        00:00:05 /usr/local/bin/kube-schedule
# docker exec -ti master ps -ef  | grep etcd
root        1367       1  1 13:10 ?        00:00:29 /usr/local/bin/etcd --name m

在worker node容器中运行了kubelet:

# docker exec -ti worker-1 ps -ef  | grep kubelet
root         980       1  0 13:11 ?        00:00:20 /usr/local/bin/kubelet --con# docker exec -ti worker-2 ps -ef  | grep kubelet
root         981       1  0 13:44 ?        00:00:05 /usr/local/bin/kubelet --con

因为在master node容器中没有运行kubelet,所以查看node时看不到master。

容器网络都为clinco模式:

# docker network  ls -f name=clinco
NETWORK ID     NAME      DRIVER    SCOPE
5d018b1d9b06   clinco    bridge    local# docker inspect master | grep NetworkMode"NetworkMode": "clinco",
# docker inspect worker-1 | grep NetworkMode"NetworkMode": "clinco",
# docker inspect worker-2 | grep NetworkMode"NetworkMode": "clinco",

数据也是挂载到宿主机上的:

# docker volume ls -f name=etcd
DRIVER    VOLUME NAME
local     etcd

总结

这里用到两个镜像(master、worker各一个),我们可以在10秒内轻松装好一个 Kubernetes 集群,平时测试用起来将变得方便快捷。

参考

[1]

GitHub仓库: https://github.com/ManasPecenek/clinco

ad3a7b144bcdacd83624330fb76af00b.png

点个在看你最好看

a4678cd448d366d7886bb81ab4dfff3a.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上公厕上一半突然被拽出来......

1 哈哈哈哈&#xff0c;太惨了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 糟糕&#xff0c;忘了切换账号了&#xff08;via.豆瓣史上写字最烂小组&#xff09;▼3 南北方酒局区别▼4 奇奇怪怪的东西又增加了&#xff08;素材来源网络&#xff0c;侵删&#x…

context:annotation-config 跟 context:component-scan诠释及区别

<context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean&#xff08;无论是通过xml的方式还是通过package sanning的方式&#xff09;上面的注解。 <context:component-scan>除了具有<context:annotation-config>的功能之外&#xff0c;…

为什么中国这么多高薪程序员,开发不出Java, Typescript, Python, Rust, Node.js这些基础设施?...

近日&#xff0c;有人在网上问了这个问题&#xff0c;引起了网友热议&#xff1a;为什么中国这么多高薪程序员&#xff0c;开发不出Java&#xff0c;Typescript, Python, Rust, Node.js这些基础设施&#xff1f;对这个问题&#xff0c;大家从不同角度发表了自己的看法。有人说&…

当你女朋友第一次来你家会发生什么?

1 五一假期你都怎么过&#xff1f;▼2 万一实现了呢&#xff08;via.月半土荅塔&#xff09;▼3 你下周三就见不到李总了&#xff01;▼4 对不起&#xff0c;但真的很好笑▼5 女朋友第一次来我家做饭▼6 还我美女&#xff01;&#xff01;&#xff01;▼7 走他们的路&…

跟随大数据旅行

2019独角兽企业重金招聘Python工程师标准>>> 跟随大数据旅行 这是一本短小而精悍的书&#xff0c;不需要花费太多时间就能够让读者弄清 楚大数据到底是什么&#xff0c;还能帮助读者了解大数据的来龙去脉以及未来大 数据对各行各业带来的影响与作用。大数据将带来新…

利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...

本文将会以插入排序为例&#xff0c;介绍算法与数据结构的基础部分。插入排序排序可以说是整个算法中最为基础&#xff0c;最为重要的一部分&#xff0c;而插入排序正是排序算法中最简单的一种解决办法。什么是排序问题&#xff1f;输入&#xff1a;n个数的一个序列 。输出&…

MindFusion Pack for ASP.NET发布v2013.R2

在MindFusion.Diagramming for WebForms中&#xff1a;导入OpenOffice Draw文件新的DrawImporter类允许你通过OpenOffice Draw Vector图形编辑器导入后缀为*.odg的文件。只需添加一个引用到MindFusion.Diagramming.Import.Draw.dll组即可。你还可以使用导入法的多种重载将OpenO…

【翻译】C#表达式中的动态查询

当您使用LINQ来处理数据库时&#xff0c;这种体验是一种神奇的体验&#xff0c;对吗&#xff1f;你把数据库实体像一个普通的收集&#xff0c;使用Linq中像Where&#xff0c;Select或者 Take&#xff0c;这些简单的使用就能让代码可用了。但是&#xff0c;让我们考虑一下这里是…

SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高

1.背景知识 在讲SVD之前&#xff0c;我还是想先回到基于物品相似的协同过滤算法。这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐。其公式为&#xff1a; 其中 rui 表示预测用户u对物品i的喜爱程度。wij 是物品i&#xff0c;j之间的相似度&#xf…

Android插件化开发之动态加载的类型

https://segmentfault.com/a/1190000005113493 基本信息 Author&#xff1a;kaedea GitHub&#xff1a;android-dynamical-loading 现在网络上有许多关于动态加载的介绍的文章&#xff0c;谈及的关键词汇有动态加载、插件化、热部署、热修复等&#xff0c;对于一些刚接触这方…

UITableView的优化原理

2019独角兽企业重金招聘Python工程师标准>>> 当我们下啦一个 UITableView时&#xff0c;如果没有做优化&#xff0c;只是简单的实现功能代码如下&#xff0c;这样当我们有上百条tableviewcell的时候&#xff0c;我们滑动的非常快时会非常费内存&#xff0c;当然苹果…

深入浅出Mybatis系列(一)---Mybatis入门[转]

最近两年 springmvc mybatis 的在这种搭配还是蛮火的&#xff0c;楼主我呢&#xff0c;也从来没真正去接触过mybatis, 趁近日得闲&#xff0c; 就去学习一下mybatis吧。 本次拟根据自己的学习进度&#xff0c;做一次关于mybatis 的一系列教程&#xff0c; 记录自己的学习历程&…

C# 图像模板匹配并标注

01—需求这个是粉丝在我的技术群提的一个需求1、 模板匹配 &#xff1a;功能&#xff1a;&#xff08;1&#xff09;在一张大图像中&#xff0c;选取一小块区域作为模板&#xff08;2&#xff09;可在大图像中匹配到模板图像和位置。模板匹配是图像处理中最基本、最常用的匹配方…

深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap[转]

上篇《深入浅出Mybatis系列&#xff08;七&#xff09;---mapper映射文件配置之insert、update、delete》介绍了insert、update、delete的用法&#xff0c;本篇将介绍select、resultMap的用法。select无疑是我们最常用&#xff0c;也是最复杂的&#xff0c;mybatis通过resultMa…

北大保送、硕博连读!《西游记》红孩儿扮演者现成中科院博士!

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;募格学术86版《西游记》可以说是很多人的记忆&#xff0c;男女老幼几乎都看过这个版本&#xff0c;虽然已经过去三十多年&#xff0c;但如今依旧是经典无法超越之作。看过86版《西游记》的小伙伴应该都还记得里面牛魔…

Android插件化开发之运行未安装apk的activity

1、介绍 我们知道PathClassLoader是一个应用的默认加载器(而且他只能加载data/app/xxx.apk的文件)&#xff0c;但是我们加载插件一般使用DexClassLoader加载器&#xff0c;所以这里就有问题了&#xff0c;其实如果对于开始的时候&#xff0c;每个人都会认为很简单&#xff0c;…

理解UI线程——SWT, Android, 和Swing的UI机理

2019独角兽企业重金招聘Python工程师标准>>> 在做GUI的时候, 无论是SWT, AWT, Swing 还是Android, 都需要面对UI线程的问题, UI线程往往会被单独的提出来单独对待, 试着问自己, 当GUI启动的时候, 后台会运行几个线程? 比如 1. SWT 从Main函数启动 2. Swing 从Ma…