云原生部署手册01:构建k8s集群并配置持久化存储

写在前面:k8s弃用docker的影响其实没那么大

k8s通过dockershim对docker的支持从1.20版本后就已经移除,仅支持符合Container Runtime Interface(CRI)的容器运行环境,比如containerd。containerd本身就是docker底层的容器运行环境,只不过docker在containerd的基础上增加了符合人类操作的接口。docker构建的镜像并不是docker特有的镜像,它是一个OCI(开放容器标准)镜像。所以,虽然k8s移除了使用docker作为容器运行环境,但通过dockerfile构建的镜像依然可以被符合CRI接口的容器运行环境使用。

对于熟悉docker的开发者,仍然可以使用docker打包镜像,并上传到私有或公共镜像仓库,再通过k8s拉取镜像构建容器和管理pod。

一、构建k3s集群

(一) 准备集群环境

准备三个运行Ubuntu系统的node。测试环境下可以使用multipass构建三个虚拟机。

$ multipass launch -n master01
$ multipass launch -n worker01
$ multipass launch -n worker02
$ multipass list
Name                    State             IPv4             Image
master01                Running           192.168.64.15    Ubuntu 22.04 LTS
worker01                Running           192.168.64.16    Ubuntu 22.04 LTS
worker02                Running           192.168.64.17    Ubuntu 22.04 LTS

(二) 使用脚本安装k3s master和worker

Rancher是一家提供容器管理软件的国内企业,他们在国内部署了安装k3s所需的镜像服务。使用该公司提供的安装脚本,可实现一键安装和后台服务启动。

1. 安装脚本

master安装脚本:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

worker安装脚本:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -

其中K3S_URL参数设置master节点的ip,K3S_TOKEN使用的值存储在master节点上的/var/lib/rancher/k3s/server/node-token路径下。

2. 实操

切换到master01节点,安装k3s master:

$ multipass shell master01
ubuntu@master01:~$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
ubuntu@master01:~$ ip a | grep 192	#查看master节点ip地址inet 192.168.64.15/24 metric 100 brd 192.168.64.255 scope global dynamic enp0s1
ubuntu@master01:~$ sudo cat /var/lib/rancher/k3s/server/node-token	#查看K3S_TOKEN
K106f19b5abfec691fb3d92bf92dd894bc22b835fe0a787a2edda37f709dff5fbc0::server:aef034344579142feb3822207e654689
ubuntu@master01:~$ exit

切换到worker01节点,安装k3s worker:

$ multipass shell worker01
ubuntu@worker01:~$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.64.15:6443 K3S_TOKEN=K106f19b5abfec691fb3d92bf92dd894bc22b835fe0a787a2edda37f709dff5fbc0::server:aef034344579142feb3822207e654689 sh -
ubuntu@worker01:~$ exit

切换到worker02节点,安装k3s worker:

$ multipass shell worker02
ubuntu@worker02:~$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.64.15:6443 K3S_TOKEN=K106f19b5abfec691fb3d92bf92dd894bc22b835fe0a787a2edda37f709dff5fbc0::server:aef034344579142feb3822207e654689 sh -
ubuntu@worker02:~$ exit

(三) 宿主机使用kubectl管理集群

1. 在宿主机安装kubectl

mac可使用brew一键安装:brew install kubectl

2. kubectl上下文和配置

设置kubectl与哪个k8s集群通信,需要进行相关配置。

master节点安装后,在/etc/rancher/k3s/k3s.yaml文件中保存了集群配置。为了将该配置文件导入宿主机,需要修改该文件权限:

$ multipass shell master01
ubuntu@master01:~$ ll /etc/rancher/k3s/k3s.yaml
-rw------- 1 root root 2969 Mar 14 10:01 /etc/rancher/k3s/k3s.yaml
ubuntu@master01:~$ sudo chmod a+r /etc/rancher/k3s/k3s.yaml		#为所有用户添加读权限
ubuntu@master01:~$ ll /etc/rancher/k3s/k3s.yaml 
-rw-r--r-- 1 root root 2969 Mar 14 10:01 /etc/rancher/k3s/k3s.yaml
ubuntu@master01:~$ exit
$ multipass transfer master01:/etc/rancher/k3s/k3s.yaml ~/.kube/	#将master01的配置文件导入宿主机

修改该配置文件,将其中server的ip地址从127.0.0.1修改为master01的ip地址:

$ vim ~/.kube/k3s.yamlserver: https://192.168.64.15:6443

kubectl连接k8s集群时,默认使用~/.kube/config文件作为配置文件。可将导入的k3s.yaml重命名为config。

$ mv ~/.kube/k3s.yaml ~/.kube/config

至此,实现了使用宿主机的kubectl管理k8s集群:

$ kubectl get node
NAME       STATUS   ROLES                  AGE   VERSION
master01   Ready    control-plane,master   86m   v1.28.7+k3s1
worker01   Ready    <none>                 59m   v1.28.7+k3s1
worker02   Ready    <none>                 52m   v1.28.7+k3s1

(四) 集群节点维护

有三对命令与节点维护相关:

  • cordon/uncordon:停止/恢复调度,停止调度后,新创建的pod不会被调度到该节点,但原有pod不受影响,仍正常提供服务;
  • drain:驱逐pod。首先需要使用cordon封锁节点,再使用drain驱逐节点上的pod,master将该节点标记为SchedulingDisabled。节点可维护、关闭、重启,再通过uncordon命令重新激活;
  • delete:首先驱逐pod,然后从master节点删除该node,master失去对其控制。需要重新进入节点,重启kubelet,重新注册到集群。

drain的参数:

–force: 当一些pod不是经ReplicationController, ReplicaSet, Job, DaemonSet或者StatefulSet管理的时候就需要用–force来强制执行 (例如:kube-proxy);

–ignore-daemonsets: 无视DaemonSet管理的pod;

–delete-local-data: 若存在挂载了本地存储的pod,会强制删掉该pod,并将存储清除。

$ kubectl get nodes
$ kubectl cordon <node name>
$ kubectl drain <node name> --force --ignore-daemonsets --delete-local-data
$ kubectl uncordon <node name>

二、为集群配置持久化存储

(一) 配置nfs服务器

创建nfs虚拟机,安装nfs服务器,用于给集群提供共享存储。

$ multipass launch -n nfs -d 25G
$ multipass shell nfs
ubuntu@nfs:~$ sudo apt install nfs-kernel-server	#安装nfs服务
ubuntu@nfs:~$ mkdir nfs				#创建一个目录,用于共享
ubuntu@nfs:~$ sudo chmod 777 nfs			#修改目录权限
ubuntu@nfs:~$ sudo vim /etc/exports		#编辑nfs配置文件,允许集群内部网段10和宿主机网段192访问,insecure参数允许从高端口访问nfs,否则mac连接报错
/home/ubuntu/nfs 192.0.0.0/1(rw,sync,no_subtree_check,insecure)
/home/ubuntu/nfs 10.0.0.0/1,(rw,sync,no_subtree_check,insecure)
ubuntu@nfs:~$ sudo exportfs -arv			#发布共享目录
ubuntu@nfs:~$ showmount -e localhost		#查看共享目录(在其它节点可通过指定ip地址来查看)
Export list for localhost:
/home/ubuntu/nfs 192.0.0.0/1

给所有集群节点安装nfs客户端:

$ sudo apt install nfs-common

在宿主机安装nfs客户端,验证挂载。

$ showmount -e 192.168.64.15		#查看共享目录
Exports list on 192.168.64.15:
/home/ubuntu/nfs                    192.0.0.0/1
$ make abcd
$ sudo mount 192.168.64.15:/home/ubuntu/nfs /Users/deepbodhi/abcd

(二) 配置持久化卷

1. 创建pv

假设nfs服务器所在节点的ip为192.168.64.20,创建pv.yaml文件:

---
apiVersion: v1
kind: PersistentVolume
metadata:name: registry-pvnamespace: defaultlabels:pv: registry-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteManystorageClassName: registry-pvnfs:path: /home/ubuntu/nfsserver: 192.168.64.20readOnly: false

查看资源状态:

$ kubectl create -f pv.yaml
$ kubectl get pv
NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE
registry-pv   1Gi        RWX            Retain           Bound    default/registry-pvc   registry-pv             18m
2. 创建pvc

创建pvc.yaml文件:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: registry-pvcnamespace: default
spec:accessModes:- ReadWriteManyresources:requests:storage: 500MistorageClassName: registry-pv		# 通过storageClassName匹配pv

查看资源状态:

$ kubectl create -f pvc.yaml
$ kubectl get pvc
NAME           STATUS   VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
registry-pvc   Bound    registry-pv   1Gi        RWX            registry-pv    17m

若pvc处于pending状态,请检查pvc配置。可通过 kubectl describe pvc <pvc name> 来查看日志。

3. 测试

安装nginx容器,将nginx主页目录绑定到pvc指定的目录。创建nginx.yaml文件:

---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-pvcnamespace: defaultlabels:app: nginx-pvc
spec:selector:matchLabels:app: nginx-pvctemplate:metadata:labels:app: nginx-pvcspec:containers:- name: nginx-test-pvcimage: nginx:latestimagePullPolicy: IfNotPresentports:- name: web-portcontainerPort: 80protocol: TCPvolumeMounts:- name: nginx-persistent-storagemountPath: /usr/share/nginx/htmlvolumes:- name: nginx-persistent-storagepersistentVolumeClaim:claimName: registry-pvc
---
# 通过service暴露端口:
apiVersion: v1
kind: Service
metadata:name: nginxnamespace: defaultlabels:app: nginx
spec:ports:- port: 80targetPort: 80nodePort: 30080protocol: TCPselector: app: nginx-pvctype: NodePort

查看资源状态:

$ kubectl create -f nginx.yaml
$ kubectl get svc nginx
NAME    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.43.60.227   <none>        80:30080/TCP   19m
$ kubectl get deployment
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
nginx-pvc   1/1     1            1           20m
$ kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
nginx-pvc-687c675c7b-46j5k   1/1     Running   0          21m

这里需要注意,首次创建nginx容器时,需要到网络拉取镜像,可通过 kubectl describe <type> <name>跟踪资源创建状态。

上例中,nginx的主页目录被绑定到pv存储中,pv存储指定了前面建立的nfs服务器目录。因此,可在nfs服务器对应目录下创建index.html文件,观察集群中的nginx容器是否的确使用了nfs存储:

$ multipass shell nfs
ubuntu@nfs:~$ vim ~/nfs/index.html
<html>
<head>
<title>test</title>
</head>
<body>
<h1>Test</h1>
Hello World
</body>
</html>
ubuntu@nfs:~$ exit
$ multipass ls	#查看集群节点ip
Name                    State             IPv4             Image
master01                Running           192.168.64.23    Ubuntu 22.04 LTS10.42.0.010.42.0.1
nfs                     Running           192.168.64.20    Ubuntu 22.04 LTS
worker01                Running           192.168.64.24    Ubuntu 22.04 LTS10.42.1.010.42.1.1
worker02                Running           192.168.64.25    Ubuntu 22.04 LTS10.42.2.010.42.2.1
$ curl 192.168.64.23:30080	#访问集群中任意节点的30080端口
<html>
<head>
<title>test</title>
</head>
<body>
<h1>Test</h1>
Hello World
</body>
</html>
(base) 

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

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

相关文章

海康威视相机SDK二次开发(JAVA语言)

目录 前言客户端创建虚拟相机示例代码保存图片程序运行结果修改需求 二次开发引入外部包对SaveImage.java文件进行修改保存图片saveDataToFile方法选择相机chooseCamera方法主方法 FileUtil类处理过期照片启动类与配置文件application.yml通过实体类读取yml启动类 SaveImage.ja…

供应链投毒预警 | 开源供应链投毒202402月报发布啦

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年2月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

Linux uucico命令教程:UUCP文件传输服务程序(附实例详解和注意事项)

Linux uucico命令介绍 uucico&#xff0c;全称UUCP文件传输服务程序&#xff0c;是用来处理uucp或uux送到队列的文件传输工具。uucico有两种工作模式&#xff1a;主动模式和附属模式。当在主动模式下时&#xff0c;uucico会调用远端主机&#xff1b;在附属模式下时&#xff0c…

快速搭建一个一元二次方程flask应用

新建flask_service目录、templates子目录 flask_service —— app.py —— templates —— —— index.html app.py from flask import Flask, request, jsonify, render_template import random import matplotlib.pyplot as plt from io import BytesIO import base64app F…

分布式 Session--一起学习吧之架构

一、定义 分布式Session是指在一个分布式系统中&#xff0c;多个服务器之间共享用户的会话信息。在Web应用中&#xff0c;Session通常用于跟踪用户的状态和会话数据。然而&#xff0c;在分布式系统中&#xff0c;由于用户请求可能被分发到不同的服务器上&#xff0c;因此需要一…

jenkins Pipeline接入mysql

背景&#xff1a; jenkin pipeline进化过程如下&#xff1a; Jenkins Pipeline 脚本优化实践&#xff1a;从繁琐到简洁 >>>>> Jenkins Pipeline脚本优化&#xff1a;为Kubernetes应用部署增加状态检测>>>>>> 使用Jenkins和单个模板部署多个K…

BootScrap详细教程

文章目录 前言一、BootScrap入门二、导航三、栅格系统四、container五、面板六、媒体对象七、分页八、图标九、实现动态效果 前言 BootScrap是别人帮我们写好的CSS样式。如果想要使用BootScrap&#xff0c;需要先下载下来&#xff0c;在页面上引入&#xff0c;编写HTML需要按照…

Ubuntu 23.10 tar包安装和配置Elasticsearch kibana 7.13.3

目录 一、环境说明 二、准备工作 三、安装elasticsearch 3.1 安装elasticsearch 3.2 添加服务和设置开机启动 四、安装kibana 4.1. 安装kibana 4.2 添加服务和设置开机启动 出于工作需要&#xff0c;需要在Ubuntu 23.10系统上通过tar包方式安…

QT 商品入库与出库(库存管理系统)

商品入库 void GoodsWarehousing::InitComboBoxFunc() // 初始化Combo box控件 {int i0;QSqlQuery sqlQuery;sqlQuery.exec("SELECT * FROM commoditydatatable");QString StrId;while(sqlQuery.next()){StrIdsqlQuery.value(0).toString();ui->comboBox_Id->…

华岳M9制造企业管理软件业务流程 1/4

华岳M9制造企业管理软件业务流程 1/4 版本特征主控概念步骤1 部署一、服务器端二、客户端 步骤2 基础一、填写授权信息及操作权限分配二、设置业务期间三、账套参数设置四、设置分类目录五、其他基础设置六、功能模块管理 华岳M9制造企业管理软件业务流程&#xff0c;贯彻存货总…

Android 开发环境搭建(Android Studio 安装图文详细教程)

Android Studio 下载 https://developer.android.google.cn/studio?hlzh-cn Android Studio 安装 检查电脑是否启用虚拟化 如果没有开启虚拟化&#xff0c;则需要进入电脑的 BIOS 中开启 直接 next选择安装的组件&#xff0c;Android Studio 和 Android 虚拟设备&#xff…

(学习日记)2024.03.18:UCOSIII第二十节:移植到STM32

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

注册个人小程序

访问地址 https://mp.weixin.qq.com/ 立即注册 选择小程序 注册 填写信息 登录邮箱 访问邮箱的链接激活账号 选择个人&#xff0c;填写信息 注册完成&#xff0c;即可登录进入填写信息

使用jenkins-pipeline进行利用项目文件自动化部署到k8s上

Discard old builds:丢弃旧的构建,目的是管理存储空间、提升性能以及保持环境整洁 Do not allow concurrent builds: 禁止并发构建是指同一时间内只允许一个构建任务执行,避免多个构建同时运行可能带来的问题 Do not allow the pipeline to resume if the controller resta…

深度学习实战模拟——softmax回归(图像识别并分类)

目录 1、数据集&#xff1a; 2、完整代码 1、数据集&#xff1a; 1.1 Fashion-MNIST是一个服装分类数据集&#xff0c;由10个类别的图像组成&#xff0c;分别为t-shirt&#xff08;T恤&#xff09;、trouser&#xff08;裤子&#xff09;、pullover&#xff08;套衫&#xf…

蓝桥杯-24点-搜索

题目 思路 --暴力递归全组合的方法。只有4个数&#xff0c;4种计算方式&#xff0c;共有4 * 3 * 2 * 1 * 4种不同的情况&#xff0c;可以写递归来实现。 --每次计算都是两个数之间的运算&#xff0c;因此4个数需要3次计算&#xff0c;第一次计算前有4个数&#xff0c;第二次有…

面向对象【interface接口、抽象类与抽象方法】

文章目录 interface接口定义接口接口的格式与举例静态方法私有方法接口的多继承接口的默认方法冲突解决接口与抽象类之间的对比 抽象类与抽象方法抽象类抽象类的定义抽象方法使用抽象类 参考链接 interface接口 接口是一种抽象的数据类型&#xff0c;它定义了一组方法&#xff…

c语言基础~函数详解

前言 今天我们来学习一波函数的概念,帮助各位理解函数,本次博客取自一些书籍以及各大网站的讲解,把它整合在一起并且详细讲解 1函数的理解 我们得知道什么是函数&#xff0c;函数的作用是什么,好不会表述没关系&#xff0c;我们翻书 c primer plus 是这么说的"函数是指…

科技云报道:第五次工业革命,中国AI企业如何打造新质生产力?

科技云报道原创。 人类历史的叙述与技术进步的影响深深交织在一起。 迄今为止&#xff0c;每一次工业革命都彻底改变了我们社会的轮廓&#xff0c;引入了机械化、大规模生产和数字化&#xff0c;并重新定义了人类生存的规范。 自2022年11月30日OpenAI发布ChatGPT以来&#x…

C++Qt学习——QFile、QPainter、QChart

目录 1、QFile&#xff08;文本读写&#xff09;——概念 1.1、拖入三个控件&#xff0c;对pushButton进行水平布局&#xff0c;之后整体做垂直布局 1.2、按住控件&#xff0c;转到槽&#xff0c;写函数 1.3、打开文件控件 A、首先引入以下两个头文件 B、设置点击打开文件控…