使用Ingress发布应用程序
使用Ingress发布应用程序
文章目录
- 使用Ingress发布应用程序
- @[toc]
- 一、什么是Ingress
- 二、定义Ingress
- 三、什么是Ingress控制器
- 四、部署nginx Ingress控制器
- 1.了解nginx Ingress控制器的部署方式
- 2.安装nginx Ingress控制器
- 3.本地实际测试
- 五、使用Ingress对外发布应用程序
- 1.使用Deployment和Service部署和发布应用程序
- 2.使用Ingress对外发布上述Service
- 3.访问Ingress发布的应用程序
文章目录
- 使用Ingress发布应用程序
- @[toc]
- 一、什么是Ingress
- 二、定义Ingress
- 三、什么是Ingress控制器
- 四、部署nginx Ingress控制器
- 1.了解nginx Ingress控制器的部署方式
- 2.安装nginx Ingress控制器
- 3.本地实际测试
- 五、使用Ingress对外发布应用程序
- 1.使用Deployment和Service部署和发布应用程序
- 2.使用Ingress对外发布上述Service
- 3.访问Ingress发布的应用程序
一、什么是Ingress
Ingress可以理解成Kubernetes集群的“智能交通指挥系统”。就像商场入口的导览员会根据顾客需求指引不同店铺一样,Ingress的作用是管理外部流量,把用户请求准确引导到集群内的各个服务。
举个更生活化的例子:假设你的Kubernetes集群是一个大型游乐园,里面有多个游乐项目(服务)。Ingress就是游乐园的检票口和导览地图,它的工作分为两个部分:
- 规则手册(Ingress资源):由管理员编写,比如规定“从东门来的游客去摩天轮,通过官网预约的游客去过山车”。
- 执行者(Ingress控制器):像检票员一样实时检查游客请求,根据规则手册把请求转发到对应项目。比如看到带有“摩天轮预约码”的游客,就打开通往摩天轮的通道。
它的三大核心能力:
- 智能分流:根据域名(如
shop.com
去商城服务)或路径(如/api
去后台服务)分流请求,避免所有流量挤在同一个入口。 - 安全保障:统一处理SSL证书(类似给所有游客发放加密手环),外部流量经过Ingress后自动解密,内部服务无需单独处理加密。
- 负载调节:像热门项目增加检票通道一样,自动将大量请求分摊到多个服务实例,防止单个服务被压垮。
简单来说,Ingress让外部用户访问集群服务变得像用手机导航一样方便——你只需要输入目的地(域名或路径),剩下的路线规划(流量路由)和安全检查(SSL)都由它自动完成。
二、定义Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: example-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: / # 路径重写注解(Nginx控制器专用)
spec:ingressClassName: nginx # 指定使用的Ingress控制器类型[^2]rules:- host: example.com # 域名匹配规则http:paths:- path: /service1 # URL路径匹配pathType: Prefix # 路径类型(Prefix/Exact/ImplementationSpecific)backend:service:name: service1 # 后端服务名称port:name: http # 服务端口名称(或直接指定number: 80)- path: /service2pathType: Prefixbackend:service:name: service2port:number: 8080 # 直接指定端口号
- annotations:控制器专属配置(如路径重写、限流等),需参考具体控制器文档。
- ingressClassName:指定匹配的Ingress控制器(需与集群中已部署的IngressClass一致)。
- pathType:定义路径匹配规则,Prefix表示前缀匹配(如/service1/会匹配/service1/xxx)。
- backend:指定流量路由的后端服务及端口(支持端口名称或数字)。
三、什么是Ingress控制器
Ingress控制器可以理解为Kubernetes集群的“智能流量调度员”。它的作用类似于快递站的分拣机器人,专门负责把外部的访问请求(比如用户通过浏览器发送的请求)准确快速地分发到集群内部对应的服务。
举个生活化的例子:
假设你网购了一件商品,快递站收到包裹后需要分拣到不同区域的快递柜:
- Ingress资源像是你填写的快递单,上面写着「收件地址:5号楼3层」;
- Ingress控制器就是分拣机器人,它读取快递单信息后,自动把包裹投递到正确的位置。
三大核心职责:
- 流量导航
根据规则(如域名shop.com
或路径/images
)把请求导向对应服务,就像快递机器人根据地址匹配快递柜。例如:- 访问
www.example.com/video
→ 视频服务 - 访问
www.example.com/news
→ 新闻服务
- 访问
- 安全守护
统一处理HTTPS加密(类似给快递包裹加装防拆封条),外部流量经过控制器解密后,内部服务无需单独处理加密。 - 负载调节
像热门快递柜增加分拣通道一样,自动将大量请求分摊到多个服务实例,防止单个服务崩溃。
与其他组件的区别:
- Ingress资源 vs 控制器:
规则说明书 vs 执行者。用户编写Ingress资源定义路由规则(YAML文件),控制器实时读取并执行这些规则。 - 与传统负载均衡器的区别:
传统设备需要手动配置,而Ingress控制器能自动感知服务变化(如新增实例),动态调整路由。
部署小知识:
-
必须安装:就像快递站没有分拣机器人包裹会堆积一样,Kubernetes默认不带控制器,需额外部署(如Nginx、Traefik等)。
-
多种选择
:不同控制器特性不同,比如:
- Nginx控制器:适合高并发场景(类似大型分拣中心)
- Traefik控制器:配置更简单,适合动态调整(类似灵活的小型分拣车)
简单来说,有了Ingress控制器,外部用户访问集群服务就像收快递一样方便——你只需要告诉它「送到哪里」(域名或路径),剩下的分拣、安全和调度都由这个「智能调度员」搞定。
四、部署nginx Ingress控制器
1.了解nginx Ingress控制器的部署方式
以下是 Nginx Ingress 控制器的 主要部署方式 及其适用场景,结合不同环境和需求进行说明:
- 通用部署:基于官方 YAML 文件
适用场景:快速部署、测试环境或小规模集群。
操作步骤:
-
下载官方提供的
mandatory.yaml
文件(对应不同版本):
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.5/deploy/static/provider/cloud/deploy.yaml
-
执行部署命令:
kubectl apply -f deploy.yaml
核心组件:
- 创建
ingress-nginx
命名空间 - 部署
nginx-ingress-controller
的 Deployment 或 DaemonSet - 配置 RBAC 权限、ConfigMap 等
特点:简单快捷,但需自行处理外部访问(如 NodePort 或 LoadBalancer)。
- 高性能部署:DaemonSet + HostNetwork
适用场景:生产环境、高并发或对网络延迟敏感的场景。
操作步骤:
-
修改
mandatory.yaml
,将 Deployment 改为 DaemonSet,并启用hostNetwork: true
。 -
通过标签筛选节点,部署到专用边缘节点:
# DaemonSet配置示例 spec:template:spec:hostNetwork: true # 使用宿主机网络tolerations: # 允许调度到Master节点(可选)- key: node-role.kubernetes.io/mastereffect: NoSchedule
优点:
- 绕过 NodePort,减少网络转发层级,提升性能
- 直接使用节点 IP 和端口(80/443),避免端口冲突
缺点:需手动管理节点和负载均衡器绑定。
- 云服务商集成:LoadBalancer 自动绑定
适用场景:公有云环境(如 AWS、腾讯云、阿里云)。
操作步骤:
-
部署 Nginx Ingress 控制器后,创建 LoadBalancer 类型的 Service:
apiVersion: v1 kind: Service metadata:name: ingress-nginx spec:type: LoadBalancer # 云平台自动创建负载均衡器ports:- port: 80targetPort: 80
-
云平台自动分配外部 IP,流量直达 Ingress Pod(若支持 VPC-CNI 直连 Pod 更优)。
特点:
- 全托管负载均衡,支持自动扩缩容
- 部分云平台支持直通 Pod(如腾讯云 VPC-CNI 模式),避免 NodePort 瓶颈。
- 高可用部署:多副本 + 节点调度
适用场景:需高可靠性的生产环境。
操作步骤:
-
扩增控制器副本数:
kubectl scale --replicas=3 deployment/nginx-ingress-controller -n ingress-nginx
-
通过节点亲和性(Affinity)或污点(Taint)分散 Pod:
# 示例:限制Pod仅部署在专用节点 spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: ingress-nodeoperator: Invalues: ["true"]
优化点:
- 副本数建议与节点数一致,避免单点故障
- 结合 HPA(Horizontal Pod Autoscaler)实现自动扩缩容。
- Operator 模式部署
适用场景:需要声明式管理和高级定制的场景。
操作步骤:
-
安装 Nginx Ingress Operator(如通过 Helm 或直接部署):
git clone https://github.com/nginxinc/nginx-ingress-helm-operator make deploy IMG=nginx/nginx-ingress-operator:1.2.0
-
通过自定义资源(CRD)管理 Ingress 配置。
特点:
- 简化生命周期管理(如证书更新、配置热加载)
- 支持更复杂的路由策略和监控集成。
部署方式对比与选型建议
方式 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
官方 YAML | 测试/小规模 | 简单快速 | 需手动处理外部访问 |
DaemonSet + HostNetwork | 高性能生产环境 | 低延迟、高吞吐 | 需维护节点和负载均衡器绑定 |
云服务商 LoadBalancer | 公有云环境 | 全托管、自动扩缩容 | 依赖云平台特性 |
Operator 模式 | 复杂路由/声明式管理 | 灵活定制、自动化运维 | 学习成本较高 |
建议:
- 公有云用户优先选择云平台集成方案(如腾讯云“指定节点池 DaemonSet 部署”);
- 自建集群推荐 DaemonSet + HostNetwork 或高可用 Deployment;
- 需要深度定制时考虑 Operator 模式。
注意事项
- 版本兼容性:确保 Ingress 控制器版本与 Kubernetes 集群兼容(如 1.26+ 需特定镜像)。
- 证书管理:通过 Secret 存储 TLS 证书,并在 Ingress 中引用。
- 安全加固:关闭非必要端口,避免使用 NodePort 暴露过多服务。
通过以上方式,可根据实际需求灵活部署 Nginx Ingress 控制器,实现高效、安全的流量管理。
2.安装nginx Ingress控制器
在K8S集群中安装nginx Ingress控制器一般不需要进行额外配置,主要有两种方法:一种是使用Helm工具基于Chart文件安装,另一种是使用kubect apply命令基于YAML格式的配置文件安装。考虑到国内的网络环境,这里采用第2种方法安装。
(1)为了将该控制器部署到指定节点,执行以下命令为该节点设置标签
[root@master ~]# kubectl label node node2 ingress=true
node/node2 labeled
(2)从nginx Ingress控制器官网下载YAML格式的配置文件deploy.yaml,本例下载的是1.7.1版本的配置文件,将该文件更名
[root@master ~]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.1/deploy/static/provider/cloud/deploy.yaml
--2025-04-19 16:30:40-- https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.1/deploy/static/provider/cloud/deploy.yaml
正在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.110.133, 185.199.111.133, ...
正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:15704 (15K) [text/plain]
正在保存至: “deploy.yaml”deploy.yaml 100%[===================================================>] 15.34K 49.5KB/s 用时 0.3s 2025-04-19 16:30:43 (49.5 KB/s) - 已保存 “deploy.yaml” [15704/15704])
[root@master ~]# mv deploy.yaml ingress-nginx-controller.yaml
(3)修改该文件,替换其中的镜像仓库的地址,所涉及的3个镜像修改如下
[root@master ~]# cat -n ingress-nginx-controller.yaml
......440 value: /usr/local/lib/libmimalloc.so441 # image: registry.k8s.io/ingress-nginx/controller:v1.7.0@sha256:7612338342a1e7b8090bef78f2a04fffcadd548ccaabe8a47bf7758ff549a5f7442 image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.7.0......538 fieldPath: metadata.namespace539 # image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794@sha256:01d181618f270f2a96c04006f33b2699ad3ccb02da48d0f89b22abce084b292f540 image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1541 imagePullPolicy: IfNotPresent......588 fieldPath: metadata.namespace589 # image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794@sha256:01d181618f270f2a96c04006f33b2699ad3ccb02da48d0f89b22abce084b292f590 image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1......
官方给出的YAML配置文件中拉取的镜像来自registry.k8s.io仓库,Docker Hub并不提供该仓库,从国内拉取这些镜像就会报错(ErrImagePull)。解决的方法是使用国内可访问的镜像仓库代替,本例使用阿里云提供的镜像仓库。
(4)针对部署方式涉及的DaemonSet和HostNetwork定义,继续修改以上文件中名为ingress-nginx-controller的Deployment配置部分相关内容
[root@master ~]# cat -n ingress-nginx-controller.yaml
......
390 ---391 apiVersion: apps/v1392 # kind: Deployment393 kind: DaemonSet # 将类型由Deployment改为DaemonSet394 metadata:......401 name: ingress-nginx-controller402 namespace: ingress-nginx497 # 将ClusterFirst改为ClusterFirstWithHostNet,使nginx可以解析集群内部名称498 # dnsPolicy: ClusterFirst499 dnsPolicy: ClusterFirstWithHostNet500 nodeSelector:501 # kubernetes.io/os: linux502 ingress: "true" # 选择部署的节点改为此项设置503 hostNetwork: true # 此项设置是增加的,表示启用主机网络
(5)基于该配置文件创建nginx Ingress控制器
[root@master ~]# kubectl create -f ingress-nginx-controller.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
daemonset.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
该配置文件除了定义了Deployment(本例已改为DaemonSet)和Service外,还定义了名称空间、服务账号等配套的Kubernetes对象。所创建的对象都属于ingress-nginx名称空间。
(6)查看相关的Pod部署和运行情况
[root@master ~]# kubectl get pods --namespace=ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-admission-create-mw29n 0/1 Completed 0 90s 10.244.166.130 node1 <none> <none>
ingress-nginx-admission-patch-gl8x4 0/1 Completed 0 90s 10.244.166.129 node1 <none> <none>
ingress-nginx-controller-9pfcj 0/1 Running 0 90s 192.168.10.32 node2 <none> <none>
可以发现,nginx Ingress控制器最终在node2节点上运行,其他两个pod已经结束运行,说明仅是部署过程中所需执行的程序。
(7)查看相关的service的运行情况
[root@master ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.102.234.10 <pending> 80:31156/TCP,443:31454/TCP 3m2s
ingress-nginx-controller-admission ClusterIP 10.101.83.6 <none> 443/TCP 3m1s
(8)在集群内部访问该控制器发布的服务进行测试
[root@master ~]# curl 192.168.10.32
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
可以发现,该控制器就是一个nginx服务器,生成有默认的后端Pod,直接访问节点主机会返回404错误。
3.本地实际测试
完成上述安装后,可以创建简单的Ingress进行实际测试
(1)创建一个运行简单Web服务器的Deployment和相应的Service
[root@master ~]# kubectl create deployment demo --image=httpd --port=80
deployment.apps/demo created
[root@master ~]# kubectl expose deployment demo
service/demo exposed
(2)创建Ingress,下面的例子使用映射到本地主机的主机
[root@master ~]# kubectl create ingress demo-localhost --class=nginx --rule="demo.localdev.me/*=demo:80"
ingress.networking.k8s.io/demo-localhost created
(3)将一个本地端口转发到Ingress控制器
[root@master ~]# kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
(4)在控制平面节点上测试
[root@master ~]# curl demo.localdev.me:8080
<html><body><h1>It works!</h1></body></html>
结果显示,可以通过Ingress访问后端的服务。
(5)删除创建的Ingress和Deployment及Service
[root@master ~]# kubectl delete ingress demo-localhost
ingress.networking.k8s.io "demo-localhost" deleted
[root@master ~]# kubectl delete deploy/demo svc/demo
deployment.apps "demo" deleted
service "demo" deleted
五、使用Ingress对外发布应用程序
部署了nginx Ingress控制器之后就可以使用Ingress对外发布应用程序
1.使用Deployment和Service部署和发布应用程序
由Ingress发布的是Service定义的应用程序,首先要创建Service。这里分别为nginx和Tomcat两个Web服务器创建Service以用于示范。
(1)编写nginx的Deployment和Service配置文件,将其命名为nginx-foringress.yaml。
[root@master ~]# vim nginx-foringress.yaml
[root@master ~]# cat nginx-foringress.yaml
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型为Deployment
metadata: # 元数据name: nginx-deploy labels: # 标签app: nginx-deploy
spec: # 详细信息replicas: 2 # 副本数量selector: # 选择器,指定该控制器管理哪些PodmatchLabels: # 匹配规则app: nginx-podtemplate: # 定义模板,当副本数量不足时会根据模板定义创建Pod副本metadata:labels:app: nginx-pod # Pod的标签spec:containers: # 容器列表(本例仅定义一个容器)- name: nginx # 容器的名称image: nginx:1.14.2 # 容器所用的镜像ports:- name: nginx-portcontainerPort: 80 # 容器需要暴露的端口---
apiVersion: v1
kind: Service
metadata:name: nginx-svc #设置service的显示名字
spec:ports:- port: 80 #让集群知道service绑定的端口targetPort: 80 #目标Pod的端口selector:app: nginx-pod #指定pod的标签[root@master ~]#
(2)编写Tomcat的Deployment和Service文件,将其命名为tomcat-foringress.yaml
[root@master ~]# vim tomcat-foringress.yaml
[root@master ~]# cat tomcat-foringress.yaml
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型为Deployment
metadata: # 元数据name: tomcat-deploy
spec:replicas: 3selector: # 选择器,指定该控制器管理哪些PodmatchLabels:app: tomcat-podtemplate:metadata:labels:app: tomcat-podspec:containers:- name: tomcatimage: tomcat:8.0-alpine # 容器所用的镜像ports:- containerPort: 8080 # 容器需要暴露的端口---
apiVersion: v1
kind: Service
metadata:name: tomcat-svc #设置service的显示名字
spec:selector:app: tomcat-pod # 指定pod的标签ports:- port: 8080 #让集群知道service绑定的端口targetPort: 8080 #目标Pod的端口
(3)执行创建
[root@master ~]# kubectl apply -f nginx-foringress.yaml
deployment.apps/nginx-deploy created
service/nginx-svc created
[root@master ~]# kubectl apply -f tomcat-foringress.yaml
deployment.apps/tomcat-deploy created
service/tomcat-svc created
(4)查看Service列表,可以发现新创建的两个Service的类型都是默认的ClusterIP,只能在集群内部访问
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 27d
nginx-svc ClusterIP 10.110.223.241 <none> 80/TCP 89s
tomcat-svc ClusterIP 10.98.106.182 <none> 8080/TCP 80s
2.使用Ingress对外发布上述Service
用Service发布的应用程序可以通过Ingress基于HTTP或HTTPS进一步对外发布,这需要创建Ingress。
(1)编写定义Ingress配置文件,将其命名为http-ingress.yaml
[root@master ~]# vim http-ingress.yaml
[root@master ~]# cat http-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: http-ingress
spec:ingressClassName: nginxrules:- host: nginx.abc.com # 域名http:paths:- path: /pathType: Prefixbackend:service:name: nginx-svcport: number: 80- host: tomcat.abc.com # 域名http:paths:- path: /pathType: Prefixbackend:service: name: tomcat-svcport:number: 8080
这里定义了两个后端Service,由不同的域名进行转发。
(2)基于上述文件Ingress配置文件创建Ingress
[root@master ~]# kubectl apply -f http-ingress.yaml
ingress.networking.k8s.io/http-ingress created
(3)查看Ingress
[root@master ~]# kubectl get ing -o wide
NAME CLASS HOSTS ADDRESS PORTS AGE
http-ingress nginx nginx.abc.com,tomcat.abc.com 80 41s
(4)查看创建的Ingress的详细信息
[root@master ~]# kubectl describe ing http-ingress
Name: http-ingress
Labels: <none>
Namespace: default
Address:
Ingress Class: nginx
Default backend: <default>
Rules:Host Path Backends---- ---- --------nginx.abc.com / nginx-svc:80 (10.244.104.4:80,10.244.166.132:80)tomcat.abc.com / tomcat-svc:8080 (10.244.104.5:8080,10.244.166.133:8080,10.244.166.134:8080)
Annotations: <none>
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Sync 2m2s nginx-ingress-controller Scheduled for sync
可以发现,该Ingress提供两个路由规则,分别指向后端nginx和Tomcat这两个Service,每个Service都有各自的Pod副本。
3.访问Ingress发布的应用程序
在控制平面上编辑域名解析
[root@master ~]# vim /etc/hosts
[root@master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.30 master
192.168.10.31 node1
192.168.10.32 node2 nginx.abc.com tomcat.abc.com
验证
[root@master ~]# curl nginx.abc.com
<!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>
[root@master ~]# curl tomcat.abc.com
......<h1>Apache Tomcat/8.0.53</h1>......
可以发现,Ingress根据不同的域名转发到不同后端的应用程序,证明已经成功地部署了Ingress。
删除本例所有对象
[root@master ~]# kubectl delete -f http-ingress.yaml
ingress.networking.k8s.io "http-ingress" deleted
[root@master ~]# kubectl delete -f tomcat-foringress.yaml
deployment.apps "tomcat-deploy" deleted
service "tomcat-svc" deleted
[root@master ~]# kubectl delete -f nginx-foringress.yaml
deployment.apps "nginx-deploy" deleted
service "nginx-svc" deleted
相关文章:
使用Ingress发布应用程序
使用Ingress发布应用程序 文章目录 使用Ingress发布应用程序[toc]一、什么是Ingress二、定义Ingress三、什么是Ingress控制器四、部署nginx Ingress控制器1.了解nginx Ingress控制器的部署方式2.安装nginx Ingress控制器3.本地实际测试 五、使用Ingress对外发布应用程序1.使用D…...
llama-factory微调报错:
报错信息 [INFO] [utils.py:789:see_memory_usage] CPU Virtual Memory: used 81.51 GB, percent 64.9% W0419 10:14:27.573000 108354 site-packages/torch/distributed/elastic/multiprocessing/api.py:897] Sending process 108373 closing signal SIGTERM W0419 10:14:27…...
【LLaMAFactory】LoRa + 魔搭 微调大模型实战
前言 环境准备 之前是在colab上玩,这次在国内的环境上玩玩。 魔搭:https://www.modelscope.cn/ 现在注册,有100小时的GPU算力使用。注册好了之后: 魔搭社区 这里使用qwen2.5-7B-Instruct模型,这里后缀Instruct是指…...
【愚公系列】《Python网络爬虫从入门到精通》054-Scrapy 文件下载
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
db中查询关于null的sql该怎么写
正确示例 # 等于null select * from 表名 where 字段名 is NULL; # 不等于null select * from 表名 where 字段名 is not NULL;若需要同时判断字段不等于某个值且不为null select * from users where age ! 30 and age is not null; select * from users where age ! 30 or a…...
React 文章列表
自定义hook 在src/hooks文件夹下封装 useChannel.js // 获取频道列表的逻辑 import { useEffect , useState } from "react" import { getChannelAPI } from "/apis/article"function useChannel(){// 获取频道的逻辑 const [channelList,setChannelList…...
中间件--ClickHouse-12--案例-1-日志分析和监控
1、案例背景 一家互联网公司需要实时分析其服务器日志、应用日志和用户行为日志,以快速发现潜在问题并优化系统性能。 2、需求分析 目标:实时分析日志数据,快速发现问题并优化系统性能。数据来源: 服务器日志:如 Ng…...
QML中的3D功能--自定义着色器开发
在 Qt 3D 中使用自定义着色器可以实现高度定制化的渲染效果。以下是完整的自定义着色器开发方案。 一、基础着色器创建 1. 创建自定义材质 qml import Qt3D.Core 2.15 import Qt3D.Render 2.15 import Qt3D.Extras 2.15Entity {components: [Transform { translation: Qt.v…...
如何防止接口被刷
目录 🛡️ 一、常见的防刷策略分类 🔧 二、技术实现细节 ✅ 1. 基于 IP 限流 ✅ 2. 给接口加验证码 ✅ 3. 使用 Token 限制接口访问权限 ✅ 4. 给接口加冷却时间(验证码类经典) ✅ 5. 使用滑动窗口限流算法(更精…...
18、TimeDiff论文笔记
TimeDiff **1. 背景与动机****2. 扩散模型基础****3. TimeDiff 模型****3.1 前向扩散过程****3.2 后向去噪过程** 4、TimeDiff(架构)原理训练推理其他关键点解释 DDPM(相关数学)1、正态分布2、条件概率1. **与多个条件相关**&…...
docker底层原理
一句话,dockerfile里面的一行指令,就是一个layer层 docker底层原理 在机器上安装docker服务器端的程序,就会在机器上自动创建以下目录,默认安装路径是/var/lib/ docker服务器端的工作目录的作用如下,镜像的每一层的元数…...
YOLO拓展-NMS算法
1.概述 NMS(non maximum suppression)即非极大值抑制,其本质就是搜索局部极大值,抑制非极大值元素,可以理解为局部最大搜索。 这里不讨论通用的NMS算法(参考论文《Efficient Non-Maximum Suppression》对1维和2维数据…...
Docker Swarm 容器与普通 Docker 容器的网卡差异
问题背景 在 Docker Swarm 网络空间启动的容器有两张网卡(eth0 和 eth1),而普通 Docker 容器只有一张网卡(eth0)。以下通过分析 ip addr show 和 ip link show 的输出,解释原因。 命令输出解析 Docker S…...
【Linux】线程ID、线程管理、与线程互斥
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🌐 C 语言 上篇文章: 【Linux】线程:从原理到实战,全面掌握多线程编程!-CSDN博客 下…...
服务器简介(含硬件外观接口介绍)
服务器(Server)是指提供资源、服务、数据或应用程序的计算机系统或设备。它通常比普通的个人计算机更强大、更可靠,能够长时间无间断运行,支持多个用户或客户端的请求。简单来说,服务器就是专门用来存储、管理和提供数…...
自动驾驶---决策规划之导航增强端到端
1 背景 自动驾驶算法通常包括几个子任务,包括3D物体检测、地图分割、运动预测、3D占用预测和规划。近年来,端到端方法将多个独立任务整合到多任务学习中,优化整个系统,包括中间表示,以实现最终的规划任务。随着端到端技…...
Datawhale AI春训营 世界科学智能大赛--合成生物赛道:蛋白质固有无序区域预测 小白经验总结
一、报名大赛 二、跑通baseline 在魔塔社区创建实例,根据教程完成速通第一个分数~ Datawhale-学用 AI,从此开始 三、优化实例(这里是我的学习优化过程) 1.先将官方给的的模型训练实例了解一遍(敲一敲代码) 训练模…...
基于Java(Struts2 + Hibernate + Spring)+MySQL实现的(Web)在线预约系统
基于Struts2 Hibernate Spring的在线预约系统 1.引言 1.1编写目的 针对医院在线预约挂号系统,提供详细的设计说明,包括系统的需求、功能模块、界面设计、设计方案等,以辅助开发人员顺利进行系统的开发并让项目相关者可以对这个系统进行分…...
PHP获取大文件行数
在PHP中获取大文件的行数时,直接读取整个文件到内存中可能会导致内存溢出,特别是对于非常大的文件。因此,最有效的方法是逐行读取文件并计数。以下是一些实现方法: 方法一:使用 fgets() fgets() 函数逐行读取文件&am…...
2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型?
2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型? 一、8大主流Web开发语言技术对比 1. PHP开发:中小型网站的首选方案 最新版本:PHP 8.3(2023年11月发布)核心优势: 全球78%的网站…...
Win7模拟器2025中文版:重温经典,掌上电脑体验
随着科技的快速发展,现代操作系统变得越来越高级,但许多用户仍然怀念经典的Windows 7系统。如果你也想重温那种熟悉的操作体验,Win7模拟器2025中文版 是一个不错的选择。这款软件能够让你在手机上轻松实现Windows 7系统的模拟,带来…...
HTML5+CSS3小实例:CSS立方体
实例:CSS立方体 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&q…...
使用 Vite 快速搭建现代化 React 开发环境
1.检查环境 说明:检测环境,node版本为18.20.6。 2.创建命令 说明:创建命令,选择对应的选项。 npm create vitelatest 3.安装依赖 说明:安装相关依赖。 npm i...
Linux网络编程——基于ET模式下的Reactor
一、前言 上篇文章中我们已经讲解了多路转接剩下的两个接口:poll和epoll,并且知道了epoll的两种工作模式分别是 LT模式和ET模式,下来我们就实现的是一个简洁版的 Reactor,即半同步半异步I/O,在linux网络中,…...
【现代深度学习技术】循环神经网络04:循环神经网络
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
1. 认识DartGoogle为Flutter选择了Dart语言已经是既
1. 认识Dart Google为Flutter选择了Dart语言已经是既定的事实,无论你多么想用你熟悉的语言,比如JavaScript、TypeScript、ArkTS等来开发Flutter,至少目前都是不可以的。 Dart 是由谷歌开发的计算机编程语言,它可以被应用于 Web/…...
学习设计模式《三》——适配器模式
一、基础概念 适配器模式的本质是【转换匹配,复用功能】; 适配器模式定义:将一个类的接口转换为客户希望的另外一个接口;适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式的目的:复用…...
【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化 - 2025-04-19详解 - 3-5年Java开发必备知识
【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化 - 2025-04-19详解 - 3-5年Java开发必备知识 引言 在微服务架构中,分布式事务处理和性能优化是面试中高频出现的主题。随着系统规模的扩大,如何保证数据一致性和系统性能成为开发者…...
Elasticsearch只返回指定的字段(用_source)
在Elasticsearch中,当你想要查询文档但不返回所有字段,只返回指定的字段(比如这里的id字段),你可以使用_source参数来实现这一点。但是,有一点需要注意:Elasticsearch的_source字段默认是返回的…...
【Linux “sed“ 命令详解】
本章目录: 1. 命令简介sed 的优势: 2. 命令的基本语法和用法基本语法:参数说明:常见用法场景:示例1:替换文本示例2:删除空行示例3:从命令输出中处理内容 3. 命令的常用选项及参数常用命令动作&a…...
JMETER使用
接口测试流程: 1.获取接口文档,熟悉接口业务 2.编写接口测试用例以及评审 正例:输入正常的参数,验证接口能否正常返回 反例:权限异常(为空、错误、过期)、参数异常(为空、长度异常、类型异常)、其他异常(黑名单、调用次数限制)、兼容异常(一个接口被多种…...
JavaWeb 课堂笔记 —— 13 MySQL 事务
本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…...
离线安装elasticdump并导入和导出数据
离线安装elasticdump 在 CentOS 或 RHEL 系统上安装 elasticdump,你可以使用 npm(Node.js 的包管理器)来安装,因为 elasticdump 是一个基于 Node.js 的工具。以下是步骤 先在外网环境下安装 下载nodejs和npm(注意x8…...
WhatTheDuck:一个基于浏览器的CSV查询工具
今天给大家介绍一个不错的小工具:WhatTheDuck。它是一个免费开源的 Web 应用程序,允许用户上传 CSV 文件并针对其内容执行 SQL 查询分析。 WhatTheDuck 支持 SQL 代码自动完成以及语法高亮。 WhatTheDuck 将上传的数据存储为 DuckDB 内存表,继…...
关于数字信号与图像处理——基于Matlab的图像增强技术
本篇博客是在做数字信号与图像处理实验中的收获。 具体内容包括:根据给定的代码放入Matlab中分别进行两次运行测试——比较并观察运行后的实验结果与原图像的不同点——画出IJ的直方图,并比较二者差异。接下来会对每一步进行具体讲解。 题目:…...
MySQL数据库 - 锁
锁 此笔记参考黑马教程,仅学习使用,如有侵权,联系必删 文章目录 锁1. 概述1.1 介绍1.2 分类 2. 全局锁2.1 介绍2.2 语法2.3 特点(弊端) 3. 表级锁3.1 介绍3.2 表锁3.3 元数据锁(meta data lock࿰…...
免费多平台运行器,手机畅玩经典主机大作
软件介绍 飞鸟模拟器是一款面向安卓设备的免费游戏平台,支持PS2/PSP/NDS等十余种经典主机游戏运行。 该软件突破传统模拟器复杂操作模式,采用智能核心加载技术,用户只需双击主程序即可开启游戏之旅,真正实现"即下即玩"…...
计算机软考中级 知识点记忆——排序算法 冒泡排序-插入排序- 归并排序等 各种排序算法知识点整理
一、📌 分类与比较 排序算法 最优时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性 应用场景与特点 算法策略 冒泡排序 O(n) O(n) O(n) O(1) 稳定 简单易实现,适用于小规模数据排序。 交换排序策略 插入排序 O(n) O(n) O…...
STC32G12K128单片机GPIO模式SPI操作NorFlash并实现FatFS文件系统
STC32G12K128单片机GPIO模式SPI操作NorFlash并实现FatFS文件系统 Norflash简介NorFlash操作驱动代码文件系统测试代码 Norflash简介 NOR Flash是一种类型的非易失性存储器,它允许在不移除电源的情况下保留数据。NOR Flash的名字来源于其内部结构中使用的NOR逻辑门。…...
uniapp-x 二维码生成
支持X,二维码生成,支持微信小程序,android,ios,网页 - DCloud 插件市场 免费的单纯用爱发电的...
当HTTP遇到SQL注入:Java开发者的攻防实战手册
一、从HTTP请求到数据库查询:漏洞如何产生? 危险的参数拼接:Servlet中的经典错误 漏洞代码重现: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String category = request.getParameter("…...
[dp20_完全背包] 介绍 | 零钱兑换
目录 1. 完全背包 题解 背包必须装满 2.零钱兑换 题解 1. 完全背包 链接: DP42 【模板】完全背包 描述 你有一个背包,最多能容纳的体积是V。 现在有n种物品,每种物品有任意多个,第i种物品的体积为vivi ,价值为wiwi。 &a…...
精打细算 - GPU 监控
精打细算 - GPU 监控 在上一篇,咱们历经千辛万苦,终于让应用程序在 Pod 的“驾驶舱”里成功地“点火”并用上了 GPU。太棒了!但是,车开起来是一回事,知道车速多少、油耗多少、引擎水温是否正常,则是另一回事,而且同样重要,对吧? 我们的 GPU 应用跑起来了,但新的问题…...
故障诊断 | CNN-BiGRU-Attention故障诊断
效果一览 摘要 在现代工业生产中,设备的稳定运行至关重要,故障诊断作为保障设备安全、高效运行的关键技术,其准确性和及时性直接影响着生产效率与成本[[doc_refer_1]][[doc_refer_2]]。随着工业设备复杂性的不断增加,传统故障诊断方法已难以满足实际需求。深度学习技术凭借…...
单片机AIN0、AIN1引脚功能
目录 1. 模拟-数字转换器(ADC) 2. 交流电源(AC) 总结 这两部分有什么区别? 在这个电路图中,两个部分分别是模拟-数字转换器(ADC)和交流电源(AC)。以下是这…...
交换机与路由器的主要区别:深入分析其工作原理与应用场景
在现代网络架构中,交换机和路由器是两种至关重要的设备。它们在网络中扮演着不同的角色,但很多人对它们的工作原理和功能特性并不十分清楚。本文将深入分析交换机与路由器的主要区别,并探讨它们的工作原理和应用场景。 一、基本定义 1. 交换…...
uniApp小程序保存定制二维码到本地(V3)
这里的二维码组件用的 uv-ui 的二维码 可以按需引入 QRCode 二维码 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 <uv-qrcode ref"qrcode" :size"280" :value"payCodeUrl"></uv-qrcode>&l…...
手机投屏到电视方法
一、投屏软件 比如乐播投屏 二、视频软件 腾讯视频、爱奇艺 三、手机无线投屏功能 四、有线投屏 五、投屏器...
桌面应用UI开发方案
一、基于 Web 技术的跨平台方案 Electron Python/Go 特点: 技术栈:前端使用 HTML/CSS/JS,后端通过 Node.js 集成 Python/Go 模块或服务。 跨平台:支持 Windows、macOS、Linux 桌面端,适合开发桌面应用。 生态成熟&…...
FFmpeg+Nginx+VLC打造M3U8直播
一、视频直播的技术原理和架构方案 直播模型一般包括三个模块:主播方、服务器端和播放端 主播放创造视频,加美颜、水印、特效、采集后推送给直播服务器 播放端: 直播服务器端:收集主播端的视频推流,将其放大后推送给…...