@TOC
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
去集群外的主机上测试
注; 经过测试.1.24版本的k8s集群部署会出现错误
解决方法
链接: REK安装K8S后,Ingress-nginx一直状态为ContainerCreating
完成
如果对您有帮助可以关注一下