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

2023-11-12

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

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

(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 

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: 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

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: 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

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/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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • tar常用命令介绍

    最常见的压缩与解压命令是tar 参数讲解 c表示产生新的包 r表示增加文件的意思 u表示更新文件 t列出包中的文件 x解开包的意思 这五个是独立的命令 压缩解压都要用到其中一个 可以和别的命令连用但只能用其中一个 举例 tar cf all
  • Fedora 31配置和桌面美化笔记

    Fedora是一个非常流行的Linux发行版 与Ubuntu齐名 但是Fedora相对于Ubuntu更加激进 新软件和新内核会直接上到Fedora的软件源中 所以如果你那种比较喜欢更新软件的人 但是又感觉Arch Manjaro这类滚动发行
  • VMware中安装FusionCompute8.1.1 CNA和VRM镜像安装

    VMware中安装FcusionCompute8 1 一 VMware Workstation分别安装CNA VRM 注意事项 根据自身电脑的规格 一般8G 内存的电脑配置可以支持 若自己电脑是4G规格建议跳过该实验 若自己电脑是8G规格建
  • 调试最长的一帧(第三天)

    先看看整体 以及进度 第三天的内容 主要讲根据窗口参数建立图形上下文设备 建立一个全屏显示的图形设备 这个WindowingSystemInterface是纯虚基类 也就是下一步就要父类调用子类了 获取或新建显示设置 各成员变量 成员变量的
  • 机器学习基础(二)

    线性回归 误差是独立并且具有相同的分布通常认为服从均值为0方差为的高斯分布 损失函数 loss Function 代价函数 Cost Function 其实两种叫法都可以 损失函数 loss function 或代价函数 cost func
  • rust放置木箱转向_腐蚀Rust新手入门教学图文攻略 从入门到精通技巧详解_游侠网...

    腐蚀Rust怎么玩 正式版将于2月8日正式发售 体验版已经发售多年了 想必不少喜欢的玩家都有体验过 今天给大家带来了 chnodon 分享的腐蚀Rust新手入门教学图文攻略 一起来看下吧 新手入门教学图文攻略 如下图为游戏开始界面 左侧选择
  • openstack 安装并验证 Nova( 计算节点 + 控制节点)

    安装数据库 登录数据库创建 nova nova api nova cell0 数据库 root controller etcd mysql uroot pmaster Welcome to the MariaDB monitor Comma
  • 1 栈-OOP

    栈实现的是后进先出 先进后出 策略 队列实现的是先进先出策略 1 栈 栈上的操作主要包括 INSERT操作称为压入 PUSH 注意上溢问题 即往满栈里添加元素 无参数版本的DELETE操作称为弹出 POP 注意下溢问题 即从空栈上取元素 S
  • nested exception is java.sql.SQLException: The server time zone value is unrecognized

    最近在搭建springboot的项目时出现了异常问题 mybatis配置启动后报出了如下错误 nested exception is java sql SQLException The server time zone value is u
  • 服务器系统多大内存条,服务器系统多大内存

    服务器系统多大内存 内容精选 换一换 创建IP地址组 添加需要统一管理的IP地址 IP地址组功能目前仅在 华北 北京一 华北 北京四 华南 广州 西南 贵阳一 开放 IP地址组无法针对某些类型的云服务器生效 即引用了IP地址组的安全组规则
  • 强化学习-任务与奖赏(周志华)

    文章目录 什么是强化学习 马尔科夫决策过程 四元组 机器 与 环境 界限 策略两种表示方法及奖赏 2K 摇臂赌博机 探索与利用 贪心法 softmax 什么是强化学习 强化学习 一种学习过程 包含很多学习步骤 经过一段时间才能收获结果 通常
  • 404 not found nginx(dist打包后,刷新和跳转都是404 not found nginx的问题) 解决方案(打包发布在服务器)

    当我们执行了yarn run build之后 生成dist文件 我们将代码放入nginx 1 24 0下面的html中 然后我们就配置conf文件下的nginx conf 配置方面不介绍了 主要问题是因为没有加这句话 问题分析 index
  • MySQL连接查询之内连接、左连接、右连接、自连接

    目录 一 内连接 1 连接查询的介绍 2 内连接查询 二 左连接 1 左连接查询 三 右连接 1 右连接查询 四 自连接 1 自连接查询 一 内连接 1 连接查询的介绍 连接查询可以实现多个表的查询 当查询的字段数据来自不同的表就可以使用连
  • java 电商锁库存实现_电商项目扣减库存方案

    阿里巴巴b2b电商算法实战电子商务 85 3元 包邮 需用券 去购买 gt 各位小宝贝们 大家是不是在面试过程中经常被问到 你电商项目扣减库存时 到底是下单减库存呢 还是付款减库存 那今天给大家出几种解决方案 有不对的地方欢迎批评指正 一
  • 人机交互与智能的思考

    1 智能与交互的起源 霍金曾说过 在过去的20年里 人工智能一直专注于围绕建设智能体所产生的问题 即在特定的情境下 可以感知并行动的各种系统 在这种情况下 智能是一个与统计学 和经济学相关的理性概念 通俗地讲 这是一种做出好的决定计划和推论
  • 【Logstash】【ElasticSearch】【Kibana】安装测试【日志存储】

    Linux日志 var存放日志 log auth 认证 boot 登录 dpkg 深度 Debian软件安装 fontconfig 字体 Logstash功能 Logstash是一个开源的数据收集引擎 具有实时管道功能 接收 处理 转发日志
  • 华为培训04 路由协议

    学习目标 路由分类 路由配置 VLAN路由 1 路由基础 2 VLAN间路由 2 1 三层交换 解决VLAN间通信的一种解决办法就是三层交换 在三层交换机上配置vlanif接口 实现VLAN间路由 如果网络上有多个VLAN 则需要给每一个V
  • 基于springboot开发项目架构之CMS

    1 CMS是什么 CMS Content Management System 即内容管理系统 不同的项目对CMS的定位不同 比如 一个在线教育网站 有些公司认为CMS系统是对所有的课程资源进行管理 而在早期网站刚开始盛行时很多公司的业务是网
  • Spring Cloud Alibaba + mybatis + Element UI 前后端分离 分布式微服务高并发数据平台化(中台)思想+多租户saas企业开发架构技术选型和设计方案

    基于Spring Cloud Alibaba 分布式微服务高并发数据平台化 中台 思想 多租户saas设计的企业开发架构 支持源码二次开发 支持其他业务系统集成 集中式应用权限管理 支持拓展其他任意子项目 一 架构技术选型 核心框架 Spr
  • [云原生专题-41]:K8S - 核心概念 - Service业务的统一网关接口Ingress详解、安装、常见操作命令

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122804728 目录 前言 第1章