支持自定义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
- VirtualKubelet 版本 >= 0.3.1
3. 注意事项
建议用户自定义 Pod DNSConfig 时,NameServers 中建议仅包含一个 IP 地址。 原因如下:
- Kubernetes 限制 DNSConfig 的 NameServers 中最多包含 3 个 IP;
- BCI 后端会默认在 Pod 的 DNSConfig 中注入一个 IP;
- 当需要在用户集群使用 Service 服务发现时,VirtualKubelet 也会默认在 DNSConfig 中注入一个 IP;
4. 使用场景
4.1 使用 DNSPolicy 为 Default
该场景下,按照 Kubernetes 行为,预期为:“Pod 从运行所在的节点继承名称解析配置”,即需要继承 VKNode 的解析配置。
在使用该功能之前,您需要先对 VirtualKubelet 完成配置,指定注册到 VKNode 中的 DNSConfig:
在 cce-virtual-kubelet 的 helm charts 中包含 dnsConfig 配置,默认为空:
dnsConfig: {}
你可以按照自己的期望配置,例如:
dnsConfig:
nameservers:
- 169.254.20.10
- 172.21.0.10
options:
- name: ndots
value: "3"
- name: attempts
value: "2"
- name: timeout
value: "1"
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
在创建 Pod 时,您需要将 dnsPolicy 指定为 Default,例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: default
spec:
replicas: 1
selector:
matchLabels:
app: default
template:
metadata:
labels:
app: default
spec:
nodeSelector:
type: "virtual-kubelet"
tolerations:
- key: "virtual-kubelet.io/provider"
operator: "Equal"
value: "baidu"
effect: "NoSchedule"
containers:
- name: main
image: hub.baidubce.com/cce/nginx-alpine-go:latest
ports:
- containerPort: 80
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
dnsPolicy: Default # 指定 dnsPolicy 为 Default
此时 VirtualKubelet 将在 BCI 创建 Pod 时,继承您在 VirtualKubelet 中指定的 DNSConfig。
注意,当 DNSPolicy 为 Default 时,VirtualKubelet 不会自动为注入 DNSConfig。
4.2 使用 DNSPolicy 为 None
该场景下,按照 Kubernetes 行为,预期为:“Pod 会使用其 dnsConfig 字段所提供的 DNS 设置”。 您无需对 VirtualKubelet 做额外配置。 则用户需要明确在 Pod 中填写dnsConfig:
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: dns-example
spec:
containers:
- name: test
image: nginx
dnsPolicy: "None"
dnsConfig:
nameservers:
- 192.0.2.1 # 这是一个示例
searches:
- ns1.svc.cluster-domain.example
- my.dns.search.suffix
options:
- name: ndots
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:
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
spec:
selector:
matchLabels:
app: busybox
replicas: 1
template:
metadata:
labels:
app: busybox
annotations:
bci.virtual-kubelet.io/kube-proxy-enabled: "true" # 开启 kube-proxy
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh", "-c", "sleep 3600" ]
VirtualKubelet 在创建 Pod 时,将注入如下 DNSConfig,用于实现 集群内 的服务发现:
dnsConfig:
nameservers:
- ${coredns clusterip}
options:
- name: ndots
value: "5"
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local