Ingress-Nginx 快速入门

news/2025/2/21 7:43:56/文章来源:https://www.cnblogs.com/dengyouf/p/18723975

一、 安装 Ingress

1. 使用资源清单文件部署Ingress-Nginx

官网: https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

在 Kubernetes 集群中部署 ingress-nginx 时,官方推荐监听 80 和 443 端口。80 端口用于 HTTP,443 端口用于 HTTPS,这是 Web 服务的标准端口,符合互联网访问习惯。这样,客户端可以直接通过 http://yourdomain.com 访问应用,而无需指定端口号,如 http://yourdomain.com:8080。但是kubernetes 具有 NodePort 可见性的服务保留的端口范围默认为30000-32767,此处要想使用80和443端口,需要修改 api-server 的配置参数如下:

  • 修改 kube-apiserver 默认端口范围
vim /etc/kubernetes/manifests/kube-apiserver.yaml
apiVersion: v1
kind: Pod
metadata:annotations:kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 172.16.192.31:6443creationTimestamp: nulllabels:component: kube-apiservertier: control-planename: kube-apiservernamespace: kube-system
spec:containers:- command:- kube-apiserver- --advertise-address=172.16.192.31...- --service-node-port-range=1-65535
  • 修改资源清单
~/k8s-cluster-repo# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/cloud/deploy.yaml
~/k8s-cluster-repo# cp deploy.yaml  ingress-nginx.yaml 
~/k8s-cluster-repo# diff  deploy.yaml  ingress-nginx.yaml 
347c347,348
<   externalTrafficPolicy: Local
---
>   # externalTrafficPolicy: Local
>   externalTrafficPolicy: Cluster # 修改Local为Cluster;流量可以转发到其他节点上的Pod
356a358
>     nodePort: 80 # 添加nodePort,指定监听80端口
361a364
>     nodePort: 443 # 添加nodePort,指定监听443端口
366c369,370
<   type: LoadBalancer
---
>   # type: LoadBalancer
>   type: NodePort # 修改Service类型为NodePort
445c449,450
<         image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa
---
>         # image: registry.k8s.io/ingress-nginx/controller:v1.12.0@sha256:e6b8de175acda6ca913891f0f727bca4527e797d52688cbe9fec9040d6f6b6fa
>         image: registry.cn-beijing.aliyuncs.com/dengyouf/ingress-nginx:controller-v1.12.0 # 替换镜像
547c552,553
<         image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4
---
>         # image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4
>         image: registry.cn-beijing.aliyuncs.com/dengyouf/ingress-nginx:kube-webhook-certgen-v1.5.0 # 替换镜像
601c607,608
<         image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4
---
>         # image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4
>         image: registry.cn-beijing.aliyuncs.com/dengyouf/ingress-nginx:kube-webhook-certgen-v1.5.0 # 替换镜像~/k8s-cluster-repo# kubectl  apply -f ingress-nginx.yaml~/k8s-cluster-repo# kubectl  get pod -n ingress-nginx -o wide
NAME                                      READY   STATUS      RESTARTS   AGE    IP             NODE       NOMINATED NODE   READINESS GATES
ingress-nginx-admission-create-w88gz      0/1     Completed   0          6m2s   10.233.84.3    worker01   <none>           <none>
ingress-nginx-admission-patch-bjp6m       0/1     Completed   0          6m2s   10.233.108.2   worker02   <none>           <none>
ingress-nginx-controller-54b59c54-xzbms   1/1     Running     0          6m2s   10.233.108.3   worker02   <none>           <none>
~/k8s-cluster-repo# kubectl  get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                 AGE
ingress-nginx-controller             NodePort    10.233.50.40   <none>        80:80/TCP,443:443/TCP   6m15s
ingress-nginx-controller-admission   ClusterIP   10.233.26.25   <none>        443/TCP                 6m15s

二、 使用Ingress

2.1 公开后端服务

  • 创建第一个 Deployment
echo "---
apiVersion: apps/v1
kind: Deployment
metadata:name: demoapp-deploy-v10labels:app: demoapp
spec:replicas: 1selector:matchLabels:app: demoappversion: v1.0strategy: {}template:metadata:labels:app: demoappversion: v1.0spec:containers:- name: demoapp-v10image: ikubernetes/demoapp:v1.0"|tee demoapp-deploy-v10.yaml|kubectl apply -f -
  • 创建Service-demoapp-v10
echo "---
apiVersion: v1
kind : Service
metadata:name: demoapp-v10-svclabels:app: demoapp
spec:type: ClusterIPports:- name: http-80port: 80targetPort: 80selector:app: demoappversion: v1.0"|tee demoapp-v10-svc.yaml|kubectl apply -f -
  • 创建ingress规则
~# kubectl  get svc/demoapp-v10-svc
NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
demoapp-v10-svc   ClusterIP   10.233.20.86   <none>        80/TCP    25secho "---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: demoapp-v10-ingress
spec:rules:- host: demoapp-v10.linux.iohttp:paths:- path: /pathType: Prefixbackend:service:name: demoapp-v10-svcport:number: 80ingressClassName: nginx"|tee demoapp-v10-ingress.yaml|kubectl apply -f -
  • 验证
~  curl -H 'Host: demoapp-v10.linux.io' 192.168.122.21
iKubernetes demoapp v1.0 !! ClientIP: 10.233.108.3, ServerName: demoapp-deploy-v10-65c669c5f4-r2c4f, ServerIP: 10.233.84.4!

2.2 URL重写

  • 创建第二个Deployment
echo "---
apiVersion: apps/v1
kind: Deployment
metadata:name: demoapp-deploy-v11labels:app: demoapp
spec:replicas: 1selector:matchLabels:app: demoappversion: v1.1strategy: {}template:metadata:labels:app: demoappversion: v1.1spec:containers:- name: demoapp-v11image: ikubernetes/demoapp:v1.1"|tee demoapp-deploy-v11.yaml|kubectl apply -f -echo "---
apiVersion: v1
kind : Service
metadata:name: demoapp-v11-svclabels:app: demoapp
spec:type: ClusterIPports:- name: http-80port: 80targetPort: 80selector:app: demoappversion: v1.1"|tee demoapp-v11-svc.yaml|kubectl apply -f -
~# kubectl  get svc
NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
demoapp-v10-svc   ClusterIP   10.233.20.86   <none>        80/TCP         3m5s
demoapp-v11-svc   ClusterIP   10.233.55.35   <none>        80/TCP         8s
  • url重写规则
echo '---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: demoapp-ingressannotations:nginx.ingress.kubernetes.io/use-regex: "true"nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:rules:- host: demoapp.linux.iohttp:paths:- path: /v10(/|$)(.*)pathType: ImplementationSpecificbackend:service:name: demoapp-v10-svcport:number: 80- path: /v11(/|$)(.*)pathType: ImplementationSpecificbackend:service:name: demoapp-v11-svcport:number: 80ingressClassName: nginx
' |tee demoapp-ingress.yaml|kubectl apply -f -
  • 验证
~# curl -H 'Host: demoapp.linux.io' 192.168.122.22/v10
iKubernetes demoapp v1.0 !! ClientIP: 10.233.108.3, ServerName: demoapp-deploy-v10-65c669c5f4-r2c4f, ServerIP: 10.233.84.4!
~# curl -H 'Host: demoapp.linux.io' 192.168.122.22/v11
iKubernetes demoapp v1.1 !! ClientIP: 10.233.108.3, ServerName: demoapp-deploy-v11-579c9d54c-zhtsg, ServerIP: 10.233.108.4!

2.3 HTTPS

  • 创建证书
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=http-svc.linux.io/O=http-svc.linux.io"
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
  • 部署服务
echo "apiVersion: apps/v1
kind: Deployment
metadata:name: http-svc
spec:replicas: 1selector:matchLabels:app: http-svctemplate:metadata:labels:app: http-svcspec:containers:- name: http-svcimage: dengyouf/echoserver:2.3ports:- containerPort: 8080env:- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIP---apiVersion: v1
kind: Service
metadata:name: http-svclabels:app: http-svc
spec:ports:- port: 80targetPort: 8080protocol: TCPname: httpselector:app: http-svc
" |tee http-svc.yaml|kubectl apply -f -
  • 创建ingress规则
echo "
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: http-svc-tls-ingress
spec:tls:- hosts:- http-svc.linux.io# This assumes tls-secret exists and the SSL# certificate contains a CN for foo.bar.comsecretName: tls-secretingressClassName: nginxrules:- host: http-svc.linux.iohttp:paths:- path: /pathType: Prefixbackend:# This assumes http-svc exists and routes to healthy endpointsservice:name: http-svcport:number: 80
"|tee http-svc-tls-ingress.yaml|kubectl apply -f -
  • 验证
~]# curl -H 'Host:  http-svc.linux.io' -k  https://192.168.122.21

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

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

相关文章

Stable Diffusion AI绘图教程:从基础到高级,AI绘图一网打尽

在 AI 绘画领域,StableDiffusion 以其强大的功能和丰富的创意表现,成为众多创作者热衷探索的工具。今天,就为大家详细介绍一系列围绕 StableDiffusion 展开的学习资源,涵盖从基础到高阶、从功能解析到实际应用的全方位内容。 一、基础入门篇 kc开篇:“1 - 全面掌握 Stable…

龙哥量化:用deepseek编程要学习的公式编程的基础知识和常用的功能模块

龙哥微信:Long622889代写通达信技术指标、选股公式(通达信,同花顺,东方财富,大智慧,文华,博易,飞狐)代写期货量化策略(TB交易开拓者,文华8,金字塔)我自己在公式编程非常熟练了,但是遇到deepseek的时候,非常惊喜,能理解我的思路, 也能明白我提出的修改思路,真…

电商与ChatGPT结合:如何利用AI提升销售额,案例分析及应用策略

在当今数字化浪潮中,AI技术正以前所未有的速度渗透到各个行业,电商直播带货领域也不例外。 曾经一个5人团队,在团队规模恒定的情况下,巧妙借助ChatGPT与各类软件的融合之力,成功实现了年销售额从2000万跃升至2500万甚至3000万的飞跃,这无疑彰显了AI在电商领域的巨大潜力。…

逻辑推理

肯前比肯后 否后比否前 肯后否前无必然联系 前推后 如果 就 都 一定 后推前 只有 ...才 ... 除非。。。否则不 。。。 B -> A 除非。。。否则 。。。 -B -> A 谁必不可少 谁就在箭头后面 或关系 否一推一 如 A或B为真 -A->B/ -B-> A 快速做题 - 排除出现…

BTB04-ASEMI电动工具专用BTB04

BTB04-ASEMI电动工具专用BTB04编辑:ll BTB04-ASEMI电动工具专用BTB04 型号:BTB04 品牌:ASEMI 封装:TO-220F 正向电流:8A 反向电压:600V~800V 引脚数量:3 芯片个数:2 芯片尺寸: 漏电流:>10ua 恢复时间: 包装方式:管装 封装尺寸:如图 特性:双向可控硅 工作结温:…

10款最适合大数据项目管理工具(2025年)

在当今数据驱动的时代,大数据项目管理已成为企业成功的关键因素之一。随着数据量的爆炸式增长,传统的项目管理方法已无法满足需求,企业需要借助专业的软件工具来高效管理复杂的大数据项目。本文将为您介绍10款最适合大数据项目管理的软件工具,帮助您在2025年及未来更好地应…

第十六章 采购管理(2025年详细解析版)

目录导学什么是采购管理?定义内容16.1 管理基础什么是协议定义协议的形式什么是合同定义内容合同注意事项项目采购与项目管理项目买卖方内部卖方招投标的流程发展趋势和新兴实践(了解)采购新趋势16.2 项目采购管理过程项目采购管理过程ITTO裁剪时需要考虑的因素在敏捷或适应…

面试官:说说你项目中JWT的执行流程?

JWT 在目前的项目开发中使用到的频率是非常高的,因此它也是面试常问的一类问题,所以今天我们就来看看“项目中 JWT 的执行流程?”这个问题。 1.什么是 JWT? JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用间安全传输信息,通常用于身份验证和信息交换。…

【日记】文竹已经长得比路灯还要高了(1069 字)

正文最近陷入了一个深刻的情感漩涡。一边有些嫌恶爱情,一边又为它焦虑。一边觉得自己只有友谊已经足够了,一边又看见大多数友情并不能如爱情一般陪伴那样长的时间,不说二三十年,甚至不到十年可能便会消亡。觉得其实自己仍然需要它。然而目前这个不太喜欢、又需要一个东西的…

苹果使用AI让皮克斯的灯具复活了。

苹果让皮克斯著名的开场灯具复活,发布了一项新的研究,其中描述它的形容词并不是你通常会在AI研究中使用的那些。 这与我们习惯的一切都不同。它在技术上并不更聪明、更强大,也不是那些害怕AI的人噩梦般的存在。 相反,它似乎是科技巨头首次尝试以不同的方向提升AI和机器人智…

react-native-snap-carousel 轮播图卡在中间的问题

今天在使用react-native-snap-carousel组件的时候,发现一个问题,就是轮播有时候会卡在两个轮播图之间,不左不右的。研究了半天,才发现,开启动量滚动即可 关于enableMomentum的解释 enableMomentum 是 React Native 中 ScrollView 和 FlatList 组件的一个属性,用于控制滚动…