Kind创建本地环境安装Ingress

news2024/11/15 18:28:17

目录

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,如下图所示:

图1 k8s cluster pod分配了一个IP

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

图2 k8s cluster service-pod 访问方式

        增加了service这个组件,解决了Pod的IP会变化的问题,可以通过一个固定的serviceName访问Pod了,那么新的问题就出现了,那么,如何在集群之外访问呢?service组件提供了4种类型:

  • ClusterIP                    # 集群内IP,在集群内访问
  • NodePort                    # 在Node节点开一个端口,然后就可以在集群外通过这个端口访问
  • LoadBalancer             # 云服务商提供,你可以理解是一个专用节点,然后这个节点对外暴露访问端口
  • ExternalName            # 不常用,直接映射到另一个服务的地址,有点类似正向代理

这个有很多文章说的很细,我这边就一笔带过,有个概念就好。

        我们本地k8s直接将Service配置NodePort类型,我们看看会变成什么样

图3 k8s cluster service-NodePort 访问方式

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

图4 多个Service开启NodePort之后的情况

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

图5 可以设置一个XXX应用,作为一个统一的“Gateway”

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

图6 ingress的架构图

        这里有几个点要强调一下,方便理解。

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-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
- role: worker
EOF
  • 为主节点添加标签”ingress-ready:true”。Kind提供的Nginx Ingress Controller的部署资源中会通过这个标签选择运行在主节点上。
kubeadmConfigPatches:
- |
  kind: InitConfiguration
  nodeRegistration:
    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: 80
    protocol: TCP
  - containerPort: 443  # 暴露https端口
    hostPort: 443
    protocol: TCP

        如果之前本地有集群,不妨可以先删除,Kind在这方面还是很方便的

➜  ~ kind get clusters
k8s-local-dev
➜  ~ kind delete cluster --name k8s-local-dev
Deleting cluster "k8s-local-dev" ...
➜  ~
图7 创建本地的k8s双节点集群

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官网,找到匹配的版本

图8 当前k8s集群版本适配的最新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
图10 在本地k8s集群中安装Nginx ingress controller

2.3.1.注意点

        我们重点关注一下这个ingress-nginx-controller的Service组件,这就是在宿主机上可以直接访问集群的根本。

......
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.6.4
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - appProtocol: http
    name: http
    port: 80
    protocol: TCP
    targetPort: http
  - appProtocol: https
    name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: NodePort
---
......

        因为当前Service的Typp是NodePort,而暴露的端口分别是http:80/https:443。和2.2.1章节中的集群配置是对的上的。如果需要自定义,可以修改这个port。

2.3.1.检查安装的Ingress状态

        主要是检查如下图的3个Pod(Namespace:ingress-nginx)

图11 在Lens中查看集群中安装Nginx ingress controller的Pod状态

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

图12 出现感叹号,也没什么解决办法,我重试就解决了

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

图13 镜像docker run ...之后,本地测试镜像测试接口可以测通

或者直接使用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集群名称
图14 将测试demo app镜像上传到本地k8s集群

可以看到,镜像被上传到2个集群节点中了 

2.4.4.部署应用到本地k8s集群

2.4.4.1.创建deployment.yaml文件

cat << EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploymentdemo1
  labels:
    app: deploymentdemo1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: deploymentdemo1
  template:
    metadata:
      name: deploymentdemo1
      labels:
        app: deploymentdemo1
    spec:
      containers:
        - name: deploymentdemo1
          image: demo-java-serive:1.0
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
      restartPolicy: Always

---

apiVersion: v1
kind: Service
metadata:
  name: deploymentdemo1-service
spec:
  selector:
    app: deploymentdemo1
  ports:
  - name: deploymentdemo1-service-port
    protocol: TCP
    port: 8080
    targetPort: 8080

EOF

        如上所示,这里包含这个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
图15 部署demo app到k8s中
图16 在k8s中,已创建Deployment、Pod、和Service

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

图17 部署Deployment(最终体现为Pod)、Service

        在这一步中,我遇到过deployment已经创建,但是Pod没有创建出来的奇怪现象,后面我删除了集群重新建再试就可以了

2.5.测试Ingress

2.5.1.创建Ingress.yaml文件

cat <<EOF > ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: /test
        backend:
          service:
            name: deploymentdemo1-service
            port:
              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
图18 在Lens上看到Ingress已经存在一个实例了

 2.5.3.测试访问

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

        postman直接访问

图19 直接访问宿主机(localhost)绑定的Ingress接口(80)成功

        事实上,我们也可以为每一个的应用定一个前缀,毕竟应用太多,api的路径有可能重复,比如app1和app2都有一个/test/say的接口,这时,我们可以重新写url path,如下:

cat <<\EOF > ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: /app1(/|$)(.*)
        backend:
          service:
            name: deploymentdemo1-service
            port:
              number: 8080
EOF

        这时,访问路径可以加一个前缀,变为http://localhost/app1/test/say

图20 访问时可以加前缀区分不同的应用,毕竟可以重写path

*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 kubeconfig
        kind 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 k8s
        kind delete cluster --name ${KUBE_CLUSTER}

.PHONY: install-ingress
install-ingress: ## install ingress by mainfest.yaml
        kubectl 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 cluster
        kind load docker-image ${IMG} --name ${KUBE_CLUSTER}

.PHONY: deploy-app
deploy-app: ## deploy my java demo application
        kubectl apply -f ./deployment.yaml

.PHONY: deploy-ingress-inst
deploy-ingress-inst: ## install ingress instance which configurate proxy rules
        kubectl 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了。

图21 进入ingress-ngnix-controller目录
图22 Ingress.yaml中的rule转化为nginx.conf的一个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|云

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

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

相关文章

分库分表篇-2.4 springBoot 集成Mycat(1.6) 分库分表,读写分离,分布式事务

文章目录 前言一、分库分表&#xff1a;二、读写分离&#xff1a;2.1 读写分离的实现&#xff1a;2.2 主从延迟&#xff1a;2.2.1 主从延迟造成的问题&#xff1a;2.2.2 主从延迟的原因&#xff1a;2.2.3 主从延迟的解决方案&#xff1a;2.2.3.1 db 层面&#xff1a;2.2.3.2 程…

苹果手机QQ聊天记录怎么恢复?不容错过的3个好方法!

之前把很久不用的QQ给卸载了&#xff0c;但是现在突然想起来里面有很重要的聊天记录&#xff0c;友友们&#xff0c;有什么办法能够帮我找回聊天记录吗&#xff1f; 随着微信的崛起&#xff0c;现在很多人已经不怎么使用QQ了&#xff0c;因此很多小伙伴都把QQ卸载了。但是卸载后…

BST55电子式流量传感器

原理、 结构 基于热式原理&#xff0c; 在封闭的探头内包含两个电阻&#xff0c; 其中一个被加热作为探 测电阻&#xff0c; 另一个未被加热作为基准电阻&#xff0c; 当介质流动时&#xff0c; 加热电阻 上的 热量被带走&#xff0c; 电阻值被改变&#xff0c; 两个电阻差值被…

分库分表篇-2.2 Mycat-分片规则

文章目录 前言一、Mycat table的分片&#xff1a;二、常用分片规则&#xff1a;2.1 id 范围分片&#xff1a;2.2 id 取模分片&#xff1a;2.3 按照枚举值 分片&#xff1a;2.4 一致性hash hash 环&#xff1a;2.5 ER 分片&#xff1a;2.6 库内分表&#xff1a;2.7 全局表&#…

七天内连续登陆天数

一、需求描述 业务理解1&#xff1a;七天内最大连续登陆天数 业务理解2&#xff1a;七天内最近连续登陆天数&#xff08;最近一天如果未登陆则连续登陆天数为0&#xff09; 示例说明&#xff1a; 二、数据结构 流量表 tracking 字段名字段中文名userid用户iddt分区 口径描…

如果你觉得自己很失败,请观看此内容 视频学习

目录 什么是成功&#xff1f;​​​​​​​ How can we succeed in such an unfair world? 我们如何在这个不公平的地球上获得成功&#xff1f; 如何去找到自己的不公平优势呢&#xff1f; 最开始也有常有人跟她说你做视频是赚不到钱的 你做了&#xff0c;并不代表你做…

河道漂浮物检测:安防监控/视频智能分析/AI算法智能分析技术如何助力河道整治工作?

随着社会的发展和人们生活水平的进步&#xff0c;水污染问题也越来越严重&#xff0c;水资源监管和治理成为城市发展的一大困扰&#xff0c;水面上的漂浮垃圾不仅会影响河道生态安全并阻碍船舶航行&#xff0c;还会影响人们的身体健康。 TSINGSEEE青犀AI智能分析平台在环保场景…

当连锁零售超市遇上温湿度监控,简直是王炸!

在食品行业中&#xff0c;温湿度监控是确保食品质量和安全性的至关重要的环节之一。温度和湿度是影响食品保存期限、品质、口感以及微生物滋生的关键因素。通过有效的监测和管理&#xff0c;可以降低食品受损和变质的风险&#xff0c;保障消费者的健康和权益。 客户案例 福建某…

设计模式之建造者模式与原型模式

目录 建造者模式 简介 使用场景 优缺点 模式结构 实现 原型模式 简介 应用场景 优缺点 模式结构 实现 建造者模式 简介 将复杂对象的构建与表示进行分离&#xff0c;使得同样的构建过程可以创建不同的表示。是一个将复杂的对象分解为多个简单的对象&#xff0c;然…

Elasticsearch分布式搜索结果处理

1.排序 elasticsearch默认是根据相关度算分&#xff08;_score&#xff09;来排序&#xff0c;但是也支持自定义方式对搜索结果排序。可以排序字段类型有&#xff1a;keyword类型、数值类型、地理坐标类型、日期类型等。 1.1.普通字段排序 keyword、数值、日期类型排序的语法…

四季同行·雷锋家乡学雷锋“青柚课堂“讲师培训

为了给益阳市“青柚课堂”性教育志愿者讲师团队增加新鲜血液&#xff0c;8月27日&#xff0c;我机构在益阳市红十字救护培训基地开展了湖南省第二期"四季同行雷锋家乡学雷锋"孵化项目"青柚课堂"乡村女童性教育推广计划2023年师资培训。本次活动由我机构“蚂…

虹科方案 | 车辆零部件温度采集解决方案

虹科提供的车辆零部件温度监控与采集解决方案&#xff0c;通过热电偶模块来采集、监控、处理温度数据&#xff0c;可以通过CAN / CAN FD进行传输&#xff0c;确保车辆系统的正常运行和安全性。 文章目录 一、热电偶在汽车领域的应用什么是热电偶模块&#xff1f;热电偶模块如何…

PSP - 蛋白质结构预测 OpenFold Multimer 训练模型的数据加载

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132597659 OpenFold Multimer 是基于深度学习的方法&#xff0c;预测蛋白质的多聚体结构和相互作用。利用大规模的蛋白质序列和结构数据&#xff…

Unity 顶点vertices,uv,与图片贴图,与mesh

mesh就是组成3d物体的三角形们。 mesh由顶点组成的三角形组成&#xff0c;三角形的大小 并不 需要一样&#xff0c;由顶点之间的位置决定。 mesh可以是一个或者多个面。 贴图的原点在左下角&#xff0c;uv是贴图的坐标&#xff0c;数量和顶点数一样&#xff08;不是100%确定…

Unity MonoBehaviour事件函数的生命周期

Unity运行时候的默认的几个函数的执行顺序&#xff1a; 首先是Awake&#xff0c;OnEnable&#xff0c;Start等&#xff0c;后面是FixUpdate Update 最后是OnDisable、OnDestroy

《CTFshow-Web入门》09. Web 81~90

Web 入门 索引web81题解 web82题解原理 web83题解 web84题解 web85题解 web86题解 web87题解原理 web88题解 web89题解 web90题解 ctf - web入门 索引 web81&#xff1a;include() 利用&#xff0c;一句话木马之 Nginx 日志利用。web82~86&#xff1a;include() 利用&#xff…

pyqt5的 Qprogressbar 如何设计得好看一些?

参考官网内容 style 自定义&#xff1a; https://doc.qt.io/qtforpython-5/overviews/stylesheet-examples.html#customizing-qprogressbar 1.圆角&#xff0c;浅蓝色 QProgressBar {border: 2px solid grey;border-radius: 5px; }QProgressBar::chunk {background-color: #0…

Halo2、Caulk+、Baloo、Cq Lookup argument细览

1. 引言 本文主要参考2023年2月以太坊基金会Mary Maller在第13届 BIU Winter School on Cryptography上的视频分享 A Close Look at a Lookup Argument - Mary Maller。 以证明 0 ≤ x < 4 0\leq x <4 0≤x<4为例&#xff0c;相比于使用算术化电路中如何使用定制gat…

免费s5爬虫ip:真正靠谱还是泡沫?

在网络世界中&#xff0c;许多人寻找免费的s5爬虫ip以实现匿名上网和绕过地域限制。然而&#xff0c;关于这些免费服务的可信度一直存在争议。本文将探讨免费s5爬虫ip背后的真相&#xff0c;并帮助您判断它们到底是值得依赖还是只不过虚幻泡沫。 1、充斥着风险 大部分提供免费…

不平衡的数据集将如何影响模型的性能?示例说明

一、说明 朋友们&#xff0c;您可能听说过&#xff0c;在不平衡数据集上训练的模型可能会受到泛化不佳和少数类检测减少的影响。在接下来的几篇文章中&#xff0c;我将给你一个例子来展示不平衡的数据集如何影响模型的性能&#xff0c;以及我们如何处理这个问题。在这篇文章中&…