kubernetes负载均衡资源-Ingress

一、Ingress概念

1.1 Ingress概念

使用NodePort类型的Service可以将集群内部服务暴露给集群外部客广端,但使用这种类型Service存在如下几个问题。

  • 1、一个端口只能一个服务使用,所有通过NodePort暴露的端口都需要提前规划;
  • 2、如果通过NodePort暴露端口过多,后期维护成本太大,且不易于管理;
  • 3、目前Service底层使用的是Iptables、IPVS,仅支持4层协议,无法完成https协议传输;

Kubernetes为了解决这种需求,提供了一种高级的流量管理,也就是Ingress和Ingress控制器,Kubernetes使用Ingress控制器来接收所有入口的流量,然后通过Ingress资源来定义流量如何区分,以及流量如何转发的规则。

Kubernetes为了解决这种需求,提供了一种高级的流量管理,也就是Ingress和Ingress控制器,Kubernetes使用Ingress控制器来接收所有入口的流量,然后通过Ingress资源来定义流量如何区分,以及流量如何转发的规则。

有了Ingress和Ingress控制器,我们就可以直接定义流量转发规则来发布服务,而无需创建一堆的NodePort和LoadBalance类型的Service。

1.2、 什么是Ingress

Ingress其实就是Kubernetes中的一种资源,它主要是用来定义流量转发规则。但Ingress资源自身并不能实现流量的转发和调度,它仅仅是一组流量路由的规则集合,这些规则要真正发挥作用还需要使用到Ingress控制器,由Ingress控制器读取对应的Ingress规则,然后完成流量的路由或转发。

Ingress的底层知识是通过Nginx进行封装。配置规则也是跟Nginx类似

1.3、Ingress Controller

Ingress Controller就是一类以代理HTTP/HTTPS协议为主的代理程序。如:Nginx、Traefik、Envoy、Haproxy。Ingress Controller通过Pod的形式运行在Kubernetes集群上,它能够与集群上的Pod直接通信。这样就可以让用户的流量经过Ingress控制器时直接调度到对应的Pod上。

Ingress Controller类似Nginx服务,它负责读取Ingress的规则,然后转换将规则转换为nginx.conf配置文件,这样就可以根据对应的规则来实现流量的调度。同时它还会实时感知后端Service对应的Pod变化,当Pod发生变动后,Ingress控制器会再次结合Ingress的规则,进而完成对应的配置动态更新。

在这里插入图片描述
注意:使用Ingress资源进行流量分发时,Ingress控制器可基于ingress定义的规则将客户端的请求流量直接转发至Service对应的后端Pod资源上。比如:用户请求api.oldxu.net,Ingress控制器根据对应的规则直接将请求流量调度至Pod3或Pod4,而无需经过Service对象转发。

二、Ingress的安装与配置

  • 安装Ingress-nginx控制器;
  • 使用daemonSet方式部署,但需要通过nodeSelect来选择几个节点安装,并非所有节点都需要;
  • 将Pod的端口与节点共享网络名称空间;设定为HostNetwork;

在这里插入图片描述
在这里插入图片描述

1、ingress配置文件下载

  • ingress 配置文件下载
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/baremetal/deploy.yaml
  • ingress 配置修改
## 第一次修改:查看注释
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-controller
  """""
  """""
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  #type: NodePort
  type: ClusterIP    ### 这个修改成 ClusterIP 

---
第二次修改:查看注释
---
apiVersion: apps/v1
#kind: Deployment   
kind: DaemonSet    ### 修改成DaemonSet控制器
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.2.0
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  minReadySeconds: 0
  revisionHistoryLimit: 10
  selector:
   """"""
   """"""    
        volumeMounts:
        - mountPath: /usr/local/certificates/
          name: webhook-cert
          readOnly: true
      dnsPolicy: ClusterFirstWithHostNet  ##DNS策略
      hostNetwork: true  ## 与主机共享网络空间
      nodeSelector:    ## 所有节点都必须有这个标签
        kubernetes.io/os: linux  ## 这个标签已经是具备的 kubectl get node --show-labels 查看
        node-role: ingress    ## 如果具备这个标签就可以安装
      serviceAccountName: ingress-nginx
      terminationGracePeriodSeconds: 300
      volumes:
      - name: webhook-cert
        secret:
          secretName: ingress-nginx-admission   
 第三处修改:
 修改三个image 的镜像,因为GitHub,无法下载,可以提前下载,上传至阿里镜像仓库                                                         
[root@master ingress]# kubectl  apply  -f deploy.yaml  
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
daemonset.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
[root@master ingress]# kubectl  get pod -n ingress-nginx 
NAME                                   READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-pk4qm   0/1     Completed   0          48s
ingress-nginx-admission-patch-jcgqd    0/1     Completed   0          48s
[root@master ingress]# kubectl  get daemonsets.apps  -n ingress-nginx  
NAME                       DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                              AGE
ingress-nginx-controller   0         0         0       0            0           kubernetes.io/os=linux,node-role=ingress   62s

#### 本次采用的daemonsets的方式进行部署,如果在生产环境中,一般是采用这种方式进行部署,采取资源比较高的几个node进行部署ingress
### 因为node上现在还缺少node-role=ingress这个标签,导致不能给节点安装,在资源比较高的节点打上标签就可以部署,如下操作

[root@master ~]# kubectl  label  nodes node1 node-role=ingress 
node/node1 labeled
[root@master ~]# kubectl  get daemonsets.apps  -n ingress-nginx 
NAME                       DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                              AGE
ingress-nginx-controller   1         1         0       1            0           kubernetes.io/os=linux,node-role=ingress   6m43s

[root@master ~]# kubectl  get nodes node1 --show-labels | grep ingress
node1   Ready    <none>   99d   v1.23.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role=ingress

## 将node1和node2进行打标签
[root@master ~]# kubectl get nodes node1 node2 --show-labels | grep ingress
node1   Ready    <none>   99d   v1.23.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role=ingress
node2   Ready    <none>   99d   v1.23.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux,node-role=ingress

  • ingress状态查看
    在这里插入图片描述

Completed: 当一个Pod中的容器成功完成任务后,容器的状态会变为 Completed。这表示该容器已经顺利执行完其任务并退出了。在你的输出中,ingress-nginx-admission-create-pk4qm 和 ingress-nginx-admission-patch-jcgqd 这两个Pod的容器已经成功完成它们的任务。

三、Ingress快速入门实践

1、Ingress资源清单

apiVersion: networking.k8s.io/v1   #资源所属的API群组和版本 
kind: Ingress ## 资源表示
metadata:
  name: ingress-01 ## 资源名称
  namespace: default  ## 资源命名空间
spec:
  ingressClassName: "nginx" ## 适配的Ingress控制器类别,必须明确指定     <string>
  rules:                    ## Ingress规则列表  <[]Object>
  - host:       ## 虚拟主机的FODN,俗称域名 <string>
    http:       ##  <Object>
      paths:    ## 虚拟主机PATH定义的列表,有path和backend组成        <[]Object> -required->
      - path:   ## 匹配以什么开头,类似nginx中location的作用          <string>
        pathType: ##  Prefix前缀匹配,不区分大小写 Exact精确匹配URL,区分大小写     <string> -required->
        backend:  ##  <Object> -required->
          service:   ##关联后端service  <Object>
            name:    ## 关联后端service名称  <string> -required
            port:   ## 关联后端service端口   <Object>
              name:   ## 关联后端service端口名称 <string>
              port:    ## 关联后端service端口号 <integer>

在这里插入图片描述

2、Ingress发布业务,可以参考service篇章的guestbooks

3、Ingress基于URL实现路由

  • 场景:将来自同一域名,不同URL请求调度到不同Service
    在这里插入图片描述

3.1、 demoapp 的yaml资源清单

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demoapp
spec:
  replicas: 2
  selector:
    matchLabels: 
      app: demoapp
  template:
    metadata:
      labels:
        app: demoapp
    spec:
      containers:
      - name: demo
        image: oldxu3957/demoapp

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-28 06:38:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-28 06:38:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-28 06:38:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-28 06:38:04       20 阅读

热门阅读

  1. Microsoft VBA Excel 单元格 重复元素 去重

    2024-03-28 06:38:04       23 阅读
  2. 目标检测系列模型发展历程

    2024-03-28 06:38:04       24 阅读
  3. ubuntu20搭建Gitlab本地服务器(简洁版)

    2024-03-28 06:38:04       24 阅读
  4. OpenCV图像处理——图像矩

    2024-03-28 06:38:04       20 阅读
  5. 解锁社交媒体图像内容的深度学习之道

    2024-03-28 06:38:04       18 阅读
  6. LabVIEW及工具包大全

    2024-03-28 06:38:04       19 阅读
  7. ubuntu下docker常见指令

    2024-03-28 06:38:04       19 阅读
  8. 什么是数据仓库

    2024-03-28 06:38:04       21 阅读
  9. react 简单的demo

    2024-03-28 06:38:04       18 阅读
  10. 什么是函数指针?如何定义和使用函数指针?

    2024-03-28 06:38:04       20 阅读
  11. 井字棋游戏(最大最小搜索+Alpha-Beta剪枝)

    2024-03-28 06:38:04       20 阅读
  12. Ubuntu16.04 切换系统python和gcc版本

    2024-03-28 06:38:04       21 阅读