kubernetes负载均衡资源-Ingress

news/2024/7/10 2:24:44 标签: kubernetes, 负载均衡, 容器

一、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

http://www.niftyadmin.cn/n/5455966.html

相关文章

在word中显示Euclid Math One公式的问题及解决(latex公式,无需插件)

问题&#xff1a;想要在word中显示形如latex中的花体字母 网上大多解决办法是安装Euclid Math One。安装后发现单独的符号插入可行&#xff0c;但是公式中选择该字体时依然显示默认字体。 解决办法&#xff1a;插入公式后&#xff0c;勾选左上角的latex 在公式块中键入latex代码…

maya pycharm运行 重定向

目录 maya sdk下载: maya测试代码: 添加sdk 依赖库: pycharm连接 maya 测试ok

(PAT乙级) 1084 外观数列 (C语言实现,不要使用strcat)

外观数列是指具有以下特点的整数序列&#xff1a; d, d1, d111, d113, d11231, d112213111, ...它从不等于 1 的数字 d 开始&#xff0c;序列的第 n1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d&#xff0c;所以就是 d1&#xff1b;第 2 项是 1 个 d&#xff08;对…

Linux - 第五节

sudo用不了 - 新建的普通用户 以管理员的身份&#xff0c;去修改etc/sudoers配置下的文件&#xff0c;添加白名单 代码的编译 gcc - 只能用于编译C语言 g - 既能用来编译C语言&#xff0c;也能用来编译C ggc的简易用法 预处理 预处理功能主要包括宏定义,文件包含,条件编…

HarmonyOS(鸿蒙开发)入门篇

如果需要学习鸿蒙开发可以查看以下学习资源链接 OpenAtom OpenHarmony Develop applications - HUAWEI HarmonyOS APP 转载请注明出处HarmonyOS(鸿蒙开发&#xff09;入门篇-CSDN博客&#xff0c;谢谢&#xff01;

InputStream字节输入流和OutStream字节输出流

InputStream InputStream是Java标准库最基本的输入流&#xff0c;在java.io包内。它是一个抽象类。 FileInputStream&#xff1a;从文件中读取数据&#xff0c;是最终数据源。 int read()方法&#xff1a;读取输入流的下一个字节&#xff0c;并返回字节表示的int值&#xff08;…

酒店智能水电表管理解决方案:提升效率、节约成本与环保并重

随着科技的不断发展&#xff0c;智能水电表管理解决方案在酒店行业中得到了广泛应用。这一解决方案结合了物联网技术和智能管理系统&#xff0c;旨在提升酒店水电资源利用效率&#xff0c;降低运营成本&#xff0c;同时也致力于环保与可持续发展。本文将从多个方面介绍酒店智能…

广义表的深度与长度

1.广义表的长度和深度 1.长度&#xff1a;广义表的长度是指广义表中第一层所含的元素个数&#xff0c;包括原子和子表。 理解&#xff1a;广义表的长的也就是最外层的括号中包含的元素的个数 2.深度&#xff1a;广义表的深度是指广义表中括号的最大层数&#xff0c;即最大嵌套…