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路由例子
对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
访问ingress
ingress也是一种service,可以通过nodeport的方式访问
kubectl get svc -n ingress-nginx
其中看到,其中ingress的80端口映射到31432,443端口映射到30874。
通过访问域名+端口+路径,就能通过ingress访问。
举例如下:
访问http://www.myweb.com:31406/demo
配置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"
生成了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
方法二
编辑myweb-ingress.yaml文件,将 tls.key和tls.crt文件内容经过base64复制进去,然后用kubectl create命令创建.
测试访问
使用https访问