3个概念pod、endpoint、service
-
pod
一组container组成,被RC(replicationController)、Deployment、DaemonSet、Job、StatefulSet管理
-
endpoint
每个pod都提供一个独立的endpoint(PodIP + ContainerPort)以被客户端访问
-
service
由多个pod副本组成,通过selector来选择。相同label的pod组成一个servie。
解决问题:service对于的ClusterIP在service的生命周期内不会变化。而pod的endpoint会随pod的改变而改变。
k8s的服务发现机制
一般分布式系统服务发现实现:服务提供API接口等待抓取数据实现。
k8s通过DNS系统实现。解决service的名字与clusterIP的映射。
DNS系统的组件
-
etcd: DNS存储(域名与IP)
key: /dns服务名(skydns)/local/cluster/namespace/serviceName
value: 对应clusterIP
-
kube2sky:通过k8s master获取都所有service注册到etcd
-
skyDNS: k8s里的DNS域名解析服务器 (有一个service)
-
healthz: 提供对kube2sky的健康检测
分两步实现
-
kube2sky通过master的获取与更新所有service的映射数据到etcd的数据。
-
pod配置skydns到/etc/resolv.conf,当需要访问其他其他service(对应其他pod)时,先通过skydns解析(去etcd获取)到对应的clusterIP,再由kube-proxy转发到pod。
配置注意
-
kube2sky启动参数
--kube_master_url=http://k8s-master-ip:port
--domain=xxx
(一般为cluster.local) -
node节点kubelet启动参数
--cluseter-dns=DNS服务的clusterIP
--cluster_domain=cluster.local
-
kube2sky为service生成2条记录:
service_name.namespace_name.domain
、service_name.namespace_name.svc.domain
k8s引入其他DNS
- 存根域: 公司自建服务发现系统(如cosul)完成域名解析
- 外部上游域名:8.8.8.8 (google的DNS服务)
用configMap配置存根域和上游DNS服务
apiVersion: v1
kind: ConfigMap
.......
data:
stubDomains: | # 存根域
{"out-of.kuberneters": ["10.10.10.5"]}
upstreamNameservers: | # 上游dns
["8.8.8.8","8.8.8.4"]
解析过程
k8s的pod支持两种策略:Default、ClusterFirst
- Default : 域名解析配置从pod的/etc/resolv.conf继承
- ClusterFirst: Dns查询被发送到kube-dns(skydns)服务,以域名后缀进行服务名解析
当pod的dnsPolicy为CulsterFirst
时,域名解析会先发送到kube-dns的DNS缓存层,检查域名后缀,为cluster.local由kube-dns解析,为out-of.kuberneters的由10.10.10.5解析,其他后缀有上游dns8.8.8.8解析。
tips:可以使用dnsmasq
模拟dns服务器
so,dns解决了servicename与clusterIP的映射关系,service实现了culsterIP代理相同一组pod。因为pod的endpoint会随着创建销毁而变化,这样设计能够一定程度上保证pod对应业务的可用性。 类似:DNS解析某个网站,网站由nginx反向代理后段服务。
网友评论