k8s安装nginx Ingress超详细指南

在本全面的 Ingress 指南中,您将学习如何在 Kubernetes 设置 Nginx Ingress控制器并使用 DNS 配置 Ingress。

目前有两种 Nginx Ingress 控制器。

  1. kubernetes 社区的 Nginx Ingress 控制器
  2. Nginx Inc 开发的 Nginx Ingress 控制器

我们将使用 Kubernetes 社区 Nginx 控制器。

Ingress & Nginx Ingress 控制器架构

下面是使用 Nginx Ingress 控制器的 Kubernetes Ingress 的高级架构。在本指南中,我们将学习如何在体系结构中构建设置。

Nginx ingress controller deployment architecture

先决条件

  1. Kubernetes 集群
  2. Kubectl 已安装并已通过 Kubernetes 集群的身份验证。
  3. 对 kubernetes 集群的管理员访问权限。
  4. 指向 Ingress 控制器负载均衡器 IP 的有效域。(可选)

Nginx Ingress 控制器 Kubernetes 清单

本教程中使用的所有 kubernetes 清单都托管在 Github 存储库中。

您可以按照指南直接部署 YAML 文件。

git clone https://github.com/techiescamp/nginx-ingress-controller

首先,我们将通过使用 YAML 清单部署 Nginx 控制器来了解所有关联的 Kubernetes 对象。一旦我们理解了,我们将使用 Helm 图表进行部署

注意:如果你想了解所有的 Nginx Ingress 控制器对象以及它们之间的关系,我建议你从 repo 中单独创建对象。了解其工作原理后,可以使用单个清单或 helm 图表来部署它。

如果要一次性部署所有对象,请在 termal 中打开克隆的存储库。

cd 进入 manifest 文件夹并执行以下命令。它将部署此博客中介绍的所有清单。

kubectl apply -f .

使用清单部署 Nginx Ingress 控制器

我们需要部署以下 Kubernetes 对象才能拥有一个有效的 Nginx 控制器

  1. ingress-nginx命名空间
  2. Nginx 准入控制器的服务帐户/角色/集群角色
  3. 验证 Webhook 配置
  4. 用于创建/更新 Webhook CA 捆绑包的作业
  5. Nginx 控制器部署的服务帐户/角色/集群角色
  6. Nginx 控制器配置图
  7. Nginx 控制器和准入控制器的服务
  8. Ingress 控制器部署

注意:您可以自己创建所有清单,也可以使用 Github 存储库。但是,我强烈建议您仔细检查每个清单并了解您正在部署的内容。

需要准入控制器和验证 Webhook

Kubernetes Admission Controller 是一小段代码,用于在创建 Kubernetes 对象之前对其进行验证或更新。在本例中,它是用于验证 Ingress 对象的准入控制器。准入控制器代码是侦听8443端口的 Nginx 控制器的一部分。

为什么需要 Ingress 控制器?

如果没有准入控制器,则可以部署可能包含错误配置的 Ingress 对象。错误的配置可能会破坏与 Ingress 控制器关联的所有 Ingress 规则。

使用准入控制器后,如果部署配置错误的 Ingress 对象,则会引发错误。这样,您可以确保您创建的 Ingress 对象具有正确的配置,并且不会破坏路由规则。

以下是 Nginx 的准入控制器的工作方式。

nginx ingress controller validation admission controller explained.

  1. 部署 Ingress YAML 时,验证允许会截获请求。
  2. 然后,Kubernetes API 根据准入 Webhook 终结点将 Ingress 对象发送到验证准入控制器服务终结点。
  3. Service 将请求发送到端口 8443 上的 Nginx 部署,以验证 ingress 对象。
  4. 然后,准入控制器向 k8s API 发送响应。
  5. 如果响应有效,API 将创建 ingress 对象。

现在,让我们从为 Ingress 控制器创建 Kubernetes 对象开始。

注意:在以下各节中,您不必复制和创建 YAML 文件。您可以直接使用存储库中的文件并部署它。我在这里给出了完整的 YAML 以供参考。

创建 Namespace

我们将把所有Nginx控制器对象部署在 ingress-nginx 命名空间中。

kubectl create ns ingress-nginx

创建 Admin 控制器角色和服务帐户

我们需要一个具有所需权限的 Role 和 ClusterRole,并绑定到 ingress-nginx-admission 服务帐户。

创建一个名为 admission-service-account.yaml 的文件。

---
apiVersion: v1
kind: ServiceAccount
metadata:labels:app.kubernetes.io/component: admission-webhookapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-admissionnamespace: ingress-nginx---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:annotations:app.kubernetes.io/component: admission-webhookapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-admissionnamespace: ingress-nginx
rules:
- apiGroups:- ""resources:- secretsverbs:- get- create---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:labels:app.kubernetes.io/component: admission-webhookapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-admissionnamespace: ingress-nginx
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: ingress-nginx-admission
subjects:
- kind: ServiceAccountname: ingress-nginx-admissionnamespace: ingress-nginx---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:labels:app.kubernetes.io/component: admission-webhookapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-admission
rules:
- apiGroups:- admissionregistration.k8s.ioresources:- validatingwebhookconfigurationsverbs:- get- update---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:labels:app.kubernetes.io/component: admission-webhookapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-admission
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: ingress-nginx-admission
subjects:
- kind: ServiceAccountname: ingress-nginx-admissionnamespace: ingress-nginx

部署清单

kubectl apply -f admission-service-account.yaml 

创建验证 Webhook 配置

创建一个名为 validating-webhook.yaml 的文件,并复制以下内容。

---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:labels:app.kubernetes.io/component: admission-webhookapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-admission
webhooks:
- admissionReviewVersions:- v1clientConfig:service:name: ingress-nginx-controller-admissionnamespace: ingress-nginxpath: /networking/v1/ingressesfailurePolicy: FailmatchPolicy: Equivalentname: validate.nginx.ingress.kubernetes.iorules:- apiGroups:- networking.k8s.ioapiVersions:- v1operations:- CREATE- UPDATEresources:- ingressessideEffects: None

创建 ValidatingWebhookConfiguration

kubectl apply -f validating-webhook.yaml

部署 Job 更新 Webhook 证书

ValidatingWebhookConfiguration 只在 HTTPS 上有效,所以它需要一个 CA bundle。

我们使用 kube-webhook-certgen 与第一个 job 一起生成 CA 证书包。生成的CA证书存储在一个名为 ingress-nginx-admission 的秘密文件中。

创建一个名为 jobs.yaml 的文件,并复制以下内容:

---
apiVersion: batch/v1
kind: Job
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-admission-createnamespace: ingress-nginx
spec:template:metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-admission-createspec:containers:- args:- create- --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc- --namespace=$(POD_NAMESPACE)- --secret-name=ingress-nginx-admissionenv:- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceimage: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0imagePullPolicy: IfNotPresentname: createsecurityContext:allowPrivilegeEscalation: falsenodeSelector:kubernetes.io/os: linuxrestartPolicy: OnFailuresecurityContext:runAsNonRoot: truerunAsUser: 2000serviceAccountName: ingress-nginx-admission
---
apiVersion: batch/v1
kind: Job
metadata:labels:app.kubernetes.io/component: admission-webhookapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-admission-patchnamespace: ingress-nginx
spec:template:metadata:labels:app.kubernetes.io/component: admission-webhookapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-admission-patchspec:containers:- args:- patch- --webhook-name=ingress-nginx-admission- --namespace=$(POD_NAMESPACE)- --patch-mutating=false- --secret-name=ingress-nginx-admission- --patch-failure-policy=Failenv:- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceimage: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0imagePullPolicy: IfNotPresentname: patchsecurityContext:allowPrivilegeEscalation: falsenodeSelector:kubernetes.io/os: linuxrestartPolicy: OnFailuresecurityContext:runAsNonRoot: truerunAsUser: 2000serviceAccountName: ingress-nginx-admission

创建 jobs

kubectl apply -f jobs.yaml

使用以下命令验证 jobs 完成情况。

一旦作业被执行,就可以describe  ValidatingWebhookConfigurationand

kubectl describe ValidatingWebhookConfiguration ingress-nginx-admission

创建 Ingress 控制器角色和服务帐户

创建名为 ingress-service-account.yaml 的文件,并复制以下内容。

---
apiVersion: v1
kind: ServiceAccount
metadata:labels:app.kubernetes.io/component: admission-webhookapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginxnamespace: ingress-nginx---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginxnamespace: ingress-nginx
rules:
- apiGroups:- ""resources:- namespacesverbs:- get
- apiGroups:- ""resources:- configmaps- pods- secrets- endpointsverbs:- get- list- watch
- apiGroups:- ""resources:- servicesverbs:- get- list- watch
- apiGroups:- networking.k8s.ioresources:- ingressesverbs:- get- list- watch
- apiGroups:- networking.k8s.ioresources:- ingresses/statusverbs:- update
- apiGroups:- networking.k8s.ioresources:- ingressclassesverbs:- get- list- watch
- apiGroups:- ""resourceNames:- ingress-controller-leaderresources:- configmapsverbs:- get- update
- apiGroups:- ""resources:- configmapsverbs:- create
- apiGroups:- ""resources:- eventsverbs:- create- patch---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginxnamespace: ingress-nginx
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: ingress-nginx
subjects:
- kind: ServiceAccountname: ingress-nginxnamespace: ingress-nginx---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx
rules:
- apiGroups:- ""resources:- configmaps- endpoints- nodes- pods- secrets- namespacesverbs:- list- watch
- apiGroups:- ""resources:- nodesverbs:- get
- apiGroups:- ""resources:- servicesverbs:- get- list- watch
- apiGroups:- networking.k8s.ioresources:- ingressesverbs:- get- list- watch
- apiGroups:- ""resources:- eventsverbs:- create- patch
- apiGroups:- networking.k8s.ioresources:- ingresses/statusverbs:- update
- apiGroups:- networking.k8s.ioresources:- ingressclassesverbs:- get- list- watch---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: ingress-nginx
subjects:
- kind: ServiceAccountname: ingress-nginxnamespace: ingress-nginx

 部署清单

kubectl apply -f ingress-service-account.yaml

创建 Configmap

有了configmap,你可以自定义 Nginx 的设置。例如,可以设置自定义 headers 和大多数 Nginx 设置。

有关所有支持的配置,请参阅官方社区文档。

创建名为 services.yaml 的文件并复制以下内容。

<span style="background-color:var(--cs-color-contrast-200)"><span style="color:#000000"><code>---
apiVersion: v1
kind: Service
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-controllernamespace: ingress-nginx
spec:externalTrafficPolicy: LocalipFamilies:- 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: LoadBalancer
---
apiVersion: v1
kind: Service
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-controller-admissionnamespace: ingress-nginx
spec:ports:- appProtocol: httpsname: https-webhookport: 443targetPort: webhookselector:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxtype: ClusterIP</code></span></span>

创建服务。

kubectl apply -f services.yaml

ingress-nginx-controller service 在正在部署的相应云平台中创建负载均衡器

您可以使用以下命令获取负载均衡器 IP/DNS。

kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller

注意:对于每个云提供商,您可以使用特定的注释将静态 IP 地址和其他配置映射到 Loadbalancer。

创建 Ingress Controller 部署

创建名为 deployment.yaml 的文件并复制以下内容。

---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxname: ingress-nginx-controllernamespace: ingress-nginx
spec:minReadySeconds: 0revisionHistoryLimit: 10selector:matchLabels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxtemplate:metadata:labels:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxspec:containers:- args:- /nginx-ingress-controller- --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller- --election-id=ingress-controller-leader- --controller-class=k8s.io/ingress-nginx- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller- --validating-webhook=:8443- --validating-webhook-certificate=/usr/local/certificates/cert- --validating-webhook-key=/usr/local/certificates/keyenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: LD_PRELOADvalue: /usr/local/lib/libmimalloc.soimage: registry.k8s.io/ingress-nginx/controller:v1.9.5imagePullPolicy: IfNotPresentlifecycle:preStop:exec:command:- /wait-shutdownlivenessProbe:failureThreshold: 5httpGet:path: /healthzport: 10254scheme: HTTPinitialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 1name: controllerports:- containerPort: 80name: httpprotocol: TCP- containerPort: 443name: httpsprotocol: TCP- containerPort: 8443name: webhookprotocol: TCPreadinessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPinitialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 1resources:requests:cpu: 100mmemory: 90MisecurityContext:allowPrivilegeEscalation: truecapabilities:add:- NET_BIND_SERVICEdrop:- ALLrunAsUser: 101volumeMounts:- mountPath: /usr/local/certificates/name: webhook-certreadOnly: truednsPolicy: ClusterFirstnodeSelector:kubernetes.io/os: linuxserviceAccountName: ingress-nginxterminationGracePeriodSeconds: 300volumes:- name: webhook-certsecret:secretName: ingress-nginx-admission

创建部署。

kubectl apply -f deployment.yaml

要确保部署正常工作,请检查容器状态。

kubectl get pods -n ingress-nginx

验证 Ingress Controller 部署

您可以使用服务创建的 LoadBlancer 终结点验证 Ingress 控制器部署。

Nginx Ingress 控制器具有默认后端。Ingress 中没有条目的所有请求都将转到此默认后端。

我们将使用默认后端验证控制器。

获取 Loadbalancer 终端节点,尝试使用它。您应该收到 404 错误,如下所示。

现在尝试使用 curl 访问 /heathz url,如下所示。你应该得到 200 的回复。将 <LOAD-BALANCER-ENDPOINT> 替换为您的 Loadbalancer 终端节点。

curl http://<LOAD-BALANCER-ENDPOINT>/healthz

Nginx Ingress Controller Helm 部署

如果您是 Helm 用户,则可以使用社区 Helm 图表部署 Ingress Controller。 ValidatingWebhookConfiguration 默认处于禁用状态。

部署 helm 图表。如果 ingress-nginx 不存在,它将创建命名空间。

helm upgrade --install ingress-nginx ingress-nginx \--repo https://kubernetes.github.io/ingress-nginx \--namespace ingress-nginx --create-namespace

验证 helm 版本。

helm list -n ingress-nginx

若要清理资源,请卸载该版本。

 helm uninstall ingress-nginx -n ingress-nginx

将域名映射到 Nginx Ingress Loadbalancer IP

Ingress 的主要目标是接收运行在 Kubernetes 上的服务的外部流量。理想情况下,在项目中,DNS 将映射到 Ingress 控制器负载均衡器 IP。

这可以通过具有您拥有的域名的相应 DNS 提供商来完成。

信息:对于面向 Internet 的应用,它将是指向负载均衡器的公共 IP 的公共 DNS。如果是内部应用,则它将是映射到专用负载均衡器 IP 的组织专用 DNS。

单个 DNS 映射

您可以将单个域作为 A 记录直接映射到负载均衡器 IP。使用此选项,Ingress 控制器只能有一个域和多个基于路径的流量路由。

例如

www.example.com --> Loadbalancer IP

您还可以使用此模型进行基于路径的路由。

几个例子,

http://www.example.com/app1
http://www.example.com/app2
http://www.example.com/app1/api
http://www.example.com/app2/api

通配符 DNS 映射

如果将通配符 DNS 映射到负载均衡器,则可以通过 Ingress 获得动态 DNS 终结点。

在 DNS 记录中添加通配符条目后,需要在 Ingress 对象中提及所需的 DNS,Nginx Ingress 控制器将负责将其路由到所需的服务终结点。

例如,检查以下两个映射。

*.example.com --> Loadbalancer IP
*.apps.example.com --> Loadbalancer IP 

这样,您可以通过单个 Ingress 控制器拥有多个动态子域,并且每个 DNS 都可以拥有自己的基于路径的路由。

几个例子,

#URL onehttp://demo1.example.com/api
http://demo1.example.com/api/v1
http://demo1.example.com/api/v2#app specific urlshttp://grafana.apps.example.com
http://prometheus.apps.example.com#URL twohttp://demo2.apps.example.com/api
http://demo2.apps.example.com/api/v1
http://demo2.apps.example.com/api/v2

出于演示目的,我已将通配符 DNS 映射到 LoadBalancer IP。根据您的 DNS 提供商,您可以添加 DNS 记录。

下图显示了我用于此博客演示的 DNS 记录。我使用了 EKS,因此我有一个网络负载均衡器终端节点的 DNS,而不是 Loadnbalacer IP,它将是一个 CNAME。在 GKE 的情况下,您将获得一个 IP,在这种情况下,您需要创建一个 A 记录。

nginx 入口控制器 DNS 映射

部署 Demo 应用程序

为了测试 Ingress ,我们将部署一个演示应用程序,并向其添加一个 ClusterIp 服务。此应用程序只能在群集中访问,而不能进入。

步骤1: 创建名为 dev 的命名空间

kubectl create namespace dev

步骤2:创建名为hello-app.yaml的文件,并复制以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:name: hello-appnamespace: dev
spec:selector:matchLabels:app: helloreplicas: 2template:metadata:labels:app: hellospec:containers:- name: helloimage: "gcr.io/google-samples/hello-app:2.0"

步骤3:使用 kubectl 创建部署

kubectl create -f hello-app.yaml

检查部署状态。

kubectl get deployments -n dev

步骤5:创建一个名为并复制以下内容的文件并保存该文件。hello-app-service.yaml

apiVersion: v1
kind: Service
metadata:name: hello-servicenamespace: devlabels:app: hello
spec:type: ClusterIPselector:app: helloports:- port: 80targetPort: 8080protocol: TCP

步骤6:使用 kubectl 创建服务。

kubectl create -f hello-app-service.yaml

为应用程序创建 Ingress 对象

现在,让我们创建一个 Ingress 对象,以使用 DNS 访问我们的 hello 应用。Ingress 对象只不过是一组路由规则。

如果你想知道ingress对象是如何连接到 Nginx 控制器的,ingress 控制器 pod 连接到 ingress API来检查规则,并相应地更新它的 nginx .conf。

因为我用 DNS 提供程序映射了通配符DNS (*.apps.mlopshub.com),所以我将使用 demo.apps.mlopshub.com 指向 hello app 服务。

步骤1:创建一个名为ingress.yaml文件

步骤2:复制以下内容并保存文件。

替换demo.apps.mlopshub.comdevdev为您的域名。此外,我们在命名空间中创建此Ingress 对象,因为 hello 应用正在命名空间中运行。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: test-ingressnamespace: dev
spec:ingressClassName: nginxrules:- host: "demo.apps.mlopshub.com"http:paths:- pathType: Prefixpath: "/"backend:service:name: hello-serviceport:number: 80

步骤3:描述为检查配置而创建的 Ingress 对象。

kubectl describe ingress  -n dev

现在,如果我尝试访问域demo.apps.mlopshub.com,我将能够访问hello应用程序,如下所示。(您应该将其替换为您的域名) 

您可能会在浏览器中遇到 https 错误。在这种情况下,您可以使用 curl 命令来验证 Ingress 端点。

curl demo.apps.mlopshub.com

结论

在本文中,我们学习了如何设置 Nginx Ingress 控制器。

这很容易上手。但是,对于项目实现,请确保您完成所有 Nginx 配置并根据要求进行调整

使用 Nginx 控制器配置映射,您可以配置所有 Nginx 设置,而无需重新部署控制器。

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

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

相关文章

论文分享[cvpr2018]Non-local Neural Networks非局部神经网络

论文 https://arxiv.org/abs/1711.07971 代码https://github.com/facebookresearch/video-nonlocal-net 非局部神经网络 motivation:受计算机视觉中经典的非局部均值方法[4]的启发&#xff0c;非局部操作将位置的响应计算为所有位置的特征的加权和。 非局部均值方法 NLM&#…

用keras识别狗狗

一、需求场景 从照片从识别出狗狗 from keras.applications.resnet50 import ResNet50 from keras.preprocessing import image from keras.applications.resnet50 import preprocess_input, decode_predictions import numpy as np# 加载预训练的ResNet50模型 model ResNet5…

Flask-HTTP请求、响应、上下文、进阶实验

本节主要目录如下&#xff1a; 一、请求响应循环 二、HTTP请求 2.1、请求报文 2.2、Request对象 2.3、在Flask中处理请求 2.4、请求钩子 三、HTTP响应 3.1、响应报文 3.2、在Flask中生成响应 3.3、响应格式 3.4、Cookie 3.5、session&#xff1a;安全的Cookie 四、…

【仪酷LabVIEW AI工具包案例】使用LabVIEW AI工具包+YOLOv5结合Dobot机械臂实现智能垃圾分类

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『仪酷LabVIEW AI工具包案例』 &#x1f4d1;上期文章&#xff1a;『【YOLOv9】实战二&#xff1a;手把手教你使用TensorRT实现YOLOv…

数据结构学习——线性表、顺序表

1.线性表 线性表 &#xff08; linear list &#xff09; 是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一…

项目管理-项目资源管理2/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 资源管理&#xff1a;6个过程“硅谷火箭管控” ①规划资源管理&#xff1a; 写计划 ②估算活动资源&#xff1a;估算团队资源&…

渗透之sql盲注(时间/boolean盲注)

sql盲注&#xff1a;sql盲注意思是我们并不能在web页面中看到具体的信息&#xff0c;我们只能通过输入的语句的真假来判断。从而拿到我们想要的信息。 我们通常使用ascii值来进行盲注。 目录 手动注入&#xff1a; 时间盲注&#xff1a; 布尔盲注&#xff1a; python脚本注…

LabVIEW波浪发电平台浮筒取能效率数据采集系统

LabVIEW波浪发电平台浮筒取能效率数据采集系统 随着化石能源的逐渐减少以及能源价格的上升&#xff0c;寻找可替代的、可再生的、清洁的能源成为了世界各国的共识。波浪能作为一种重要的海洋能源&#xff0c;因其巨大的潜力和清洁性&#xff0c;近年来受到了广泛关注。开发了一…

(六)JSP教程——out对象

out对象是在JSP中经常使用到的对象&#xff0c;它本质上是一个输出流&#xff0c;前面已经多次使用&#xff0c;我们经常使用它的print()和println()方法&#xff0c;这些方法主要用于实现客户端数据的输出。通过out对象也可以直接向客户端发送一个由程序动态生成的HTML文件。 …

Docker-Compose 容器集群的快速编排

Docker-compose 简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&…

JavaEE企业级开发中常用的JDK7和JDK8的时间类

JDK7时间类 全世界的时间有一个统一的计算标准 在同一条经线上的时间是一样的 格林威治时间 简称GMT 计算核心 地球自转一天是24小时 太阳直射正好是12小时 但是误差太大 现在用原子钟来代替 用铯原子震动的频率来计算时间&#xff0c;作为世界的标准时间UTC 中国标准时间…

在国企分公司做信息宣传新闻投稿的经验分享

作为一名国企分公司的信息宣传工作者,我亲历了从传统投稿方式到数字化转型的全过程,这段经历既充满了挑战,也收获了成长。回首最初的日子,那些用邮箱投稿的时光,至今仍让我感慨万千。 初尝辛酸,邮箱投稿的艰难岁月 刚接手信息宣传工作时,我满腔热情,却很快被现实的冷水浇了个透…

c语言实现贪吃蛇小游戏————附全代码!!!

目录 1.Win32 API 1.1控制台应用程序 1.2控制台的名称&#xff0c;控制台窗口大小 1.3设置控制台光标位置 COORD - 光标坐标 GetStdHandle - 获取句柄 SetConsoleCursorPosition - 设置光标位置 封装一个设置光标的函数 1.4设置控制台光标的属性 CONSOLE_CURSOR_INFO …

栈PART 1

目录 1. 栈 1.1 栈的概念和结构 1.2 栈的实现 1.2.1 栈的顺序储存结构 1.2.2 栈的基本操作 1.3 有效的括号 1. 栈 1.1 栈的概念和结构 堆栈又名栈&#xff08;stack&#xff09;&#xff0c;它是一种运算受限的线性表。 限定仅在表尾进行插入和删除操作的线性表。这一端…

C++进阶之路:深入理解编程范式,从面向过程到面向对象(类与对象_上篇)

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

java-函数式编程-语法

目录 1、函数表现形式 分类 lambda表达式 参数类型可以全写&#xff0c;也可以全不写&#xff0c;但不能一部分写&#xff0c;一部分不写lambda 的省略策略&#xff1a;凡是可推导&#xff0c;都可以省略 方法引用 练习-判断语法正确性 练习-写出与方法引用等价的lambda表达式…

TCP三次握手四次挥手 UDP

TCP是面向链接的协议&#xff0c;而UDP是无连接的协议 TCP的三次握手 三次传输过程是纯粹的不涉及数据&#xff0c;三次握手的几个数据包中不包含数据内容。它的应用层&#xff0c;数据部分是空的&#xff0c;只是TCP实现会话建立&#xff0c;点到点的连接 TCP的四次挥手 第四…

VMware虚拟机提示内存不足

VMware虚拟机&#xff0c;k8s集群搭建内存不足的问题 疑问&#xff1a;我的电脑是8G8G双通道的内存&#xff0c;当我在搭建k8s集群时给master-2G内存&#xff0c;node1-3G内存&#xff0c;node2-3G内存&#xff1b; 当依次打开虚拟机到node2时VM提示“物理内存不足&#xff0c;…

【大学物理】双语合集听课笔记

7.5 angular momentu(角动量)_哔哩哔哩_bilibili 6.4Energy in Rotation Motion 有质量有速度的物体有动能&#xff0c;是不是很有道理 international system&#xff08;from French systeme international&#xff0c;acronym&#xff0c;SI&#xff09;of ineria kg*m^2 转…

使用 Cython 加密 Python 代码防止反编译

文章目录 前言使用 Cython 加密 Python 代码环境Python 源代码编写 Cython 编译配置文件 编译查看输出文件使用 问题error: Microsoft Visual C 14.0 or greater is requiredpyconfig.h(59): fatal error C1083: 无法打开包括文件: “io.h”: No such file or directorydynamic…