ingress

Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路由。Ingress 具备如下特性:集群外部可访问的 URL、负载均衡、SSL Termination、按域名路由(name-based virtual hosting)。

配置举例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress-for-nginx # Ingress 的名字,仅用于标识
spec:
rules: # Ingress 中定义 L7 路由规则
- host: demo.my-company.com # 根据 virtual hostname 进行路由(请使用您自己的域名)
http:
paths: # 按路径进行路由
- path: /
backend:
serviceName: nginx-service # 指定后端的 Service 为之前创建的 nginx-service
servicePort: 80

典型的HTTP路由例子

k8s学习-ingress配置_后端服务

​对http://mywebsite.com/api的访问将被路由到后端名为api的 Service上;

 对http://mywebsite.com/web的访问将被路由到后端名为web的 Service上;

 对http://mywebsite.com/docs的访问将被路由到后端名为docs 的Service上。​


ingressclass

在一个k8s集群中,用户可以部署多个不同类型的IngressController同时提供服务,此时需要在ingres资源上标明该策略由那个controller管理。通过使用ingressclass,可以除了可以设置IngressController,还可以配置更加丰富的参数信息。

配置一个名为testing的ingressclass,如下所示

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: testing
spec:
controller: k8s.io/ingress-nginx

然后编写ingress资源对象,通过ingressClassName字段引用该IngressClass,表明使用其中的指定的Ingress Controller相应的参数。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mysite #ingress名称
spec:
ingressClassName: testing #引用的ingressclass
rules: #路由规则
- host: www.myweb.com
http:
paths:
- backend:
service:
name: myweb #后端服务的service
port:
number: 8080
path: /demo #访问URL
pathType: Prefix #匹配URL路径前缀


配置完成后检查ingress和ingressclass

k8s学习-ingress配置_ls命令_02

k8s学习-ingress配置_ls命令_03

k8s学习-ingress配置_后端服务_04

访问ingress

ingress也是一种service,可以通过nodeport的方式访问

 kubectl get svc -n ingress-nginx

k8s学习-ingress配置_nginx_05

其中看到,其中ingress的80端口映射到31432,443端口映射到30874。

通过访问域名+端口+路径,就能通过ingress访问。

举例如下:

访问http://www.myweb.com:31406/demo

k8s学习-ingress配置_后端服务_06

配置https

通过为host配置tls的私钥和证书的secret进行支持。ingress只支持单个TLS端口443,向后端转发的流量将以铭文的形式发送。

TLS secret中的文件名必须为tls.crt和tls.key,分别包含用于tls的证书和私钥。

配置TLS步骤如下:

  • 创建自签名的密钥和ssl证书文件
  • 将证书保存到k8s的secret资源对象中
  • 再ingress中引用该secret

通过openssl工具,生成密钥和证书文件,将参数-subj中的CN设置为host域名www.myweb.com

openssl req -x509 -nodes -days 5000 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=www.myweb.com"

k8s学习-ingress配置_nginx_07

生成了tls.key和tls.crt两个文件,然后根据这两个文件,有两种方法创建secret资源对象。

方法一

使用kubectl create tls命令直接通过tls.key和tls.crt文件创建secret对象。

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

然后修改ingress配置文件,增加tls相关配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
creationTimestamp: "2022-08-22T06:17:29Z"
generation: 10
name: mysite
namespace: default
resourceVersion: "620947"
uid: 77033f30-47e4-45ae-9b16-ac64235ddb83
spec:
ingressClassName: testing
rules:
- host: www.myweb.com
http:
paths:
- backend:
service:
name: myweb
port:
number: 8080
path: /demo
pathType: Prefix
tls: #增加tls相关配置
- hosts:
- www.myweb.com
secretName: myweb-ingress #指明secret

k8s学习-ingress配置_nginx_08

方法二

编辑myweb-ingress.yaml文件,将 tls.key和tls.crt文件内容经过base64复制进去,然后用kubectl create命令创建.

k8s学习-ingress配置_后端服务_09

k8s学习-ingress配置_后端服务_10

测试访问

使用https访问

k8s学习-ingress配置_后端服务_11

k8s学习-ingress配置_后端服务_12