k8s学习--ingress详细解释与应用(nginx ingress controller))

文章目录

  • lngress简介
    • 什么是 Ingress
    • Ingress 的用途
    • Ingress 的工作原理
    • Ingress 的工作流程
    • Ingress 的应用场景
    • 应用
      • 实验环境
      • 部署nginx ingress controller
        • 1.安装metalLB
        • 2.nginx ingress controller部署
        • 3.ingress 对象应用案例(基于名称的负载均衡)
          • (1) 创建deployment控制器类型应用
          • (2) 创建service
          • (3) 创建ingress对象
          • (4) 模拟客户端访问

            lngress简介

            什么是 Ingress

            Ingress 是 Kubernetes 中用于管理集群内服务暴露的 API 资源。它提供了 HTTP 和 HTTPS 路由功能,使外部流量能够访问集群内部的服务。通过定义 Ingress 资源,可以控制哪些外部请求能够访问集群中的哪些服务,以及如何路由这些请求。

            Ingress 的用途

            统一入口控制

            Ingress 提供了一个统一的入口点,用于管理多个服务的访问和流量控制。

            HTTP/HTTPS 路由

            通过 Ingress,可以配置基于主机名和路径的路由规则,将外部请求定向到集群内部的服务。

            SSL 终止

            Ingress 可以配置 SSL 证书,用于加密和解密外部流量,从而确保数据传输的安全性。

            负载均衡

            通过 Ingress 控制器,可以实现对多实例服务的负载均衡,将请求分发到多个后端实例。

            Ingress 的工作原理

            Ingress 的工作原理涉及以下两个关键组件:

            Ingress 资源

            用户定义的 Kubernetes 资源,描述了主机名、路径和后端服务之间的映射关系。

            Ingress 控制器

            实现 Ingress 规则的实际组件。常见的 Ingress 控制器包括 NGINX、Traefik 和 HAProxy 等。控制器监控 Ingress 资源的变化,并相应地配置其代理服务器,以实现路由和流量管理。

            Ingress 的工作流程

            定义 Ingress 资源

            用户创建 Ingress 资源,定义了主机名、路径和后端服务的映射。

            Ingress 控制器监控

            Ingress 控制器不断监控 Ingress 资源的变化。

            配置代理服务器:

            根据 Ingress 资源的定义,Ingress 控制器配置其代理服务器(如 NGINX)以匹配请求。

            处理请求

            当外部请求到达集群时,Ingress 控制器的代理服务器根据 Ingress 规则进行路由,将请求转发到相应的服务。

            Ingress 的应用场景

            多服务管理

            适用于需要管理多个服务的环境,通过 Ingress 实现统一的入口控制。

            基于域名的路由

            在同一个集群中运行多个应用,通过不同的域名或子域名进行访问。

            基于路径的路由

            根据请求路径将流量路由到不同的服务,例如 /api 路径指向一个微服务,/web 路径指向另一个微服务。

            SSL 终止

            需要使用 HTTPS 加密流量的场景,通过 Ingress 配置 SSL 证书进行终止。

            负载均衡

            在多实例服务间进行负载均衡,以提高服务的可用性和扩展性。

            应用

            实验环境

            虚拟机

            Ip主机名cpu内存硬盘
            192.168.10.11master012cpu双核4G100G
            192.168.10.12worker012cpu双核4G100G
            192.168.10.13worker022cpu双核4G100G
            192.168.10.16vm61cpu1核1G20G

            版本 centos7.9

            已部署k8s-1.27

            vm6 无需配置,测试使用

            部署nginx ingress controller

            1.安装metalLB

            具体步骤详情作者上篇博客

            链接: metalLB负载均衡器

            这里不再过多描述

            2.nginx ingress controller部署

            下载并修改配置文件 需要vpn

            curl -k https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml  -o deploy.yaml
            

            修改文件

            vim deploy.yaml
            

            修改此行 type: NodePort

            为 type: LoadBalancer

            修改前

            修改后

            创建

            kubectl apply -f deploy.yaml
            

            稍等几分钟后查看 需要vpn,没有的话查看信息时会显示连接不到镜像仓库

            kubectl -n ingress-nginx get pod
            

            可以看到已经成功运行了

            3.ingress 对象应用案例(基于名称的负载均衡)

            ingress-http案例:基于名称的负载均衡

            (1) 创建deployment控制器类型应用
            vim nginx.yaml
            
            apiVersion: apps/v1
            kind: Deployment
            metadata:
              name: nginx
              namespace: ingress-nginx
            spec:
              replicas: 2
              selector:
                matchLabels:
                  app: nginx
              template:
                metadata:
                  labels:
                    app: nginx
                spec:
                  containers:
                  - name: c1
                    image: nginx:1.20
                    imagePullPolicy: IfNotPresent
            

            应用YAML

            kubectl apply -f nginx.yaml
            

            验证pod

            kubectl get pods -n ingress-nginx
            
            (2) 创建service
            vim nginx-service.yaml
            
            apiVersion: v1
            kind: Service
            metadata:
              name: nginx-service
              namespace: ingress-nginx
              labels:
                app: nginx
            spec:
              ports:
              - port: 80
                targetPort: 80
              selector:
            app: nginx
            

            应用YAML

            vim nginx-service.yaml
            

            查看service

            kubectl get svc -n ingress-nginx
            

            默认service类型是ClusterIP

            (3) 创建ingress对象
            vim ingress-nginx.yaml
            
            apiVersion: networking.k8s.io/v1
            kind: Ingress
            metadata:
              name: ingress-nginx                    			#自定义ingress对象名称
              namespace: ingress-nginx
              annotations:									#注解,声明
                ingressclass.kubernetes.io/is-default-class: "true"		#ingress控制器由标记的class作为默认class
            spec:
              ingressClassName: nginx							#此处标记出ingressClass为nginx
              rules:
              - host: www.test.com                   			# 自定义域名
                http:
                  paths:
                  - pathType: Prefix
                    path: "/"
                    backend:
                      service:
                        name: nginx-service     				# 对应上面创建的service名称
                        port:
                          number: 80
            

            应用YAML

            kubectl apply -f ingress-nginx.yaml
            

            验证ingress对象

            kubectl get ingress -n ingress-nginx
            

            描述查看ingress信息

            kubectl describe ingress ingress-nginx -n ingress-nginx
            
            kubectl get pods -o wide -n ingress-nginx
            

            可以看到两个pod的IP正好对应ingress域名对应的IP

            确认nginx-ingress-controller的podIP为192.168.10.240

            (4) 模拟客户端访问

            确认nginx-ingress-controller的podIP, 下面命令查询的结果为192.168.10.240

            kubectl get svc -n ingress-nginx | grep ingress
            

            在集群之外任一主机中添加上述域名与IP地址解析(模拟公网DNS)

            这里是192.168.10.16

            vim /etc/hosts
            
            192.168.10.240 www.test.com
            

            准备pod内容器运行的web主页

            查看

            kubectl get pods  -n ingress-nginx
            

            进入容器添加html文件

            kubectl -n ingress-nginx exec -it nginx-c9f79b6f4-9xdms -- bash
            echo "ingress web1" > /usr/share/nginx/html/index.html
            exit
            

            第二个

            kubectl -n ingress-nginx exec -it nginx-c9f79b6f4-jqwsx -- bash
            echo "ingress web2" > /usr/share/nginx/html/index.html
            exit
            

            去集群外的主机上测试

            完成

            如果对您有帮助可以关注一下