我会用非常具体的方式来解释我的问题,但我认为这比用抽象的方式解释要好…
例如,在库伯内特斯集群之外但在网络中有一个MongoDB副本集。副本集所有成员的IP地址由应用服务器和数据库服务器中的 /etc/hosts解析。
在实验/过渡阶段,我需要从kubernetes pod访问那些mongodb服务器。然而,kubernetes似乎不允许在pod/容器中添加自定义条目来 /etc/hosts。
MongoDB副本集已经在处理大型数据集,在集群中创建新的副本集不是一个选项。
因为我使用GKE,所以我想应该避免更改库贝-dns命名空间中的任何资源。配置或替换库贝-dns以适合我的需要是最后一件事。
有没有办法解析库伯内特斯集群中自定义主机名的IP地址?
这只是一个想法,但是如果kube2sky可以读取config map的一些条目并将它们用作dns记录,那就太好了。例如rep1. mongo.local:192.168.10.100
。
编辑:我引用了https://github.com/kubernetes/kubernetes/issues/12337的问题
现在这个问题有两种可能的解决方案:
DNS
)从Kunbernetes 1.7开始,现在可以直接使用. spec.hostAliase
将条目添加到Pod的/etc/host
例如:要将foo. local
、bar.local
解析为127.0.0.1
和foo.Remote
、bar.Remote
解析为10.1.2.3,您可以在.spec.hostAliase
下为Pod配置HostAliase:
apiVersion: v1
kind: Pod
metadata:
name: hostaliases-pod
spec:
restartPolicy: Never
hostAliases:
- ip: "127.0.0.1"
hostnames:
- "foo.local"
- "bar.local"
- ip: "10.1.2.3"
hostnames:
- "foo.remote"
- "bar.remote"
containers:
- name: cat-hosts
image: busybox
command:
- cat
args:
- "/etc/hosts"
从库伯内特斯v1.12开始,CoreDNS
是推荐的DNS服务器,取代了库贝-dns。如果您的集群最初使用
库贝-dns
,您可能仍然部署了库贝-dns
而不是CoreDNS
。我将假设您使用CoreDNS
作为您的K8SDNS。
在CoreDNS中,可以在集群域中添加任意条目,这样所有pod都可以直接从DNS解析此条目,而无需更改每个pod中的每个/etc/host
文件。
第一:
让我们更改coreos ConfigMap并添加所需的更改:
kubectl edit cm coredns -n kube-system
apiVersion: v1
kind: ConfigMap
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
hosts /etc/coredns/customdomains.db example.org {
fallthrough
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . "/etc/resolv.conf"
cache 30
loop
reload
loadbalance
}
customdomains.db: |
10.10.1.1 mongo-en-1.example.org
10.10.1.2 mongo-en-2.example.org
10.10.1.3 mongo-en-3.example.org
10.10.1.4 mongo-en-4.example.org
基本上我们添加了两件事:
>
在
插件,并使用kubernetes
插件之前托管host
插件的回退
选项来满足我们的案例。
为了进一步阐明回退
选项。任何给定的后端通常是其区域的最终单词——它要么返回结果,要么返回NXDOMAIN进行查询。然而,有时这不是所需的行为,因此一些插件支持回退
选项。当启用回退
时,插件将在未找到记录时返回NXDOMAIN,而不是在链中向下传递请求。链更下游的后端然后有机会处理请求,在我们的例子中,该后端是kubernetes
。
我们在ConfigMap中添加了一个新文件(自定义域. db
),并在其中添加了自定义域(mongo-en-*.example.org)。
最后一件事是记住将自定义域. db
文件添加到CoreDNS pod模板的config-卷
:
kubectl edit -n kube-system deployment coredns
volumes:
- name: config-volume
configMap:
name: coredns
items:
- key: Corefile
path: Corefile
- key: customdomains.db
path: customdomains.db
最后让kubernetes重新加载CoreDNS(每个pod运行):
$ kubectl rollout restart -n kube-system deployment/coredns
@OxMH的回答非常棒,为了简洁可以简化。CoreDNS允许您直接在host插件(https://coredns.io/plugins/hosts/#examples)中指定主机。
因此,可以像这样编辑ConfigMap:
$ kubectl edit cm coredns -n kube-system
apiVersion: v1
kind: ConfigMap
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
hosts {
10.10.1.1 mongo-en-1.example.org
10.10.1.2 mongo-en-2.example.org
10.10.1.3 mongo-en-3.example.org
10.10.1.4 mongo-en-4.example.org
fallthrough
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . "/etc/resolv.conf"
cache 30
loop
reload
loadbalance
}
您仍然需要重新启动coredns,以便它重新读取配置:
$ kubectl rollout restart -n kube-system deployment/coredns
内联主机文件的内容消除了从配置图映射主机文件的需要。这两种方法实现了相同的结果,取决于您想要在哪里定义主机的个人偏好。
访问kubernetes之外的主机或ips需要一种外部名称。
以下对我有用。
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "tiny-server-5",
"namespace": "default"
},
"spec": {
"type": "ExternalName",
"externalName": "192.168.1.15",
"ports": [{ "port": 80 }]
}
}