场景说明

在使用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对应的路由规则也可以删除,避免增加成本