k8s1.21 安装ingress-nginx

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

环境

操作系统:CentOS7
软件:kubectl、kubeadm、kubelet均是1.21版本,安装步骤见CentOS7搭建k8s集群

目标

在一个域名(模拟我们只有一个域名)下发布两个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实例的高可用集群。

参考

基于K8S 1.21.2集群安装Ingress-Nginx 0.48.1
k8s ingress原理及ingress-nginx部署测试

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值