Kubernetes Ingress

news/2024/9/19 1:28:54 标签: kubernetes, 容器, 云原生

文章目录

  • 一、为什么需要 Ingress
  • 二、什么是Ingress,Ingress Controller
  • 三、Ingress 的工作原理
  • 四、Ingress 配置资源模版
  • 五、实例
    • 1、搭建 Ingress 环境
      • 1.1、Ingress-Nginx官网地址
      • 1.2、master 节点下载 deploy.yaml
      • 1.3、所有节点提前 pull 必须的镜像
      • 1.4、修改并应用 deploy.yaml 文件
      • 1.5、查看 ingress-nginx
      • 1.6、查看 service
    • 2、准备 service 和 pod
      • 2.1、创建 nginx 和 tomcat 的 Deployment
      • 2.2、创建并查看对应 svc,pod
    • 3、HTTP代理
      • 3.1、创建 ingress-http.yaml
      • 3.2、应用并查看
      • 3.3、本地电脑配置 hosts 解析
      • 3.4、通过域名+端口号查看
    • 4、HTTPS代理
      • 4.1、生成证书
      • 4.2、创建密钥
      • 4.3、创建ingress-https.yaml
      • 4.4、应用并查看
      • 4.5、通过 https://域名+端口号 访问

一、为什么需要 Ingress

我们使用传统的NodePort类型的Service的确能将集群内的服务暴露给集群外部客户端去访问,但是使用这种类型的Service存在以下问题:

  • 一个端口只能使用一个服务,所有通过NodePort暴露的端口都需要提前规划;

  • 如果集群上的Service的数量太多的话,暴露的NodePort端口不具有连续性。后期维护成本太大,且不宜于管理;

  • 无论是Iptables或者是Ipvs模型的Service都配置在Linux内核中的Netfilter之上进行四层调度。是一种比较通用的调度器。支持调度HTTP、Mysql等应用层服务,不过,也正是工作于传输层从而使得它无法做到类似卸载HTTPS中的SSL会话,也不支持基于URL的请求调度机制,因为它工作在传输层。kubernetes也不支持为此类负载均衡配置任何类型的健康状态检测机制。

为了解决这种需求,提供了一种高级的流量管理,也就Ingress和Ingress Controller,kubernetes使用Ingress Controller来接收所有入口的流量,然后通过Ingress资源来定义流量如何区分,以及如何转发的规则。有了Ingress和Ingress控制器。我们就可以直接定义流量转发规则来发布服务,而无需创建许多的NodePort和LoadBalancer类型的Service。

image-20240917180553792

二、什么是Ingress,Ingress Controller

Ingress 是 Kubernetes 中的一个 API 对象,用于定义集群内部服务的外部可访问性。简而言之,Ingress 是用来描述如何将外部请求路由到集群内部的服务的规则集合。Ingress 提供了一种定义 HTTP 路由规则的方式,使得外部客户端可以通过一个统一的入口点访问集群内部的服务。

img

Ingress相当于一个7层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类 似于Nginx,可以理解成在Ingress里建立诸多映射规则,Ingress Controller通过监听这些配置规则并 转化成Nginx的反向代理配置 , 然后对外部提供服务。

在这里有两个核心概念:

  • ingress:kubernetes中的一个对象,作用是定义请求如何转发到service的规则
  • ingress controller:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx, Contour, Haproxy等等

三、Ingress 的工作原理

Ingress(以Nginx为例)的工作原理如下:

  1. 用户编写Ingress规则,说明哪个域名对应kubernetes集群中的哪个Service
  2. Ingress控制器动态感知Ingress服务规则的变化,然后生成一段对应的Nginx反向代理配置
  3. Ingress控制器会将生成的Nginx配置写入到一个运行着的Nginx服务中,并动态更新
  4. 到此为止,其实真正在工作的就是一个Nginx了,内部配置了用户定义的请求转发规则

image-20240917184743873

四、Ingress 配置资源模版

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

五、实例

1、搭建 Ingress 环境

1.1、Ingress-Nginx官网地址

#Ingress-Nginx 官网地址
https://kubernetes.github.io/ingress-nginx/
 
#Ingress-Nginx GitHub地址
https://github.com/kubernetes/ingress-nginx

1.2、master 节点下载 deploy.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yaml

image-20240917195944285

1.3、所有节点提前 pull 必须的镜像

docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:ingresswebhook111

docker tag c41e9fcadf5a k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1

docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:ingresscontroller104

docker tag a9f76bcccfb5 k8s.gcr.io/ingress-nginx/controller:v1.0.4

1.4、修改并应用 deploy.yaml 文件

如果是提前pull的镜像,要删除掉deploy.yaml中对镜像sha256的检查,在image标签中,删除 @sha256到行尾

sed -i 's/@sha256:.*//g' deploy.yaml

kubectl apply -f deploy.yaml

image-20240917220226247

1.5、查看 ingress-nginx

kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

image-20240918101812536

1.6、查看 service

kubectl get svc -n ingress-nginx

image-20240918101850149

2、准备 service 和 pod

image-20240917222647664

2.1、创建 nginx 和 tomcat 的 Deployment

apiVersion: v1
kind: Namespace
metadata:
  name: dev
  
---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: tomcat-pod
  template:
    metadata:
      labels:
        app: tomcat-pod
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.5-jre10-slim
        ports:
        - containerPort: 8080

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: dev
spec:
  selector:
    app: nginx-pod
  clusterIP: None
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
  namespace: dev
spec:
  selector:
    app: tomcat-pod
  clusterIP: None
  type: ClusterIP
  ports:
  - port: 8080
    targetPort: 8080

2.2、创建并查看对应 svc,pod

kubectl apply -f tomcat-nginx.yaml

kubectl get pods,svc -n dev

image-20240918103916622

3、HTTP代理

3.1、创建 ingress-http.yaml

ingressClassName: nginx

使用 nginx 的 IngressClass(关联的 ingress-nginx 控制器)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-nginx
  namespace: dev
spec:
  rules:
  - host: nginx.bbj1030.cn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend: 
          service:
            name: nginx-service
            port: 
              number: 80
  ingressClassName: nginx
---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-tomcat
  namespace: dev
spec:
  rules:
  - host: tomcat.bbj1030.cn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tomcat-service
            port: 
              number: 8080
  ingressClassName: nginx

3.2、应用并查看

kubectl get ing -n dev

image-20240918120230378

kubectl describe ing -n dev

image-20240918120311196

3.3、本地电脑配置 hosts 解析

将以上 nginx.bbj1030.cn 和 tomcat.bbj1030.cn 解析到 master 节点 192.168.112.10上

192.168.112.10 nginx.bbj1030.cn
192.168.112.10 tomcat.bbj1030.cn

image-20240918120828477

3.4、通过域名+端口号查看

nginx.bbj1030.cn:32596

tomcat.bbj1030.cn:32596

image-20240918112152192

image-20240918120508649

image-20240918130957117

4、HTTPS代理

4.1、生成证书

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=bbj1030.cn"

4.2、创建密钥

kubectl create secret tls tls-secret --key tls.key --cert tls.crt

image-20240918121104780

4.3、创建ingress-https.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: https-nginx
  namespace: dev
spec:
  tls:
    - hosts:
      - nginx.bbj1030.cn
      secretName: tls-secret # 指定秘钥
  rules:
  - host: nginx.bbj1030.cn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port: 
              number: 80
  ingressClassName: nginx
---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tomcat-https
  namespace: dev
spec:
  tls:
    - hosts:
      - tomcat.bbj1030.cn
      secretName: tls-secret # 指定秘钥
  rules:
  - host: tomcat.bbj1030.cn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tomcat-service
            port: 
              number: 8080
  ingressClassName: nginx

4.4、应用并查看

需要先删除之前创建的 ingress 不然会报错

image-20240918121547056

kubectl delete -f ingress-http.yaml

kubectl apply -f ingress-https.yaml

image-20240918121408401

kubectl get ing -n dev

kubectl describe ing -n dev

image-20240918121642798

4.5、通过 https://域名+端口号 访问

https://nginx.bbj1030.cn:31563

https://tomcat.bbj1030.cn:31563

image-20240918131142580

image-20240918121928061


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

相关文章

frida 命令参数作用

frida-traces是一个动态跟踪函数调用的工具。 # 在Safari中跟踪recv*和send*API&#xff0c;在日志记录中插入库名称 frida-trace --decorate -i "recv*" -i "send*" Safari# 跟踪Safari中的ObjC方法调用 frida-trace -m "-[NSView drawRect:]"…

智能化技术在灌区管理中的应用前景

智能化技术在灌区管理中的应用前景&#xff0c;是一个集高效性、可持续性与精细化管理为一体的前沿领域。随着物联网&#xff08;IoT&#xff09;、大数据分析、人工智能&#xff08;AI&#xff09;、云计算以及遥感技术的迅猛发展&#xff0c;灌区管理正经历着从传统模式向智能…

Python快速入门 —— 第七节:其他概念

第七节&#xff1a;其他概念 目标&#xff1a; 了解Python中的一些高级概念&#xff0c;如异常处理、迭代器、生成器、装饰器、闭包、匿名函数和类的继承&#xff0c;提升编程技巧。 内容&#xff1a; 异常处理&#xff1a; 捕获异常&#xff1a; try:# 可能发生异常的代码 …

【C++ Primer Plus习题】16.8

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <set> #includ…

[SAP ABAP] 修改内表数据

1.利用关键字修改数据 语法格式 MODIFY TABLE <itab> FTOM <wa> [TRANSPORTING f1 f2...].<itab>&#xff1a;代表内表 <wa>&#xff1a;代表工作区 示例1 内表修改前的数据 将上述数据行中的AGE字段值更改为25&#xff0c;SEX字段值更改为女 输出结…

内存管理篇-26虚拟内存管理:vmalloc

1.vmalloc分配器的使用&#xff1a; vmalloc经常用于申请大块内存。由于kmalloc最大申请内存为4MB&#xff0c;如果想要申请更加大的内存&#xff0c;可以使用vmalloc&#xff0c;大小没有限制&#xff0c;虚拟地址连续&#xff0c;物理地址不一定连续。 vmalloc区域最小是240M…

C++之继承(通俗易懂版)

前言&#xff1a;我们都知道C是一门支持过程化编程&#xff0c;面向对象的高级语言&#xff0c;既然是面向对象的语言&#xff0c;那么对于对象而言&#xff0c;对象会有很多中相同的属性&#xff0c;举个例子:你和你老师&#xff0c;你们都有着共同的属性和身份&#xff0c;例…

Doker学习笔记--黑马

介绍&#xff1a;快速构建、运行、管理应用的工具 在不同的服务器上部署多个应用&#xff0c;但是往往不同应用之间会有冲突&#xff0c;因为它们所依赖的环境&#xff0c;函数库&#xff0c;配置都不一样&#xff0c;此时docker在运行时形成了一个隔离环境&#xff08;容器&am…