DNS 接入

技术原理

Polaris 的 DNS 服务发现接入方案中,Polaris 是您的控制平面,Polaris Sidecar 作为本地 DNS 服务器实现服务发现以及动态路由。

DNS 接入 - 图1

Kubernetes 场景

  • polaris-server: 北极星服务端,处理服务注册以及服务发现请求。
  • polaris-controller: 完成 polaris-sidecar 容器注入到业务 POD 中,并下发 iptables 指令拦截业务容器的 DNS 请求,将其转发到 polaris-sidecar 中
  • polaris-sidecar: 作为本地 DNS 服务器,将 DNS 域名解析为北极星中的服务,实现服务发现。

虚拟机场景

  • polaris-server: 北极星服务端,处理服务注册以及服务发现请求。
  • polaris-sidecar: 作为本地 DNS 服务器,将 DNS 域名解析为北极星中的服务,实现服务发现。

说明: 如果使用 DNS 进行服务发现,则必须保证命名空间和服务名在北极星上都是以全小写字母进行注册,否则会寻址失败。

相关配置解读

polaris-sidecar 配置

  1. bind: 0.0.0.0 # DNS 服务器监听IP
  2. port: 53 # DNS 服务器监听端口
  3. namespace: default # polaris-sidecar 所在的命名空间
  4. recurse: # 递归解析,当 polaris-sidecar 自己无法解析域名时,会转发给上一级 DNS 服务器继续解析
  5. enable: false
  6. timeoutSec: 1
  7. logger: # 日志配置
  8. output_paths: # 标准输出打印
  9. - stdout
  10. error_output_paths: # 错误日志通过标准错误输出打印
  11. - stderr
  12. rotate_output_path: logs/polaris-sidecar.log # 日志持久化输出
  13. error_rotate_output_path: logs/polaris-sidecar-error.log # 错误日志持久化输出
  14. rotation_max_size: 100 # 单个日志文件最大大小,单位 MB
  15. rotation_max_backups: 10 # 最多保存多少个日志文件
  16. rotation_max_age: 7 # 单个日志文件最大保存时间,单位天
  17. output_level: info # 日志级别
  18. resolvers: # DNS 解析插件
  19. - name: dnsagent # 普通的 DNS 解析
  20. dns_ttl: 10 # dns 记录的 TTL
  21. enable: true # 插件是否启用
  22. suffix: "." # 决定哪些域名解析会先通过 polaris-sidecar,默认为全部域名,用户可以设置改配置来控制需要经过 polaris-sidecar 解析域名
  23. option:
  24. route_labels: "key: value" # 当前 polaris-sidecar 的静态标签信息,用于服务路由
  25. - name: meshproxy # 工作在 kubernetes 下的 mesh 模式
  26. dns_ttl: 120
  27. enable: false
  28. option:
  29. reload_interval_sec: 30 # 定时与北极星服务端进行同步服务列表
  30. dns_answer_ip: 10.4.4.4 # 返回给 envoy 的 IP 信息

polaris-go SDK 配置

  1. global:
  2. serverConnector:
  3. addresses:
  4. - 127.0.0.1:8091 # 设置北极星服务端 gRPC 服务发现接入地址
  5. location: # 用于就近接入
  6. provider: env # 默认从环境变量中读取地理位置信息

快速接入

基于 DNS 的北极星服务发现接入支持虚拟机以及 kubernetes 两种部署环境。您可以根据实际部署场景选择其中一种接入方式。

虚拟机接入

部署 polaris

如果已经部署好了 polaris,可忽略这一步。

安装 polaris-sidecar

  • 虚拟机安装过程需要使用 root 用户或者具有超级管理员权限的用户来执行,并且确保 53(udp/tcp)端口没有被占用。

  • 需要从 Releases 下载最新版本的安装包。

  • 上传安装包到虚拟机环境中,并进行解压,进入解压后的目录。

    1. unzip polaris-sidecar-release_$version.$os.$arch.zip
  • 修改 polaris.yaml,写入部署好的北极星服务端的地址,端口号使用8091(GRPC端口)。

    1. global:
    2. serverConnector:
    3. addresses:
    4. - {北极星服务端IP}:8091
  • 关闭系统自身的 dns resolve 进程

    1. # 关闭 systemd-resolved 进程
    2. systemctl stop systemd-resolved
    3. # 如果想恢复原本的 systemd-resolved,执行下面命令
    4. # systemctl start systemd-resolved
  • 进入解压后的目录,执行 tool/start.sh 进行启动,然后执行 tool/p.sh 查看进程是否启动成功。

    1. # bash tool/start.sh
    2. # bash ./tool/p.sh
    3. root 15318 1 0 Jan22 ? 00:07:50 ./polaris-sidecar start
  • 使用 root 权限修改 /etc/resolv.conf,在文件中添加 nameserver 127.0.0.1,并且添加到所有的 nameserver 记录前面,如下:

    1. ; generated by /usr/sbin/dhclient-script
    2. nameserver 127.0.0.1
    3. nameserver x.x.x.x

验证

使用格式为<service>.<namespace>的域名进行访问,预期可以获得服务下某个实例的 IP 地址。

  1. dig polaris.checker.polaris
  2. ...
  3. ;; ANSWER SECTION:
  4. polaris.checker.polaris. 10 IN AAAA ::ffff:127.0.0.1
  5. ...

到这里,在虚拟机环境下通过 DNS 接入北极星的服务发现就完成了。

Kubernetes 接入

部署 polaris

如果已经部署好了 polaris,可忽略这一步。

部署 polaris-controller

开启 polaris-sidecar 注入

  • 为某个 kubernetes 命名空间启用 polaris-sidecar 注入:

    1. # 为某个 kubernetes 命名空间开启 polaris sidecar 的注入
    2. kubectl label namespace ${kubernetes namespace} polaris-injection=enabled
    3. # 设置注入的 polaris sidecar 以 dns 模式运行
    4. kubectl label namespace ${kubernetes namespace} polaris-sidecar-mode=dns

验证

  • 下载样例部署文件

  • 执行部署:kubectl create -f deployment.yaml

  • 查看容器注入是否注入成功,启动自动注入后,polaris-controller 会将 Polaris Sidecar 容器注入到在此命名空间下创建的 pod 中。可以看到运行起来的 pod 均包含两个容器,其中第一个容器是用户的业务容器,第二个容器是由 Polaris Controller 注入器注入的 Polaris Sidecar 容器。您可以通过下面的命令来获取有关 pod 的更多信息:

    1. kubectl describe pods -l k8s-app=polaris-dns-provider --namespace=default
  • 进入验证 POD, 执行 curl 命令

    1. kubectl exec -it polaris-dns-consumer-xxx -n default -- /bin/bash
    2. curl http://echoserver.default:10000/echo

使用高级功能

在使用高级功能时,先创建一个测试服务,用于接下来的功能测试

  • 创建测试服务 test.echoserver

    DNS 接入 - 图2

使用就近路由

可以通过设置环境变量,指定 polaris-sidecar 实例所处的地理位置信息,当 polaris-sidecar 执行 DNS 服务发现时,会根据自身的地域信息,对目标服务实例进行就近匹配。

假定一个场景:

  • 存在以下三个地域
    • region=region-1、zone=zone-1、campus=campus-1
    • region=region-2、zone=zone-2、campus=campus-2
    • region=region-3、zone=zone-3、campus=campus-3
  • polaris-sidecar 如果处于 region=region-1、zone=zone-1、campus=campus-1,则优先选择相同地域的实例

使用方式

  • 虚拟机
  • Kubernetes

  • 设置地域信息环境变量

    1. export POLARIS_INSTANCE_REGION=${ REGION 信息 }
    2. export POLARIS_INSTANCE_ZONE=${ ZONE 信息 }
    3. export POLARIS_INSTANCE_CAMPUS=${ CAMPUS 信息 }
  • 重启 polaris-sidecar

    1. bash tool/stop.sh
    2. bash tool/start.sh
  • 调整 polaris-sidecar container 的 ENV 信息

    1. containers:
    2. - image: polarismesh/polaris-sidecar:${sidecar 的版本}
    3. name: polaris-sidecar
    4. ...
    5. env:
    6. - name: POLARIS_INSTANCE_REGION
    7. value: "{ REGION 信息 }"
    8. - name: POLARIS_INSTANCE_ZONE
    9. value: "{ ZONE 信息 }"
    10. - name: POLARIS_INSTANCE_CAMPUS
    11. value: "{ CAMPUS 信息 }"
    12. ...
  • 重建 POD

    1. kubectl delete pod {POD 名称} --namespace {命名空间}

验证

执行 dig 命令验证

  1. # 地域信息分别为 region=region-1、zone=zone-1、campus=campus-1
  2. dig test.echoserver.default
  3. ...
  4. ;; ANSWER SECTION:
  5. test.echoserver.default. 10 IN A 1.1.1.1
  6. ...
  7. # 地域信息分别为 region=region-2、zone=zone-2、campus=campus-2
  8. dig test.echoserver.default
  9. ...
  10. ;; ANSWER SECTION:
  11. test.echoserver.default. 10 IN A 2.2.2.2
  12. ...
  13. # 地域信息分别为 region=region-3、zone=zone-3、campus=campus-3
  14. dig test.echoserver.default
  15. ...
  16. ;; ANSWER SECTION:
  17. test.echoserver.default. 10 IN A 3.3.3.3
  18. ...

使用动态路由

假定一个场景:

  • 希望 env 为 dev 的请求,路由到 env 标签为 dev 的实例上
  • 希望 env 为 pre 的请求,路由到 env 标签为 pre 的实例上
  • 其他则路由到 env 标签为 prod 的实例上

    DNS 接入 - 图3 DNS 接入 - 图4

说明:

  • 当前 DNS 服务发现仅支持静态标签动态路由,暂不支持请求级别的动态路由
  • 动态路由相关规则配置请参考: 控制台使用-动态路由

使用方式

  • 虚拟机
  • Kubernetes

  • 调整 polaris-sidecar 配置文件

    1. ...
    2. resolvers:
    3. - name: dnsagent
    4. ...
    5. option:
    6. route_labels: "env:dev"
  • 重启 polaris-sidecar

    1. bash tool/stop.sh
    2. bash tool/start.sh
  • 调整 polaris-sidecar container 的 ENV 信息

    1. containers:
    2. - image: polarismesh/polaris-sidecar:${sidecar 的版本}
    3. name: polaris-sidecar
    4. ...
    5. env:
    6. - name: SIDECAR_DNS_ROUTE_LABELS
    7. value: "env:dev"
    8. ...
  • 重建 POD

    1. kubectl delete pod {POD 名称} --namespace {命名空间}

验证

执行 dig 命令验证

  1. # 设置 route_labels: "env: dev"
  2. dig test.echoserver.default
  3. ...
  4. ;; ANSWER SECTION:
  5. test.echoserver.default. 10 IN A 1.1.1.1
  6. ...
  7. # 设置 route_labels: "env: pre"
  8. dig test.echoserver.default
  9. ...
  10. ;; ANSWER SECTION:
  11. test.echoserver.default. 10 IN A 2.2.2.2
  12. ...
  13. # 设置 route_labels: ""
  14. dig test.echoserver.default
  15. ...
  16. ;; ANSWER SECTION:
  17. test.echoserver.default. 10 IN A 3.3.3.3
  18. ...