Kind创建本地环境安装Ingress
目录
1.K8s什么要使用Ingress
2.在本地K8s集群安装Nginx Ingress controller
2.1.使用Kind创建本地集群
2.1.1.创建kind配置文件
2.1.2.执行创建命令
2.2.找到和当前k8s版本匹配的Ingress版本
2.2.1.查看当前的K8s版本
2.2.2.在官网中找到对应的合适版本
2.3.按照版本安装Ingress controller
2.3.1.注意点
2.4.在本地K8s集群部署Demo app
2.4.1.简单开发只含一个api app
2.4.2.构建镜像
2.4.2.1.创建一个Dockerfile文件
2.4.2.2.构建一个镜像
2.4.2.3.运行镜像
2.4.2.4.测试镜像接口
2.4.2.5.结束本地运行
2.4.3.将镜像上传到k8s集群
2.4.4.部署应用到本地k8s集群
2.4.4.1.创建deployment.yaml文件
2.4.4.2.将应用部署到K8s集群
2.5.测试Ingress
2.5.1.创建Ingress.yaml文件
2.5.2.部署一个ingress实例
2.5.3.测试访问
*2.6.可不可以更便捷的操作命令?
3.Ingress的rules和Nginx的关系?
参考文章
1.K8s什么要使用Ingress
这个理由,其实很多k8s serive模块存在的理由已经间接做了解释。可以自下而上来回顾一下这个过程。
首先,当一个app被部署到k8s之后,会以Pod的方式运行在k8s中,Pod运行中,会被分配一个集群内的Ip地址,我们在集群内可以通过这个IP访问到这个Pod,如下图所示:

但是,Pod在K8s是不稳定的,Pod每次重启后,这个IP会被重新分配,因此,如果集群内要通过IP访问是不实际的,因此K8s增加了一个组件Service,Service以serviceName作为访问路径,因为serviceName是不变的,不用关注IP的变化,我们可以认为这个路径是稳定不变的。至于为什么serviceName可以当成访问路径,是CoreDNS维护解析的,以后有时间再开文章讨论。

增加了service这个组件,解决了Pod的IP会变化的问题,可以通过一个固定的serviceName访问Pod了,那么新的问题就出现了,那么,如何在集群之外访问呢?service组件提供了4种类型:
- ClusterIP # 集群内IP,在集群内访问
- NodePort # 在Node节点开一个端口,然后就可以在集群外通过这个端口访问
- LoadBalancer # 云服务商提供,你可以理解是一个专用节点,然后这个节点对外暴露访问端口
- ExternalName # 不常用,直接映射到另一个服务的地址,有点类似正向代理
这个有很多文章说的很细,我这边就一笔带过,有个概念就好。
我们本地k8s直接将Service配置NodePort类型,我们看看会变成什么样

如上图,Service使用NodePort后,就可以在宿主机直接通过打通的Port访问在K8s内部署的app。那么假如我有很多个App部署在k8s,又如何呢?比如每一个App都要开放一个端口?如下图:

从上图可以看出,多个Service开启NodePort之后,就Cluster Node而言,无论从安全还是维护的角度来看,都不应该使用这种方式开放应用的访问。为此,有人想,要不就只开一个NodePort,然后用一个专门的应用"XXX"接收请求,然后再转发所有的请求到具体的Pod上,如下图所示:

如上图,如果我们有一个XXX的应用统一处理请求,就可以解决上述问题。事实上,K8s团队引入了Ingress的组件,这个Ingress就是上图的XXX应用,当然,架构上不止如此简单,会复杂一些,我偷一下懒,从其他文章中“借鉴”了一张图:

这里有几个点要强调一下,方便理解。
1.Ingress是K8s团队定义的,但是这个组件只是一个定义概念,类似于java的interface接口,具体的实现是可以选择的。
2.Ingress controller就是这个具体的实现,可以选择不同的controller,例如:Kubernetes 、Ngnix、Haproxy、kong、Traefik等等。
我们从Kind的官网中,来开启本地安装Ingress的测试。
2.在本地K8s集群安装Nginx Ingress controller
2.1.使用Kind创建本地集群
我们创建2节点,一个Master Node,一个Worker Node节点,这也是本地创建k8s比较“经济的”的选择,能体验多节点的特性,也能尽可能节约资源。和之前的文章“使用Kind搭建本地k8s集群环境”创建Cluster集群配置有点差别,需要加一些配置。
2.1.1.创建kind配置文件
# 创建2个节点,一个master node,一个worker node,在master node设置labels,配合后续安装ingress controller
cat << EOF > kind-clusters-mutil-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-planekubeadmConfigPatches:- |kind: InitConfigurationnodeRegistration:kubeletExtraArgs:node-labels: "ingress-ready=true"extraPortMappings:- containerPort: 80hostPort: 80protocol: TCP- containerPort: 443hostPort: 443protocol: TCP
- role: worker
EOF
- 为主节点添加标签”ingress-ready:true”。Kind提供的Nginx Ingress Controller的部署资源中会通过这个标签选择运行在主节点上。
kubeadmConfigPatches: - |kind: InitConfigurationnodeRegistration:kubeletExtraArgs:node-labels: "ingress-ready=true"
- 将容器主节点的80,443端口映射到运行Kind的主机(这里是Win10主机)的80,443端口。Kind提供的Nginx Ingress Controller的服务资源会通过NodePort将服务通过容器主节点的80,443暴露出去,这样用户就可以通过访问本地主机的80,443端口访问运行在集群中的Nginx Ingress Controller。
extraPortMappings:- containerPort: 80 # 暴露http端口hostPort: 80protocol: TCP- containerPort: 443 # 暴露https端口hostPort: 443protocol: TCP
如果之前本地有集群,不妨可以先删除,Kind在这方面还是很方便的
➜ ~ kind get clusters k8s-local-dev ➜ ~ kind delete cluster --name k8s-local-dev Deleting cluster "k8s-local-dev" ... ➜ ~

2.1.2.执行创建命令
执行命令,创建本地集群
# 执行创建本地集群
kind create cluster --name k8s-local-dev --config ./kind-clusters-mutil-config.yaml
# 将kubeconfig copy到Win10的用户目录下,让Lens可以用
cp ~/.kube/config /mnt/c/Users/${CURRENT_USER}/.kube/config
2.2.找到和当前k8s版本匹配的Ingress版本
2.2.1.查看当前的K8s版本
# 查看k8s版本信息
kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.2", GitCommit:"8b5a19147530eaac9476b0ab82980b4088bbc1b2", GitTreeState:"clean", BuildDate:"2021-09-15T21:38:50Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.4", GitCommit:"e6c093d87ea4cbb530a7b2ae91e54c0842d8308a", GitTreeState:"clean", BuildDate:"2022-03-06T21:32:53Z", GoVersion:"go1.17.7", Compiler:"gc", Platform:"linux/amd64"}# 从返回的信息中,我们看到了k8s版本是:v1.23.4
2.2.2.在官网中找到对应的合适版本
登录Nginx Ingress Controller官网,找到匹配的版本

2.3.按照版本安装Ingress controller
在Kind的官网中,我们知道,可以通过Helm和mainfests两种方式安装,我们就按mainfest的方式来安装。和官网中的描述相比,我这里增加了版本适配的一个步骤,找到对应的版本后,直接安装。
# 按照对应的版本安装Ngnix Ingress Controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/kind/deploy.yaml#其中:
#controller-v1.6.4 就是我们依据k8s集群版本找的适配版本
#kind 是指当前mainfests是为Kind创建的集群准备的,还有aws、azure等不同的类型,当然基本也差不多。
注意:官网给的示例是:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
这里的版本是main,指向的是当前最新的release版本。可以在github仓库中查看
![]()
图9 截止2023-08-30,最新的版本是controller-v1.8.1

2.3.1.注意点
我们重点关注一下这个ingress-nginx-controller的Service组件,这就是在宿主机上可以直接访问集群的根本。
......
---
apiVersion: v1
kind: Service
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxapp.kubernetes.io/version: 1.6.4name: ingress-nginx-controllernamespace: ingress-nginx
spec:ipFamilies:- IPv4ipFamilyPolicy: SingleStackports:- appProtocol: httpname: httpport: 80protocol: TCPtargetPort: http- appProtocol: httpsname: httpsport: 443protocol: TCPtargetPort: httpsselector:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxtype: NodePort
---
......
因为当前Service的Typp是NodePort,而暴露的端口分别是http:80/https:443。和2.2.1章节中的集群配置是对的上的。如果需要自定义,可以修改这个port。
2.3.1.检查安装的Ingress状态
主要是检查如下图的3个Pod(Namespace:ingress-nginx)

这里不要出现黄色的感叹号,因为有感叹号,就说明部署Ingress有问题。也没有别的办法,可能需要重新安装Ingress甚至k8s集群。

2.4.在本地K8s集群部署Demo app
安装这个Demo app的目的是为了验证请求是否能到Pod,因此,这个应用不需要太复杂,只需要有一个简单的api接口方便测试。
2.4.1.简单开发只含一个api app
我这里使用springboot开发,增加一个Controller,开发一个hollo world的接口
package com.demo.java.springboot.web;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;/*** @author lyg 2021年9月22日下午2:18:53*/@ResponseBody
@RestController
@RequestMapping("test")
public class TestCtrl {@RequestMapping("say")public String testFunc() { System.out.println("hello world!");return "hello world!";}
}
一个工程若要跑起来,一个cotroller肯定是不行的,这边我省略了
2.4.2.构建镜像
2.4.2.1.创建一个Dockerfile文件
在工程根目录下,创建一个Dockerfile文件
cat << EOF > Dockerfile
# baselibrary, jdk8
FROM openjdk:8-jdk-alpine
ADD ./target/app.jar /app/app.jar
WORKDIR /app
EXPOSE 8080
ENTRYPOINT java -jar ./app.jar
EOF
其中,./target/app.jar是当前springboot工程构建后,在功能目录下的artifacts.
# springboot工程构建命令(前提是Maven已经被配置,这里就不演示了)
mvn clear && mvn install
2.4.2.2.构建一个镜像
# 将demo app工程构建成为一个镜像
docker build -f Dockerfile -t demo-java-serive:1.0 .
2.4.2.3.运行镜像
# 运行镜像
docker run --name java-demo-app -it -p 8080:8080 -d demo-java-serive:1.0
2.4.2.4.测试镜像接口
当应用启动后,可以通过postman

或者直接使用curl访问
# 访问测试api
curl http://127.0.0.1:8080/test/say
# 预期返回:hello world!#
2.4.2.5.结束本地运行
# 停止并删除容器
docker container stop java-demo-app && docker container rm java-demo-app
# image还是不能删除的,留着,我们要测试ingress
2.4.3.将镜像上传到k8s集群
将镜像上传到kind创建的本地k8s集群
# 使用Kind命令,将测试镜像上传到kind创建的本地k8s集群
kind load docker-image demo-java-serive:1.0 --name k8s-local-dev# 说明:
# demo-java-serive:1.0 我的测试demo app镜像名称:版本
# k8s-local-dev kind创建的本地k8s集群名称

可以看到,镜像被上传到2个集群节点中了
2.4.4.部署应用到本地k8s集群
2.4.4.1.创建deployment.yaml文件
cat << EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: deploymentdemo1labels:app: deploymentdemo1
spec:replicas: 1selector:matchLabels:app: deploymentdemo1template:metadata:name: deploymentdemo1labels:app: deploymentdemo1spec:containers:- name: deploymentdemo1image: demo-java-serive:1.0imagePullPolicy: IfNotPresentports:- containerPort: 8080restartPolicy: Always---apiVersion: v1
kind: Service
metadata:name: deploymentdemo1-service
spec:selector:app: deploymentdemo1ports:- name: deploymentdemo1-service-portprotocol: TCPport: 8080targetPort: 8080EOF
如上所示,这里包含这个Deployment、Service两种组件,“---”就是yaml文件分隔不同资源的分隔符。其中Service没有指明类型,默认使用ClusterIP类型。
就一般而言,将一个应用部署到k8s,我们一般都使用Deployment这个组件,所以我创建部署yaml文件一般习惯命名为deployment.yaml,但是其实Deployment组件一般和Service是配套的,也就是说,deployment.yaml文件是部署应用的组件mainfest清单,可能包含多种组件资源。
2.4.4.2.将应用部署到K8s集群
执行命令,在k8s上部署Demo app
# 在k8s集群部署Demo app
kubectl create -f deployment.yaml


重新拿之前的图来理解一下,这时,我们应该已经创建了如下图红框所示的两个组件

在这一步中,我遇到过deployment已经创建,但是Pod没有创建出来的奇怪现象,后面我删除了集群重新建再试就可以了
2.5.测试Ingress
2.5.1.创建Ingress.yaml文件
cat <<EOF > ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressannotations:kubernetes.io/ingress.class: "nginx"
spec:rules:- http:paths:- pathType: Prefixpath: /testbackend:service:name: deploymentdemo1-serviceport:number: 8080
EOF
这里,我们只是列举了一个最简单的Ingress的规则,就是请求路径带test的,转发到Service(deploymentdemo1-service:8080),这个Service就是我们之前部署的Demo app Service服务。
还有很多其他的配置,包括annotation都是有讲究的,点击传送
2.5.2.部署一个ingress实例
# 部署一个Ingress请求转发实例
kubectl apply -f ingress.yaml
# ingress.networking.k8s.io/example-ingress created

2.5.3.测试访问
这里我们需要回顾2.3.1章节的内容,因为Ingress-controller-serive绑定的端口80,因此,我们的访问路径就是http://12.0.0.1:80/...或缺省http://12.0.0.1/....
postman直接访问

事实上,我们也可以为每一个的应用定一个前缀,毕竟应用太多,api的路径有可能重复,比如app1和app2都有一个/test/say的接口,这时,我们可以重新写url path,如下:
cat <<\EOF > ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /$2kubernetes.io/ingress.class: "nginx"
spec:rules:- http:paths:- pathType: Prefixpath: /app1(/|$)(.*)backend:service:name: deploymentdemo1-serviceport:number: 8080
EOF
这时,访问路径可以加一个前缀,变为http://localhost/app1/test/say

*2.6.可不可以更便捷的操作命令?
我们在整个过程中,有大量操作的shell命令的过程,记不住,容易错,用本子记录每次还要copy出来,非常繁琐,我们完全可使用Makefile定义几个function,然后使用make [command] [variable] 执行命令,例如我定义的Makefile供大家参考:
# Image URL to use all building/pushing image targets
IMG ?= demo-java-serive:1.0
# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
ENVTEST_K8S_VERSION = 1.23
# 本地集群的名称
KUBE_CLUSTER ?= k8s-local-dev
# 本地集群配置文件的名称
KUBE_CLUSTER_INIT_CONFIGFILE ?= kind-clusters-mutil-config.yaml
# Ingress版本
INGRESS_NGNIX_CTL_VERSION ?=v1.6.4.PHONY: create-k8s
create-k8s: ## create local k8s by config file and synchronize the kubeconfigkind create cluster --name ${KUBE_CLUSTER} --config ./${KUBE_CLUSTER_INIT_CONFIGFILE} && cp ~/.kube/config /mnt/c/Users/Geoff_Lin/.kube/config.PHONY: delete-k8s
delete-k8s: ## delete local k8skind delete cluster --name ${KUBE_CLUSTER}.PHONY: install-ingress
install-ingress: ## install ingress by mainfest.yamlkubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-${INGRESS_NGNIX_CTL_VERSION}/deploy/static/provider/kind/deploy.yaml.PHONY: kind-load
kind-load: ## load the local image to the kind clusterkind load docker-image ${IMG} --name ${KUBE_CLUSTER}.PHONY: deploy-app
deploy-app: ## deploy my java demo applicationkubectl apply -f ./deployment.yaml.PHONY: deploy-ingress-inst
deploy-ingress-inst: ## install ingress instance which configurate proxy ruleskubectl apply -f ./ingress.yaml
需要注意,命令缩进只能用“tab”键,不能使用空格键,不然make命令会报错
我们可以方便地执行这些命令
# 删除集群
make delete-k8s
# 创建集群
make create-k8s
# 安装Ingress
make install-ingress
# 上传demo app镜像
make kind-load
# 部署demo app 到k8s
make deploy-app
# 部署Ingress代理规则
make deploy-ingress-inst
......
3.Ingress的rules和Nginx的关系?
我们走了一遍流程发现,ingress.yaml配置rule的就是一个代理转发,我们在前面的章节中知道,我们的ingress controller采用的是Ngnix controller,也就是说,ingress.yaml配置的rule,会转化成nginx.conf的配置,实际上做转发的就是ngnix。
为此,我们可以验证一下,打开ingress-nginx-controller这个pod的控制台,进入容器目录(就是一个ngnix镜像),打开nginx.conf,容易发现我们ingress.yaml配置的规则已经转变成为server下的一个location了。


参考文章
kind – Ingress
Installation Guide - Ingress-Nginx Controller
Kind创建本地Kubernetes集群 - 云斋随笔
https://github.com/kubernetes/ingress-nginx
Installation with the NGINX Ingress Operator | NGINX Ingress Controller
Kubernetes — 服务类型(Service Types) - 知乎
Flowchart Maker & Online Diagram Software
Ingress Annotation 配置说明 | Higress
ingress-nginx 中 Rewrite 的使用-阳明的博客|Kubernetes|Istio|Prometheus|Python|Golang|云
相关文章:

Kind创建本地环境安装Ingress
目录 1.K8s什么要使用Ingress 2.在本地K8s集群安装Nginx Ingress controller 2.1.使用Kind创建本地集群 2.1.1.创建kind配置文件 2.1.2.执行创建命令 2.2.找到和当前k8s版本匹配的Ingress版本 2.2.1.查看当前的K8s版本 2.2.2.在官网中找到对应的合适版本 2.3.按照版本安…...

MySQL与Oracle数据库通过系统命令导出导入
MySQL导出 mysqldump -uroot -ppassword 库名 表名 --where"s_dtend<2023-05-01 00:00:00 and s_dtend>2023-01-01 00:00:00 and (i_mbr!10000 OR (i_mbr 10000 AND I_ACTV IN (SELECT I_ACTV FROM t_mk_activity WHERE S_DTEND < 2023-05-01 00:00:00)))"…...

从零学算法(剑指 Offer 36)
123.输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表。…...

【Unity3D】UI Toolkit容器
1 前言 UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery,本文将介绍 UI Toolkit 中的容器,主要包含 VisualElement、ScrollView、ListView、UI Toolkit,官方介绍详见→UXML elements reference。 2 VisualElement(空容器&…...

手把手教你写出第一个C语言程序
Hello, World! 1. 前言2. 准备知识2.1 环境2.2 文件的分类2.3 注释2.3.1 注释的作用2.3.2 注释的两种风格2.3.2.1 C语言的注释风格2.3.2.2 C的注释风格 2.3.3 VS中注释和取消注释的快捷键 3. 开始演示3.1 创建项目3.2 创建源文件3.3 写代码3.4 编译链接运行 4. 代码解释4.1 写主…...

flink维度表关联
分析&回答 根据我们业务对维表数据关联的时效性要求,有以下几种解决方案: 1、实时查询维表 实时查询维表是指用户在Flink 的Map算子中直接访问外部数据库,比如用 MySQL 来进行关联,这种方式是同步方式,数据保证是…...

Docker Compose 安装使用 教程
Docker Compose 1.1 简介 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的 快速编排 。从功能上看,跟 OpenStack 中的 Heat 十分类似。 其代码目前在 https://github.com/docker/compose 上开源。 Compose 定位是 「定义和运行多个…...

睿趣科技:开抖音小店挣钱吗到底
在当今数字化时代,社交媒体平台成为了创业者们寻找商机和赚钱的新途径。而抖音作为一款风靡全球的短视频分享平台,自然也成为了许多人开设小店、进行创业的选择之一。那么,开抖音小店能否真正实现盈利,成为了一个备受关注的话题。…...

国际腾讯云账号云服务器网络访问丢包问题解决办法!!
本文主要介绍可能引起云服务器网络访问丢包问题的主要原因,及对应排查、解决方法。下面一起了解腾讯云国际云服务器网络访问丢包问题解决办法: 可能原因 引起云服务器网络访问丢包问题的可能原因如下: 1.触发限速导致 TCP 丢包 2.触发限速导致…...

Deepnote:为什么我停止使用 Jupyter Notebook
Jupyter 笔记本已经成为必不可少多年来用于众多数据科学工作流程的工具。其中包括执行数据挖掘、分析、处理、建模以及在每个数据科学项目的生命周期中执行的一般日常实验任务。 Jupyter(作者提供的图片) 尽管它很受欢迎,但许多数据科学家也指出了它的众多缺点,例如这里和...

山西省文物局与大势智慧签订战略合作协议
8月24日,由山西省文物局、中国文物信息咨询中心(国家文物局数据中心)主办的数字文博发展论坛在太原举行。武汉大势智慧科技有限公司(后简称“大势智慧”)受邀参与,与来自国内文博数字化领域的专家学者齐聚一堂,围绕“数…...

Java设计模式:一、六大设计原则-02:开闭原则
文章目录 一、定义:开闭原则二、模拟场景:开闭原则2.0 工程结构2.1 定义面积计算接口2.2 面积计算实现类 三、违背方案:开闭原则四、改善代码:开闭原则4.1 扩展继承4.2 单元测试 一、定义:开闭原则 开闭原则ÿ…...

DETRs Beat YOLOs on Real-time Object Detection
目录 1、模型架构1.1高效混合编码器1.1.1 尺度内特征交互模块AIFI1.1.2 跨尺度特征融合CCFM 1.2IoU感知查询选择总结 DETRs在实时目标检测中击败YOLO 问题:DETR的高计算成本,实时检测效果有待提高 解决:提出了一个实时的目标检测器 具体来说…...

【数据分享】1901-2022年1km分辨率的逐月降水栅格数据(免费获取/全国/分省)
气象指标在日常研究中非常常用,之前我们给大家分享过来源于国家青藏高原科学数据中心提供的气象指标栅格数据(均可查看之前的文章获悉详情): 1901-2022年1km分辨率逐月平均气温栅格数据1901-2022年1km分辨率逐年平均气温栅格数据…...

全网首发!奔驰宝马奥迪卡带机卡带通道激活模块,无损安装可以接2路AUX
文章目录 1.前言2.时序逆向分析2.1协议分析2.2卡带音频通道引出 3、PCB设计4、程序设计5、焊接调试6、结语 1.前言 之前写过四篇关于车机增加音频输入的方法。 1、07宝来经典车机CD收音机(RC668)改装增加蓝牙播放音乐 2、全网首发!老大…...

反弹shell总结
反弹shell总结 讲在前面说的话:反弹shell总结nc反弹shell正向shell反向shell正向shell(服务端被攻击):反向shell(客户端被攻击):无nc反弹shellpython反弹shellbash反弹shellPHP反向shellPerl反向shellJava反弹shellsocat 反弹shellRuby反弹shellLua反弹shellAwk 反弹she…...

[机缘参悟-103] :IT人关于接纳的思考与感悟
目录 前言: 一、接纳 1.1 什么是接纳 1.2 对接纳的误解 1.3 接纳的含义 1.4 "存在即合理" VS 接纳 1.5 接纳 VS 躺平 VS 随遇而安 1.6 为什么现实总是那么不尽人意 1.7 现实世界的多样性 1.8 接纳与认命 1.9 不接纳的表现 前言: …...

甄知携AIGC新升级产品参与首届人工智能生成内容国际会议,共探AIGC最前沿技术
首届人工智能生成内容国际会议(2023The 1st International Conference on AI-generated Content (AIGC2023)于2023年8月25-26日在中国上海举行。本次会议得到了复旦大学、中国科技大学、同济大学、上海交通大学、上海人工智能实验室、香港中文大学等知名院校和研究机构的大力支…...

4.9 已建立连接的TCP,收到SYN会发生什么?
1. 客户端的 SYN 报文里的端口号与历史连接不相同 此时服务端会认为是新的连接要建立,于是就会通过三次握手来建立新的连接。 旧连接里处于 Established 状态的服务端最后会怎么样呢? 服务端给客户端发消息了:客户端连接已被关闭ÿ…...

leetcode 365 水壶问题
有一个水壶容量或者两个水壶加起来总容量为目标容量 总共有八种选择:第一种倒满x,第二种倒满y,第三种清空x,第四种清空y,第五种x 倒给 y y能装满 ,第六种 x 倒给 y x倒完, 。。。。 这里用深度遍历,时间超时 class Solution {public boole…...

django/CVE-2017-12794XSS漏洞复现
docker搭建漏洞复现环境 漏洞原理看帮助文档 # Django debug page XSS漏洞(CVE-2017-12794)分析Django发布了新版本1.11.5,修复了500页面中可能存在的一个XSS漏洞,这篇文章说明一下该漏洞的原理和复现,和我的一点点评…...

【学习笔记】计算机视觉对比学习综述
计算机视觉对比学习综述 前言百花齐放InstDiscInvaSpreadCPCCMC CV双雄MoCoSimCLRMoCo v2SimCLR v2SwAV 不用负样本BYOLSimSiam TransformerMoCo v3DINO 总结参考链接 前言 本篇对比学习综述内容来自于沐神对比学习串讲视频以及其中所提到的论文和博客,对应的链接详…...

【Linux】fork函数的基础知识
文章目录 前言一、fork的返回值二、常见问题 1.为什么fork要给子进程返回0,给父进程返回子进程pid?2.一个函数返回两次值怎么理解? 3.一个变量怎么会有不同的内容? 4.fork函数干了什么? 前言 fork初识: …...

代码随想录算法训练营day48 | LeetCode 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III
198. 打家劫舍(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台) 思路:dp题除背包外的另外一类题目,重点不在于看前面的情况,而在于考虑本节点的情况。一种情况…...

【已解决】Java 后端使用数组流 Array.stream() 将数组格式的 Cookie 转换成字符串格式
🎉工作中遇到这样一个场景:远程调用某个接口,该接口需要用户的 Cookie 信息进行权限认证,认证通过之后才可以打通并返回数据。 在后端拿到 httpServletRequest 后,调用 getCookies() 方法,返回的是一个 Coo…...

Redis——》如何评估锁过期时间
推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...

完整开发实现公众号主动消息推送,精彩内容即刻到达
🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…...

获取ip(公网和内网) 前端通过高德api获取位置信息
获取ip(公网和内网) 前端通过高德api获取位置信息 获取ip //获取公网ip getIp() {this.$axios.get(http://api.ipify.org).then((res) > {if (res) {console.log(res, 公网ip);}}).catch((e) > {console.log(e, e);}); },//获取内网ip this.getIP(…...

linux打开端口命令是什么
linux打开端口命令是什么 linux开启端口的命令是 1 firewall-cmd --zonepublic --add-port端口/通讯协议 --permanent 需要注意的是,我们在开启指定端口后需要重启防火墙。 示例如下: 1、开启防火墙 1 systemctl start firewalld 2、开放指定端…...

从《孤注一掷》出发,聊聊 SSL 证书的重要性
你去看《孤注一掷》了吗?相信最近大家的朋友圈和抖音都被爆火电影《孤注一掷》成功刷屏。取材于上万真实案例的《孤注一掷》揭露了缅甸诈骗园区残暴的统治,以及电信诈骗中系统性极强的诈骗技巧,引发了大量讨论。 图片来源于电影《孤注一掷》…...