做云原生应用域名配置这个事的时候, 需要按顺序把四个部分弄完。具体是哪四个部分呢? 第一个是 DNS解析指向。第二个部分是 TLS证书签发以及挂载这一步。

第三个环节叫做 Ingress域名路由映射。第四个叫法是集群外访问链路验证。下面要说的事儿, 是关于这四个部分里每一个部分的标准操作路径, 还有关键参数的相关说明。

DNS解析配置

你要先去那些提供域名服务的供应商那边, 比方说Cloudflare, 或者阿里云DNS, 又或者华为云DNS这种地方, 然后去添加一个A记录, 也有可能是一个CNAME记实, 要把你那个业务上的域名, 像比如说是api.example.com这样子的东西, 指向到你的集群入口的IP地址那里, 或者是连接到负载均衡器的地址上面去。

在使用Kubernetes LoadBalancer Service之前, 应该先去执行kubectl get svc命令, 目的是拿到EXTERNAL-IP地址的详情, 拿到这个IP以后, 再把信息填进DNS记录里。

关于TTL的设置, 建议把它控制在300秒以内, 这样做的目的是为了在后续的切换操作中更加方便和灵活。

在记录生效以后, 你可以使用 dig +short api.example.com A 这个命令, 或者也可以使用 nslookup 这个命令, 来确认解析结果是不是正确的, 在这种情况下, 多可用区部署场景里头, 是能够去配置多条A记录的, 通过这种方式, 可以实现DNS层负载均衡。

TLS/SSL证书绑定

证书申请推荐两条路径:

自动续签方案: 部署 cert-manager Operator, 然后创建 Certificate 资源以及 Issuer 资源, 之后指定让 Let's Encrypt 这样的免费 CA 来提供服务, 接着 Operator 会自动完成 HTTP-01 验证或者 DNS-01 验证的操作, 还会进行证书签发的工作, 最后在到期前的 30 天时间里会自动完成续签的过程, 全程不需要人工介入。

企业证书方案的情况是, 把已经存在的证书还有私钥一起打包成一个Secret, 这里用到了那个叫做kubectl create secret tls的操作, 然后在Ingress里面, 去引用这个Secret的名称, 是在tls这一段里进行引用的。

不管是什么方案, 必须要去把证书上面所涵盖的所有业务域名这一件事进行确认工作。这里所说的业务域名是包括通配符子域在内的这些内容。要这样做的原因是避免出现因为证书和域名之间不匹配这样的状况而让浏览器发出告警信息的现象发生。

Ingress域名路由映射

在对Ingress这种类型的资源进行配置的时候, 要去设置一下叫作rules的这个字段。把指定的那个域名和背后的这个Service给关联起来。然后可以看一下给出的这个示例内容。

spec:
  tls:
hosts: ["api.example.com"]
      secretName: api-tls-secret
  rules:
host: api.example.com
      http:
        paths:
path: /
            pathType: Prefix
            backend:
              service:
                name: api-gateway
                port: 80

云原生应用域名配置怎么做?DNS解析与证书绑定实操指南(图1)

如果集群正在运行Nginx Ingress Controller, 那么用户还需要去对应的ConfigMap里面进行设置龙南市就业服务平台,具体的操作是要把ssl-redirect这个参数设置为true, 同时要把proxy-read-timeout这个参数设置为120, 当然还有其他的一些需要配置的参数也可以进行设置, 这样做的目的, 就是要确保能够实现HTTPS的强制跳转效果, 并且让长连接超时的时间能够满足业务方面的实际要求。

我们建议针对开发环境、测试环境和生产环境这样三种不同的运行场景, 采用按照主机头信息来进行划分的这样一种做法, 去创建彼此独立的入口资源, 以此来防止因为域名相同而引发的冲突问题。

集群外访问链路验证

在域名上线之前, 需要按照指定的顺序完成四项必要的核查工作。

1. 先是在公网环境下, 用dig这个命令来查看, 结果确认指向的IP地址是正确的。

2. 运行由code标签包裹起来的curl命令, 后面跟着-vI参数以及https斜杠斜杠目标地址域名, 用来检查证书的链路是否完整, 同时确认响应得到的状态码是否为200。

3. 通过在浏览器里面进行访问, 来对确认页面的渲染情况以及重定向的行为是否正常这一件事项进行了观察, 结果是正常的。

4. 请用 kubectl get ingress 这个命令去检查一下, 看 STATUS 这个字段上面的内容, 是不是应该要显示那个集群入口的 IP 地址, 而不应该是显示状态为 Pending 的那样子。

常见疑难与快速排查

域名无法访问, 需要优先排查DNS本地缓存的问题, 可以通过运行命令 ipconfig /flushdns 来刷新, 同时也需要检查ISP在解析方面是否存在差异, 最后再检查安全组和网络ACL是否已经放行了80和443这两个端口。

证书不生效: 你要去核对一下Secret的名称, 和Ingress的tls段所引用的内容是否完全一样, 同时要去查看cert-manager这个Pod的日志, 看看里面有没有验证失败的记录。

Ingress状态Pending:检查Ingress Controller Pod是否正常运行云原生应用域名配置云原生应用域名配置,节点端口未被防火墙拦截。

你可以去参考一下在 gz88.cn 发布的那个云原生运维知识库, 这里面有按场景分类整理的故障排查清单, 还有配置模板, 同时里面也包含了关于 DNS 这类高频问题的标准化处理 SOP, 也包括证书还有路由这三类, 处理的时候就可以直接套用。

上线后运维要点

在生产环境的域名配置工作完成以后, 必须要把证书到期监控告警的事情给建立起来, 并且把那个阈值设定为剩余有效期还有7天这样的状态, 同时针对DNS变更的操作要走审批流程, 并且要把变更记录都给保留下来, 当进行多区域部署的时候, 应该去利用DNS地理路由这个技术去把不同区域的用户的指向设置为最近的集群入口, 从而去降低访问延迟的情况。