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

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[云原生专题-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: 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

以上是关于[云原生专题-41]:K8S - 核心概念 - Service业务的统一网关接口Ingress详解安装常见操作命令的主要内容,如果未能解决你的问题,请参考以下文章

[云原生专题-43]:K8S - 核心概念 - placeholder - 加密数据

[云原生专题-42]:K8S - 核心概念 - placeholder-有状态服务

[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC

[云原生专题-40]:K8S - 核心概念 - 网络模型网络通信集群内负载均衡机制(重要重要重要)

[云原生专题-33]:K8S - 核心概念 - 服务Service管理服务发现负载均衡

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