真快!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…

关于F5 排错的简单介绍之一

我只是每天抽出几分钟&#xff0c;写写自己想到的东西。有时间会进行修正。F5 是一直专注于4到7层&#xff0c;但是ping F5上某个IP 总丢包&#xff0c;总和F5 有点关系吧&#xff0c;哈哈~&#xff0c;说这话&#xff0c;想必做过F5的人&#xff0c;都有点苦逼了吧。所以&…

java之socket的OOBInline和UrgentData和发送心跳包研究

UrgentData可以理解为紧急发送数据方式&#xff0c;如果我们客户端先用write方法写入数据&#xff0c;再用UrgentData发送数据&#xff0c;再去执行flush操作&#xff0c;我们可以得到服务端先打印UrgentData发送的数据&#xff0c;然后再打印write写入的数据。 客户端代码实现…

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

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

python 读行为数组_python将多列文件读入数组

我在读一个文件&#xff0c;它看起来像&#xff1a;Protein in water5826300LEU N 2945 7.972 16.153 13.055 -0.0183 0.4861 -0.4376300LEU H 2946 8.006 16.194 13.139 1.5894 1.3176 -1.4422300LEU CA 2947 8.017 16.020 13.016 0.1247 0.7136 -0.1096300LEU CB 2948 8.157 …

01背包初始化的细节问题与循环下限的改进

转自&#xff1a;背包久讲 Tianyi Cui 初始化的细节问题 我们看到的求最优解的背包问题题目中&#xff0c;事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解&#xff0c;有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化的时候…

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

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

字符串之从规定的字符串中根据下标得到字符

题目: 例如给规定字符串str = "a_3_b_4_c_5",给定下标4,会得到字符b str = "a_3_b_4_c_5" 就意味着字符串是str = "aaabbbbccccc"; 然后下标4,就会得到字符‘b’ 代码实现: package com.chenyu.string.cn;import java.util.Arrays;public…

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

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

Linux常用C函数-接口处理篇(网络通信函数)

接口处理篇accept&#xff0c;bind&#xff0c;connect&#xff0c;endprotoent&#xff0c;endservent&#xff0c;getsockopt&#xff0c;htonl&#xff0c;htons&#xff0c;inet_addr&#xff0c;inet_aton&#xff0c;inet_ntoa&#xff0c;listen&#xff0c;ntohl&#…

hdu 5108

//题意是给一个数N,然后让你求M,使得N/M为素数,并且M的值最小//思路呢,大概有两种,一个是遍历素数求解的,不过数据太大不现实//另外一种就是质因数求解,for循环是遍历质因数,然后while循环是剔除相同的质因数//最后你可以判定剩下来的如果非1,则是最大素数....#include <ios…

跟随大数据旅行

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

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

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

MD5计算,一个扩展类,哪里都能用

最近有同学问到如何计算一个字节数组的MD5值&#xff0c;现在分享一个扩展类&#xff0c;有了它&#xff0c;MD5计算再也不用其他了。先看示例&#xff1a;string s "hello world";var s_md5 s.ToMD5();string f "C:\Windows\explorer.exe";var f_md5 f…

字符串之翻转字符串

题目: 给定一个字符类型的数组chas,请在单词间做逆序调整,只要做到单词顺序即可,对空格的位置没有特别要求。 例如: 如果把chas看作字符串为“dog loves pig”,调整成“pig loves dog”. 如果把chas看作字符串为“Im a student.”,调整成“student. a Im”. 代码: pac…

noi 4982 踩方格

题目链接&#xff1a;http://noi.openjudge.cn/ch0206/4982/ 深搜很好写。 DP&#xff1a;O(n) d[i] 为走 I 不的方案数&#xff0c; l[i],r[i],u[i]为第一步走 左&#xff0c;右&#xff0c;上&#xff0c;共走 i 步的方案数。(u[i] d[i-1]) d[i] l[i] r[i] u[i] l[i-1] …

VB6之GIF分解

原文链接&#xff1a;http://hi.baidu.com/coo_boi/item/1264a64172fe8dec1f19bc08 还是找了个C的翻译下&#xff0c;原文链接&#xff1a;http://www.360doc.com/content/05/1122/15/1894_34348.shtml GDI的函数声明 我就不放上了&#xff0c;网上有个做好的GDI公共模块。 Pri…

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…

python中的常量可以修改吗_python实现不可修改的常量

因为种种原因&#xff0c;Python并未提供如C/C/Java一样的const修饰符&#xff0c;换言之&#xff0c;python中没有常量&#xff0c;至少截止2015年年末&#xff0c;还没有这个打算。Python程序一般通过约定俗成的变量名全大写的形式来表示这是一个常量&#xff0c;但是这终究不…