场景说明
在使用ingress 对外暴露服务的时候,有使用业务上需要配置验证文件,在指定路径下面放置配置文件,进行验证,这篇文章将引导大家进行配置,本篇文章通过SSL的验证文件举例,其他验证文件的场景操作方案是一致的
准备环境
先创建一个简单的 Ingress
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
labels:
app: nginx-deployment
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
## annotations:
## service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxxxxx ##若是创建内网访问的 Service 需指定该条 annotation
name: my-service
spec:
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: qcloud ## 可选值:qcloud(CLB类型ingress)
name: my-ingress
namespace: default
spec:
rules:
- host: tke.aa.cn # 替换成自己的域名
http:
paths:
- backend:
service:
name: my-service
port:
number: 80
path: /
pathType: ImplementationSpecific
使用 如下命令创建 ingress, ing_demo.yaml 就是上面的yaml文件
kubectl apply -f ing_demo.yaml
查看Ingress已经创建成功了
测试访问正常
申请证书
这里申请证书选择文件验证
可以看到这里的要求
需要下载对应的文件,放到指定的目录文件访问
在指定目录中放入验证文件
正常的Ingress的路由中都是业务文件,不建议修改业务的pod放入验证文件,这里比较对接新建一个工作负载和svc,然后再Ingress这里配置转发规则,转发到后端pod中实现验证需求,后续验证完成后对应的工作负载和svc以及ingress的路由规则可以删除
先创建svc和工作负载。这里使用的svc类型是 LoadBalancer 类型的,这个在公有云场景会创建一个clb,在公有云场景中,如果你对应的节点支持nodePort类型,可以考虑使用nodePort ,这里可以降低一些成本
这里的的操作是创建一个nginx的工作负载,到时候把对应的验证文件放在nginx对应目录中,就可以实现需求了
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-y
namespace: default
labels:
app: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx-y
template:
metadata:
labels:
app: nginx-y
spec:
containers:
- name: nginx
image: nginx:latest
lifecycle:
postStart: # 这里在pod运行后创建验证文件的路径
exec:
command:
- /bin/mkdir
- -p
- /usr/share/nginx/html/.well-known/pki-validation
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
## annotations:
## service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxxxxx ##若是创建内网访问的 Service 需指定该条 annotation
name: service-y
spec:
selector:
app: nginx-y
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
创建svc和工作负载
把验证文件下载后上传到客户端服务器中
查看对应的pod名称
然后再使用kubectl cp 命令把 验证文件放入nginx的家目录中
kubectl cp fileauth.txt nginx-y-c869c9d9b-jhcwv:/usr/share/nginx/html/.well-known/pki-validation
可以使用命令查看验证,看看文件是否上传成功
kubectl exec nginx-y-c869c9d9b-jhcwv -- ls /usr/share/nginx/html/.well-known/pki-validation
配置一下ingress的转发规则,新增一个 host
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
labels:
app: nginx-deployment
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
## annotations:
## service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxxxxx ##若是创建内网访问的 Service 需指定该条 annotation
name: my-service
spec:
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: qcloud ## 可选值:qcloud(CLB类型ingress)
name: my-ingress
namespace: default
spec:
rules:
- host: tke.aa.cn # 替换成自己的域名
http:
paths:
- backend:
service:
name: my-service
port:
number: 80
path: /
pathType: ImplementationSpecific
- host: tke.aa.cn # 新增的host
http:
paths:
- backend:
service:
name: service-y # y验证文件新创建的svc
port:
number: 80
path: /.well-known/pki-validation/fileauth.txt # 验证文件的路径
pathType: ImplementationSpecific
测试验证
查看已经验证成功了
后续验证成功后,验证创建的SVC和工作负载可以删除,ingress对应的路由规则也可以删除,避免增加成本