云原生部署手册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集群。
请添加图片描述

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

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

相关文章

【工具】一键生成动态歌词字幕

那眼神如此熟悉 让人着迷无力抗拒 一次又一次相遇 在眼前却遥不可及 命运总爱淘气 将一切都藏匿 曾有你的回忆 无痕迹 若不是心心相吸 又怎么会一步一步靠近 &#x1f3b5; 董真《思如雪》 下载LRC歌词 https://www.musicenc.com/article/50287.htmlhttp…

【全开源】JAVA情侣扭蛋机情侣游戏系统源码支持微信小程序+微信公众号+H5

一、功能介绍 会员功能、情侣扭蛋 收到的券、送出的券 合伙代理、意见反馈 我们技术使用JAVA后台服务 前后端分离 springbootmybatisplusmysql 用户端 uniapp&#xff08;vue语法&#xff09;管理后台 vueelementUi 适配小程序H5公众号&#xff0c;一套源码&#xff0c;无…

idea中database的一些用法

1、查看表结构 方法1&#xff0c;右键&#xff0c;选这个 方法2 双击表后&#xff0c;看到数据&#xff0c;点DDL 方法3 写SQL时&#xff0c;把鼠标放在表名上&#xff0c;可以快速查看表结构 2、表生成对应的实体类 表中右键&#xff0c;选择这2个&#xff0c;选择生成的路…

相机与相机模型(针孔/鱼眼/全景相机)

本文旨在较为直观地介绍相机成像背后的数学模型&#xff0c;主要的章节组织如下&#xff1a; 第1章用最简单的针孔投影模型为例讲解一个三维点是如何映射到图像中的一个像素 第2章介绍除了针孔投影模型外其他一些经典投影模型&#xff0c;旨在让读者建立不同投影模型之间的建模…

代码随想录算法训练营第二十五天 | 216. 组合总和 III、17. 电话号码的字母组合

代码随想录算法训练营第二十五天 | 216. 组合总和 III、17. 电话号码的字母组合 216. 组合总和 III题目解法 17. 电话号码的字母组合题目解法 感悟 216. 组合总和 III 题目 解法 修改上一天组合的代码 class Solution { public:vector<vector<int>> result;vect…

爆肝两千字!掌握CSS选择器与响应式设计:从基础到高级应用

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

计算机网络----计算机网络的基础

目录 一.计算机网络的相关概念 二.计算机网络的功能 三.计算机网络的发展 四.计算机网络的组成 五.计算机网络的分类 六.计算机的性能指标 1.速率 2.带宽 3.吞吐量 4.时延 5.时延带宽积 6.往返时延RTT 7.利用率 七.计算机的分层结构 八.ISO/OSI参考模型 九.OSI…

【JAVA基础】算法与集合

1 查找 1.1 二分查找 public class Main {public static void main(String[] args) throws IOException, CloneNotSupportedException, ParseException { //数组必须有序int[] arr{1,2,4,5,6,24,123};System.out.println(binarySearch(arr,123));//6}public static int bina…

java数据结构与算法刷题-----LeetCode376. 摆动序列

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 贪心2. 动态规划3. 优化版动态规划 1. 贪心 解题思路&#x…

ArcGIS分享图层数据的最佳方法

在工作中&#xff0c;经常需要将图层数据分享给其他人。 如下图所示&#xff0c;需要分享的是【CJDCQ】和【GHDLTB】&#xff0c;图层带有符号系统&#xff1a; 一、分享gdb数据库及lyr文件 分享数据自然要找到源数据&#xff1a; 但是&#xff0c;gdb数据是不带符号系统的&a…

接口幂等性问题和常见解决方案

接口幂等性问题和常见解决方案 1.什么是接口幂等性问题1.1 会产生接口幂等性的问题1.2 解决思路 2.接口幂等性的解决方案2.1 唯一索引解决方案2.2 乐观锁解决方案2.3 分布式锁解决方案2.4 Token解决方案(最优方案) 1.什么是接口幂等性问题 幂等性: 用户同一操作发起的一次或多…

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

JMeter中如何进行性能测试的规划和设计&#xff1f; 进行JMeter性能测试的规划和设计主要遵循以下几个步骤&#xff1a; 1、确定测试目标&#xff1a; 明确性能测试的目的和目标&#xff0c;比如确定要测试的系统性能指标&#xff08;如响应时间、吞吐量、并发用户数等&#…