如何为 pods 使用 Kubernetes DNS?
how to use Kubernetes DNS for pods?
在 GKE 上,kube-dns 在我的节点上 运行,我可以看到 docker 个容器。
我确实可以按名称访问 Services,这对于负载平衡是非常合适的解决方案的所有这些应用程序来说都很棒,但是 我将如何使用访问个人的 DNS pods?
我知道我可以在 API 中查找特定的 pods,但我需要自己更新 hosts
文件,并继续关注播客列表。 DNS 应该为我做这件事,那么在 pod 中使用它意味着什么?
Kubernetes 文档说 DNS 信息需要传递给 kubelet,但据我所知,我无法在 GKE 上访问它,所以它只是没有在 GKE 上以这种方式设置,还是有什么事情要做激活它?
我的一些服务(尤其是 zookeeper)知道它自己的其他节点,并尝试通过主机名(即 pod 名称)连接到它们并且失败,除非我更新 hosts
自己归档。我想为此使用集成的 DNS 服务。
任何有关如何执行此操作的指导将不胜感激。
谢谢
更新
根据文档,格式现在是:
_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local
在此处查看相关文档:
https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods
原始答案:
截至目前,这实际上是不可能的......但 Kubernetes 团队正在研究它。
看到这个问题:https://github.com/kubernetes/kubernetes/issues/13552
更新:
自 09/2015 起 Pods 可以使用 DNS
见公关:https://github.com/kubernetes/kubernetes/pull/13759
简而言之:
This will give pods dns in the form of
<podIP>.<namespace>.pod.<clusterSuffix>
Currently can be disabled, but
is either on for all pods or off.
Kubernetes statefulset支持关联服务名,并通过服务名定义pod dns名称。
比如你创建了一个zk daemonset,一个zk service,那么zk daemonset的第一个pod的dns名称是zk-0.$(namespace).svc.cluster.local
更多详情请见:
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
重要提示:服务必须为“headless”才能正常工作,即.spec.clusterIP
必须是None
。
Kubernetes 为 StatefulSet
的所有组件提供稳定的网络 ID
考虑以下示例:
kind: Namespace
apiVersion: v1
metadata:
name: mynamespace
---
apiVersion: v1
kind: Service
metadata:
name: myservice
namespace: mynamespace
labels:
app: myapp
spec:
ports:
- port: 80
name: http
type: ClusterIP
selector:
app: myapp
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
namespace: mynamespace
spec:
serviceName: myservice
replicas: 2
selector:
matchLabels:
app: myapp
# ...
然后您将在 k8s 集群中拥有以下可解析的 DNS 条目:
myservice.mynamespace.svc.cluster.local
用于通过 myservice
对 myapp
pods 之一的负载均衡访问
myapp-0.myservice.mynamespace.svc.cluster.local
用于直接访问 myapp
StatetefulSet
的 Pod 0
myapp-1.myservice.mynamespace.svc.cluster.local
用于直接访问 myapp
StatetefulSet
的 Pod 1
文档:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#stable-network-id
在 GKE 上,kube-dns 在我的节点上 运行,我可以看到 docker 个容器。
我确实可以按名称访问 Services,这对于负载平衡是非常合适的解决方案的所有这些应用程序来说都很棒,但是 我将如何使用访问个人的 DNS pods?
我知道我可以在 API 中查找特定的 pods,但我需要自己更新 hosts
文件,并继续关注播客列表。 DNS 应该为我做这件事,那么在 pod 中使用它意味着什么?
Kubernetes 文档说 DNS 信息需要传递给 kubelet,但据我所知,我无法在 GKE 上访问它,所以它只是没有在 GKE 上以这种方式设置,还是有什么事情要做激活它?
我的一些服务(尤其是 zookeeper)知道它自己的其他节点,并尝试通过主机名(即 pod 名称)连接到它们并且失败,除非我更新 hosts
自己归档。我想为此使用集成的 DNS 服务。
任何有关如何执行此操作的指导将不胜感激。
谢谢
更新
根据文档,格式现在是:
_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local
在此处查看相关文档: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods
原始答案:
截至目前,这实际上是不可能的......但 Kubernetes 团队正在研究它。
看到这个问题:https://github.com/kubernetes/kubernetes/issues/13552
更新:
自 09/2015 起 Pods 可以使用 DNS 见公关:https://github.com/kubernetes/kubernetes/pull/13759
简而言之:
This will give pods dns in the form of
<podIP>.<namespace>.pod.<clusterSuffix>
Currently can be disabled, but is either on for all pods or off.
Kubernetes statefulset支持关联服务名,并通过服务名定义pod dns名称。
比如你创建了一个zk daemonset,一个zk service,那么zk daemonset的第一个pod的dns名称是zk-0.$(namespace).svc.cluster.local
更多详情请见: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
重要提示:服务必须为“headless”才能正常工作,即.spec.clusterIP
必须是None
。
Kubernetes 为 StatefulSet
考虑以下示例:
kind: Namespace
apiVersion: v1
metadata:
name: mynamespace
---
apiVersion: v1
kind: Service
metadata:
name: myservice
namespace: mynamespace
labels:
app: myapp
spec:
ports:
- port: 80
name: http
type: ClusterIP
selector:
app: myapp
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
namespace: mynamespace
spec:
serviceName: myservice
replicas: 2
selector:
matchLabels:
app: myapp
# ...
然后您将在 k8s 集群中拥有以下可解析的 DNS 条目:
myservice.mynamespace.svc.cluster.local
用于通过myservice
对 myapp-0.myservice.mynamespace.svc.cluster.local
用于直接访问myapp
StatetefulSet
的 Pod 0
myapp-1.myservice.mynamespace.svc.cluster.local
用于直接访问myapp
StatetefulSet
的 Pod 1
myapp
pods 之一的负载均衡访问
文档:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#stable-network-id