很简单的K8s集群部署方法-KubeKey自动化部署

K8s集群部署方法-KubeKey自动化部署

文章后续KubeSphere部署安装,接入KubeKey安装的k8s集群

文章目录

  • K8s集群部署方法-KubeKey自动化部署
      • 一.清理`kubeadm`安装的k8s集群缓存
      • 二.服务器安装前准备
        • 1.设置主机名
        • 2.配置时间同步
        • 3.关闭系统防火墙
        • 4.安装系统依赖
        • 5.关闭`swap`分区
        • 6.创建数据目录(非必须)
      • 三.安装部署`KubeKey`+`K8s`(任一`Master`节点操作)
        • 1.下载 `KubeKey`
        • 2.创建 K8s 集群部署配置文件
        • 3.修改部署配置文件
        • 4.部署 K8s 集群
        • 5.检查集群是否部署成功
        • 6.测试集群是否可以成功部署和访问pod

部署环境介绍:两台服务器属于同一个内网环境,服务器为Ubuntu环境。

角色主机名称IPKubernetes版本
master&&workerk8s-master1192.168.6.132v1.28.2
master&&workerk8s-master2192.168.6.131v1.28.2

KubeKey简单介绍:

KubeKey 是由 KubeSphere开发的轻量化工具(Go 语言开发),用于快速安装 KubernetesKubeSphere,支持扩缩容和升级集群;

一.清理kubeadm安装的k8s集群缓存

清理kubernetes缓存

#重置 Kubernetes 集群配置,清除主节点和工作节点的设置
sudo kubeadm reset -f
#卸载内核模块,特别是在使用 Calico 网络插件时需要。
sudo modprobe -r ipip
lsmod
#删除用户目录下的 kubeconfig 文件和缓存
sudo rm -rf ~/.kube/
#删除 Kubernetes 相关目录和文件
sudo rm -rf /etc/kubernetes/
sudo rm -rf /etc/systemd/system/kubelet.service.d
sudo rm -rf /etc/systemd/system/kubelet.service
sudo rm -rf /usr/bin/kube*
sudo rm -rf /etc/cni
sudo rm -rf /opt/cni
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/etcd
#清理 APT 缓存
sudo apt-get clean
sudo apt-get remove --purge kube* -y
sudo apt-get autoremove -y

清理containerd缓存

#停止服务
sudo systemctl stop containerd
sudo systemctl disable containerd
#卸载 containerd 软件包
sudo apt-get remove --purge containerd containerd.io -y
#清理 containerd 的所有配置文件和数据目录
sudo rm -rf /etc/containerd/
sudo rm -rf /var/lib/containerd/
sudo rm -rf /run/containerd/
sudo rm -rf /usr/bin/containerd*
sudo rm -rf /usr/lib/systemd/system/containerd.service
#清除 APT 缓存和遗留的安装文件
sudo apt-get clean
sudo apt-get autoremove -y

运行以下命令,确认 containerd 已卸载干净:

which containerd
containerd --version

如果未输出任何内容,说明 containerd 已成功卸载。

二.服务器安装前准备

此处操作未作任何声明的情况下,默认所有节点都要执行。

1.设置主机名

根据机器的规划,分布设置三台主机名为k8s-master1、k8s-msater2。

#修改配置文件方式,
vi /etc/hostname
##文件内容为:k8s-master1或k8s-node1

#命令行方式,临时修改
# 设置 master 主机名
hostnamectl set-hostname k8s-master1 && bash
2.配置时间同步

采用ntpdate命令进行时间校对,设置Crontab定时任务进行定时校对。

#设置时区
timedatectl set-timezone Asia/Shanghai
cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
#执行命令查看时区是否修改
timedatectl status
#安装工具
sudo apt install ntpdate
#配置Crontab定时任务
crontab -e
#添加如下内容: 0 */1 * * * ntpdate time1.aliyun.com

image-20241218173016645

3.关闭系统防火墙
#Ubuntu默认的防火墙
systemctl stop ufw && systemctl disable ufw
#或者
systemctl stop firewalld && systemctl disable firewalld
4.安装系统依赖

在安装前检查是否有已经安装的依赖

dpkg -l | grep -E "curl|socat|conntrack|ebtables|ipset|ipvsadm"

image-20250115160607665

也可直接执行下面的命令为 Kubernetes 安装系统基本依赖包,所有节点都要执行。

# 安装 Kubernetes 系统依赖包
sudo apt update
sudo apt install -y curl socat conntrack ebtables ipset ipvsadm
5.关闭swap分区
swapoff -a  #临时关闭

编辑/etc/fstab,注释如下类似的内容,重启系统并验证。如果已经关闭那么该命令不会有输出。

sudo swapon --show 

image-20230403214910666

image-20230403215315571

6.创建数据目录(非必须)
#创建 **OpenEBS** 本地数据根目录
mkdir -p /data/openebs/local
#创建Containerd数据目录
mkdir -p /data/containerd
#创建Containerd数据目录软连接
ln -s /data/containerd /var/lib/containerd

这一步的操作不是非必须的,因为有的节点在安装的时候,磁盘挂载时,根路径并没有太多的内存。这时候则需要看主要的磁盘挂载到哪个路径下的,则可以在该路径下创建安装时需要的数据目录例如/data目录下
image-20250115163423491

三.安装部署KubeKey+K8s(任一Master节点操作)

1.下载 KubeKey
#创建安装目录
mkdir ~/kubekey
cd ~/kubekey/
# 选择中文区下载,否则从Github拉取会超时
export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | sh -

下载后如下图:

image-20250115165925645

查看 KubeKey 支持的 Kubernetes 版本列表

./kk version --show-supported-k8s

image-20250115170156750

2.创建 K8s 集群部署配置文件
./kk create config -f k8s-v1288.yaml --with-kubernetes v1.28.2

image-20250115171521371

3.修改部署配置文件

可以看到上一步已经输出了一个k8s-v1288.yaml文件,然后可以根据实际的安装情况进行对应的修改。

vi k8s-v1288.yaml

我的文件内容如下:

apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
  name: sample
spec:
  hosts:
  - {name: k8s-master1, address: 192.168.6.132, internalAddress: 192.168.6.132, user: root, password: "1234567"}
  - {name: k8s-master2, address: 192.168.6.131, internalAddress: 192.168.6.131, user: root, password: "1234567"}
  roleGroups:
    etcd:
    - k8s-master1
    - k8s-master2
    control-plane:
    - k8s-master1
    - k8s-master2
    worker:
    - k8s-master1
    - k8s-master2
  controlPlaneEndpoint:
    ## Internal loadbalancer for apiservers
    internalLoadbalancer: haproxy

    domain: lb.kubesphere.local
    address: ""
    port: 6443
  kubernetes:
    version: v1.28.2
    clusterName: k8s-paco
    autoRenewCerts: true
    containerManager: containerd
  etcd:
    type: kubekey
  network:
    plugin: calico
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
    ## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
    multusCNI:
      enabled: false
  storage:
    openebs:
      basePath: /data/openebs/local # 默认没有的配
  registry:
    privateRegistry: ""
    namespaceOverride: ""
    registryMirrors: []
    insecureRegistries: []
  addons: []

配置文件解析:

主要修改 spec: 下的相关配置,且此处为安装演示,所以是两个msater节点,且都为worker节点

  • hosts:指定节点的 IP、ssh 用户、ssh 密码(可以不是root,但是要保证该用户有sudo的权限)

  • roleGroups:指定 2个 etcd、control-plane 节点,并复用为 worker 节点

  • internalLoadbalancer: 启用内置的 HAProxy 负载均衡器,做高可用负载均衡,用来分发客户端对 API Server 的请求到多个控制平面节点。

  • domain:自定义域名 ,一般使用默认值 lb.kubesphere.local,如果有购买域名也可自行修改

  • clusterName:集群名字,没特殊需求可使用默认值 cluster.local

  • autoRenewCerts:此参数可以实现证书到期自动续期,默认为 true

  • containerManager:容器运行时指定 containerd,支持containerd, cri-o, isula,默认为 docker

  • storage.openebs.basePath:默认没有,新增配置,指定 openebs 默认存储路径

  • registry.privateRegistry:可选配置, 可以解决 Docker 官方镜像不可用的问题,在export KKZONE=cn后默认从kubesphere的阿里云官方仓库地址拉取,默认为registry.cn-beijing.aliyuncs.com

  • registry.namespaceOverride: 可选配置, 默认为kubesphereio,仓库名

    更多的配置可以参考官方文件:kubekey/docs/config-example.md at master · kubesphere/kubekey · GitHub

4.部署 K8s 集群
export KKZONE=cn

./kk create cluster -f k8s-v1288.yaml

执行命令后,KubeKey会检查部署 K8s 的依赖及其他详细要求。通过检查后,系统将提示您确认安装。输入 yes 并按 ENTER 继续部署。

image-20250115180224214

如果不缺少组件,且没有其他疑难杂症,则会进入部署流程。根据运行内存和网速等条件,大概时间为 10-20 分钟左右。

输出日志情况如下:

image-20250115180302658

image-20250115180316233

上图可以看见,部署过程中,KubeKey是从阿里云的镜像地址拉取的镜像。这也是这个安装方法的优势之一。在部署完成后可以看到如下输出

image-20250115180621301

5.检查集群是否部署成功
kubectl get nodes -o wide
kubectl get pods -o wide -n kube-system

image-20250115180706376

kubectl cluster-info

该命令可以查看集群是否成功通过haproxy配置了高可用。

image-20250115181707278

6.测试集群是否可以成功部署和访问pod

以部署一个Nginx应用为例,以下是一个简单的Nginx部署的yaml文件:

apiVersion: apps/v1     #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment        #该配置的类型,我们使用的是 Deployment
metadata:               #译名为元数据,即 Deployment 的一些基本属性和信息
  name: nginx-deployment        #Deployment 的名称
  labels:           #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
    app: nginx  #为该Deployment设置key为app,value为nginx的标签
spec:           #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 1   #使用该Deployment创建一个应用程序实例
  selector:         #标签选择器,与上面的标签共同作用,目前不需要理解
    matchLabels: #选择包含标签app:nginx的资源
      app: nginx
  template:         #这是选择或创建的Pod的模板
    metadata:   #Pod的元数据
      labels:   #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:           #期望Pod实现的功能(即在pod中部署)
      containers:       #生成container,与docker中的container是同一种
      - name: nginx     #container的名称
        image: registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/nginx:1.26.0  #使用镜像nginx:1.26.0创建container,该container默认80端口可访问
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service #Service 的名称
  labels:       #Service 自己的标签
    app: nginx  #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec:     #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
  selector:     #标签选择器
    app: nginx  #选择包含标签 app:nginx 的 Pod
  ports:
  - name: nginx-port  #端口的名字
    protocol: TCP     #协议类型 TCP/UDP
    port: 80          #集群内的其他容器组可通过 80 端口访问 Service
    nodePort: 32600   #通过任意节点的 32600 端口访问 Service
    targetPort: 80  #将请求转发到匹配 Pod 的 80 端口
  type: NodePort  #Serive的类型,ClusterIP/NodePort/LoaderBalancer

上述的资源清单创建了两种类型一个Deployment,一个Service,然后执行命令部署:

kubectl apply -f nginx.yaml

执行成功后,如下图:

image-20241223185153003

然后通过node节点IP+32600的方式进行访问:

image-20241218191914871

其他可参考的,k8s集群的部署方法

(高可用版本)Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群-CSDN博客

Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)-CSDN博客

Rancher(V2.6.3)安装K8s教程_cluster must have at least one etcd plane host: pl-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux之文件系统前世今生(一)

Linux在线1 Linux在线2 一、 基本概念 1.1 块(Block) 在计算机存储之图解机械硬盘这篇文章中我们提到过,磁盘读写的最小单位是扇区,也就是 512 Byte;很明显,每次读写的效率非常低。 为了提高IO效率&…

.netframwork模拟启动webapi服务并编写对应api接口

在.NET Framework环境中模拟启动Web服务,可以使用几种不同的方法。一个常见的选择是利用HttpListener类来创建一个简单的HTTP服务器,或者使用Owin/Katana库来自托管ASP.NET Web API或MVC应用。下面简要介绍Owin/Katana示例代码。这种方法更加灵活&#x…

【0x0052】HCI_Write_Extended_Inquiry_Response命令详解

目录 一、命令概述 二、命令格式及参数 2.1. HCI_Write_Extended_Inquiry_Response命令格式 2.2. FEC_Required 2.3. Extended_Inquiry_Response 三、生成事件及参数 3.1. HCI_Command_Complete 事件 3.2. Status 四、命令执行流程 4.1. 命令准备阶段(主机端) 4.2…

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行,这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟,但很多特性还得qt6才行,这里用qt5.14.2主要是考虑到服…

Mockito+PowerMock+Junit单元测试

一、单元测试用途 1、日常开发团队要求规范,需要对开发需求代码进行单元测试并要求行覆盖率达到要求,DevOps流水线也会开设相关门禁阀值阻断代码提交,一般新增代码行覆盖率80%左右。 二、Mock测试介绍 1、Mock是为了解决不同的单元之间由于…

candb++ windows11运行报错,找不到mfc140.dll

解决问题记录 mfc140.dll下载 注意:放置位置别搞错了

【Spring Boot】Spring AOP 快速上手指南:开启面向切面编程新旅程

前言 ???本期讲解关于spring aop的入门介绍~~~ ??感兴趣的小伙伴看一看小编主页:-CSDN博客 ?? 你的点赞就是小编不断更新的最大动力 ??那么废话不多说直接开整吧~~ 目录 ???1.AOP概述 1.1什么是AOP ?1.2什么是Spring AOP ???2.Spring AOP入…

(01)STM32—GPIO

1. GPIO简介 GPIO(General Purpose Input Output)通用输入输出端口。可配置为8种输入输出模式。引脚电平:0V~3.3V,部分引脚可容忍5V。输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时…

python实现pdf转word和excel

一、引言   在办公中,我们经常遇收到pdf文件格式,因为pdf格式文件不易修改,当我们需要编辑这些pdf文件时,经常需要开通会员或收费功能才能使用编辑功能。今天,我要和大家分享的,是如何使用python编程实现…

基于 Python 的深度学习的车俩特征分析系统,附源码

博主介绍:✌stormjun、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

C#实现字符串反转的4种方法

见过不少人、经过不少事、也吃过不少苦,感悟世事无常、人心多变,靠着回忆将往事串珠成链,聊聊感情、谈谈发展,我慢慢写、你一点一点看...... 1、string.Reverse 方法 string content "Hello World";string reverseStri…

LabVIEW串口通信调试与数据接收问题

在使用LabVIEW进行串口通信时,常常会遇到无法接收数据的情况。这可能与串口设置、连接、设备响应等多方面因素相关。本文将详细讨论如何使用LabVIEW进行串口通信,并提供常见问题的排查与解决方法,帮助用户更高效地进行数据接收调试。通过调整…

单元测试与unittest框架

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,薪资嘎嘎涨 单元测试的定义 1. 什么是单元测试? 单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&am…

LuaJIT Garbage Collector Algorithms

Explain 本篇文章是对Make Pall发表wili内容《LuaJIT 3.0 new Garbage Collector》的翻译和扩展,因为原文是对LuaJIT 2.x GC重要功能的简介和对LuaJIT 3.0 new GC的工作计划,所以它并不是系统性介绍GC的文章。希望以后能有精力系统性的对LuaJIT 2.x GC做…

1.17组会汇报

STRUC-BENCH: Are Large Language Models Good at Generating Complex Structured Tabular Data? STRUC-BENCH:大型语言模型擅长生成复杂的结构化表格数据吗?23年arXiv.org 1概括 这篇论文旨在评估大型语言模型(LLMs)在生成结构…

EF Core全局查询筛选器

目录 概述 用法 添加全局查询筛选器 禁用全局查询筛选器 概述 全局查询筛选器:EF Core 会自动将这个查询筛选器应用于涉及这个实体类型的所有 LINQ 查询。 场景:软删除、多租户。 什么是软删除? 逻辑删除,并不是真正地从数…

俄语画外音的特点

随着全球媒体消费的增加,语音服务呈指数级增长。作为视听翻译和本地化的一个关键方面,画外音在确保来自不同语言和文化背景的观众能够以一种真实和可访问的方式参与内容方面发挥着重要作用。说到俄语,画外音有其独特的特点、挑战和复杂性&…

怎么用CRM系统实现客户数据的集中管理?

一、为什么我们需要关注客户数据? 嘿,大家好!你有没有过这样的经历,在与一家公司打交道时,突然发现对方对你的需求了如指掌,并且总能提供恰到好处的服务?这可不是巧合哦,背后很可能…

学习threejs,使用OrbitControls相机控制器

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.OrbitControls 相机控…

Vue2+OpenLayers实现点位拖拽功能(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 3.1、初始化变量 3.2、创建一个点 3.3、将点添加到地图上 3.4、实现点位拖拽 3.5、完整代码 四、Gitee源码 一、案例截图 可以随意拖拽点位到你想要的位置 二、安装OpenLayers库 npm install ol 三、代码实现…