当前位置: 首页 > news >正文

云原生部署手册02:将本地应用部署至k8s集群

(一)部署集群镜像仓库

1. 集群配置

首先看一下集群配置:

(base) ➜  ~ multipass ls
Name                    State             IPv4             Image
master                  Running           192.168.64.5     Ubuntu 22.04 LTS10.42.0.010.42.0.1
nfs                     Running           192.168.64.4     Ubuntu 22.04 LTS
worker                  Running           192.168.64.7     Ubuntu 22.04 LTS10.42.1.010.42.1.1
(base) ➜  ~ kubectl get node
NAME     STATUS   ROLES                  AGE    VERSION
worker   Ready    <none>                 140m   v1.28.7+k3s1
master   Ready    control-plane,master   149m   v1.28.7+k3s1
(base) ➜  ~ kubectl get pv,pvc
NAME                           CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE
persistentvolume/registry-pv   1Gi        RWX            Retain           Bound    default/registry-pvc   registry-pv             116mNAME                                 STATUS   VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/registry-pvc   Bound    registry-pv   1Gi        RWX            registry-pv    116m
(base) ➜  ~ showmount -e 192.168.64.4
Exports list on 192.168.64.4:
/home/ubuntu/nfs                    10.0.0.0/1 192.0.0.1/1

当前有三个节点,1个是nfs服务器,另两个是k8s集群节点。

nfs挂载点是192.168.64.4:/home/ubuntu/nfs。

k8s上创建了pv和pvc持久存储资源,pv了绑定nfs。

2. 使用helm安装registry

Helm是k8s集群上的包管理工具,类似于mac的brew和ubuntu的apt。Registry是docker的私有镜像仓库。

在mac宿主机上,通过 brew install helm可以一键安装helm。

到heml官网https://artifacthub.io/packages/helm搜索docker-registry,找到repo地址为https://helm.twun.io,添加repo并安装registry

(base) ➜  ~ helm repo add twun https://helm.twun.io	#添加helm repo
(base) ➜  ~ helm repo list				#查看当前repos
NAME   	URL   
twun   	https://helm.twun.io 
(base) ➜  ~ helm search repo twun/docker-registry	#列出指定repo内发布的包
NAME                	CHART VERSION	APP VERSION	DESCRIPTION   
twun/docker-registry	2.2.2        	2.8.1      	A Helm chart for Docker Registry
(base) ➜  ~ helm install registry twun/docker-registry \
--namespace system \
--set service.type=NodePort \
--set service.nodePort=31500 \
--set persistence.existingClaim=registry-pvc

安装docker-registry时指定了pvc参数,用于持久化存储,也指定了外部访问的端口31500。关于docker-registry支持的配置参数,可到官网查看文档:https://artifacthub.io/packages/helm/twuni/docker-registry

至此,registry安装完毕。

(二)向仓库推送镜像和拉取镜像

1. 修改docker安全策略

我们安装registry时未配置ssl证书,只能通过http访问。

docker使用私有仓库时,默认需要通过https访问,若通过http访问,需要修改docker配置文件daemon.json,将私有库IP添加到insecure-registries:

{"insecure-registries": ["192.168.64.5:31500"]
}
2. 修改k8s节点的registry配置

逐个登录k8s master节点,创建/etc/rancher/k3s/registries.yaml文件,写入配置内容,并重启k3s服务:

ubuntu@master:~$ sudo vim /etc/rancher/k3s/registries.yaml
mirrors:"192.168.64.5:31500":endpoint:- "http://192.168.64.5:31500"
ubuntu@master:~$ sudo service k3s restart

逐个登录k8s worker节点,创建/etc/rancher/k3s/registries.yaml文件,写入配置内容,并重启k3s-agent服务:

ubuntu@worker:~$ sudo vim /etc/rancher/k3s/registries.yaml
mirrors:"192.168.64.5:31500":endpoint:- "http://192.168.64.5:31500"
ubuntu@worker:~$ sudo service k3s-agent restart
3. 拉取测试镜像并重新打标签

在宿主机上利用docker拉取一个nginx镜像作为测试。

(base) ➜  ~ docker pull nginx:latest
(base) ➜  ~ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    92b11f67642b   4 weeks ago   187MB

使用tag命令修改镜像名,将私有仓库的地址作为镜像的前缀。

(base) ➜  ~ docker tag nginx:latest 192.168.64.5:31500/nginx:latest
(base) ➜  ~ docker images
REPOSITORY                 TAG       IMAGE ID       CREATED       SIZE
192.168.64.5:31500/nginx   latest    92b11f67642b   4 weeks ago   187MB
nginx                      latest    92b11f67642b   4 weeks ago   187MB
4. 向私有仓库推送镜像和拉取镜像

向私有仓库推送镜像:

(base) ➜  ~ docker push 192.168.64.5:31500/nginx:latest

删除本地测试镜像:

(base) ➜  ~ docker image rm 192.168.64.5:31500/nginx:latest
(base) ➜  ~ docker image rm nginx:latest
(base) ➜  ~ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

从私有仓库拉取镜像:

(base) ➜  ~ docker pull 192.168.64.5:31500/nginx:latest
(base) ➜  ~ docker images
REPOSITORY                 TAG       IMAGE ID       CREATED       SIZE
192.168.64.5:31500/nginx   latest    92b11f67642b   4 weeks ago   187MB

测试成功。

(三) 使用Dockerfile打包镜像

1. 打包镜像方法

在制作镜像时,首先准备好需要复制到镜像中的文件,包括程序文件和配置文件。再通过Dockerfile中的指令进行文件复制、程序运行和启动配置。

Dockefile的主体包括如下几个部分:

FROM rackspacedot/python37:latest #指明基础镜像包
COPY xxx /xxx/ #将Dockerfile同目录下的xxx文件或目录拷贝到生成镜像中的/xxx/目录下
RUN xxx #这里相当于在bash里执行指令,每条指令用一个RUN来标记,完成service文件的chmod修改等
MAINTAINER name email #留下你的大名和邮箱
EXPOSE 10000 #暴露端口号
ENTRYPOINT xxx #这个是启动执行命令,只能有一条
CMD xxx #这个也是启动执行命令(或给ENTRYPOINT传递默认参数),若启动容器时附加了参数,则CMD中的命令会被忽略
2. 实操

Dockerfile文件:

vue3项目打包后生成dist目录,在与dist平级的目录下新建文件Dockerfile,编辑内容:

FROM 192.168.64.5:31500/nginx:latest
COPY dist/ /usr/share/nginx/html/

其中,我们基于上一步推送到私有仓库的nginx镜像为基础,将dist目录下的内容拷贝到nginx镜像的web目录下。

打包镜像:

(base) ➜  ~ docker build -t 192.168.64.5:31500/frontend:1.0 .

推送到集群中的私有仓库:

(base) ➜  ~ docker push 192.168.64.5:31500/frontend:1.0

(四) 启动服务

编写yaml文件frontend.yaml:

---
apiVersion: apps/v1
kind: Deployment
metadata:name: vue3-deployment
spec:replicas: 2selector:matchLabels:app: vue3template:metadata:labels:app: vue3spec:containers:- name: vue3image: 192.168.64.5:31500/frontend:1.0
---
# 通过service暴露端口:
apiVersion: v1
kind: Service
metadata:name: vue3namespace: defaultlabels:app: vue3
spec:ports:- port: 80targetPort: 80nodePort: 30080protocol: TCPselector: app: vue3type: NodePort

该文件指定k8s使用刚才上传的镜像生成容器,并通过Service将pod的服务通过30080端口开放给集群外使用。

启动服务:

(base) ➜  ~ kubectl create -f frontend.yaml
(base) ➜  .kube kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1      <none>        443/TCP        7h6m
vue3         NodePort    10.43.207.91   <none>        80:30080/TCP   17m
(base) ➜  ~ kubectl get pod
NAME                               READY   STATUS    RESTARTS   AGE
vue3-deployment-86469c7667-npxm2   1/1     Running   0          25s
vue3-deployment-86469c7667-5t69q   1/1     Running   0          25s

yaml文件中为服务配置了两个pod,如上所示,可看到服务的确被部署到两个pod上。生产环境下有多个worker节点时,可为服务配置更多的pod,这些pod会被调度到不同物理节点上,可起到负载均衡的作用。

浏览器访问集群任一node的30080端口(192.168.64.5:30080或192.168.64.7:30080),可看到本地应用已经成功部署到k8s集群。
请添加图片描述

相关文章:

云原生部署手册02:将本地应用部署至k8s集群

&#xff08;一&#xff09;部署集群镜像仓库 1. 集群配置 首先看一下集群配置&#xff1a; (base) ➜ ~ multipass ls Name State IPv4 Image master Running 192.168.64.5 Ubuntu 22.04 LTS1…...

AJAX——JSON

目录 一、JSON概述 二、JSON对象语法 三、JSON序列化方法 四、JSON与XML比较 五、Java对象与Json对象的转换 六、Js解析服务器发送过来的JSON字符串 七、$.getJSON() 一、JSON概述 JSON简介:JSON的全称为JavaScript Object Nation(JavaScript 对象表示语法)&#xff0c;…...

Nexus3 Docker 私有仓库

Nexus3 Docker 私有仓库 安装并部署 Nexus3 $ docker search nexus3$ docker pull sonatype/nexus3$ mkdir /home/tester/data/docker/nexus3/sonatype-work $ sudo chown -R 200 /home/tester/data/docker/nexus3/sonatype-work$ docker run -d --namenexus3 \ --restartalw…...

Element UI el-dialog自由拖动功能

1.创建drag .js文件 /*** 拖拽移动* param {elementObjct} bar 鼠标点击控制拖拽的元素* param {elementObjct} target 移动的元素* param {function} callback 移动后的回调*/ export function startDrag(bar, target, callback) {var params {top: 0,left: 0,currentX: …...

RPC浅析,加密数据解析

个人总结 其实就是HOOK注入wbsocket 链接创建服务端和客户端进行通信&#xff0c;直接调用js代码中的加密方法 将结果通过浏览器客户端传入服务端。一种比较好实用的一种技术 https://blog.csdn.net/qq_36759224/article/details/123082574 &#xff08;搬运记录下&#xff…...

光速论文能用吗 #媒体#知识分享#学习方法

光速论文是一个非常有效的论文写作、查重降重工具&#xff0c;它的使用非常简单方便&#xff0c;而且功能强大&#xff0c;是每个写作者必备的利器。 首先&#xff0c;光速论文具有强大的查重降重功能&#xff0c;能够快速检测论文中的抄袭部分&#xff0c;帮助作者避免不必要的…...

智慧工地解决方案,智慧工地项目管理系统源码,支持大屏端、PC端、手机端、平板端

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合&#xff0c;为工程项目管理提供先进技术手段&#xff0c;构建工地现场智能监控和控制体系&#xff0c;弥补传统方法在监管中的缺陷&#xff0c;最线实现项目对人、机、料、法、环的全…...

【前端寻宝之路】学习和使用label标签

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-2nm9oQQVtSL8hDS1 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…...

项目————网络聊天室

服务器 #include <myhead.h> typedef struct msg{char flag;char name[20];char cont[128]; }msg_t;typedef struct link{struct sockaddr_in cin;struct link* next; }link_t;void do_login(int sfd,msg_t msg,link_t *L,struct sockaddr_in cin){link_t* pL;if(sendto…...

【计算机网络】基本概念

基本概念 IP 地址端口号协议协议分层封装分用客户端服务器请求和响应两台主机之间的网络通信流程 IP 地址 概念&#xff1a;IP 地址主要是用于唯一标识网络主机、其他网络设备&#xff08;如路由器&#xff09;的网络地址。简单来说&#xff0c;IP地址用来唯一定位主机。格式&…...

Redis入门到实战-第七弹

Redis实战热身Sets篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理和流…...

图像处理学习笔记(一)

本文主要介绍&#xff0c;以供读者能够理解该技术的定义、原理、应用。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;ISP处理 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就…...

duckdb学习-1

DuckDB is a fast in-process analytical database DuckDB supports a feature-rich SQL dialect complemented with deep integrations into client APIs 在notebook中使用duckdb 安装 pip install duckdb 示例代码: #> pip install jupysql #> pip install duckdb-en…...

GEE高阶案例——Landsat/Sentinel/MODIS影像进行缨帽变换一行代码实现

本教程的主要目的是利用eemont中的tasseledCap()的函数进行缨帽变换实现。 在 eemont 中,可使用扩展到 ee.Image 和 ee.ImageCollection 对象的 tasseledCap 方法计算缨帽亮度、绿度和湿度组件。只需从支持的平台加载图像,然后使用 tasseledCap 添加分量带即可。 代码: !p…...

数独游戏(c++题解)

题目描述 给出一个的表格&#xff0c;部分格子已经填好数。请填完所有空白格子&#xff0c;使得表格每一行、每一列、每个的九宫格&#xff0c;都恰好填满这9个数字。 输入格式 9行9列的方阵状态&#xff0c;0代表空格。 输出格式 输出完成后的方阵状态&#xff0c;每一个…...

【开发方案】Android 应用双卡搜网功能

一、功能简介 需求:开机自动开始搜网并显示网络列表 那么就不能将相关类做成单例,不能将subId、phoneId等卡相关的属性作为UI、服务的全局变量。 二、流程设计 NetworkSelectReceiver:监听开机广播,触发拉起搜网服务 NetworkOperatorService:搜网服务,完成后调起用户…...

图论基础|深度优先dfs、广度优先bfs

dfs 与 bfs 区别 提到深度优先搜索&#xff08;dfs&#xff09;&#xff0c;就不得不说和广度优先搜索&#xff08;bfs&#xff09;有什么区别 先来了解dfs的过程&#xff0c;很多录友可能对dfs&#xff08;深度优先搜索&#xff09;&#xff0c;bfs&#xff08;广度优先搜索…...

Python从入门到精通秘籍十七

一、Python的构造方法 在Python中&#xff0c;构造方法是一个特殊的方法&#xff0c;用于创建和初始化类的实例。构造方法的名称是__init__()&#xff0c;它在创建对象时自动调用。 下面是一个示例代码来详细解释Python的构造方法&#xff1a; class Person:def __init__(se…...

Java——抽象类和接口

目录 1.抽象类 1.概念: 2.语法 3.特性 2.接口 1.概念 2.语法 3.特性 1.抽象类 1.概念: 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的…...

React—— props校验(非typescript校验类型)

非typescript环境下&#xff0c;当我们在封装组件的时候&#xff0c;接受props时传入的内容&#xff0c;需要做类型检测&#xff0c;那我们可以用props校验进行类型的检查。 props校验允许在创建组件的时候&#xff0c;就约定props的格式、类型等 实现步骤&#xff1a; 导入 …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...