Ingress简单使用

介绍

Ingress 是 Kubernetes 中用于公开和管理集群内服务的一种 API 资源。它充当了集群入口的角色,可以将外部流量路由到集群内部的服务,同时提供了一些高级功能,如负载均衡、TLS 终止、虚拟主机路由等。

下面是 Ingress 的一个简单示例,可将所有流量都发送到同一 Service:

通过配置,Ingress 可为 Service 提供外部可访问的 URL、对其流量作负载均衡、 终止 SSL/TLS,以及基于名称的虚拟托管等能力

环境准备

必须拥有一个 Ingress 控制器 才能满足 Ingress 的要求。仅创建 Ingress 资源本身没有任何效果。

需要先安装Helm 点击跳转

在安装 Ingress 控制器 点击跳转

Ingress 资源

Ingress 资源示例:

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress                                                # 指定了资源的类型为 Ingress
metadata:
  name: web-dashboard                                        # 指定了资源的名称 为 web-dashboard
  annotations:
    kubernetes.io/tls-acme: "true"                           # 启用自动获取 TLS 证书的功能
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"    # 指定后端服务的通信协议为 HTTPS
    nginx.ingress.kubernetes.io/server-snippet: |            # 自定义 Nginx 配置片段,关闭对后端服务证书的验证
      proxy_ssl_verify off;
spec:
  ingressClassName: "nginx"                                  # 指定使用的 Ingress Controller 的类别为 "nginx"
  tls:
    - hosts:
        - web.example.com                                    # 指定 TLS 证书的域名为 "web.example.com"
      secretName: web.example.com                            # 指定存储 TLS 证书的 Secret 的名称为 "web.example.com"
  rules:
    - host: web.example.com
      http:
        paths:
          - path: /
            pathType: Prefix                                 # 指定路径匹配类型为 Prefix,即匹配以 "/" 开头的所有路径
            backend:
              service:
                name: web-dashboard                          # 指定后端 Service服务的名称为 "web-dashboard"
                port:
                  name: https-dashboard                      # 指定后端服务的端口名称为 "https-dashboard",也可以写端口号

查看Ingress

bash 复制代码
[root@master01 ~]# kubectl get ing
NAME                      CLASS   HOSTS               ADDRESS         PORTS     AGE
web-dashboard             nginx   web.example.com    10.99.220.206    80, 443   20d

Ingress 规则

  • Ingress规则由Ingress资源定义,每个Ingress资源包含一个或多个规则,每个规则指定了一个主机名和与之关联的服务。这些规则可以基于域名、路径或其他条件来匹配请求,并将请求转发到相应的后端服务。
  • 路径列表(例如 /testpath)。每个路径都有一个由 service.nameservice.port.name 或 service.port.number 确定的关联后端。 主机和路径都必须与入站请求的内容相匹配,负载均衡器才会将流量引导到所引用的 Service,
  • backend(后端)是 Service 文档中所述的 Service 和端口名称的组合, 或者是通过 CRD 方式来实现的自定义资源后端。 对于发往 Ingress 的 HTTP(和 HTTPS)请求,如果与规则中的主机和路径匹配, 则会被发送到所列出的后端。
  • Ingress 经常使用注解(Annotations)来配置一些选项,具体取决于 Ingress 控制器,不同的 Ingress 控制器支持不同的注解。 (查看Ingress 控制器官网

Ingress 配置方法

创建nginx应用和Service

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app.kubernetes.io/name: proxy
spec:
  containers:
  - name: nginx
    image: nginx:stable
    ports:
      - containerPort: 80
        name: http-web-svc

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app.kubernetes.io/name: proxy
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 8080
    targetPort: http-web-svc  # 后端 pod 端口的名字 也可以写80端口

nginx 服务起来以后创建Ingress

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-nginx
spec:
  ingressClassName: nginx
  rules:
  - host: "foo.nginx.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: nginx-service
            port:
              name: name-of-service-port

在你需要访问的主机上面配置K8S集群的host 通过"foo.nginx.com" 这个域名即可访问nginx服务。

配置多域名Ingress

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-wildcard-host
spec:
  rules:
  - host: "foo.bar.com"
    http:
      paths:
      - pathType: Prefix
        path: "/bar"
        backend:
          service:
            name: service1
            port:
              number: 80
  - host: "*.foo.com"
    http:
      paths:
      - pathType: Prefix
        path: "/foo"
        backend:
          service:
            name: service2
            port:
              number: 80

Ingress 类

Ingress 可以由不同的控制器实现,通常使用不同的配置。 每个 Ingress 应当指定一个类,也就是一个对 IngressClass 资源的引用。 IngressClass 资源包含额外的配置,其中包括应当实现该类的控制器名称。

查看Ingress 控制器

bash 复制代码
kubectl get ingressclasses

yaml 文件

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  annotations:
    meta.helm.sh/release-name: ingress-nginx
    meta.helm.sh/release-namespace: ingress-nginx
  generation: 1
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.8.1
    helm.sh/chart: ingress-nginx-4.7.1
  name: nginx
spec:
  controller: k8s.io/ingress-nginx

IngressClass 中的 .spec.parameters 字段可用于引用其他资源以提供与该 IngressClass 相关的配置。

参数(parameters)的具体类型取决于你在 IngressClass 的 .spec.controller 字段中指定的 Ingress 控制器。

IngressClass 的作用域

集群作用域

IngressClass 参数的默认作用域是集群范围。

如果你设置了 .spec.parameters 字段且未设置 .spec.parameters.scope 字段,或是将 .spec.parameters.scope 字段设为了 Cluster, 那么该 IngressClass 所引用的即是一个集群作用域的资源。

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-1
spec:
  controller: example.com/ingress-controller
  parameters:									# 包含了与这个 IngressClass 相关的配置参数信息
    scope: Cluster								# 指定了参数资源的作用域为集群级别
    apiGroup: k8s.example.net
    kind: ClusterIngressParameter
    name: external-config-1

命名空间作用域

如果你设置了 .spec.parameters 字段且将 .spec.parameters.scope 字段设为了 Namespace,那么该 IngressClass 将会引用一个名字空间作用域的资源。 .spec.parameters.namespace 必须和此资源所处的名字空间相同。

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb-2
spec:
  controller: example.com/ingress-controller
  parameters:
    scope: Namespace						# 指定了参数资源的作用域为命名空间作用域
    apiGroup: k8s.example.com
    kind: IngressParameter
    namespace: external-configuration		# 指定了具体应用到那个命名空间 这里指定的是"external-configuration"
    name: external-config

默认 Ingress

你可以将一个特定的 IngressClass 标记为集群默认 Ingress 类。 将某个 IngressClass 资源的 ingressclass.kubernetes.io/is-default-class 注解设置为 true 将确保新的未指定 ingressClassName 字段的 Ingress 能够被赋予这一默认 IngressClass。

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/component: controller
  name: nginx-example
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"  # 设置为默认 IngressClass
spec:
  controller: k8s.io/ingress-nginx
相关推荐
小猿姐15 小时前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
阿里云云原生2 天前
深入内核:拆解 OpenTelemetry eBPF 探针如何优雅地“透视”多语言微服务?
云原生
2601_961875242 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj2 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵2 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops
正经教主2 天前
【docker基础】 第八周:容器监控与应用更新策略
运维·docker·容器
kiros_wang2 天前
Docker 使用完整指南
运维·docker·容器
正经教主2 天前
【docker基础】第九周:Docker安全与镜像优化
运维·docker·容器
qq_452396232 天前
第十三篇:《K8s 安全基础:RBAC、ServiceAccount、Pod Security》
java·安全·kubernetes
睡不醒男孩0308232 天前
云原生运维实战:高并发架构下的云原生可观测性、韧性降级与自动化干预体系
数据库·kubernetes·高并发·prometheus·devops·sre·缓存调优