八、快速入门Kubernetes之service
文章目录
- Service
- :one: VIP和Service代理
- :star: 代理模式分类
- 2、`iptables`代理模式
- 3、`ipvs`代理模式
- :two: `ClusterIP`
- :three:实列Service
- :four: `Headless Service`实列
- :five: `NodePort`
- :six: `LoadBalancer`
- :seven: `ExternalName`
Service
⭐️ 概念:Kubernetes Service
定义了这样-种抽象: 一个Pod
的逻辑分组, 一种可以访问它们的策略——通常称为微服务。这一组Pod
能够被Service
访问到,通常是通过Label Selector
⭐️Service
能够提供负载均衡的能力,但是在使用上有以下限制:只提供4层负载均衡能力,而没有7层功能,但有时我们可能需要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的,也就是说不能通过我们的主机名和域名来进行负载均衡,所以说要配合ingress
来实现7层负载均衡
⭐️ Service在k8s中有4种类型:
clusterIP
:默认,就仅仅只分配集群内部的应该虚拟IPNodePort
:在ClusterIP
的基础上,service
为每个pod
绑定上了对应端口,这样就可以通过访问对应端口来访问对应服务了。LoadBalancer
:在NodePort的基础上加上了云厂商提供的外部负载均衡服务器,并将请求转发到NodePortExternalName
:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有kubernetes 1.7
或更高版本的kube-dns
才支持,也就是创建一个svc
把外部集群的ip和端口号填入svc
,pod
就可以直接访问svc
来服务外部集群,假如集群变了,则只需要修改svc
地址即可
1️⃣ VIP和Service代理
- 在
Kubernetes
集群中,每个Node
运行一个kube-proxy
进程。kube-proxy
负责为Service
实现了一种VIP
(虛拟IP)的形式,而不是ExternalName
的形式。在Kubernetes
v1.0版本,代理完全在userspace
.在Kubernetes
v1.1版本,新增了iptables
代理,但并不是默认的运行模式。从Kubernetes v1.2
起,默认就是iptables
代理。在Kubernetes v1.8.0-beta.0
中,添加了ipvs
代理 - 在
Kubernetes 1.14
版本开始默认使用ipvs代理 - 在
Kubernetes v1.0
版本,Service
是"4层”(TCP/UDP over IP)概念。Kubernetes v1.1
版本,新增了Ingress API
(beta 版),用来表示"7层”(HTTP)服务
⭐️ 代理模式分类
1、userspace
代理模式
iptables
规则来访问到kube-proxy
在去访问serverPOD
,你要访问就要经过kube-proxy
,这样kube-porxy
就负载很大,又要被监控写iptables
规则又要做代理。
2、iptables
代理模式
是直接通过iptables
规则来直接访问pod
3、ipvs
代理模式
⭐️ 是直接通过ipvs
规则来直接访问pod
这种模式,kube-proxy
会监视Kubernetes Service
对象和Endpoints
,调用netlink
接口以相应地创建ipvs
规则并定期与Kubernetes Service
对象和Endpoints
对象同步ipvs
规则,以确保ipvs
状态与期望一致。访问服务时,流量将被重定向到其中-个后端Pod
⭐️ 与iptables
类似,ipvs
于netfilter
的hook
功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着ipvs
可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外, ipvs
为负载均衡算法提供了更多选项,例如:
rr
: 轮询调度lc
: 最小链接数dh
: 目标哈希sh
: 源哈希sed
: 最短期望延迟nq
: 不排队调度
假如上面这几项又一项未达到那么还是继续使用的
iptables
规则
2️⃣ ClusterIP
⭐️ clusterlP
主要在每个node
节点使用iptables
,将发向clusterIP
对应端口的数据,转发到kube-proxy
中。然后kube-proxy
自己内部实现有负载均衡的方法,并可以查询到这个service
下对应pod
的地址和端口,进而把数据转发给对应的pod
的地址和端口
⭐️ 这里是由你的环境决定的你的环境是ipvs
那clusterIP
就是使用的ipvs
⚠️ 为了实现图上的功能,主要需要以下几个组件的协同工作:
apiserver
用户通过kubectl
命令向apiserver
发送创建service
的命令,apiserver
接收到请求后将数据存储到etcd中kube-proxy
kubernetes
的每个节点中都有-一个叫做kube-porxy
的进程,这个进程负责感知service
,pod
的变化,并将变化的信息写入本地的iptables
规则中iptables/ipvs
使用NAT
等技术将virtuallP
的流量转至endpoint
中
3️⃣实列Service
1)创建pod
[root@master ~]# vim pod/svc-deploypod.yamlapiVersion: extensions/v1beta1
kind: Deployment
metadata:name: svc-nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: webappversion: v1template:metadata:name: nginxlabels:app: webappversion: v1spec:containers:- name: webappimage: harbor.tanc.com/library/nginximagePullPolicy: IfNotPresentports:- containerPort: 80name: httpprotocol: TCP
2)查看pod和deployment
[root@master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
svc-nginx-deployment 3/3 3 3 7m55s[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
svc-nginx-deployment-9bf97bf55-54tj4 1/1 Running 0 7m57s
svc-nginx-deployment-9bf97bf55-mx7sk 1/1 Running 0 7m57s
svc-nginx-deployment-9bf97bf55-rljqn 1/1 Running 0 7m57s
3)我们现在是可以用默认的svc
来访问到pod
的
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22h
4)我们查看一下ipvs
[root@master ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.96.0.1:443 rr-> 192.168.100.10:6443 Masq 1 3 0
TCP 10.96.0.10:53 rr-> 10.244.0.2:53 Masq 1 0 0 -> 10.244.0.3:53 Masq 1 0 0
TCP 10.96.0.10:9153 rr-> 10.244.0.2:9153 Masq 1 0 0 -> 10.244.0.3:9153 Masq 1 0 0
UDP 10.96.0.10:53 rr-> 10.244.0.2:53 Masq 1 0 0 -> 10.244.0.3:53 Masq 1 0 0
5)在查看一下pod ip
,可以看到ipvs
内并没有映射pod
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
svc-nginx-deployment-9bf97bf55-54tj4 1/1 Running 0 9m49s 10.244.2.34 node2 <none> <none>
svc-nginx-deployment-9bf97bf55-mx7sk 1/1 Running 0 9m49s 10.244.1.45 node1 <none> <none>
svc-nginx-deployment-9bf97bf55-rljqn 1/1 Running 0 9m49s 10.244.1.44 node1 <none> <none>
6)创建svc
[root@master ~]# vim pod/svc.yaml apiVersion: v1
kind: Service
metadata:name: svc-nginxlabels:app: webappversion: v1
spec:type: ClusterIPselector:app: webappversion: v1ports:- port: 80targetPort: 80
创建后查看
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22h
svc-nginx ClusterIP 10.109.8.90 <none> 80/TCP 56s
查看ipvs
[root@master ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 10.109.8.90:80 rr-> 10.244.1.44:80 Masq 1 0 0 -> 10.244.1.45:80 Masq 1 0 0 -> 10.244.2.34:80 Masq 1 0 0 xxxxxxxxxx8 1[root@master ~]# ipvsadm -Ln2IP Virtual Server version 1.2.1 (size=4096)3Prot LocalAddress:Port Scheduler Flags4 -> RemoteAddress:Port Forward Weight ActiveConn InActConn5 TCP 10.109.8.90:80 rr6 -> 10.244.1.44:80 Masq 1 0 0 7 -> 10.244.1.45:80 Masq 1 0 0 8 -> 10.244.2.34:80 Masq 1 0 0
- 访问
[root@master ~]# curl -L 10.109.8.90
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
4️⃣ Headless Service
实列
⭐️ 有时你不想要负载均衡,以及单独的Service IP
,遇到这种情况、可以通过指定ClusterIP
的值为“None
” 来创建Headless Service
。这类Service
并不会分配Cluster IP
、Kube-proxy
不会处理它们,而且平台也不会为它们进行负载均衡和路由,可以通过它来解决hostname
和ip
变化的问题。
1)创建svc
[root@master ~]# cat pod/hd.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-headless
spec:type: ClusterIPclusterIP: Noneselector:app: webappversion: v1ports:- name: nginxport: 80targetPort: 80protocol: TCP
2)查看svc
,我们可以看见是没有ip
地址的我们用DNS
解析一下svc
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23h
nginx-headless ClusterIP None <none> 80/TCP 17s
svc-nginx ClusterIP 10.109.8.90 <none> 80/TCP 37m
pod
是可以同时连接多个svc
的
这个域名是svc
名+命名空间名+svc
+cluster.local
[root@master ~]# dig -t A svc-nginx.default.svc.cluster.local. @10.244.0.2; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.5 <<>> -t A svc-nginx.default.svc.cluster.local. @10.244.0.2
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35197
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;svc-nginx.default.svc.cluster.local. IN A;; ANSWER SECTION:
svc-nginx.default.svc.cluster.local. 30 IN A 10.109.8.90;; Query time: 0 msec
;; SERVER: 10.244.0.2#53(10.244.0.2)
;; WHEN: Sat Aug 21 04:26:55 EDT 2021
;; MSG SIZE rcvd: 115
3)解析一下无头服务,可以看见pod
的ip
地址直接被解析出来了
[root@master ~]# dig -t A nginx-headless.default.svc.cluster.local. @10.244.0.2; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.5 <<>> -t A nginx-headless.default.svc.cluster.local. @10.244.0.2
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29123
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nginx-headless.default.svc.cluster.local. IN A;; ANSWER SECTION:
nginx-headless.default.svc.cluster.local. 30 IN A 10.244.1.45
nginx-headless.default.svc.cluster.local. 30 IN A 10.244.2.34
nginx-headless.default.svc.cluster.local. 30 IN A 10.244.1.44;; Query time: 0 msec
;; SERVER: 10.244.0.2#53(10.244.0.2)
;; WHEN: Sat Aug 21 04:29:08 EDT 2021
;; MSG SIZE rcvd: 237
5️⃣ NodePort
⭐️ nodePort
的原理在于在node
上开了一个端口, 将向该端口的流量导入到kube
-proxy
,然后由kube-proxy
进一步到给对应的pod
,也就是说它会在你的node节点上随机生成一个端口来映射service的端口
1)创建svc
[root@master ~]# cat pod/nodeport.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-nodeportlabels:app: nodeport
spec:type: NodePortselector:app: webappversion: v1ports:- port: 80targetPort: 80
2)查看svc可以看见80:30664
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24h
nginx-headless ClusterIP None <none> 80/TCP 49m
nginx-nodeport NodePort 10.108.196.116 <none> 80:30664/TCP 5s
svc-nginx ClusterIP 10.109.8.90 <none> 80/TCP 86m
3)打开浏览器访问–只要是集群的ip都可以
4)查看ipvs
[root@master ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.100.10:30664 rr-> 10.244.1.44:80 Masq 1 0 0 -> 10.244.1.45:80 Masq 1 0 0 -> 10.244.2.34:80 Masq 1 1 0
6️⃣ LoadBalancer
⭐️ loadBalancer
和nodePort
其实是同一种方式。区别在于loadBalancer
比nodePort
多了一步,就是可以调用cloud provider
去创建LB
来向节点导流,但是前提是就是pod是在云服务器上
7️⃣ ExternalName
⭐️这种类型的Service
通过返回CNAME
和它的值,可以将服务映射到externalName
字段的内容(例如:hub.atguigu.com
)。ExternalName
Service
是Service
的特例,它没有selector
,也没有定义任何的端口和Endpoint
。相反的,对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务
⭐️当查询主机my-service.defalut.svc.cluster.local
( SVC_NAME.NAMESPACE.svc.cluster.local
)时,集群的DNS
服务将返回-一个值my.database.example.com
的CNAME
记录。访问这个服务的工作方式和其他的相
同,唯一不同的是重定向发生在DNS
层,而且不会进行代理或转发
相关文章:

八、快速入门Kubernetes之service
文章目录 Service:one: VIP和Service代理:star: 代理模式分类2、iptables代理模式3、ipvs代理模式 :two: ClusterIP:three:实列Service:four: Headless Service实列:five: NodePort:six: LoadBalancer:seven: ExternalName Service ⭐️ 概念:Kubernetes Service 定…...
JVM 类加载机制详解
JVM 类加载机制详解 在 Java 虚拟机(JVM)中,类加载机制是一个非常重要的组成部分,它负责将类的字节码文件加载到内存中,并进行一系列的处理,最终使类能够被虚拟机使用。本文将详细介绍 JVM 类加载机制的相…...

在 JavaScript 中,`Array.prototype.filter` 方法用于创建一个新数组,该数组包含通过测试的所有元素
文章目录 1、概念在你的代码中的作用示例总结 2、实战3、formattedProducts4、filteredProducts 1、概念 在 JavaScript 中,Array.prototype.filter 方法用于创建一个新数组,该数组包含通过测试的所有元素。具体来说,filter 方法会遍历数组中…...

63 mysql 的 行锁
前言 我们这里来说的就是 我们在 mysql 这边常见的 几种锁 行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁 意向共享锁, 意向排他锁, 主要是 为了表粒度的锁获取的同步判断, 提升效率 意向共享锁, 意向排他锁 这边主要的逻辑意义是数据表中是否有任…...
ubuntu文件编辑操作
Vim 基本操作指南 在 vim 中打开文件后,可以按照以下步骤进行编辑和保存: 进入插入模式 打开文件后,默认情况下 vim 处于命令模式,无法直接输入文本。按下 i 键进入插入模式(会看到左下角显示 -- INSERT --࿰…...

Nuxt.js 应用中的 nitro:config 事件钩子详解
title: Nuxt.js 应用中的 nitro:config 事件钩子详解 date: 2024/11/2 updated: 2024/11/2 author: cmdragon excerpt: nitro:config 是 Nuxt 3 中的一个生命周期钩子,允许开发者在初始化 Nitro 之前自定义 Nitro 的配置。Nitro 是 Nuxt 3 的服务器引擎,负责处理请求、渲…...
【前端】项目中遇到的问题汇总(长期更新)
一、联调交互类 1、出现一个数据在当前页面进行了修改,另外一个页面的同一数据并未同步更改 当前的数据经过调用接口修改更新以后,if(code 200) 将当前数据存入store.dispatch, 然后另一个地方获取该数据,直接获取存入的数据,这…...

DAY73WEB 攻防-支付逻辑篇篡改属性值并发签约越权盗用算法溢出替换对冲
知识点: 1、支付逻辑-商品本身-修改-数量&价格&属性等 2、支付逻辑-营销折扣-优惠券&积分&签约&试用等 3、支付逻辑-订单接口-替换&并发&状态值&越权支付等 支付逻辑常见测试: 熟悉常见支付流程:选择商品…...

2024 Rust现代实用教程:Ownership与结构体、枚举
文章目录 一、Rust的内存管理模型1.GC(Stop the world)2.C/C内存错误大全3.Rust的内存管理模型 二、String与&str1.String与&str如何选择2.Example 三、枚举与匹配模式1.常见的枚举类型:Option和Result2.匹配模式 四、结构体、方法、…...

MMed-RAG:专为医学视觉语言模型设计的多功能多模态系统
MMed-RAG:专为医学视觉语言模型设计的多功能多模态系统 论文大纲提出背景全流程优化空雨伞分析空:观察现象层雨:分析原因层伞:解决方案层 三问分析WHAT - 问题是什么?WHY - 原因是什么?HOW - 如何解决&…...
数据采集(全量采集和增量采集)
全量采集:采集全部数据 3、全量采集 vim students_all.json {"job": {"setting": {"speed": {"channel": 1},"errorLimit": {"record": 0,"percentage": 0.02}},"content": [{…...

GPT-Sovits-1-数据处理
1.1 切割音频 将音频切割为多个10s内的片段 1.2 降噪 这一步用的是modelscope的pipeline 如果要去除背景音,可以用傅立叶转为为频谱,去除低频部分后再转回来 1.3 提取音频特征 这里用到了 funasr 库 这一步目的是输出音频样本的《文本标签文件》&am…...

web前端多媒体标签设置(图片,视频,音频)以及图片热区(usemap)的设置
多媒体标签运用 在HTML中有以下常见多媒体标签: <img> (图像标签) - 作用:用于在网页中嵌入图像。 - 示例: <img src"image.jpg" alt"这是一张图片"> 。其中 src 属性指定图像的…...
尚硅谷react教程_扩展_stateHook
1.类式组件写 import React, {Component} from react;export default class Demo extends Component {state {count:0}add () > {this.setState(state>({count:state.count1}))}render() {return (<div><h2>当前求和为{this.state.count}</h2><b…...

专线物流公共服务平台:数据驱动,标准引领,共创金融双赢新时代
专线物流公共服务平台:数据驱动,标准引领,共创金融双赢新时代 在当今这个数据驱动、标准引领、金融赋能的经济发展新时代,专线物流作为商贸流通领域的重要一环,正面临着前所未有的机遇与挑战。为应对复杂多变的市场环…...

界面控件DevExpress JS ASP.NET Core v24.1亮点 - 支持Angular 18
DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac,…...

Spring之依赖注入(DI)和控制反转(IoC)——配置文件、纯注解
依赖注入 依赖注入(Dependency Injection,简称 DI)与控制反转(loC)的含义相同,只不过这两 个称呼是从两个角度描述的同一个概念。对于一个 Spring 初学者来说,这两种称呼很难理解, 下面我们将通过简单的语言来描述这两个概念。 当Java对象&…...

基于SpringBoot的宠物健康咨询系统的设计与实现
摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,宠物健康知识信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不…...

Lucene的使用方法与Luke工具(2)
文章目录 第2章 Lucene快速入门2.1 项目搭建2.1.1 SQL语句2.1.2 maven依赖2.1.3 实体类:2.1.4 编写DAO: 2.2 建立索引2.2.1 步骤:2.2.2 实现代码: 2.3 Luke工具2.3.1 运行界面介绍:1)主界面2)文…...
【客户端开发】electron 中无法使用 js-cookie 的问题
产生问题的原因 谷歌浏览器升级之后,出于安全考虑,cookie的SameSite属性默认值由None变为Lax,对于跨域的请求,禁止携带cookie。electron内核是chromium内核,所以也会有这个限制。 Cookie的SameSite属性用来限制第三方 Cookie&…...

jenkins gerrit-trigger插件配置
插件gerrit-trigger下载好之后要在Manage Jenkins -->Gerrit Trigger-->New Server 中新增Gerrit Servers 配置好保存后点击“状态”查看是否正常...

家政小程序开发——AI+IoT技术融合,打造“智慧家政”新物种
基于用户历史订单(如“每周一次保洁”)、设备状态(如智能门锁记录的清洁频率),自动生成服务计划。 结合天气数据(如“雨天推荐玻璃清洁”),动态推送服务套餐。 IoT设备联动&#x…...
AI编程提示词
你是 IDE 的 AI 编程助手,遵循核心工作流(研究 -> 构思 -> 计划 -> 执行 -> 评审)用中文协助用户,面向专业程序员,交互应简洁专业,避免不必要解释。[沟通守则] 1. 响应以模式标签 [模式&#…...
# 主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析
主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析 在上一篇文章中,我们对多个主流大语言模型(LLM)进行了中文诱导性提示词的越狱测试,评估其是否能够在面对非法、有害或危险内容请求…...

使用VuePress2.X构建个人知识博客,并且用个人域名部署到GitHub Pages中
使用VuePress2.X构建个人知识博客,并且用个人域名部署到GitHub Pages中 什么是VuePress VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个…...

win32相关(远程线程和远程线程注入)
远程线程和远程线程注入 CreateRemoteThread函数 作用:创建在另一个进程的虚拟地址空间中运行的线程 HANDLE CreateRemoteThread([in] HANDLE hProcess, // 需要在哪个进程中创建线程[in] LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全…...
无字母数字webshell的命令执行
在Web安全领域,WebShell是一种常见的攻击手段,通过它攻击者可以远程执行服务器上的命令,获取敏感信息或控制系统。而无字母数字WebShell则是其中一种特殊形式,通过避免使用字母和数字字符,来绕过某些安全机制的检测。 …...
Thinkphp6软删除
方法一 从控制器层直接操作 删除 此操作不会直接删除数据 而是在delete_time字段更新删除时间 ->useSoftDelete(delete_time,get_datetime())->delete() 查询 这里的数据库字段需要设置为默认NULL 查询的时候仅查询未更新删除时间的数据 ->whereNull("dele…...

PowerBI企业运营分析—列互换式中国式报表分析
PowerBI企业运营分析—列互换式中国式报表分析 欢迎来到Powerbi小课堂,在竞争激烈的市场环境中,企业运营分析平台成为提升竞争力的核心工具。 该平台通过高效整合多源数据,并实时监控关键指标,能够迅速揭示业务表现的全貌&#…...
Python打卡训练营学习记录Day43
作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 从谷歌图片中拍摄的 10 种不同类别的动物图片 数据预处理 import os from torchvision import datasets, transforms from torch.utils…...