如何配置kubernetes dns
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何配置kubernetes dns相关的知识,希望对你有一定的参考价值。
创建一个简单的 Pod 来用作测试环境
使用以下内容创建一个名为 busybox.yaml 的文件:
busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
然后使用此文件创建一个 pod 并验证其状态:
$ kubectl create -f busybox.yaml
pod "busybox" created
$ kubectl get pods busybox
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 <some-time>
一旦该 pod 运行,您就可以在环境中执行 nslookup。如果您看到如下所示的内容,则 DNS 工作正常。
$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server: 10.0.0.10
Address 1: 10.0.0.10
Name: kubernetes.default
Address 1: 10.0.0.1
如果 nslookup 命令失败,请检查以下内容:
首先检查本地 DNS 配置
看一看 resolv.conf 文件。(有关更多信息,请参阅 从节点继承 DNS 和 下面的 已知问题)
$ kubectl exec busybox cat /etc/resolv.conf
验证搜索路径和名称服务器是否设置如下(请注意,搜索路径可能因不同的云提供商而异):
search default.svc.cluster.local svc.cluster.local cluster.local google.internal c.gce_project_id.internal
nameserver 10.0.0.10
options ndots:5
以下错误表明 kube-dns 附加组件或相关服务存在问题:
$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server: 10.0.0.10
Address 1: 10.0.0.10
nslookup: can't resolve 'kubernetes.default'
或者
$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server: 10.0.0.10
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local
nslookup: can't resolve 'kubernetes.default'
检查 DNS pod 是否正在运行中
使用 kubectl get pods 命令验证 DNS pod 是否正在运行中。
$ kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
...
kube-dns-v19-ezo1y 3/3 Running 0 1h
如果您看到没有 pod 正在运行中,或者 pod 已失败/已完成,那么在当前环境中,默认情况下可能不会部署 DNS 插件,您将不得不手动部署它。
检查 DNS pod 中的错误
使用 kubectl logs 命令查看 DNS 守护程序的日志。
$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns
$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq
$ kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c sidecar
看看有没有可疑的日志。字母 ‘W‘、’E‘、’F’ 表示警告、错误和失败。请搜索具有这些日志级别的条目,并使用 kubernetes 问题 来报告意外错误。
DNS服务起来了吗?
通过使用 kubectl get service 命令验证 DNS 服务已启动。
$ kubectl get svc --namespace=kube-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
...
kube-dns 10.0.0.10 <none> 53/UDP,53/TCP 1h
...
如果您已经创建了该服务,或者应该在默认情况下创建它,但它没有出现,请参阅 调试服务 以获取更多信息。
DNS endpoints 是否暴露?
您可以使用 kubectl get endpoints 命令验证是否暴露了了 DNS endpoints。
$ kubectl get ep kube-dns --namespace=kube-system
NAME ENDPOINTS AGE
kube-dns 10.180.3.17:53,10.180.3.17:53 1h
如果您没有看到 endpoints,请参阅 调试服务 文档中的 endpoints 部分 。
有关其他 Kubernetes DNS 示例,请参阅 Kubernetes GitHub 仓库中的 cluster-dns 示例。
已知问题
Kubernetes 安装不会将节点的 resolv.conf 文件配置为默认使用集群 DNS,因为该过程本身就是发行版的。最终可能会这么实现。
Linux 的 libc 不可能摆脱(见 2005 年的这个 bug)只有 3 个 DNS nameserver 记录和 6 个 DNS search 记录的限制。Kubernetes 需要消耗 1 个 nameserver 记录和 3 条 search 记录。这意味着如果本地安装已经使用了 3 个 nameserver 或使用了多于 3 条 search,那么其中一些设置将会丢失。作为部分解决方法,节点可以运行 dnsmasq,它将提供更多 nameserver 条目,但没有更多的 search 条目。您也可以使用 kubelet --resolv-conf 标志。
如果您使用 Alpine 3.3 或更低版本作为您的基本镜像,由于 Alpine 的某些已知问题,DNS 可能无法正常工作。
kubernetes 调试 DNS 解析
第二种接近答案
确:其minion/etc/kubernetes配置拷贝安装kubeletkube-proxy启两服务本回答被提问者采纳
如何使多个DNS指向Kubernetes中的一个服务
当我们使用docker-compose
时,我们可以通过links
将多个别名映射到一个容器/服务。例如,bucket1.s3
和bucket2.s3
是容器s3
的别名。现在,当我们转向kubernetes时,我正在尝试使用服务发现来做同样的事情并链接容器。
我现在能想到的是为每个桶提供一个服务,每个服务将指向同一个pod。这看起来很多工作。有没有办法让多个DNS映射到一个服务,所以bucket1.s3.namespace.svc.cluster.local
和bucket2.s3.namespace.svc.cluster.local
都可以解析为s3
服务?
我相信你可能想要的是一个映射到两个部署的服务,你可以有两个deployments,名称为bucket1和bucket2,并用一个标签app: buckets
标记,然后有一个包含该标签的选择器的服务。
apiVersion: apps/v1
kind: Deployment
metadata:
name: bucket1
labels:
app: buckets
spec:
replicas: 3
selector:
matchLabels:
app: buckets
template:
metadata:
labels:
app: buckets
spec:
containers:
- name: bucket-container
image: bucketimage
ports:
- containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
name: bucket2
labels:
app: buckets
spec:
replicas: 3
selector:
matchLabels:
app: buckets
template:
metadata:
labels:
app: buckets
spec:
containers:
- name: bucket-container
image: bucketimage
ports:
- containerPort: 80
kind: Service
apiVersion: v1
metadata:
name: s3
spec:
selector:
app: buckets
ports:
- protocol: TCP
port: 80
但另一个问题是你为什么要这样做呢?如果bucket1和bucket2都包含不同的信息/数据。
通常使用Kubernetes,假设数据相同,您将有一个具有多个pod /副本的部署来在bucket1或bucket2中提供数据。如果数据不同,为什么不具有2个具有不同DNS条目的部署。
如果您使用的是K8s 1.11或更高版本,您也可以在tweak the coredns ConfigMap
命名空间中使用kube-system
来获得您想要获得的内容,但根据RFC 1034,第3.6.2节中的DNS you can't have a single record map to two CNAMEs。您不能在Kubernetes中对IP进行硬编码,因为您的IP在创建/删除pod时总是会更改。
以上是关于如何配置kubernetes dns的主要内容,如果未能解决你的问题,请参考以下文章