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
相关推荐
JunLan~1 小时前
Rocky Linux 系统安装/部署 Docker
linux·docker·容器
小袁搬码4 小时前
Windows中指定路径安装DockerDesktop
windows·docker·容器·docker desktop
qq_312920115 小时前
docker 部署 kvm 图形化管理工具 WebVirtMgr
运维·docker·容器
踏雪Vernon5 小时前
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
linux·docker·容器·harmonyos
条纹布鲁斯6 小时前
dockerdsktop修改安装路径/k8s部署wordpress和ubuntu
docker·kubernetes
CP-DD8 小时前
Docker 容器化开发 应用
运维·docker·容器
老司机张师傅8 小时前
【微服务实战之Docker容器】第七章-Dockerfile解析
容器·dockerfile·虚悬镜像·docker学习
登云时刻9 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)
redis·kubernetes·bootstrap
运维&陈同学10 小时前
【zookeeper03】消息队列与微服务之zookeeper集群部署
linux·微服务·zookeeper·云原生·消息队列·云计算·java-zookeeper
吴半杯10 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway