Kubernetes Secret的创建与使用

前提条件

  • 拥有Kubernetes集群环境,可参考:Kubernetes集群搭建
  • 理解Kubernetes部署知识,可参考:使用Kubernetes部署第一个应用 、Deloyment控制器

Secret简介

Kubernetes Secret 是一种用于存储敏感信息(如密码、令牌、密钥等)的对象。它可以让你将敏感数据以加密的方式存储在 Kubernetes 集群中,避免在配置文件或容器镜像中以明文形式暴露这些信息。这对于安全地部署应用程序至关重要,例如,在一个包含数据库连接的应用场景中,数据库的用户名和密码就可以存储在 Secret 中。

Secret如何保证数据安全

  • 存储加密
    • Base64 编码混淆:虽然 Base64 编码不是真正的加密,但它可以对数据进行一定程度的混淆。在 Kubernetes 中,Secret 数据在存储时会进行 Base64 编码。例如,密码等敏感信息被编码后,以一种不可直接阅读的格式存储在data字段下。这使得在存储层面,数据内容不会以明文形式轻易暴露。
    • etcd 加密(可选):etcd 是存储 Kubernetes 集群状态包括 Secret 的数据库。可以启用 etcd 加密来增强存储安全。通过配置 API Server 与 etcd 之间的通信加密,使用 TLS(Transport Layer Security)来保护数据传输路径。同时,etcd 本身也支持加密存储数据,防止数据在存储介质上被未授权访问。
  • 访问控制
    • RBAC 严格授权:Role - Based Access Control(RBAC)是 Kubernetes 保障 Secret 安全访问的关键机制。通过定义精确的角色(Role)和角色绑定(RoleBinding),可以限制谁(用户、组或者服务账户)能够对 Secret 进行何种操作(如创建、读取、更新和删除)。例如,对于生产环境中的敏感 Secret,只有特定的运维团队角色可以进行更新操作,开发人员角色可能只有读取权限。
    • 命名空间隔离防护:Secret 是命名空间(Namespace)范围内的资源。不同命名空间中的 Secret 相互隔离,这提供了天然的访问屏障。例如,开发环境的 Secret 存放在开发命名空间,生产环境的 Secret 存放在生产命名空间,默认情况下,开发环境的用户无法访问生产命名空间的 Secret,有效防止了跨环境的非授权访问。
  • 传输安全
    • TLS 加密传输:在集群内部,Secret 数据在传输过程中可以通过 TLS 进行加密。当 API Server 与节点之间或者不同组件之间传输 Secret 相关的数据时,TLS 通道确保数据在网络上以加密的形式传输。这防止了数据在传输过程中被中间人窃取或者篡改,保证了数据从存储位置到使用位置的安全性。
  • 使用安全措施
    • 容器内权限管理:当 Secret 在容器中作为环境变量或者挂载文件使用时,Kubernetes 会谨慎处理。如果是挂载文件,容器内的应用程序可以被配置为以只读权限访问这些文件,避免了文件内容被意外修改。对于作为环境变量注入的 Secret 数据,容器内的进程只能在其运行权限范围内使用这些变量,减少了数据泄露风险。
    • 更新谨慎处理:更新 Secret 时,Kubernetes 采取谨慎的策略。已经运行的容器不会自动获取更新后的 Secret 内容,这是为了避免配置突然变化导致应用程序异常。这种机制确保了 Secret 更新过程的可控性,防止因配置更新导致的潜在安全漏洞。只有在经过适当的操作(如重新部署容器或者采用支持热更新且经过安全验证的方式)后,容器才会获取新的 Secret 内容。

Secret 的类型

内置类型用法
Opaque用户定义的任意数据
kubernetes.io/service-account-token服务账号令牌
kubernetes.io/dockercfg~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth用于基本身份认证的凭据
kubernetes.io/ssh-auth用于 SSH 身份认证的凭据
kubernetes.io/tls用于 TLS 客户端或者服务器端的数据

这里选取Opaque、service-account-token、dockerconfigjson类型作案例演示。

Base64编码/解码

  • Base64工具:Base64 工具
  • 命令行
# 编码
[root@k8s-master01 ~]# echo -n "admin" | base64
YWRtaW4=
​
# 解码
[root@k8s-master01 ~]# echo -n "YWRtaW4=" | base64 -d
admin
​

Opaque Secret

创建Secret 

Opaque 类型的数据是一个 map 类型,要求value是 base64编码格式,比如创建一个用户名为 admin,密码为 admin321 的 Secret 对象,首先将用户名和密码做 base64 编码

$ echo -n "admin" | base64
YWRtaW4=
​
$ echo -n "admin321" | base64
YWRtaW4zMjE=

然后用base64编码过后的数据来编写一个 YAML文件:(secret-demo.yaml)

创建yaml文件

# 目录准备
[root@k8s-master01 test]# mkdir secrettest
[root@k8s-master01 test]# cd secrettest/
​
# 创建yaml文件
[root@k8s-master01 secrettest]# vi secret-demo.yaml

内容如下

apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: YWRtaW4=password: YWRtaW4zMjE=

使用 kubectl命令来创建了:

[root@k8s-master01 secrettest]# kubectl create -f secret-demo.yaml
secret/mysecret created

利用 get secret命令查看:

[root@k8s-master01 secrettest]# kubectl get secret
NAME       TYPE     DATA   AGE
mysecret   Opaque   2      8s

使用 describe命令,查看详情:

[root@k8s-master01 secrettest]# kubectl get secret
NAME       TYPE     DATA   AGE
mysecret   Opaque   2      8s
[root@k8s-master01 secrettest]# kubectl describe secret mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>
​
Type:  Opaque
​
Data
====
password:  8 bytes
username:  5 bytes

可以看到利用 describe命令查看到的 Data没有直接显示出来,如果想看到 Data里面的详细信息,可以输出成 YAML文件进行查看:

[root@k8s-master01 secrettest]# kubectl get secret mysecret -o yaml
apiVersion: v1
data:password: YWRtaW4zMjE=username: YWRtaW4=
kind: Secret
metadata:creationTimestamp: "2024-11-28T15:58:49Z"name: mysecretnamespace: defaultresourceVersion: "563446"uid: 092ffdfc-8ba7-4ac5-aae2-2787e0fe9cb7
type: Opaque

使用Secret

创建好 Secret对象后,有两种方式来使用它:

  • 以环境变量的形式

  • 以Volume的形式挂载

环境变量

创建yaml文件

vi secret1-pod.yaml

内容如下

apiVersion: v1
kind: Pod
metadata:name: secret1-pod
spec:containers:- name: secret1image: busyboxcommand: [ "/bin/sh", "-c", "env" ]env:- name: USERNAMEvalueFrom:secretKeyRef:name: mysecretkey: username- name: PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: password

创建pod

[root@k8s-master01 secrettest]# kubectl create -f secret1-pod.yaml
pod/secret1-pod created

查看pod

[root@k8s-master01 secrettest]# kubectl get pod
NAME          READY   STATUS              RESTARTS   AGE
secret1-pod   0/1     ContainerCreating   0          35s
​
[root@k8s-master01 secrettest]# kubectl get pod
NAME          READY   STATUS      RESTARTS   AGE
secret1-pod   0/1     Completed   0          56s
​

等到pod的状态为Completed,查看 Pod的日志输出:

[root@k8s-master01 secrettest]# kubectl logs secret1-pod
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.0.0.1:443
HOSTNAME=secret1-pod
SHLVL=1
HOME=/root
USERNAME=admin
KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
KUBERNETES_SERVICE_HOST=10.0.0.1
PWD=/
PASSWORD=admin321
​

可以看到有 USERNAME 和 PASSWORD 两个环境变量输出出来。

Volume 挂载

创建yaml文件

[root@k8s-master01 secrettest]# vi secret2-pod.yaml

内容如下

apiVersion: v1
kind: Pod
metadata:name: secret2-pod
spec:containers:- name: secret2image: busyboxcommand: ["/bin/sh", "-c", "ls /etc/secrets"]volumeMounts:- name: secretsmountPath: /etc/secretsvolumes:- name: secretssecret:secretName: mysecret

创建 Pod:

[root@k8s-master01 secrettest]# kubectl create -f secret2-pod.yaml 
pod/secret2-pod created

查看pod

[root@k8s-master01 secrettest]# kubectl get pod
NAME          READY   STATUS             RESTARTS      AGE
secret1-pod   0/1     CrashLoopBackOff   4 (40s ago)   4m29s
secret2-pod   0/1     Completed          0             36s
​

查看输出日志:

[root@k8s-master01 secrettest]# kubectl logs secret2-pod
password
username

可以看到 secret把两个key挂载成了两个对应的文件。

dockerconfigjson Secret

创建docker registry认证的 Secret,直接使用 kubectl create命令创建,如下:

[root@k8s-master01 secrettest]# kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret/myregistry created

然后查看 Secret列表:

[root@k8s-master01 secrettest]# kubectl get secret
NAME         TYPE                             DATA   AGE
myregistry   kubernetes.io/dockerconfigjson   1      10s
mysecret     Opaque                           2      11m
​

注意看上面的 TYPE类型,myregistry是不是对应的 kubernetes.io/dockerconfigjson,使用 describe命令来查看详细信息:

[root@k8s-master01 secrettest]# kubectl describe secret myregistry
Name:         myregistry
Namespace:    default
Labels:       <none>
Annotations:  <none>
​
Type:  kubernetes.io/dockerconfigjson
​
Data
====
.dockerconfigjson:  152 bytes
​

看到 Data区域没有直接展示出来,如果想查看的话可以使用get命令 -o yaml来输出展示出来:

[root@k8s-master01 secrettest]# kubectl get secret myregistry -o yaml
apiVersion: v1
data:.dockerconfigjson: eyJhdXRocyI6eyJET0NLRVJfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiLCJwYXNzd29yZCI6IkRPQ0tFUl9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZTWDFWVFJWSTZSRTlEUzBWU1gxQkJVMU5YVDFKRSJ9fX0=
kind: Secret
metadata:creationTimestamp: "2024-11-28T16:10:35Z"name: myregistrynamespace: defaultresourceVersion: "564657"uid: 0c379366-e94e-4fa0-9027-28a040d24ecf
type: kubernetes.io/dockerconfigjson
​

把上面的 data.dockerconfigjson下面的数据做一个 base64解码,可以查看docker registry认证信息

[root@k8s-master01 secrettest]# echo eyJhdXRocyI6eyJET0NLRVJfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiLCJwYXNzd29yZCI6IkRPQ0tFUl9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZTWDFWVFJWSTZSRTlEUzBWU1gxQkJVMU5YVDFKRSJ9fX0= | base64 -d
{"auths":{"DOCKER_SERVER":{"username":"DOCKER_USER","password":"DOCKER_PASSWORD","email":"DOCKER_EMAIL","auth":"RE9DS0VSX1VTRVI6RE9DS0VSX1BBU1NXT1JE"}}} 
​

如果需要拉取私有仓库中的 docker镜像的话就需要使用到上面的 myregistry这个 Secret

apiVersion: v1
kind: Pod
metadata:name: foo
spec:containers:- name: fooimage: 192.168.1.100:5000/test:v1imagePullSecrets:- name: myregistrykey

需要拉取私有仓库镜像 192.168.1.100:5000/test:v1,就需要针对该私有仓库来创建一个如上的 Secret,然后在 Pod的 YAML 文件中指定 imagePullSecrets

service-account-token Secret

service-account-token,用于被 serviceaccount引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。

Pod 如果使用了 serviceaccount,对应的secret会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount目录中。

使用一个 nginx镜像来验证一下

[root@k8s-master01 secrettest]# kubectl run secret-pod3 --image nginx:1.14.2
pod/secret-pod3 created
​
[root@k8s-master01 secrettest]# kubectl get pods
NAME          READY   STATUS             RESTARTS        AGE
secret-pod3   1/1     Running            0               12s
secret1-pod   0/1     CrashLoopBackOff   6 (4m53s ago)   13m
secret2-pod   0/1     CrashLoopBackOff   6 (74s ago)     9m50s
​
[root@k8s-master01 secrettest]# kubectl exec secret-pod3 -- ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token
​
[root@k8s-master01 secrettest]# kubectl exec secret-pod3 -- cat /run/secrets/kubernetes.io/serviceaccount/token
eyJhbGciOiJSUzI1NiIsImtpZCI6Ii1MZ29NaWJ3R0lpQ1hCSTB4bzQzbkp5V0hiXzJsODA2M0lKakRPRkZ2eEEifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzY0MzQ2NjAyLCJpYXQiOjE3MzI4MTA2MDIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiNDRjYWMwNTktYjQzYi00OTY5LThjNDUtNDBhN2M4NWJhY2QxIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwibm9kZSI6eyJuYW1lIjoiazhzLW5vZGUwMSIsInVpZCI6ImQxZDU3ZTgwLWVlYjUtNDRjOC1hZDk4LWYxZjllNzk4MWQ4ZSJ9LCJwb2QiOnsibmFtZSI6InNlY3JldC1wb2QzIiwidWlkIjoiMjRhYmRhYWEtZDhjMC00ODkzLTk4ZTQtNWQyZjM5M2YwN2NkIn0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJkZWZhdWx0IiwidWlkIjoiYzBhYjc4ZTAtZDZkMC00NWFmLTlkNTQtOTFhMmI3MGZjOTdkIn0sIndhcm5hZnRlciI6MTczMjgxNDIwOX0sIm5iZiI6MTczMjgxMDYwMiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6ZGVmYXVsdCJ9.GPtgJy4-o3-l2ZmIsc4yY2tdjpTlofS1uOoGaAFoDAjtZ0Xh0ZvRxD6-Ae8NHgLv9Wmu2jY4jiE54-C56R_7N7iDby4zzwa9DuMtytIDk4ZMv85X7GcoBd7z5kfvWU3mMIVZP8dKYopblNYTQX80Homv-HKX-vD1fRasiF13xGmxCWkcxcCM2pZamXDJ2_YZcZ-_buGvZK5Ejfmfm51lmUzICFbcWWd9ZKTx5W5PnlCfUgaCsfq7ZBVz_NjUP9Ufw9a8qGc9in9iGnrOdTetcn1-UW9oqXeVoFUxRAYjYXJR-22iwlCKme5uvtr63r2WPEn-b_-j_tWzTvV_T_BEmQ

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

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

相关文章

电脑出现 0x0000007f 蓝屏问题怎么办,参考以下方法尝试解决

电脑蓝屏是让许多用户头疼的问题&#xff0c;其中出现 “0x0000007f” 错误代码更是较为常见且棘手。了解其背后成因并掌握修复方法&#xff0c;能帮我们快速恢复电脑正常运行。 一、可能的硬件原因 内存问题 内存条长时间使用可能出现物理损坏&#xff0c;如金手指氧化、芯片…

Ubuntu下ESP32-IDF开发环境搭建

Ubuntu下ESP32-IDF开发环境搭建 文章目录 Ubuntu下ESP32-IDF开发环境搭建一、前言二、软件安装三、开发环境搭建3.1 ESP-IDF安装&#xff1a;3.2 安装编译工具&#xff1a; 四、编译并烧录代码五、ESP32代码编辑工具 一、前言 ​ 开发ESP32&#xff0c;我们首先就要安装开发环…

Linux复习4——shell与文本处理

认识vim编辑器 #基本语法格式&#xff1a; vim 文件名 •如果文件存在&#xff0c;进入编辑状态对其进行编辑 •如果文件不存在&#xff0c;创建文件并进入编辑状态 例&#xff1a; [rootlocalhosttest]# vim practice.txt #Vim 编辑器三种模式&#xff1a; 命令模式&a…

5个实用的设计相关的AI网站

在这个日新月异的数字时代&#xff0c;我们不断面临着新的挑战和机遇。随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;越来越多的AI工具开始融入到设计相关的工作流程中&#xff0c;极大地提升了工作效率和创作能力。今天&#xff0c;我非常兴奋地向大家介…

云手机群控能用来做什么?

随着云手机的发展&#xff0c;云手机群控技术逐渐从小众的游戏多开工具&#xff0c;发展为涵盖多个领域的智能操作平台。不论是手游搬砖、短视频运营&#xff0c;还是账号养成等场景&#xff0c;云手机群控都展现出了强大的应用潜力。本文将为大家详细解析云手机群控的应用场景…

数据结构(哈希表(中)纯概念版)

前言 哈希表&#xff08;Hash Table&#xff09;是计算机科学中的一个基础而重要的数据结构&#xff0c;它广泛评估各种算法和系统中&#xff0c;尤其是在需要快速查找、插入和删除操作的场景中。由于其O( 1)的平均时间复杂度&#xff0c;存储表在性能要求较高的应用中表现得非…

Python使用requests_html库爬取掌阅书籍(附完整源码及使用说明)

教程概述 本教程先是幽络源初步教学分析掌阅书籍的网络结构&#xff0c;最后提供完整的爬取源码与使用说明&#xff0c;并展示结果&#xff0c;切记勿将本教程内容肆意非法使用。 原文链接&#xff1a;Python使用requests_html库爬取掌阅书籍&#xff08;附完整源码及使用说明…

水库大坝三维模型开发bim篇

效果图 开发过程 使用了bimface 插件上传做好rvt模型到bimface工程引入bimface相关的插件代码加载模型自定义目录树定位构件闪烁构件展示构件信息 代码 技术交流加V:bloxed appKey 和appSecret 换成自己的就行 <template><div class"box-bim w100" ref&…

CSharp: Oracle Stored Procedure query table

存储过程查询postgreSQL,Oracle 和sql server,Mysql 有区别。程序调用也是有区别。 oracle sql script: CREATE OR REPLACE PROCEDURE procSelectSchool(paramSchoolId IN char,p_cursor OUT SYS_REFCURSOR ) AS BEGINOPEN p_cursor FORSELECT *FROM SchoolWHERE SchoolId p…

C语言基础——指针(4)

一&#xff0e; 字符指针变量 字符指针变量的使用和整型指针变量的使用方法相似&#xff0c;以下是其基本使用方法的例子&#xff1a; &#xff08;1&#xff09;字符指针变量还有一种使用方法&#xff1a; const char* p "abcd" 需…

Net9解决Spire.Pdf替换文字后,文件格式乱掉解决方法

官方文档 https://www.e-iceblue.com/Tutorials/Spire.PDF/Program-Guide/Text/Find-and-replace-text-on-PDF-document-in-C.html C# 在 PDF 中查找替换文本 原文件如下图&#xff0c;替换第一行的新编码&#xff0c;把41230441044替换为41230441000 替换代码如下&#xff…

【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;该程序需输入个人数据&#xff0c;进而预测其成年后的身高。 相关知识 为了完成本…

【自动化测试】windows下安装Selenium浏览器界面测试工具

Date: 2024.12.23 10:15:53 author: lijianzhan 简述&#xff1a;这篇教程详细介绍了如何在Windows环境下安装selenium&#xff0c;并设置Chrome浏览器驱动。什么是Selenium&#xff1f;Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端…

前端网络之【浏览器跨域问题分析与解决方案】

文章目录 同源策略同源与异源跨域的限制场景解决方案 CORS 请求分类 简单请求预检请求 注意点一 【关于Cookie】注意点二 【关于跨域获取响应头】 JSONP 基本流程 代理服务器 如何选择对应方案 同源策略 **同源策略是一套浏览器的安全策略机制&#xff0c;当一个源的文档和脚…

老旧小区用电安全保护装置#限流式防火保护器参数介绍#

摘要 随着居民住宅区用电负荷的增加&#xff0c;用电安全问题日益突出&#xff0c;火灾隐患频繁发生。防火限流式保护器作为一种新型电气安全设备&#xff0c;能够有效预防因电气故障引发的火灾事故。本文介绍了防火限流式保护器的工作原理、技术特点及其在居民住宅区用电系统…

论文复刻:ESG表现对企业价值的影响机制研究——A股上市公司证据(2009-2023年)

参照王波&#xff08;2022&#xff09;的做法&#xff0c;对来自软科学《ESG表现对企业价值的影响机制研究——来自我国A股上市公司的经验证据》一文中的基准回归部分进行复刻 以中国2009-2023年A股上市公司为研究样本考察企业的环境、社会和治理&#xff08;ESG&#xff09;表…

小程序租赁系统开发指南与实现策略

内容概要 在如今这个快节奏的时代&#xff0c;小程序租赁系统的开发正逐渐成为许多商家提升服务质量与效率的重要选择。在设计这样一个系统时&#xff0c;首先要明白它的核心目标&#xff1a;便捷、安全。用户希望在最短的时间内找到需要的物品&#xff0c;而商家则希望通过这…

[2003].第2-01节:关系型数据库表及SQL简介

所有博客大纲 后端学习大纲 MySQL学习大纲 1.数据库表介绍&#xff1a; 1.1.表、记录、字段 1.E-R&#xff08;entity-relationship&#xff0c;实体-联系&#xff09;模型中有三个主要概念是&#xff1a; 实体集 、 属性 、 联系集2.一个实体集&#xff08;class&#xff09…

git推送本地仓库到远程(Gitee)

目录 一、注册创建库 二、创建仓库 三、推送本地仓库到远程 1.修改本地仓库用户名和邮箱 2.本地库关联远程仓库 3.拉取远程仓库的文件 4.推送本地库的文件 5.查看远程仓库 四、远程分支查看 1.查看远程分支 2.修改test.txt文件 一、注册创建库 Gitee官网&#xff1…

GoZero框架接入数据库引擎Gorm 并实战:构建简单的 CRUD 业务API

GoZero 是一个高性能的微服务框架&#xff0c;它基于 Go 语言开发&#xff0c;提供了丰富的工具支持&#xff0c;能够帮助开发者快速构建可扩展、易维护的应用。Gorm 是 Go 语言中常用的 ORM 库&#xff0c;它帮助我们简化数据库操作&#xff0c;使用面向对象的方式进行增删改查…