作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122804728
目录
前言:
第1章 Ingress概述
1.1 什么是Ingress
1.2 Ingress的网络架构
1.3 Ingress与nginx的关系
第2章 Ingress nginx的安装
第3章 在集群内部署多个服务
3.1 集群内服务规划
3.2 通过deployment部署两个服务
3.3 通过Service创建两个服务抽象
3.4 在集群内部访问两个部署的服务: 集群内私网IP地址 + 端口号
第4章 ingress-nginx统一网关基于域名访问的规则配置
4.1 ingress的规则配置文件:ingress-rule.yaml
4.2 集群外域名(路径名)访问
4.3 路径名重写/重定向:rewrite
4.4 限制流量:
Service为具备相同功能、相同服务的Pods提供了统一的接口(IP:port),然而对于一个业务,会有大量的Service,如何为业务系统提供一个统一的业务接口?于是引入了Ingress层。
Ingress是应用层网关,所谓网关Gateway,就是整个集群的统一出口和入口,所有应用层网关,是指ingress可以针对HTTP协议数据路进行规则转发,而不仅仅根据IP地址进行路由。
Kubernetes总共有三种暴露服务的方式:
要理解ingress,需要区分两个概念,ingress和ingress-controller:
ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到ingress-controller,而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名哪些path要转发到哪些服务等等。
在该网络架构分为多层:
第底层就是服务层,它被安装在pod内部。
第2层就是Pod层,提供各种微服务。
第3层是service层,是相同功能微服务的抽象,它是多个service实例的代表,所有发给pod的微服务请求都需要发给service层,由service负责路由与负载均衡。包括来自集群内部其他pod的服务请求和来自集群外部服务请求,都需要发送给service层。
与service处于同一个层次的就是deployment,它与service的功能分工是,service服务负责业务,deployment负责监控和管理pods的工作状态,不负责具体的业务。
第4层就是ingress层,由称为网关层,负责在HTTP应用层对进出集群的应用层数据进行统一收口,ingress最核心的功能就是应用层网关,它能够根据HTTP协议的域名请求,进行分流、路由以及负载均衡。
整个集群,实际上就是一个微缩的软件定义的局域网(软件定义网络SDN), 每个pod就是局域网中能够提供特定服务的“服务器”,只不过,这个整个网络被架构在云服务器上。上述架构,与企业的局域网很相似。与企业的办公网不同的是,办公网主要是client,访问互联网资源,是服务的消费者,而服务集群的作用是为互联网用户提供服务,是服务的提供者。
作为整个服务集群的应用层网关的Ingress,它在互联网的角色主要不是作为Client的方式访问互联网,而是作为server的方式为互联网的客户端提供服务,它代表的是集群内部的各种service,因此,Ingress必须支持反向代理的能力,充当了反向代理服务器的角色。
K8S的ingress层使用了nginx作为其反向代理服务器。用于屏蔽内部的各种service和内部的服务器节点,同时可以利用nginx实现负载均衡。即使用nginx充当ingress-controller的角色。
(0)官方地址
ngress-Nginx-github 地址:https://github.com/kubernetes/ingress-nginx
Ingress-Nginx 官方地址:Welcome - NGINX Ingress Controller
(1)下载ingress安装配置文件
# 下载最新的配置文件
# https://github.com/kubernetes/ingress-nginx/blob/nginx-0.20.0/deploy/
# https://github.com/kubernetes/ingress-nginx/blob/main/deploy/static/provider/baremetal/deploy.yaml
$ wget https://github.com/kubernetes/ingress-nginx/tree/nginx-0.20.0/deploy/mandatory.yaml
$ wget https://github.com/kubernetes/ingress-nginx/blob/main/deploy/static/provider/baremetal/deploy.yaml
# 或者
$ vi deploy deploy.yaml
# copy from IE
(2)vi deploy.yaml
# 现有
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0
# 更换成阿里云镜像
# image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nginx-ingress-controller:0.20.0
image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:0.20.0
(3)应用、安装ingress
$ kubectl apply -f deploy.yaml
(4)检查ingress nginx的安装结果
[root@k8s-master1 ~]# kubectl get pods -A |grep ingress
NAME READY STATUS RESTARTS AGE
[root@k8s-master1 ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS
ingress-nginx ingress-nginx-admission-create-fb7sq 0/1 ImagePullBackOff 0 6m38s
ingress-nginx ingress-nginx-admission-patch-gqdwz 0/1 ImagePullBackOff 0 6m38s
ingress-nginx ingress-nginx-controller-f9d6fc8d8-79xwq 0/1
root@k8s-master1 ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.1.221.182 80:31540/TCP,443:30737/TCP 3m34s
ingress-nginx-controller-admission ClusterIP 10.1.122.66 443/TCP 3m34s
ingress nginx会自动创建一个ingress-nginx名字空间,ingress pod和sevice就安装在这个新的名字空间中。不同的名字空间,可以通过网络进行通信。
ingress本质上是在K8S的基础之上,安装了新的service和pod,该service有自己独立的集群内的IP地址: 10.1.221.182
该service与前面提到的service不同的是,原先的service是为某个特定的服务而创建的抽象对象,而这里的service是为其他service服务而创建的抽象对象,是针对整个集群的,与它通信的不是pod,而是其他service,这就是service网格的本质。
因此,该service也有自己的集群内部的私有IP地址,用于与其他service的通信。
同时该service通过NodePort的方式把自己暴露给集群外部访问,也就意味着,该service会集群内部所有的节点上暴露自己的端口号,并通过集群内部节点的公网IP地址访问 。
详解NodePort暴露service的原理和方法。
ingress创建了一个新的ingress-nginx service,并通过NodePort的方式在每个Node节点都暴露了该服务的公网端口号,公网就可以通过任意Node的公网IP和暴露的公网端口号,就可以访问集群的网关ingress-nginx service,ingress-nginx service会把请求转发到集群内部相应的特定服务的service上。
ingress-nginx会暴露两个端口号,一个用于http访问,一个用于https访问。
(5)设置安全组,放行暴露的端口
在公网访问集群之前,还需要在阿里云平台设置虚拟机的安全组,放行新暴露的公网端口号。
以便云平台虚拟主机授权对该新暴露端口的访问。
(6)ingress-nginx service访问验证
http://10.1.221.182:80
https: //10.1.221.182:443
$ curl 10.1.221.182:31540
$ curl 10.1.221.182:30737
至此,ingress-nginx网关的安装就算完成了。
紧接着要做的事:
(1)服务1:hello server,2个实例,docker image为hello-server
(2)服务2:ngnix-demo,2个实例,docker image为ngnix
(1)编辑my-deploy-ingress yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-server
spec:
replicas: 2
selector:
matchLabels:
app: hello-server
template:
metadata:
labels:
app: hello-server-pod
spec:
containers:
- name: hello-server
image: registry.cn.hangzhou.aliyuncs.com/lfy_k8s_images/hello-server
ports:
- containerPort:9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx
image: nginx
nginx-demo默认的pod端口号为80
hello-server设定的pod端口号为9000
(2)应用deployment yaml文件
$ kubectl create -f my-deploy-ingress.yaml
$ kubectl apply -f my-deploy-ingress.yaml
(1)编辑service yaml文件
apiVersion: v1
kind: Service
metadata:
labels:
app: hello-server
name: hello-server
spec:
type: ClusterIP
selector:
app: hello-server
ports:
- port: 8000
targetPort: 9000
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-demo
name: nginx-demo
spec:
type: ClusterIP
selector:
app: hello-server
ports:
- port: 8000
targetPort: 80
protocol: TCP
(2)应用service yaml文件
$ kubectl apply -f
$ curl private-ip:port
ingress-nginx是根据规则进行对服务请求进行分流与负载均衡的。
$ vi ingress-rule.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-host-atguigu
spec:
ingressClassName: nginx
rules:
-- host: "hello.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-server
port:
number: 8000
-- host: "ngnix.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/ngnix" #对应/usr/share/nginx/html/ngnix
backend:
service:
name: ngnix-demo
port:
number: 8000
-- host: "ngnix.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/" #对应/usr/share/nginx/html/index.html
backend:
service:
name: ngnix-demo
port:
number: 8000
$ kubectl apply -f ingress-rule.yaml
$ kubectl get ingress
$ kubectl get ingress xxxx
(1)修改主机名映射
(2)进入nginx内部
$/usr/share/nginx/html/
$ echo "1111" > nginx
(2)远程访问
http://ip:port/
http://域名:port/
http://ip:port/
https://域名:port/
http://ip:port/nginx
https://域名:port/nginx
所谓路径重写是指,对来自公网的路径名访问的请求,先进行路径修改,然后根据修改后的路径,映射到相应的后台服务。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2 #截掉第一个"/"后的名称, 只使用2个"/"参数
name: ingress-host-atguigu-rewrite
spec:
ingressClassName: nginx
rules:
-- host: "hello.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-server
port:
number: 8000
-- host: "ngnix.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/ngnix(/|$)(.*)" # 提取第二个"/"的名称
backend:
service:
name: ngnix-demo
port:
number: 8000
-- host: "ngnix.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/" #对应/usr/share/nginx/html/index.html
backend:
service:
name: ngnix-demo
port:
number: 8000
$ vi ingress-rule-rate.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/limit-rps:"1" # 1 pacakge/s
name: ingress-host-atguigu-rewrite
spec:
ingressClassName: nginx
rules:
-- host: "hahua.atguigu.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: ngnix-demo
port:
number: 8000
$ kubectl apply -f ingress-rule-rate.yaml
$ kubectl get ingress
http://hahua.atguigu.com/ # 如果访问刷新速度太快,就会导致service unavailable
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122804728