2025年k8s1.21 安装ingress-nginx

k8s1.21 安装ingress-nginxk8s 的 ingress nginx 可以通过只占用 node 的两个端口 分别是 http 和 https 来发布多个服务 而 nodePort 类型的 Service 有几个服务就需要占用 node 几个端口 不利于端口管理 所以今天我们就来安装 ingress 并且发布两个服务 环境 操作系统

大家好,我是讯享网,很高兴认识大家。

k8s的ingress-nginx可以通过只占用node的两个端口(分别是http和https)来发布多个服务,而nodePort类型的Service,有几个服务就需要占用node几个端口,不利于端口管理。所以今天我们就来安装ingress,并且发布两个服务。

环境

目标

在一个域名(模拟我们只有一个域名)下发布两个web服务。架构如下:
一个域名发布多个服务
讯享网

为此,我们准备两个springboot服务,只有一个简单的接口
web1 和 web2 服务
当访问/web1/contextpath时返回web1
当访问/web2/contextpath时返回web2

镜像准备

使用ingress-nginx:v0.48.1

#拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/kubernetes-fan/ingress-nginx:v0.48.1 #打标签,这里的标签是以后需要用到的 docker tag registry.cn-hangzhou.aliyuncs.com/kubernetes-fan/ingress-nginx:v0.48.1 k8s.gcr.io/ingress-nginx/controller:v0.48.1 #删除下载的阿里镜像 docker rmi registry.cn-hangzhou.aliyuncs.com/kubernetes-fan/ingress-nginx:v0.48.1 

讯享网

yaml文件下载和修改

yaml内容可直接粘贴这位老哥的基于K8S 1.21.2集群安装Ingress-Nginx 0.48.1
这个yaml已经做了修改。修改的内容就是ingress的镜像。把镜像的标签改成你自己的ingress镜像标签即可,因为在【镜像准备】那一步我们把ingress镜像标签改成了k8s.gcr.io/ingress-nginx/controller:v0.48.1,所以image就改成k8s.gcr.io/ingress-nginx/controller:v0.48.1。
修改处
将yaml文件命名deploy.yaml

安装

讯享网kubectl create -f deploy.yaml 

检查

安装之后,会新建一个ingress-nginx的namespace

kubectl get svc -n ingress-nginx 

在这里插入图片描述
可以看到新建了一个nodePort类型的svc,分别映射的http和https。集群外部的流量要从nodePort流入k8s集群。比如我们要访问web1就应该写
http://www.zcx.com:30080/web1/contextpath

构建web镜像

把我们的springboot打成镜像,
web1的镜像是ws1,svc是ws1-svc
web2的镜像是ws2。svc是ws2-svc
yaml文件如下,注意我们的端口是9090

讯享网apiVersion: apps/v1 kind: Deployment metadata: name: ws1-deploy namespace: default spec: replicas: 1 selector: matchLabels: app: ws1 template: metadata: labels: app: ws1 spec: containers: - name: ws1 image: ws1:latest imagePullPolicy: IfNotPresent ports: - name: http containerPort: 9090 --- apiVersion: v1 kind: Service metadata: name: ws1-svc namespace: default spec: type: ClusterIP # 默认类型 selector: app: ws1 ports: - name: http port: 9090 targetPort: 9090 --- apiVersion: apps/v1 kind: Deployment metadata: name: ws2-deploy namespace: default spec: replicas: 1 selector: matchLabels: app: ws2 template: metadata: labels: app: ws2 spec: containers: - name: ws2 image: ws2:latest imagePullPolicy: IfNotPresent ports: - name: http containerPort: 9090 --- apiVersion: v1 kind: Service metadata: name: ws2-svc namespace: default spec: type: ClusterIP # 默认类型 selector: app: ws2 ports: - name: http port: 9090 targetPort: 9090 

创建ingress

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-http annotations: # 注意这里不要重写,否则会请求不到资源。重写就是把web1重写成 / 当然找不到资源 # nginx.ingress.kubernetes.io/rewrite-target: / kubernetes.io/ingress.class: "nginx" namespace: default spec: rules: - host: "www.zcx.com" http: paths: - path: /web1 pathType: Prefix backend: service: name: ws1-svc port: number: 9090 - path: /web2 pathType: Prefix backend: service: name: ws2-svc port: number: 9090 

DNS解析

要保证发起请求的主机能解析www.zcx.com这个域名,
把www.zcx.com配置成k8s集群下任意一台主机都行
如果你在虚拟机上测试,就把www.zcx.com配置到虚拟机的/etc/hosts下。

DNS解析
如果你在windows上测试,就把www.zcx.com配置到C:\Windows\System32\drivers\etc\hosts下
DNS解析

测试

在虚拟机上

讯享网curl www.zcx.com:30080/web1/contextpath curl www.zcx.com:30080/web2/contextpath 

测试
在postman上
测试

后记

手动指定nodePort端口
安装ingress-nginx时绑定的nodePort是随机的,可以修改yaml文件手动指定
修改Service部分,而不是Deployment部分
指定nodePort

注意

因为没有用镜像仓库,所以要保证每个node上都有我们的ws1和ws2镜像哦

后续

现在我们用Deployment+NodePort的方式完成了一个ingress-nginx管理整个集群的服务,那如果这一个ingress-nginx不可用了怎么办,下一篇,我们使用DaemonSet+HostNetwork+nodeSelector的方式搭建多个ingress-nginx实例的高可用集群。

参考

小讯
上一篇 2025-04-03 17:10
下一篇 2025-04-06 16:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67186.html