kubernetes 集群内,应用可能会遇到 dns 性能问题。可以在 Pod 内增加 nscd 来增强性能,该方法需要重制镜像;
下面介绍一种给业务 Pod 添加 dns cache sidecar 来增强 dns 性能的方法,虽然无需重制镜像,但需要改动应用 YAML 配置。可以根据实际情况选择合适优化方法。
部署 dns-cache 配置
将下列 dns-cache 的配置部署到应用的命名空间。该配置说明:
- 输出 log 和 errors 信息到标准输出。
- 将 dns 查询请求转发到 /etc/resolv.conf 配置的上游 dns 服务器中。
- cache 所有请求 30s。(可以调整 cache 时间,配置 prefetch 策略。)
- 配置 reload ,当该配置文件有变动时,可以自动 reload 并应用新配置。
apiVersion: v1
kind: ConfigMap
data:
Corefile: |
.:53 {
errors
log
forward . /etc/resolv.conf
cache 30
reload
}
metadata:
name: dns-cache
给业务 Pod 配置 dns sidecar
- 给 pod 配置 sidecar dns-cache。
- 通过 postStart 机制,调整业务容器的 dns 配置,把 sidecar 地址作为首选项。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: ubuntu
labels:
app: ubuntu
spec:
replicas: 1
template:
metadata:
labels:
app: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
command: ["sleep", "100000"]
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo \"$(sed \'1i nameserver 127.0.0.1\' /etc/resolv.conf)\" > /etc/resolv.conf"]
- name: dns-cache
image: registry.cn-hangzhou.aliyuncs.com/acs/coredns:1.6.2
args: [ "-conf", "/etc/coredns/Corefile" ]
volumeMounts:
- mountPath: /etc/coredns
name: config-volume
readOnly: true
volumes:
- name: config-volume
configMap:
name: dns-cache
items:
- key: Corefile
path: Corefile