介绍
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.name 和 service.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