作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_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层。

第1章 Ingress概述

1.1 什么是Ingress

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

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

  • LoadBlancer Service
  • NodePort Service
  • Ingress

要理解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 地址: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   <none>        80:31540/TCP,443:30737/TCP   3m34s
ingress-nginx-controller-admission   ClusterIP   10.1.122.66    <none>        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访问验证

  • 通过公网外的IE浏览器访问
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网关的安装就算完成了。

紧接着要做的事:

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

第3章 在集群内部署多个服务

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/v1
kind: Deployment
metadata:name: hello-server
spec:replicas: 2selector:matchLabels:app: hello-servertemplate:metadata:labels:app: hello-server-podspec:containers:- name: hello-serverimage: registry.cn.hangzhou.aliyuncs.com/lfy_k8s_images/hello-serverports:- containerPort:9000
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-demonamespace: default
spec:replicas: 2selector:matchLabels:app: nginx-demotemplate:metadata:labels:app: nginx-demospec:containers:- name: nginximage: 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: v1
kind: Service
metadata:labels:app: hello-servername: hello-server
spec:type: ClusterIPselector:app: hello-serverports:- port: 8000targetPort: 9000protocol: TCP
---
apiVersion: v1
kind: Service
metadata:labels:app: nginx-demoname: nginx-demo
spec:type: ClusterIPselector:app: hello-serverports:- port: 8000targetPort: 80protocol: 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/v1
kind: Ingress
metadata:name: ingress-host-atguigu
spec:ingressClassName: nginxrules:-- host: "hello.atguigu.com"http:paths:- pathType: Prefixpath: "/"       backend:service: name: hello-serverport:number: 8000-- host: "ngnix.atguigu.com"http:paths:- pathType: Prefixpath: "/ngnix"      #对应/usr/share/nginx/html/ngnixbackend:service: name: ngnix-demoport:number: 8000-- host: "ngnix.atguigu.com"http:paths:- pathType: Prefixpath: "/"      #对应/usr/share/nginx/html/index.htmlbackend:service: name: ngnix-demoport: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)远程访问

http://ip:port/
http://域名:port/http://ip:port/
https://域名:port/http://ip:port/nginx
https://域名:port/nginx

4.3 路径名重写/重定向:rewrite

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

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/rewrite-target: /$2   #截掉第一个"/"后的名称, 只使用2个"/"参数name: ingress-host-atguigu-rewrite
spec:ingressClassName: nginxrules:-- host: "hello.atguigu.com"http:paths:- pathType: Prefixpath: "/"       backend:service: name: hello-serverport:number: 8000-- host: "ngnix.atguigu.com"http:paths:- pathType: Prefixpath: "/ngnix(/|$)(.*)"     # 提取第二个"/"的名称backend:service: name: ngnix-demoport:number: 8000-- host: "ngnix.atguigu.com"http:paths:- pathType: Prefixpath: "/"      #对应/usr/share/nginx/html/index.htmlbackend:service: name: ngnix-demoport:number: 8000

4.4 限制流量:

$ vi ​ingress-rule-rate.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/limit-rps:"1"  # 1 pacakge/sname: ingress-host-atguigu-rewrite
spec:ingressClassName: nginxrules:-- host: "hahua.atguigu.com"http:paths:- pathType: Prefixpath: "/"backend:service: name: ngnix-demoport:number: 8000
$ kubectl apply -f ​ingress-rule-rate.yaml$ kubectl get ingresshttp://hahua.atguigu.com/    # 如果访问刷新速度太快,就会导致service unavailable

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

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122804728

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

  1. [云原生专题-16]:容器 - 在Windows主机上搭建Docker环境

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  2. [云原生专题-29]:K8S - 核心概念 - 名字空间/命名空间概念详解与主要操作案例

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  3. [云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  4. 从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念

    作者| 阿里巴巴资深技术专家.CNCF 9个 TCO 之一 李响 一.什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台.Kubernetes 这个 ...

  5. KubeVela 高可扩展的云原生应用平台与核心引擎

    https://www.oschina.net/news/121015/kubevela-open-source 目录 什么是 KubeVela ? KubeVela 解决了什么问题? 1. 应用开发 ...

  6. 【云原生】学习K8s,读完这篇就够了

    目录 前言 K8s集群架构及核心概念 架构图 K8s组件 api service controller manager scheduler etcd kubelet kube-proxy 其他重要插件 ...

  7. KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎

    [来源:阿里巴巴云原生公众号] 美国西部时间 2020 年 11 月 18 日,在云原生技术"最高盛宴"的 KubeCon 北美峰会 2020 上,CNCF 应用交付领域小组(CN ...

  8. 火山引擎张鑫解读云原生2021:K8s 开先河、技能全栈、业务“无感”

    作者 | 张鑫 责编 | 杨阳 出品 | CSDN(ID:CSDNnews) 2015年2月的纽约周边,在皑皑白雪覆盖下的Woodlock避暑山庄中,我参加了Google内部的首次"Clou ...

  9. 什么是云原生架构和K8S?

    作者:duktig 博客:https://duktig.cn (文章首发) 优秀还努力.愿你付出甘之如饴,所得归于欢喜. 本篇文章的思维导图参看语雀:https://www.yuque.com/doc ...

  10. 从2.0到3.0,安全可信正在成为云原生的下一核心

    <中智观察>第1542篇推送 记者:白 编辑:小瑞瑞 头图来源:图虫创意 "没有云原生,就没有真正的数字化和智能化."在华为云TechWave 全球技术峰会(应用现代化 ...

最新文章

  1. 华为云服务器 大文件,云服务器上传大文件
  2. 微信小程序自带地图_【小程序】微信小程序之地图功能
  3. 关于scws分词的一些记录
  4. 页面获取Spring Security登录用户
  5. Java单依赖性Dockerized HTTP端点
  6. linux下硬盘测速工具hdparm
  7. Go的闭包看你犯错,Rust却默默帮你排坑
  8. 【转】MapReduce读取lzo文件
  9. JAVA中InputStream转base64
  10. STM32利用DCMI对并口ADC高速数据采样
  11. 路由器桥接显示无法连接服务器,路由器无法桥接怎么办
  12. ASP.NET2005各类教程实例1[视频下载]
  13. python如何下载安装spacy_SpaCy下载及安装
  14. 程序员日常,你的痛只有我懂,因为小编也是程序员,扎心不老铁?
  15. 异步FIFO基本原理(基于Verilog的简单实现)
  16. BUG日志:无法解析的外部符号 _Direct3DCreate9
  17. mysql 1265错误_Mysql出现ERROR 1265: Data truncated for
  18. 计算机硬盘的种类,硬盘类型 - 硬盘使用知识大全(2)
  19. 12306 火车票 Python爬虫 车次信息及经停站信息
  20. NeurIPS'22 | APG:面向CTR预估的自适应参数生成网络

热门文章

  1. Linux系统下如何解压压缩包内某个文件
  2. 20220505模拟赛总结(ABC237)
  3. Qt我的文档 桌面路径
  4. 《浦岛太郎》——太宰治
  5. 仅需3 小时,如何用 AI 做场景贴图,完成场景制作 ?AI创作工作流探索
  6. 编写TaskMgr.exe的时候学习的知识点
  7. Redis Cluster集群原理+三主三从交叉复制实战+故障切换(十)
  8. 计算机打印机端口配置,如何设置打印机端口,小编教你设置电脑打印机端口
  9. 《把时间当做朋友》读书摘记
  10. httpwatch11.1---专业版