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

(一)部署集群镜像仓库

1. 集群配置

首先看一下集群配置:

(base) ➜  ~ multipass ls
Name                    State             IPv4             Image
master                  Running           192.168.64.5     Ubuntu 22.04 LTS
                                          10.42.0.0
                                          10.42.0.1
nfs                     Running           192.168.64.4     Ubuntu 22.04 LTS
worker                  Running           192.168.64.7     Ubuntu 22.04 LTS
                                          10.42.1.0
                                          10.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             116m

NAME                                 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: 2
  selector:
    matchLabels:
      app: vue3
  template:
    metadata:
      labels:
        app: vue3
    spec:
      containers:
      - name: vue3
        image: 192.168.64.5:31500/frontend:1.0
---
# 通过service暴露端口:
apiVersion: v1
kind: Service
metadata:
  name: vue3
  namespace: default
  labels:
    app: vue3
spec:
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080
      protocol: TCP
  selector: 
    app: vue3
  type: 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集群。
请添加图片描述

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

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

相关文章

MySQL--深入理解MVCC机制原理

什么是MVCC&#xff1f; MVCC全称 Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;维持一个数据的多个版本&#xff0c;主要是为了提升数据库的并发访问性能&#xff0c;用更高性能的方式去处理数据库读写冲突问题&#xff0c;实现无锁并发。 什…

k8s之图形界面DashBoard【九】

文章目录 9. DashBoard9.1 部署Dashboard9.2 使用DashBoard 镇场 9. DashBoard 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实&#xff0c;为了提供更丰富的用户体验&#xff0c;kubernetes还开发了一个基于web的用户界面&#xff08;Dashboard&…

VMware ESXi 8.0U1d macOS Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 8.0U1d macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U1 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8-u1-sysin/&#xff0c;查看最新版。原…

Spark-Scala语言实战(2)(在IDEA中安装Scala,超详细配图)

之前的文章中&#xff0c;我们学习了如何在windows下下载及使用Scala&#xff0c;但那对一个真正想深入学习Scala的人来说&#xff0c;是不够的&#xff0c;今天我会给大家带来如何在IDEA中安装Scala。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的…

STM32(TIM定时器中断)

理论知识 定时器定时中断 接线图 定时器工作配置步骤 定时中断和内外时钟源选择 定时器中需要使用的函数 程序实现效果&#xff1a; void TIM_DeInit(TIM_TypeDef* TIMx); **// 恢复定时器的缺省配置**void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*TIM…

SwiftUI动画之几何匹配

SwiftUI动画之几何匹配 记录一下 日常开发中经常使用到的滑块功能 如何同工几何匹配快速制作点击动画 import SwiftUIstruct MatchedGeometryEffestExamle: View {let categories ["Home", "Popular", "Saved"]State var selecedTitle "…

Artemis Finance引领Metis流动性质押,并启动积分空投活动

在以太坊可扩展性解决方案中&#xff0c; Optimism、Arbitrum等Layer2链主要面临两个问题&#xff1a;欺诈/有效性证明以及去中心化排序器Sequencers。在实际的发展过程中&#xff0c;Optimism或Arbitrum等Layer2链仍然侧重于在欺诈证明和有效性证明方面进行努力&#xff0c;在…

MATLAB 矩阵

【MATLAB】&#xff08;四&#xff09;MATLAB在线性代数中的应用_线性代数在matlab中的应用-CSDN博客 矩阵的秩 rank rank&#xff08;a&#xff09; 矩阵的逆矩阵 inv inv&#xff08;a&#xff09; 矩阵的特征值eig和特征向量D [V,D]eig(a) 特征值 deig(a) 特征向量D [V…

【 c 语言 】指针入门

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Swiper)

滑块视图容器&#xff0c;提供子组件滑动轮播显示的能力。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 说明&#xff1a; 子组件类型&#xff1a;系统组件和自定义组…

Python基础入门 --- 4.循环语句

文章目录 Python基础入门第四章&#xff1a;4.1 while循环语句4.1.1 while循环的嵌套4.2 for循环语句4.2.1 range语句4.2.2 变量作用域4.2.3 for循环的嵌套应用 4.3 循环中断 continue和break Python基础入门 第四章&#xff1a; 4.1 while循环语句 语法结构&#xff1a; w…

springboot多模块下swaggar界面出现异常(Knife4j文档请求异常)或者界面不报错但是没有显示任何信息

继上一篇博文&#xff0c;我们解决了多模块下扫描不到子模块的原因,建议先看上一个博客了解项目结构&#xff1a; springboot 多模块启动报错Field XXX required a bean of type XXX that could not be found. 接下来我们来解决swaggar异常的原因&#xff0c;我们成功启动项目…

【IC设计】Verilog线性序列机点灯案例(三)(小梅哥课程)

声明&#xff1a;案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔记&#xff0c;如有学习需要请支持官方正版。 文章目录 该系列目录设计目标设计思路RTL及Testbench代码RTL代码Testbench代码 仿真结果上板视频 该系列目录 Verilog线性序列机点灯案例(一)&#xff…

【Hadoop大数据技术】——MapReduce分布式计算框架(学习笔记)

&#x1f4d6; 前言&#xff1a;MapReduce是Hadoop系统核心组件之一&#xff0c;它是一种可用于大数据并行处理的计算模型、框架和平台&#xff0c;主要解决海量数据的计算问题&#xff0c;是目前分布式计算模型中应用较为广泛的一种。 目录 &#x1f552; 1. MapReduce概述&am…

cool 中的Midway ----node.js的TypeORM的使用

1.介绍 TypeORM | Midway TypeORM 是 node.js 现有社区最成熟的对象关系映射器&#xff08;ORM &#xff09;。本文介绍如何在 Midway 中使用 TypeORM 相关信息&#xff1a; 描述可用于标准项目✅可用于 Serverless✅可用于一体化✅包含独立主框架❌包含独立日志❌ 和老写…

实现HBase表和RDB表的转化(附Java源码资源)

实现HBase表和RDB表的转化 一、引入 转化为HBase表的三大来源&#xff1a;RDB Table、Client API、Files 如何构造通用性的代码模板实现向HBase表的转换&#xff0c;是一个值得考虑的问题。这篇文章着重讲解RDB表向HBase表的转换。 首先&#xff0c;我们需要分别构造rdb和hba…

JUnit 面试题及答案整理,最新面试题

JUnit中的断言&#xff08;Assert&#xff09;有哪些类型&#xff1f; JUnit提供了多种断言类型来帮助测试代码的正确性。常见的断言类型包括&#xff1a; 1、assertEquals&#xff1a; 用于检查两个值是否相等。如果不相等&#xff0c;测试失败。 2、assertTrue和assertFal…

Midjourney订阅攻略

订阅Midjourney的攻略主要包括以下几个步骤&#xff1a; 访问Midjourney官网&#xff1a;首先&#xff0c;你需要访问Midjourney的官方网站。你可以通过搜索引擎找到它&#xff0c;或者通过社交媒体、论坛等渠道获取官方网站链接。了解订阅选项&#xff1a;在官网上&#xff0…

HarmonyOS NEXT应用开发—视频全屏切换案例

介绍 本示例介绍了Video组件和ohos.window接口实现媒体全屏的功能。 该场景多用于首页瀑布流媒体播放等。 效果图预览 使用说明&#xff1a; 点击全屏按钮&#xff0c;横屏媒体窗口。点击恢复窗口按钮&#xff0c;恢复媒体窗口。 实现步骤 在Video组件内调用 onFullscreen…

并发编程之join 方法的详细解析

3.8 join 方法详解 为什么需要 join 下面的代码执行&#xff0c;打印 r 是什么&#xff1f; static int r 0; public static void main(String[] args) throws InterruptedException {test1(); } private static void test1() throws InterruptedException {log.debug(&quo…