资源管理命令-陈述式

news2025/2/25 21:21:59

资源管理介绍

资源管理概念

在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。

//kubernetes的本质就是一个集群系统,用户可以在集群中部署各种服务,起始就是在kubernetes集群中运行一个个容器,并将指定的程序跑在容器中。

kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在pod中,而kubernetes一般也不会直接管理pod,而是通过pod控制器来管理pod的。

Pod可以提供服务之后,就要考虑如何访问Pod,kubernetes提供了service资源实现这个功能。

当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统

学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、service、存储等各种资源进行操作。

https://gitee.com/link?target=https%3A%2F%2Fwww.json2yaml.com%2Fconvert-yaml-to-json)

资源管理方式

命令式对象管理: 直接使用命令去操作kubernetes资源

也叫陈诉式管理方法:通过命名式语句来实现对资源管理。

kubectl run nginx-pod --image=nginx:1.17.1 --port=80

命令式对象配置: 通过命令配置和配置文件去操作kubernetes资源

kubectl create/path -f nginx-pod.yaml

声明式对象配置: 通过apply命令和配置文件去操作kubernetes资源

kubectl apply -f nginx-pod.yaml
类型操作对象   使用环境优点 缺点
命令式对象管理对象 测试简单只能操作活动对象,无法审计、跟踪
命令式对象配置  文件开发可以审计、跟踪项目大时,配置文件多
声明式对象配置  目录 开发支持目录操作意外情况下难以调试

 陈述式对象管理

基本概念

kubernetes集群管理资源的唯一入口是通过相应的方法调用apiserver的接口。
kubectl是官方的CTL命令行工具,用于与apiserver进行通信,将用户在命令行输入的命令,组织并转化为apiserver能识别的信息,进而实现管理k8s各种资源的一种有效途径。

kubectl 命令

kubectl 是kubernetes集群的命令行工具,通过它能够对集群本身记性管理,并能够在集群上进行容器化应用安装部署。

kubectl命令语法格式

kubernetes中所有的内容都抽象为资源,可以通过kubectl api-resources进行查看

kubectl [command] [type] [name] [flags]

command: //指定要对资源执行的操作,例如:create、get、delete

type: //指定资源类型,比如deployment、pod、service

name: //指定资源的名称,名称大小写敏感

flags: //指定额外的可选参数

经常使用的操作命令

  • kubernetes允许对资源进行多种操作,可以通过kubectl --help 进行查看

常用的资源类型 

基础命令使用

kubectl version
#查看版本信息(服务端和客户端版本都可查看到)

kubectl api-resources
#查看资源对象简写以及版本

kubectl cluster-info
#查看集群信息

source <(kubectl completion bash)
//可以将此条命令放入到环境变量中,每次开机都会执行自动补全命令
#配置kubectl 自动补全
###命令放在/etc/profile 或者/root/.bashrc

journalctl -u kubelet -f
#node节点查看日志

kubectl get pods -w
#持续监听pod的状态信息

基本信息查看(kubectl get)

kubectl get <resource> [-o wide|json|yaml] [-n namespace]
#获取资源的相关信息,-o指定输出格式,-n 指定命令空间

//<resource> :可以是具体资源名称,如pods
//nginx-xxx: 也可以是资源类型,如pod,或all(仅展示几种核心资源,并不完整)

案例演示

kubectl get pods
#查看当前默认命令空间(defaults)的pods信息

kubectl get pods -n kube-system
#查看指定的kube-system命名空间的资源

kubectl get pods -owide
#查看默认命名空间的pod详细信息

kubectl get pods -A 或者 kubectl get pods --all-namespace
#查看所有命名空间的pod资源信息

kubecrl get pods -A -owide
#查看所有命名空间下的pod资源信息,并显示详细信息

kubectl get pods --show-labels 
#查看当前默认的命令空间的下的pods的标签类型信息

kubectl get pods --show-labels -A
#查看所有命令空间下的标签信息

kubectl get pods -A -l app
#查看所有命名空间下,仅显示标签为app的资源

kubectl get pods -l app=nginx-ydq
#查看默认命名空间下的标签为nginx-ydq的资源

kubectl get cs
#查看服务组件状态信息

kubectl get nodes 
#查看node节点集群的信息

kubectl get ns
#查看命令空间资源(用于允许不同 命名空间 的 相同类型 的资源 重名的)

kubectl get deployment
#查看deployment的pod控制器

kubectl get all
#查看默认命名空间下的所有资源

kebectl get svc 
#查看service信息

常用命令参数总结

--all-namespace 或 -A   //表示显示所有的命令空间
--show-labels //显示所有标签
-l app //仅显示标签为app的资源
-n  //指定命令空间
-owide //显示详细信息

增删等操作

创建pod资源

创建pod资源分为两种,一种为 自主式pod 一种为 控制器pod
**自主式pod ** 创建无法指定副本数量,当pod挂掉后,不会进行重建,可直接删除。
控制器pod 创建可以设置副本数量,且当pod挂掉后,pod控制器会重新创建,要想删除只能删除pod控制器。

kubectl create ns app
#创建命名空间app

kubectl delete ns app
#删除命名空间app

kubectl create deployment nginx-ydq --image=nginx --port=80 --replicas=2 -n kube-public 
#在命名空间kube-public创建副本控制器(deployment)来启动pod,并创建2个副本(pod名称它会随机)
//删除它只能删除的pod控制器,删除控制器后,pod控制器下面的所有pod都会删除
###注意!!!!pod控制器,不能单独创建,基本是和创建pod一起制定创建pod控制器。

kubectl run nginx-ydq2 --image=nginx -n kube-public
#直接创建自主式pod(挂掉后不会重建,没有pod控制器)
//可以直接删除这个pod,它没有pod控制器

kubectl describe deployment nginx-ydq -n kube-public
#查看nginx-ydq的pod控制器的详细信息,

kubectl describe pods 【pod名称】 -n kube-public
#查看某个pod的详细信息

kubectl delete deployment nginx-ydq -n kube-public
#删除pod控制器,(里面所有的pod都会被删除)

kubectl delete pod nginx-ydq2 -n kube-public
#删除自主式pod。

kubectl delete pod 【pod名称】 -n 【命名空间】 --force --grace-period=0
#如pod无法删除,总是处于terminate状态,则要强行删除
//grace-period 表示过度存活期,默认30s,在删除pod之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止

登录pod中的容器

kubectl exec -it 【pod名称】 bash
#可以跨主机登录到指定的pod中的容器中,docker exec只能在容器所在主机上登录

扩容缩容pod控制器的pod

可以根据指定的数量,创建或缩小任意的pod的数量。

kubectl scale deployment nginx-ydq --replicas=4 -n kube-public
#扩容

kubectl scale deployment nginx-ydq --replicas=2 -n kube-public 
#缩容

标签操作(labels)

kubectl run nginx-ydq --image=nginx 
#创建自主式的pod

kubectl get pods nginx-ydq --show-labels
#查看当前pod的标签

kubectl label pods nginx-ydq verwion=1.0
#给nginx-ydq的pod加上标签信息

kubectl label pods nginx-ydq version=2.0 --overwrite
#更新版本标签
kubectl run nginx-ydq2 --image=nginx
#再创建一个pod

kubectl label pods nginx-ydq2 version=1.0
#打上version=1的标签

kubectl get pods --show-labels
#查看所有节点的标签

kubectl get pods -l version=2.0 
#筛选version=2.0的标签版本

kubectl get pods -l version!=2.0
#筛选version不等于2.0的标签版本

kubectl lable pod nginx-ydq version-
#删除标签

简单案例

下面以一个namespace/pod的创建pod和删除简单演示

# 创建一个namespace
kubectl create namespace dev

# 获取namespace
kubectl get ns

# 在此namespace下创建并运行一个nginx的Pod,名称为Pod
kubectl run pod --image=nginx:latest -n dev

# 查看新创建的pod
kubectl get pod -n dev

#查看新创建pod的详细信息
kubectl describe pods pod -n dev

# 删除指定的pod(前面指定删除Pod,后面指定名称)
kubectl delete pod pod -n dev

# 删除指定的namespace
kubectl delete ns dev

k8s的ip和端口介绍

ip的种类

kubernetes集群中有三种IP地址,分别如下:

  • Node IP: Node节点的IP地址,即物理网卡的IP地址。

  • Pod IP: Pod的IP地址,也就是docker容器的ip地址,此为虚拟IP地址

  • Cluster IP: service的IP地址,此为虚拟IP地址

Node IP

可以时候物理机的IP (也可能是虚拟机的IP)。每个service都会在node节点上开通一个端口,外部可以通过NodeIP:NodePort即可访问Service里的Pod,和我们访问服务器部署的项目一样,IP:端口/项目名

Cluster IP

service的IP地址,此为虚拟的ip地址,外部网络无法ping通,只有kubernets集群内部使用。

Cluster IP 是一个虚拟的IP,但更像是一个伪造的IP网络

Cluster IP 仅仅作用于 kubernetes service 这个对象,并由kubernetes管理和分配IP地址。
Cluster IP无法被ping,他没有一个“实体网络对象”来响应
Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备通信的基础,并且他们属于Kubernetes集群这样一个封闭的空间。
在不同Service下的pod节点在集群间相互访问可以通过Cluster IP

Pod IP

Pod IP是每个Pod的IP地址,他是Docker Engine根据docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络

同Service下的pod可以直接根据PodIP相互通信、
不同Service下的pod在集群间pod通信要借助于 cluster ip
pod和集群外通信,要借助于node ip

三种IP网络间通信

service地址和pod地址在不同网段,service地址为虚拟地址,不配在pod上或主机上,外部访问时,先到Node节点网络,再转到service网络,最后代理给pod网络。

Kubernetes在其所有节点上开放一个端口给外部访问(所有节点上都使用相同的端口号), 并将传入的连接转发给作为Service服务对象的pod。这样我们的pod就可以被外部请求访问到


k8s暴露服务给外部访问有三种方式,NodePort、LoadBalane、Ingress三种暴露服务的方式,上图是用了NodePort的方式,缺点是服务一旦多起来,NodePort 在每个节点上开启的端口数量会极其庞大,难以维护

port种类

node Port

外部流量访问k8s集群中service入口的一种方式(另一种方式是LoadBalancer),即nodeIP:nodePort是提供给外部流量访问k8s集群中service的入口。

Port

k8s集群内部服务之间访问service的入口。即clusterIP:port是service暴露在clusterIP上的端口。比如 mysql容器暴露了3306端口,集群内其他容器通过33306端口访问mysql服务,但是外部流量不能访问mysql服务,因为mysql服务没有配置NodePort。

target Port

targetPort是pod上的端口,从port和nodePort上来的流量,经过kube-proxy流入到后端pod的targetPort上,最后进入容器。

containner port

容器内部进程使用的端口。

hostPort

这是一种直接定义Pod网络的方式。hostPort是直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过宿主机的IP加上来访问Pod了

项目生命周期

项目的生命周期: 创建---->发布------>更新------->回滚------->删除

创建 (kubectl create)

  • 创建并运行一个或多个容器镜像

  • 创建一个deployment 或job来管理容器

  • 可使用:kubectl create --help ,来查看详细的用法。

kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=3
#启动 nginx 实例,暴露容器端口80,设置副本数3

kubectl get pods
#查看容器

kubectl get all
#查看所有资源

发布 (kubectl expose)

将资源暴露为新的srvice

kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort

#为Deployment 的nginx 创建service,并通过service的80端口转发至容器的80端口上,service的名称为nginx-service。类型为NodePort
 service的作用与类型
service的作用

kubernetes之所以需要service,一方面是因为Pod的IP不是固定的(Pod可能会重建),另一方面是因为一组实例之间总会有负载均衡的需求。
service通过label selector 实现的对一组Pod的访问
对于容器应用而言,kubernetes提供了基于VIP(虚拟IP)的网桥的方式访问service,再由service重定向到相应的Pod。

service的类型

cluster IP : 提供一个集群内部的虚拟IP以供Pod访问(service默认类型)

NodePort : 在每个Node上打开一个端口以供外部访问,kubernetes将会在每个Node上打开一个端口,并且每个Node的端口都是一样的,通过NodeIP:NodePort的方式。

LoadBalancer: 通过外部的负载均衡器来访问,通常在云平台部署LoadBalancer还需要额外的费用。

k8s端口

端口总结

port : 为service在clusterIP上暴露的端口
targetport : 对应容器映射在pod上的端口
nodeport: 可以通过在k8s集群外部使用的nodeip+nodeport 来访问service
containnerport : 容器内部进程使用的端口。

K8s集群内部:

客户端—》clusterIP:port—》通过targetport ----》pod port --》container port

客户端—》nodeIP:nodeport—》通过targetport ----》pod port --》container port

k8s集群外部

客户端–》nodeip:nodeport–》通过targetport ----》pod port --》container port

相关命令
kubectl get pods,svc -o wide
#查看pod网络状态详细信息和service暴露端口

kubectl get enpoints
#查看关联后端的节点(集群的地址)

kubectl describe svc nginx
#查看service的描述信息

curl
#访问查看

kubectl log 【pod名称】
#查看访问日志

更新 (kubectl set)

http://www.lanxinbase.com/?p=2553

更改现有应用资源一些信息

  • 可以使用kubectl set --help 进行查看命令使用方法
  • 使用 kubectl set image --help ,查看修改的模板
curl -I 20.0.0.50:32179
curl -I 20.0.0.60:32179
#查看当前nginx的版本号
kubectl set image deployment/nginx nginx=nginx:1.15
#将nginx版本更新为1.15版本(更新的过程中,不会影响使用,因是滚动更新)

kubectl get pods -w
#监听nginx版本,由于使用的是滚动更新方式,所以会先生成一个新的pod,然后删除一个旧的pod,往后一次类推

kubectl get pods -o wide
#查看更新好后的pod的ip会改变

回滚 (kubectl rollout)

对资源进行回滚管理

  • 使用kubectl rollout ,可进行查看帮助信息
回滚到上一个版本
kubectl rollout history deployment/nginx
#查看历史版本

kubectl rollout undo deployment/nginx
#回滚到上一个版本

kubectl get pods -o wide
#查看新创建pod

curl -I 20.0.0.50:32179
#查看当前nginx的版本
回滚到指定的版本
kubectl rollout history deployment/nginx
#查看历史版本

kubectl rollout undo deployment/nginx --to-revision=2
#回滚到revison2,也就是1.15版本

kubectl get pods -owide
#查看pod的ip变化

curl -I 20.0.0.50:32179
#查看当前nginx的版本

kubectl rollout status deployment/nginx
#查看回滚状态

删除 (kubectl delete)

kubectl delete deployment/nginx
#删除pod控制器(相当与命令: kubectl delete deployment nginx)

kubectl delete svc/nginx-service
#删除指定svc端口

金丝雀发布(Canary Release)

Deployment 控制器支持自定义控制更新过程中的滚动节奏, 如“暂停(pause)”或“继续(resume)”更新操作, 比如等待第一批新的pod资源创建完成后立即暂停更新过程, 此时,仅存在一部分新版本的应用,主体部分还是旧版本。

然后, 再筛选一小部分的用户请求路由到新版本的pod应用,继续观察能否稳定的按期望的方式运行。确定没问题之后在继续完成余下的pod资源滚动更新,否则立即回滚更新操作,这就是所谓的金丝雀发布。

简单理解:就是只更新一小部分的pod用来试运行,运行一段时间没问题了,再进行滚动更新。否则进行回滚

//当前所有的pod版本为1.14版本

kubectl set image deployment/nginx nginx=nginx:1.15 && kubectl rollout pause deployment/nginx
#更新deployment的版本,并配置暂停deployment的更新

kubectl rollout status deployment/nginx
#查看更新状态

kubectl get pods -owide
#可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源,就是因为使用了pause暂停命令

curl -I 
#查看版本信息

kubectl rollout resume deployment/nginx
#确保更新的pod没问题了,继续更新

kubectl get pods -w
#查看最后的更新情况

curl -I 
#查看版本信息
//如果在进行灰度发布时,想要新版本和旧版本进行隔离,让客户端只能访问到后台新版本pod。

可以使用以下命令进行新创一个service端口,
kubectl expose deployment nginx-new --port=80 --tager-port=80 --type=NodePort
#重新生成一个service

kubectl edit svc nginx-new
#修改service的后台标签信息

//然后此时,通过新生成的service的ip地址,访问时,只能访问到新的版本。
//相当于游戏的公测版本,单独发布。
kuvectl get pods --show-labels
#查看pod的标签信息


 

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

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

相关文章

网络爬虫——urllib(5)

前言&#x1f36d; ❤️❤️❤️网络爬虫专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Python网络爬虫_热爱编程的林兮的博客-CSDN博客 上一篇我们讲解有关ajax的相关案例&#xff0c;下面我们来学习新的关于ur…

开发小程序需要多少钱?

随着移动互联网的快速发展&#xff0c;小程序已经成为了企业、个人创业者获取用户、提升品牌影响力的重要工具。然而&#xff0c;对于许多初次接触小程序的人来说&#xff0c;开发小程序需要多少钱&#xff0c;是他们最关心的问题。 首先我们需要明确的是&#xff0c;开发小程…

AI技术发展:防范AI诈骗,守护数字安全

随着AI技术的迅猛发展&#xff0c;人工智能赋予了计算机更多的能力&#xff0c;包括自然语言处理、图像生成、声音合成等。这些领域的突破为人们提供了全新的体验和便捷&#xff0c;但同时也催生了一些潜在的安全风险&#xff0c;其中最突出的就是AI诈骗。本文将探讨如何防范AI…

echarts 地图迁徙与地图下钻

echarts 地图迁徙与地图下钻 一、迁徙 1、引入中国地图数据及echarts const china require("./echarts-mapJson-master/china.json") import * as echarts from echarts2、数据准备 // 点数据 需要hover或点击获取数据可以添加额外的参数&#xff0c; // 如{ val…

前端开发必知:HTML、Vue和React中的跨域页面跳转解决方案

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

万物皆可“云” 从杭州云栖大会看数智生活的未来

文章目录 前言一、云栖渐进&#xff1a;一个科技论坛的变迁与互联网历史互联网创新创业飞天进化飞天智能驱动数字中国 二、2023云栖大会&#xff1a;云计算人工智能 玩出科技跨界新花样大会亮点重磅嘉宾热门展览算力馆人工智能馆产业创新馆 总结 前言 10月31日&#xff0c;202…

查询平均提速 700%,奇安信基于 Apache Doris 升级日志安全分析系统

本文导读&#xff1a; 数智时代的到来使网络安全成为了不可忽视的重要领域。奇安信作为一家领先的网络安全解决方案领军者&#xff0c;致力于为企业提供先进全面的网络安全保护&#xff0c;其日志分析系统在网络安全中发挥着关键作用&#xff0c;通过对运行日志数据的深入分析…

做好团队沟通和协调 不可忽略的5个重点

做好团队的沟通和协调&#xff0c;可以确保成员之间及时交流、分享信息和解决问题。这有助于避免信息滞后和工作冲突&#xff0c;提高工作效率。如果沟通不顺畅&#xff0c;往往导致成员间信息传递不及时或遗漏&#xff0c;容易产生误解和冲突&#xff0c;影响项目进度地顺利开…

【LVS实战】02 搭建一个LVS-NAT模式实验

一、网络结构 用虚拟机搭建如下的几台机器&#xff0c;并配置如下的ip 关于虚拟机网卡和网络的配置&#xff0c;可以参考 iptables章节&#xff0c;05节&#xff1a;网络转发实验 主机A模拟外网的机器 B为负载均衡的机器 C和D为 RealServer 二、C和D主机的网关设置 C和D机…

专业医学病例翻译公司推荐

我们知道&#xff0c;医学病例翻译在涉外看病的患者中具有广泛的应用&#xff0c;它可以帮助医生快速了解患者的病情&#xff0c;为治疗和药物处方提供关键信息。因此&#xff0c;对于出国看病的患者&#xff0c;医学病例翻译便成了不可或缺的重要工具。 翻译医学病例不仅要求译…

使用 Node.js 搭建 API 网关

您好&#xff0c; 如果喜欢我的文章或者想上岸大厂&#xff0c;可以关注公众号「量子前端」&#xff0c;将不定期关注推送前端好文、分享就业资料秘籍&#xff0c;也希望有机会一对一帮助你实现梦想 外部客户端访问微服务架构中的服务时&#xff0c;服务端会对认证和传输有一些…

如何将微信视频号的视频保存到手机相册?

微信视频号是近年来微信推出的一项功能&#xff0c;它允许用户通过手机拍摄和分享短视频内容。然而&#xff0c;许多人纷纷表示他们想要保存微信视频号上的视频&#xff0c;以便在离线时观看。但一直以来这个需求腾讯一直没有开放随后也取消了复制视频链接功能&#xff0c;为此…

最全的操作系统原版镜像,镜像winxp、win7、8、10、11,win server2008、2012、2016、2019、2022各版本系统下载 址

1、 MSDN原版系统(我告诉你&#xff09; [软件、镜像下载地址](https://www.imsdn.cn/)2、 HelloWindows.cn 精校 完整 极致 Windows系统下载仓储站 镜像、软件下载地址 3、系统库 镜像下载地址 4、 山己几子木 镜像下载地址

Redis Predixy 集群

文章目录 一、概述二、测试规划三、Redis 服务实例准备3.1 配置Redis实例3.2 创建相关资源3.2 启动Redis服务实例 四、Sentinel 监控准备4.1 配置 sentine l3.2 开启 Sentinel 五、安装配置 Predixy5.1 下载 Predixy5.2 配置 Predixy5.3 启动 Predixy 代理 六、测试 如果您对Re…

快手协议算法最新版

快手的协议分析是指对快手算法系统进行分析&#xff0c;以了解其推荐内容和个性化用户体验的机制。 然而&#xff0c;一般来说&#xff0c;协议分析的目标是理解算法系统中各个组成部分的功能和作用&#xff0c;以及它们之间的相互关系。以下是一些常见的分析方向&#xff1a;…

Jmeter之JSR223

一、JSR223组件 JSR是Java Specification Requests的缩写,意思是Java规范提案。JSR已成为Java界的一个重要标准. JSR223其实包含了有好几种组件,但是其用法都是一致的,并且都是执行一段代码&#xff0c;主要分类如下&#xff1a; JSR223 PreProcessor JSR223 Timer JSR223 S…

高防CDN如何在防护cc上大显神通

高级防御CDN&#xff08;Content Delivery Network&#xff09;在对抗CC&#xff08;HTTP Flood&#xff09;攻击方面扮演着关键的角色&#xff0c;具备以下重要职能和作用&#xff1a; 流量分散&#xff1a;CC攻击的目标是通过大规模的HTTP请求使服务器过载&#xff0c;从而导…

【Docker】十分钟完成mysql8安装,你也可以的!!!

十分钟完成mysql8安装&#xff0c;你也可以的 前言安装步骤1.创建安装目录2.创建docker-compose.yml3.启动容器4.mysql开启远程连接5.连接mysql 总结 前言 本文基于Docker安装mysql:8.0.29&#xff0c;首先确保系统安装了docker和docker-compose。 没有使用过docker朋友可以去…

flink的安装与使用(ubuntu)

组件版本 虚拟机&#xff1a;ubuntu-20.04.6-live-server-amd64.iso flink&#xff1a;flink-1.18.0-bin-scala_2.12.tgz jdk&#xff1a;jdk-8u291-linux-x64.tar flink 下载 1、官网&#xff1a;https://flink.apache.org/downloads/ 2、清华镜像&#xff1a;https://mirr…

vue3+vite实现一个后台管理框架,毒蘑菇后台管理。

写后台管理的项目写了很多个了&#xff0c;虽说用的别人的模板&#xff0c;自己专注于自己的业务&#xff0c;保证自己的业务不出错就行了&#xff0c;但是自定义配置又不好去配置&#xff0c;大家用的模板都差不多&#xff0c;用模板自带的业务功能呢后台又得是模板自带的&…