[云原生专题-41]:K8S - 核心概念 - Service业务的统一网关接口Ingress详解、安装、常见操作命令

网友投稿 294 2022-11-03

[云原生专题-41]:K8S - 核心概念 - Service业务的统一网关接口Ingress详解、安装、常见操作命令

作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊​

​目录​

​​前言:​​

​​第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层。

第1章 Ingress概述

1.1 什么是Ingress

Ingress是​应用层网关​,所谓网关Gateway,就是整个集群的统一出口和入口,所有应用层网关,是指ingress可以针对HTTP协议数据路进行规则转发,而不仅仅根据IP地址进行路由。

Kubernetes总共有三种暴露服务的方式:

LoadBlancer ServiceNodePort ServiceIngress

要理解ingress,需要区分两个概念,ingress和ingress-controller:

ingress对象: 指的是k8s中的一个api对象,一般用yaml配置。作用是定义请求如何转发到service的规则,可以理解为配置模板。ingress规则配置文件是定义规则的实体。ingress-controller: 具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。ingress-controller执行规则的实体。

ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到ingress-controller,而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名哪些path要转发到哪些服务等等。

1.2 Ingress的网络架构

在该网络架构分为多层:

​第底层就是服务层,​它被安装在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,访问互联网资源,是服务的消费者,而服务集群的作用是为互联网用户提供服务,是服务的提供者。​

1.3 Ingress与nginx的关系

作为整个服务集群的应用层网关的Ingress,它在互联网的角色主要不是作为Client的方式访问互联网,而是作为server的方式为互联网的客户端提供服务,它代表的是集群内部的各种service,因此,Ingress必须支持反向代理的能力,充当了反向代理服务器的角色。

K8S的ingress层使用了nginx作为其反向代理服务器。用于屏蔽内部的各种service和内部的服务器节点,同时可以利用nginx实现负载均衡。即使用nginx充当ingress-controller的角色。

​第2章 Ingress ​nginx​的安装​

​(0)官方地址​

ngress-Nginx-github 地址:​​官方地址:​​Welcome - NGINX Ingress Controller​​

​(1)下载ingress安装配置文件​

# 下载最新的配置文件# wget wget 或者$ 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.0image: 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 ingressNAME READY STATUS RESTARTS AGE[root@k8s-master1 ~]# kubectl get pods -ANAMESPACE NAME READY STATUS ingress-nginx ingress-nginx-admission-create-fb7sq 0/1 ImagePullBackOff 0 6m38singress-nginx ingress-nginx-admission-patch-gqdwz 0/1 ImagePullBackOff 0 6m38singress-nginx ingress-nginx-controller-f9d6fc8d8-79xwq 0/1

root@k8s-master1 ~]# kubectl get svc -n ingress-nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEingress-nginx-controller NodePort 10.1.221.182 80:31540/TCP,443:30737/TCP 3m34singress-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会暴露两个端口号,一个用于service访问验证​

通过公网外的IE浏览器访问

//10.1.221.182:443

通过集群内命令行访问:

$ curl 10.1.221.182:31540$ curl 10.1.221.182:30737

至此,ingress-nginx网关的安装就算完成了。

紧接着要做的事:

在集群内部部署多个不同的服务配置ingress-nginx网关的域名访问规则,以便根据域名转发在集群内部署多个服务

3.1 集群内服务规划

(1)服务1:hello server,2个实例,docker image为hello-server

(2)服务2:ngnix-demo,2个实例,docker image为ngnix

3.2 通过deployment部署两个服务

​(1)编辑my-deploy-ingress yaml文件​

apiVersion: apps/v1kind: Deploymentmetadata: name: hello-serverspec: 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/v1kind: Deploymentmetadata: name: nginx-demo namespace: defaultspec: 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

3.3 通过Service创建两个服务抽象

​(1)编辑service yaml文件​

apiVersion: v1kind: Servicemetadata: labels: app: hello-server name: hello-serverspec: type: ClusterIP selector: app: hello-server ports: - port: 8000 targetPort: 9000 protocol: TCP---apiVersion: v1kind: Servicemetadata: labels: app: nginx-demo name: nginx-demospec: type: ClusterIP selector: app: hello-server ports: - port: 8000 targetPort: 80 protocol: TCP

​(2)应用service yaml文件​

$ kubectl apply -f

3.4 在集群内部访问两个部署的服务: ​集群内私网IP地址 + 端口号​

$ curl private-ip:port

第4章 ingress-nginx​统一网关基于域名访问的规则配置​

ingress-nginx是根据规则进行对服务请求进行分流与负载均衡的。

​4.1 ingress的规则配置文件:ingress-rule.yaml​

$ vi ingress-rule.yaml

apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: ingress-host-atguiguspec: ingressClassName: nginx rules: -- host: "hello.atguigu.com" paths: - pathType: Prefix path: "/" backend: service: name: hello-server port: number: 8000 -- host: "ngnix.atguigu.com" paths: - pathType: Prefix path: "/ngnix" #对应/usr/share/nginx/html/ngnix backend: service: name: ngnix-demo port: number: 8000 -- host: "ngnix.atguigu.com" 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

4.2 集群外域名(路径名)访问

(1)修改主机名映射

​(2)进入nginx内部​

$/usr/share/nginx/html/$ echo "1111" > nginx

​ (2)远程访问​

路径名重写/重定向:rewrite

所谓路径重写是指,对来自公网的路径名访问的请求,先进行路径修改,然后根据修改后的路径,映射到相应的后台服务。

apiVersion: networking.k8s.io/v1kind: Ingressmetadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 #截掉第一个"/"后的名称, 只使用2个"/"参数 name: ingress-host-atguigu-rewritespec: ingressClassName: nginx rules: -- host: "hello.atguigu.com" paths: - pathType: Prefix path: "/" backend: service: name: hello-server port: number: 8000 -- host: "ngnix.atguigu.com" paths: - pathType: Prefix path: "/ngnix(/|$)(.*)" # 提取第二个"/"的名称 backend: service: name: ngnix-demo port: number: 8000 -- host: "ngnix.atguigu.com" paths: - pathType: Prefix path: "/" #对应/usr/share/nginx/html/index.html backend: service: name: ngnix-demo port: number: 8000

4.4 限制流量:

$ vi ingress-rule-rate.yaml

apiVersion: networking.k8s.io/v1kind: Ingressmetadata: annotations: nginx.ingress.kubernetes.io/limit-rps:"1" # 1 pacakge/s name: ingress-host-atguigu-rewritespec: ingressClassName: nginx rules: -- host: "hahua.atguigu.com" paths: - pathType: Prefix path: "/" backend: service: name: ngnix-demo port: number: 8000

$ kubectl apply -f ingress-rule-rate.yaml$ kubectl get ingress # 如果访问刷新速度太快,就会导致service unavailable

作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:与现代传感器接口:轮询 ADC 驱动器
下一篇:[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC
相关文章

 发表评论

暂时没有评论,来抢沙发吧~