[云原生专题-41]:K8S - 核心概念 - Service业务的统一网关接口Ingress详解、安装、常见操作命令
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_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详解、安装、常见操作命令相关推荐
- [云原生专题-16]:容器 - 在Windows主机上搭建Docker环境
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- [云原生专题-29]:K8S - 核心概念 - 名字空间/命名空间概念详解与主要操作案例
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- [云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- 从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念
作者| 阿里巴巴资深技术专家.CNCF 9个 TCO 之一 李响 一.什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台.Kubernetes 这个 ...
- KubeVela 高可扩展的云原生应用平台与核心引擎
https://www.oschina.net/news/121015/kubevela-open-source 目录 什么是 KubeVela ? KubeVela 解决了什么问题? 1. 应用开发 ...
- 【云原生】学习K8s,读完这篇就够了
目录 前言 K8s集群架构及核心概念 架构图 K8s组件 api service controller manager scheduler etcd kubelet kube-proxy 其他重要插件 ...
- KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎
[来源:阿里巴巴云原生公众号] 美国西部时间 2020 年 11 月 18 日,在云原生技术"最高盛宴"的 KubeCon 北美峰会 2020 上,CNCF 应用交付领域小组(CN ...
- 火山引擎张鑫解读云原生2021:K8s 开先河、技能全栈、业务“无感”
作者 | 张鑫 责编 | 杨阳 出品 | CSDN(ID:CSDNnews) 2015年2月的纽约周边,在皑皑白雪覆盖下的Woodlock避暑山庄中,我参加了Google内部的首次"Clou ...
- 什么是云原生架构和K8S?
作者:duktig 博客:https://duktig.cn (文章首发) 优秀还努力.愿你付出甘之如饴,所得归于欢喜. 本篇文章的思维导图参看语雀:https://www.yuque.com/doc ...
- 从2.0到3.0,安全可信正在成为云原生的下一核心
<中智观察>第1542篇推送 记者:白 编辑:小瑞瑞 头图来源:图虫创意 "没有云原生,就没有真正的数字化和智能化."在华为云TechWave 全球技术峰会(应用现代化 ...
最新文章
- 华为云服务器 大文件,云服务器上传大文件
- 微信小程序自带地图_【小程序】微信小程序之地图功能
- 关于scws分词的一些记录
- 页面获取Spring Security登录用户
- Java单依赖性Dockerized HTTP端点
- linux下硬盘测速工具hdparm
- Go的闭包看你犯错,Rust却默默帮你排坑
- 【转】MapReduce读取lzo文件
- JAVA中InputStream转base64
- STM32利用DCMI对并口ADC高速数据采样
- 路由器桥接显示无法连接服务器,路由器无法桥接怎么办
- ASP.NET2005各类教程实例1[视频下载]
- python如何下载安装spacy_SpaCy下载及安装
- 程序员日常,你的痛只有我懂,因为小编也是程序员,扎心不老铁?
- 异步FIFO基本原理(基于Verilog的简单实现)
- BUG日志:无法解析的外部符号 _Direct3DCreate9
- mysql 1265错误_Mysql出现ERROR 1265: Data truncated for
- 计算机硬盘的种类,硬盘类型 - 硬盘使用知识大全(2)
- 12306 火车票 Python爬虫 车次信息及经停站信息
- NeurIPS'22 | APG:面向CTR预估的自适应参数生成网络