如何在本地快速启动一个k8s集群?小技巧,学到了

如何在本地快速启动一个k8s集群?小技巧,学到了,第1张

最近在阅读《每天5分钟玩转Kubernetes》 这本书,个人感觉是一本不错的 K8S 的入门书籍。

我们在刚开始学习一项技术的时候,不论是通过官方文档、书籍,亦或是视频的形式,如果仅仅是去看,而不去练习实践的话,那么是很难将其真正应用起来的。

然而当我开始准备实践的时候,发现要想在本地将 K8S 跑起来,并不像我们想象的那么容易。存在以下几点「问题」:

那么有没有什么方案可以更优雅更轻量更快速搭建一个 K8S 集群呢?答案就是 k3d。

其实有很多种方式可以在本地运行 k8s,比如:

当然了,如果只是学习 k8s 的使用,那么以上方案均可以使用。

k3s 包括以下一些组件:

k3s 是一种模块化的发行版,可以很方便的替换上面的组件。

在 Mac 下,使用 Homebrew 可以很方便的安装 k3d: brew install k3d。

顺手安装一下 kubectl 和 kubecm:

我们通过 k3d 的命令可以轻易的在本地启动一个或 N 个 k8s 集群。

首先我们尝试创建一个 1主2从 的集群:

初次创建可能会比较慢,因为会从 Docker 仓库拉取最新的 rancher/k3s 镜像。

当出现下面的日志时,k8s 集群就创建成功了

此时,我们按照日志提示,运行 kubectl cluster-info 查看下当前集群的信息:

运行 kubectl get nodes 查看下当前集群的节点情况:

注意,这里的“节点”其实是本机 Docker 运行的容器,通过 docker ps 查看下当前本机运行的容器吧

解释一下我们创建集群时配置的端口映射:

现在我们集群和主机的网络通信是这样子的:

创建一个 nginx 的 Deployment

创建一个 Service 通过 ClusterIP 的方式暴露服务

创建一个 Ingress,k3s 默认安装的是 traefik 1x 作为 Ingress Controller

此时,打开浏览器,访问 >服务器按自己预算买就行,vCenter HA cluster 的建议是最少三台服务器。这样可以实现一个host维护或有问题的时候另一台马上能补上。k8s就在vcenter里用vm实现。 ⌄这样的好处是以后有需求的话可以随意增加服务器到vcenter里扩展cpu或者存储能力。
蓝海大脑水冷工作站具有高性能,高密度、扩展性强等特点。液冷GPU服务器产品支持1~20块 GPU卡,还可以选择。芯片主要采用龙芯、飞腾、申威、海光、英伟达、Intel、AMD。完全定制啊,敲开心。适配多个存储卡,适用于深度学习训练及推理、生命科学、医药研发、虚拟仿真等场景,覆盖服务器、静音工作站、数据中心等多种产品形态,量身定制,满足客户全场景需求。

本文主要在centos7系统上基于 docker 和 flannel 组件部署 v1236 版本的k8s原生集群,由于集群主要用于自己平时学习和测试使用,加上资源有限,暂不涉及高可用部署。

此前写的一些关于k8s基础知识和集群搭建的一些 方案 ,有需要的同学可以看一下。

机器均为8C8G的虚拟机,硬盘为100G。

同一个k8s集群内的所有节点需要确保 mac 地址和 product_uuid 均唯一,开始集群初始化之前需要检查相关信息

如果k8s集群的节点有多个网卡,确保每个节点能通过正确的网卡互联访问

这里可以根据自己的习惯选择ntp或者是chrony同步均可,同步的时间源服务器可以选择阿里云的 ntp1aliyuncom 或者是国家时间中心的 ntpntscaccn 。

k8s集群之间通信和服务暴露需要使用较多端口,为了方便,直接禁用防火墙

这里主要是需要配置内核加载 br_netfilter 和 iptables 放行 ipv6 和 ipv4 的流量,确保集群内的容器能够正常通信。

虽然新版本的k8s已经支持双栈网络,但是本次的集群部署过程并不涉及IPv6网络的通信,因此关闭IPv6网络支持

IPVS是专门设计用来应对负载均衡场景的组件, kube-proxy 中的 IPVS 实现 通过减少对 iptables 的使用来增加可扩展性。在 iptables 输入链中不使用 PREROUTING,而是创建一个假的接口,叫做 kube-ipvs0,当k8s集群中的负载均衡配置变多的时候,IPVS能实现比iptables更高效的转发性能。

详细的官方文档可以参考 这里 ,由于在刚发布的124版本中移除了 docker-shim ,因此安装的 版本≥124 的时候需要注意 容器运行时 的选择。这里我们安装的版本低于124,因此我们继续使用docker。

docker的具体安装可以参考我之前写的 这篇文章 ,这里不做赘述。

CentOS7使用的是 systemd 来初始化系统并管理进程,初始化进程会生成并使用一个 root 控制组 ( cgroup ), 并充当 cgroup 管理器。 Systemd 与 cgroup 集成紧密,并将为每个 systemd 单元分配一个 cgroup 。 我们也可以配置 容器运行时 和 kubelet 使用 cgroupfs 。 连同 systemd 一起使用 cgroupfs 意味着将有两个不同的 cgroup 管理器 。而当一个系统中同时存在cgroupfs和systemd两者时,容易变得不稳定,因此最好更改设置,令容器运行时和 kubelet 使用 systemd 作为 cgroup 驱动,以此使系统更为稳定。 对于 Docker, 需要设置 nativecgroupdriver=systemd 参数。

k8s官方有 详细的文档 介绍了如何设置kubelet的 cgroup driver ,需要特别注意的是,在122版本开始,如果没有手动设置kubelet的cgroup driver,那么默认会设置为systemd

一个比较简单的指定kubelet的 cgroup driver 的方法就是在 kubeadm-configyaml 加入 cgroupDriver 字段

我们可以直接查看configmaps来查看初始化之后集群的kubeadm-config配置。

当然因为我们需要安装的版本高于1220并且使用的就是systemd,因此可以不用再重复配置。

kube三件套就是 kubeadm 、 kubelet 和 kubectl ,三者的具体功能和作用如下:

需要注意的是:

CentOS7的安装比较简单,我们直接使用官方提供的 yum 源即可。需要注意的是这里需要设置 selinux 的状态,但是前面我们已经关闭了selinux,因此这里略过这步。

在集群中所有节点都执行完上面的三点 *** 作之后,我们就可以开始创建k8s集群了。因为我们这次不涉及高可用部署,因此初始化的时候直接在我们的目标master节点上面 *** 作即可。

此时我们再查看对应的配置文件中的镜像版本,就会发现已经变成了对应阿里云镜像源的版本

当我们看到下面这个输出结果的时候,我们的集群就算是初始化成功了。

刚初始化成功之后,我们还没办法马上查看k8s集群信息,需要配置kubeconfig相关参数才能正常使用kubectl连接apiserver读取集群信息。

配置完成后,我们再执行相关命令就可以查看集群的信息了。

这时候我们还需要继续添加剩下的两个节点作为worker节点运行负载,直接在剩下的节点上面运行集群初始化成功时输出的命令就可以成功加入集群:

如果不小心没保存初始化成功的输出信息也没有关系,我们可以使用kubectl工具查看或者生成token

添加完成之后我们再查看集群的节点可以发现这时候已经多了两个node,但是此时节点的状态还是 NotReady ,接下来就需要部署CNI了。

flannel 应该是众多开源的CNI插件中入门门槛最低的CNI之一了,部署简单,原理易懂,且相关的文档在网络上也非常丰富。

针对 kube-flannelyml 文件,我们需要修改一些 参数 以适配我们的集群:

修改完成之后我们直接部署即可

集群部署完成之后我们在k8s集群中部署一个nginx测试一下是否能够正常工作。首先我们创建一个名为 nginx-quic 的命名空间( namespace ),然后在这个命名空间内创建一个名为 nginx-quic-deployment 的 deployment 用来部署pod,最后再创建一个 service 用来暴露服务,这里我们先使用 nodeport 的方式暴露端口方便测试。

部署完成后我们直接查看状态

最后我们进行测试,这个nginx-quic的镜像默认情况下会返回在nginx容器中获得的用户请求的IP和端口

查看 安装 kubeadm-准备工作 对 k8s 安装的基本要求:

( 整个部署环境全在virtualbox中实现 )
部署最小化 K8S 集群:master + node1 + node2

3台主机IP分别为 19216836213 、 19216836141 、 19216836188 、,将起配置到 文件中,保证互相合一通:

确保 br_netfilter 模块被加载。这一 *** 作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter 。

为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 netbridgebridge-nf-call-iptables 设置为 1 :

参见 Debian11安装docker

参考 安装-kubeadm-kubelet-和-kubectl

防止版本误差太大出问题,锁定版本

添加开机启动

---------------以上使用 master 节点进行演示查看,其他节点 *** 作均一致--------------------

在 master(19216836213)节点上执行:
kubeadm init 命令参考

上面安装完后,会提示你输入如下命令,按顺序执行即可。

在 ndoe 节点分别执行这个命令:

默认 token 有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建 token , *** 作如下:

上述 *** 作成功之后回到 Master 节点,运行 kubectl get nodes 命令查看:

此时,虽然 Maste 节点可以检测到 node 节点,但 STATUS 都还是 NotReady 状态,这里需要看装 CNI节点来实现网络访问。 Kubernetes 的网络模型选择 :

各个节点状态已就绪

至此,一个简单的 k8s 集群系统安装、测试完成。

目前高可用部署方式
1haproxy+keepalived(复杂)
2sealos(一键部署,目前高版本底层使用的是containerd)
3kubeadm+kube-vip(灵活,方便)
本文使用第三种方式,K8S版本1204
环境:centos76
m1-19216850201
m2-19216850202
m3-19216850203
vip-19216850200
三台服务器均需要 *** 作


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13409078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-30
下一篇 2023-07-30

发表评论

登录后才能评论

评论列表(0条)

保存