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

文章目录

  • lngress简介
    • [什么是 Ingress](#什么是 Ingress)
    • [Ingress 的用途](#Ingress 的用途)
    • [Ingress 的工作原理](#Ingress 的工作原理)
    • [Ingress 的工作流程](#Ingress 的工作流程)
    • [Ingress 的应用场景](#Ingress 的应用场景)
  • 应用
    • 实验环境
    • [部署nginx ingress controller](#部署nginx ingress controller)
      • 1.安装metalLB
      • [2.nginx ingress controller部署](#2.nginx ingress controller部署)
      • [3.ingress 对象应用案例(基于名称的负载均衡)](#3.ingress 对象应用案例(基于名称的负载均衡))
        • [(1) 创建deployment控制器类型应用](#(1) 创建deployment控制器类型应用)
        • [(2) 创建service](#(2) 创建service)
        • [(3) 创建ingress对象](#(3) 创建ingress对象)
        • [(4) 模拟客户端访问](#(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.11 master01 2cpu双核 4G 100G
192.168.10.12 worker01 2cpu双核 4G 100G
192.168.10.13 worker02 2cpu双核 4G 100G
192.168.10.16 vm6 1cpu1核 1G 20G

版本 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

去集群外的主机上测试

完成

相关推荐
Icoolkj36 分钟前
微服务学习-SkyWalking 实时追踪服务链路
学习·微服务·skywalking
李匠20241 小时前
云计算架构学习之LNMP架构部署、架构拆分、负载均衡-会话保持
学习·架构·云计算
dal118网工任子仪1 小时前
73,【5】BUUCTF WEB [网鼎杯 2020 玄武组]SSRFMe(未解出)
笔记·学习
如果'\'真能转义说2 小时前
TypeScript - 利用GPT辅助学习
gpt·学习·typescript
周杰伦_Jay2 小时前
详细介绍:Kubernetes(K8s)的技术架构(核心概念、调度和资源管理、安全性、持续集成与持续部署、网络和服务发现)
网络·ci/cd·架构·kubernetes·服务发现·ai编程
�时过境迁,物是人非3 小时前
ECS中实现Nginx四层和七层负载均衡以及ALB/NLB实现负载均衡
运维·nginx·负载均衡
东软吴彦祖3 小时前
包安装利用 LNMP 实现 phpMyAdmin 的负载均衡并利用Redis实现会话保持nginx
linux·redis·mysql·nginx·缓存·负载均衡
五味香4 小时前
Java学习,查找List最大最小值
android·java·开发语言·python·学习·golang·kotlin
小爬菜4 小时前
Django学习笔记(启动项目)-03
前端·笔记·python·学习·django
小爬菜4 小时前
Django学习笔记(bootstrap的运用)-04
笔记·学习·django