k8s的ingress-nginx可以通过只占用node的两个端口(分别是http和https)来发布多个服务,而nodePort类型的Service,有几个服务就需要占用node几个端口,不利于端口管理。所以今天我们就来安装ingress,并且发布两个服务。
环境
目标
在一个域名(模拟我们只有一个域名)下发布两个web服务。架构如下:

讯享网
为此,我们准备两个springboot服务,只有一个简单的接口

当访问/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下。

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

测试
在虚拟机上
讯享网curl www.zcx.com:30080/web1/contextpath curl www.zcx.com:30080/web2/contextpath

在postman上

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

注意
因为没有用镜像仓库,所以要保证每个node上都有我们的ws1和ws2镜像哦
后续
现在我们用Deployment+NodePort的方式完成了一个ingress-nginx管理整个集群的服务,那如果这一个ingress-nginx不可用了怎么办,下一篇,我们使用DaemonSet+HostNetwork+nodeSelector的方式搭建多个ingress-nginx实例的高可用集群。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67186.html