支持自定义DNSConfig
为了兼容原生kubernetes Pod使用节点默认NameServers能力,CCE+BCI提供vk支持自定义DNSConfig的方案。
1. VirtualKubelet DNSConfig 介绍
DNSConfig 功能介绍参考:https://kubernetes.io/zh-cn/docs/concepts/services-networking/dns-pod-service/
在 BCI 中 对 DNSPolicy 和 DNSConfig 支持情况如下:
| DNS策略 | 说明 | 备注 | 
|---|---|---|
| Default | Pod 从运行所在的节点继承名称解析配置。 | |
| ClusterFirst | 与配置的集群域后缀不匹配的任何 DNS 查询(例如 "www.kubernetes.io") 都会由 DNS 服务器转发到上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。 | |
| ClusterFirstWithHostNet | 对于以 hostNetwork 方式运行的 Pod,应将其 DNS 策略显式设置为 "ClusterFirstWithHostNet"。否则,以 hostNetwork 方式和 "ClusterFirst" 策略运行的 Pod 将会做出回退至 "Default" 策略的行为。 | 在 BCI 中,不支持使用 HostNetwork;所以不支持该 DNS 策略; | 
| None | 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig 字段所提供的 DNS 设置。 | 
2. 使用限制
- kubernetes 集群版本 >= 1.18
- cce-virtual-kubelet 版本 >= 0.3.1
3. 注意事项
建议用户自定义 Pod DNSConfig 时,NameServers 中建议仅包含一个 IP 地址。 原因如下:
- Kubernetes 限制 DNSConfig 的 NameServers 中最多包含 3 个 IP;
- BCI 后端会默认在 Pod 的 DNSConfig 中注入一个 IP;
- 当需要在用户集群使用 Service 服务发现时,VirtualKubelet 也会默认在 DNSConfig 中注入一个 IP;
3.1 设置自定义DNSConfig的方法
- 通过CCE组件中心安装VK组件且cce-virtual-kubelet版本大于等于0.3.15,通过bci-profile设置自定义dns配置,详见[操作文档];(https://cloud.baidu.com/doc/BCI/s/Vm5ux9u97)
- helm安装且cce-virtual-kubelet版本小于0.3.15,则直接修改helm charts中dnsConfig配置;
4. 使用场景
4.1 使用 DNSPolicy 为 Default
该场景下,按照 Kubernetes 行为,预期为:“Pod 从运行所在的节点继承名称解析配置”,即需要继承 VKNode 的解析配置。
在使用该功能之前,您需要先对 VirtualKubelet 完成配置,指定注册到 VKNode 中的 DNSConfig:
在 cce-virtual-kubelet 的 helm charts 中包含 dnsConfig 配置,默认为空:
1dnsConfig: {}你可以按照自己的期望配置,例如:
1dnsConfig:
2  nameservers:
3    - 169.254.20.10
4    - 172.21.0.10
5  options:
6    - name: ndots
7      value: "3"
8    - name: attempts
9      value: "2"
10    - name: timeout
11      value: "1"
12  searches:
13    - default.svc.cluster.local
14    - svc.cluster.local
15    - cluster.local在创建 Pod 时,您需要将 dnsPolicy 指定为 Default,例如:
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: default
5spec:
6  replicas: 1
7  selector:
8    matchLabels:
9      app: default
10  template:
11    metadata:
12      labels:
13        app: default
14    spec:
15      nodeSelector:
16        type: "virtual-kubelet"
17      tolerations:
18      - key: "virtual-kubelet.io/provider"
19        operator: "Equal"
20        value: "baidu"
21        effect: "NoSchedule"
22      containers:
23      - name: main
24        image: hub.baidubce.com/cce/nginx-alpine-go:latest
25        ports:
26        - containerPort: 80
27        resources:
28          limits:
29            cpu: 250m
30            memory: 512Mi
31          requests:
32            cpu: 250m
33            memory: 512Mi
34      dnsPolicy: Default # 指定 dnsPolicy 为 Default此时 VirtualKubelet 将在 BCI 创建 Pod 时,继承您在 VirtualKubelet 中指定的 DNSConfig。
注意,当 DNSPolicy 为 Default 时,VirtualKubelet 不会自动为注入 DNSConfig。
4.2 使用 DNSPolicy 为 None
该场景下,按照 Kubernetes 行为,预期为:“Pod 会使用其 dnsConfig 字段所提供的 DNS 设置”。 您无需对 VirtualKubelet 做额外配置。 则用户需要明确在 Pod 中填写dnsConfig:
1apiVersion: v1
2kind: Pod
3metadata:
4  namespace: default
5  name: dns-example
6spec:
7  containers:
8    - name: test
9      image: nginx
10  dnsPolicy: "None"
11  dnsConfig:
12    nameservers:
13      - 192.0.2.1 # 这是一个示例
14    searches:
15      - ns1.svc.cluster-domain.example
16      - my.dns.search.suffix
17    options:
18      - name: ndots
19        value: "2"此时 VirtualKubelet 将在 BCI 创建 Pod 时,将直接使用您在 Pod 中填写的 DNSConfig。
注意,当 DNSPolicy 为 None 时,VirtualKubelet 不会自动为注入 DNSConfig。
4.3 使用 DNSPolicy 为 ClusterFirst
该场景下,按照 Kubernetes 行为,预期为:“转发到上游名称服务器”。
当前在 BCI 场景下与标准 Kubernetes 有区别,需要在 Pod 中添加 annotation bci.virtual-kubelet.io/kube-proxy-enabled: "true",才会默认注入 DNSConfig,用于解析集群中的域名。
参考:https://cloud.baidu.com/doc/CCE/s/Qkhfxcry7
示例 Pod:
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: busybox
5spec:
6  selector:
7    matchLabels:
8      app: busybox
9  replicas: 1
10  template:
11    metadata:
12      labels:
13        app: busybox
14      annotations:
15        bci.virtual-kubelet.io/kube-proxy-enabled: "true" # 开启 kube-proxy
16    spec:
17      containers:
18      - name: busybox
19        image: busybox
20        command: [ "/bin/sh", "-c", "sleep 3600" ]VirtualKubelet 在创建 Pod 时,将注入如下 DNSConfig,用于实现 集群内 的服务发现:
1dnsConfig:
2  nameservers:
3    - ${coredns clusterip}
4  options:
5    - name: ndots
6      value: "5"
7  searches:
8    - default.svc.cluster.local
9    - svc.cluster.local
10    - cluster.local