【Kubernetes】第二十五篇 - 布署 nodejs 后端项目(下)
一,前言
上一篇,介绍了部署后端项目之前,需要的准备的相关配置信息;
本篇,创建 Deployment、Service 完成后端项目布署;
二,解决 jenkins 安全问题
构建 docker 镜像之后,登录 docker 会提示有安全问题:
这是由于在脚本中使用了眀文用户名、密码进行登录所导致的;
jenkins 中的项目构建脚本:
#!/bin/bash
time=$(date "+%Y%m%d%H%M%S")
npm install --registry=https://registry.npm.taobao.org
docker build -t 47.94.92.122:8082/cicd-backend:$time .
docker login -u admin -p Wz@19880818 47.94.92.122:8082
docker push 47.94.92.122:8082/cicd-backend:$time
修改为使用环境变量用户名、密码:
#!/bin/bash
time=$(date "+%Y%m%d%H%M%S")
npm install --registry=https://registry.npm.taobao.org
docker build -t 47.94.92.122:8082/cicd-backend:$time .
docker login -u $DOCKER_LOGIN_USERNAME -p $DOCKER_LOGIN_PASSWORD 47.94.92.122:8082
docker push 47.94.92.122:8082/cicd-backend:$time
如何提供环境变量:
这样,用户名密码写到了环境变量,那么用户名密码是怎么来的呢?
它会去读一个 jenkins 凭据:主页-系统管理-凭据
登录成功了
三、创建后端 Deployment
创建一个 pod:创建一个 kind: pod;
创建多个 pod:创建一个 kind: Deployment;
Deployment 对象,会创建出一个副本集,这个副本集可以控制 pod 数量;
由于后端项目和前端项目都是无状态的,为了便于演示各部署两份
[root@k8s-master cicd]# vi deployment-cicd-backend.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: cicd-backend
spec:selector:matchLabels:app: cicd-backendreplicas: 2 #两个副本template:metadata:labels:app: cicd-backend #必须和selector-cicd-backend对应spec:imagePullSecrets:- name: private-registrycontainers:- name: cicd-backendimagePullPolicy: Alwaysimage: "47.94.92.122:8082/cicd-backend:20220111113749"ports:- containerPort: 7001env: #注入后端需要的5个环境变量- name: MYSQL_HOSTvalueFrom:configMapKeyRef:name: mysql-configkey: host- name: MYSQL_PORTvalueFrom:configMapKeyRef:name: mysql-configkey: port- name: MYSQL_DATABASEvalueFrom:configMapKeyRef:name: mysql-configkey: database- name: MYSQL_USERvalueFrom:secretKeyRef:name: mysql-authkey: username - name: MYSQL_PASSWORDvalueFrom:secretKeyRef:name: mysql-authkey: password
上边配置涉及到的 configMap:
[root@k8s-master ~]# kubectl get configMap mysql-config
NAME DATA AGE
mysql-config 3 3d19h[root@k8s-master ~]# kubectl get configMap mysql-config -o yaml
apiVersion: v1
data: #三个值database: cicdhost: service-cicd-mysqlport: "8899"
kind: ConfigMap
上边配置涉及到的 Secret:
[root@k8s-master ~]# kubectl get secret mysql-auth
NAME TYPE DATA AGE
mysql-auth Opaque 2 4d2h[root@k8s-master ~]# kubectl get secret mysql-auth -o yaml
apiVersion: v1
data:password: MTIzNDU2username: cm9vdA==
kind: Secret[root@k8s-master ~]# echo cm9vdA== | base64 -d
root
[root@k8s-master ~]# echo MTIzNDU2 | base64 -d
123456
生效配置
// 生效配置
[root@k8s-master cicd]# kubectl apply -f deployment-cicd-backend.yaml
deployment.apps/cicd-backend created// 两个副本
[root@k8s-master cicd]# kubectl get pods
NAME READY STATUS RESTARTS AGE
cicd-backend-98b5d4f57-jndvd 0/1 ContainerCreating 0 2s
cicd-backend-98b5d4f57-qjvch 0/1 ContainerCreating 0 2s
cicd-mysql-745975859b-gpwzh 1/1 Running 7 4d3h// 稍等约 30 秒
[root@k8s-master cicd]# kubectl get pods
NAME READY STATUS RESTARTS AGE
cicd-backend-98b5d4f57-jndvd 1/1 Running 0 26s
cicd-backend-98b5d4f57-qjvch 1/1 Running 0 26s
cicd-mysql-745975859b-gpwzh 1/1 Running 7 4d3h
四,创建后端 Service
[root@k8s-master cicd]# vi service-cicd-backend.yamlapiVersion: v1
kind: Service
metadata:name: service-cicd-backend
spec:selector:app: cicd-backend #deploymentports:- protocol: TCPport: 7001 #服务内部的端口号targetPort: 7001 #容器内部向外暴露的端口号Dockerfile中的EXPOSEtype: NodePort
[root@k8s-master cicd]# kubectl apply -f service-cicd-backend.yaml
service/service-cicd-backend created[root@k8s-master cicd]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20d
service-cicd-backend NodePort 10.97.144.175 <none> 7001:30174/TCP 44s
service-cicd-mysql NodePort 10.108.224.96 <none> 8899:32154/TCP 4d2h
service-pay-v1 NodePort 10.97.250.199 <none> 80:30114/TCP 6d21h
service-user-v1 NodePort 10.104.13.40 <none> 80:31071/TCP 19d// 删掉不用的 service:service-pay、service-user,释放资源
[root@k8s-master cicd]# kubectl delete service service-pay-v1 service-user-v1
service "service-pay-v1" deleted
service "service-user-v1" deleted// 查 ip
[root@k8s-master cicd]# cat /etc/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4172.17.178.106 k8s-node172.17.178.105 k8s-master
172.17.178.105 k8s-master k8s-master// 通过 service 访问服务接口
[root@k8s-master cicd]# curl http://172.17.178.105:30174/user/list
curl: (7) Failed connect to 172.17.178.105:30174; 拒绝连接
访问失败,看下 pod:
[root@k8s-master cicd]# kubectl get pods
NAME READY STATUS RESTARTS AGE
cicd-backend-98b5d4f57-jndvd 0/1 CrashLoopBackOff 3 8m41s
cicd-backend-98b5d4f57-qjvch 1/1 Running 4 8m41s
cicd-mysql-745975859b-gpwzh 1/1 Running 8 4d3h// 过了一会,全都完蛋了
[root@k8s-master cicd]# kubectl get pods
NAME READY STATUS RESTARTS AGE
cicd-backend-98b5d4f57-jndvd 0/1 CrashLoopBackOff 4 9m37s
cicd-backend-98b5d4f57-qjvch 0/1 CrashLoopBackOff 4 9m37s
cicd-mysql-745975859b-gpwzh 0/1 CrashLoopBackOff 8 4d3h// 重启 mysql
[root@k8s-master cicd]# kubectl delete deploy cicd-mysql
deployment.apps "cicd-mysql" deleted
[root@k8s-master cicd]# kubectl apply -f deployment-cicd-mysql.yaml
deployment.apps/cicd-mysql created
[root@k8s-master cicd]# kubectl get pods
NAME READY STATUS RESTARTS AGE
cicd-mysql-745975859b-c4b6p 1/1 Running 0 8s// 2 个 pod 副本负载比较大 ,修改配置,改成 1 个 pod
[root@k8s-master cicd]# kubectl get pods
NAME READY STATUS RESTARTS AGE
cicd-backend-98b5d4f57-ftrdk 1/1 Running 0 6s
cicd-mysql-745975859b-c4b6p 1/1 Running 0 99s
重新测试访问:
[root@k8s-master cicd]# curl http://172.17.178.105:30174/user/list
{"message":"ok2","success":true,"code":200,"data":[]}
至此,后端项目就部署完成了
五,结尾
本篇,创建 Deployment、Service 完成后端项目布署;
下一篇,部署前端项目;
相关文章:

【Kubernetes】第二十五篇 - 布署 nodejs 后端项目(下)
一,前言 上一篇,介绍了部署后端项目之前,需要的准备的相关配置信息; 本篇,创建 Deployment、Service 完成后端项目布署; 二,解决 jenkins 安全问题 构建 docker 镜像之后,登录 do…...

贪心算法之区间问题总结
一、跳跃游戏跳跃游戏类的问题,不关心每一步怎么跳,只需要关心最大覆盖范围这里注意i是在当前最大可覆盖范围内遍历,如{2,1,0,1},就是在0~2范围内遍历,千万不能0~numsSize-1范围内遍历!!&#x…...

无线WiFi安全渗透与攻防(七)之WIFI07-WEP-wifite自动化渗透WEP加密
WIFI07-WEP-wifite自动化渗透WEP加密 1.wifite介绍 wifite是一款自动化wep、wpa以及wps破解工具,不支持windows和osx。wifite的特点是可以同时攻击多个采用wep和wpa加密的网络。wifite只需简单的配置即可自动化运行,期间无需人工干预。 目前支持任何li…...

震撼,支持多模态模型的ChatGPT 4.0发布了
最近几个月,互联网和科技圈几乎ChatGPT刷屏了,各种关于ChatGPT的概念和应用的帖子也是围绕在周围。当去年年底ChatGPT发布的那几天,ChatGPT确实震撼到了所有人,原来AI还可以这么玩,并且对国内的那些所谓的人工智能公司…...

IDEA常用插件列表
一 背景 IDEA常用插件列表,用来提供工作效率。你都安装了吗 IntelliJ IDEA 默认安装并提供了非常多的工具,比如 Maven Integration、Markdown support、SSH Remote Run 等。其中有很多好用,但是不为人知的工具。 二 插件列表 阿里代码规约…...

比df更好用的命令!
大家好,我是良许。 对于分析磁盘使用情况,有两个非常好用的命令:du 和 df 。简单来说,这两个命令的作用是这样的: du 命令:它是英文单词 disk usage 的简写,主要用于查看文件与目录占用多少磁…...

【Git使用学习】记录学习过程(1)
安装就省略了,安装结果如下。 Git Bash:这是一个模拟Linux环境的命令行工具,可以使用Git的所有功能。Git GUI:这是一个图形化界面的工具,可以方便地执行Git的常用操作。Git CMD:这是一个Windows命令行工具&…...

K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示
K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RCMQ2传感参模块1.2、STM32F103C8T6MQ2传感参模块五、基础知识学习与相关…...

【云原生·Docker】常用命令
目录 🍁1、管理命令 🍁2、帮助命令 🍁3、镜像命令 🍁4、容器命令 🍂4.1.查看容器 🍂4.2.创建容器 🍂4.3.删除容器 🍂4.4.拷贝文件 🍂4.5.查看容器IP 🍁5、部署…...
户外露营储能电源芯片CSU3AF10
户外露营的项目有很多,随着户外储能电源的发展,越来越多的电子产品可以在户外使用,也不用担心因为在户外时间过长而手机或者其他电子产品电量耗尽。户外储能电源可保证人们随时随地的用电需求,同时也可以满足家电炊具的供电需求&a…...

无线WiFi安全渗透与攻防(八)之WEP-Hirte渗透WEP加密
WEP-渗透WEP新思路–Hirte 1.Hirte介绍 Hirte是破解无线网络WEP Key的一种攻击类型 只要客户端设备(笔记本电脑,手机等)连接过的无线网络,那些WIFI即使是不在攻击者范围内也都能被破解,因为该wifi的WEP密钥和配置文…...
前端常考面试题整理
display:none与visibility:hidden的区别 这两个属性都是让元素隐藏,不可见。两者区别如下: (1)在渲染树中 display:none会让元素完全从渲染树中消失,渲染时不会占据任何空间;visibility:hidden不会让元素…...

二十二、身份验证与权限
一、 准备工作 为了讲清楚身份验证与权限,我们再创建一个应用projects,设计模型如下: class Project(models.Model):name models.CharField(项目名称, max_length20, help_text项目名称)desc models.CharField(项目描述, max_length200, help_text项目…...

k8s pod 升级与回滚
当集群中的某个服务需要升级时,我们需要停止目前与该服务相关的所有pod,然后下载新版本镜像并创建新的pod。如果集群规模比较大,则这个工作变成了一个挑战,而且先全部停止然后逐步升级的方式会导致较长时间的服务不可用。kubernet…...

【Go】Go语言开发环境安装
【Go】Go语言开发环境安装 导入 安装环境:Winowds 我现在是win7安装的,与win10整体步骤是一样的,只是部分显示的时候有点差异不影响; 【名词】 编译器:先将代码编译成可执行文件,再执行; —…...
el-switch使用
效果图: 1.表格代码,给el-waitch加上change事件 <el-table-column prop"status" label"状态" align"center" width"150"> <template slot-sc…...

【算法入门】字符串基础
目录 一.字符串引言1.字符串基础二.洛谷P5734详解1.字符串相关库函数💫(1) strcpy函数 💫💫(2) strcat函数 💫💫(3)strstr函数 💫2.题…...

前端面试题 —— 浏览器原理(二)
目录 一、有哪些可能引起前端安全的问题? 二、网络劫持有哪几种,如何防范? 三、浏览器渲染进程的线程有哪些 四、僵尸进程和孤儿进程是什么? 五、为什么需要浏览器缓存? 六、对浏览器的理解 七、CSS 如何阻塞文档解析&…...

对于植物神经紊乱的治疗 中医采用辩证论治的方法
植物神经紊乱是由于心理压力过大、长期生活不规律所导致的一种疾病,这种疾病的发生往往是症状多样、涉及广泛的。当患有植物神经紊乱之后,主要的症状会以躯体化障碍为常见症状,但是很多患者还会出现情绪失控、睡眠障碍等问题。 对于植物神经紊…...
chatGPT之Python API启用上下文管理
chatGPT已经爆火一段时间了,我想大多数的开发者都在默默的在开发和测试当中,可能也是因为这个原因所以现在很难找到关于开发中遇到的一些坑或者方法和技巧。为什么别人的机器人能联想之前的语料,而你的却像个每次都只如初见的高冷机器人&…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...