10. 想要把域名变成IP
introduction
Anyway, 反正你知道我们需要一套域名解析服务, 不然你怎么访问 Service 对吧, 虽然你也可以通过环境变量的方式注入到容器里, 但这种方式也不利于大规模铺设反正不好就对了. 是吧? 为了你的service(能做服务发现), 装一个吧, kube-dns 还是 core-dns 都行
使用方式大概是等你 dns 部署好以后对外暴露一种服务, 通过此服务的 cluster ip + port 的方式来访问它, 一般情况下就是 10.0.0.1:53
其中53就是dns协议的默认使用端口. 那么假设你的容器现在想要访问某个 service. 但是它只有这个服务的域名, 他就会去读 /etc/resolv.conf
, 你只要把你的 10.0.0.1:53
写到这里面去就好了. 具体的执行流程, 回顾你当时装K8s集群的过程:
集群dns服务就绪, 并拥有执行ip:port
前往从节点, 安装并启动 kubelet, 启动指令里有一个
--cluster-dns=<ip:port>
kubelet在启动容器的时候将这个 ip:port 写入容器的
resolve.conf
下容器内进程可以搞域名解析服务
除了配置 dns 服务ip , kubelet通常还会给你配置一个 集群域名后缀, 比如这个值可以是"cluster.local", 这句话的意思是说任何带有cluster.local
结尾的域名须从此 dns 获得解析.
基本使用
我们通常想象出的 dns 解析过程, 把域名翻译成ip , 这种操作叫 正向查找 , 我们查找的内容叫做 A record. 相对应的我们还有 端口查找(查找SRV记录) 等. 一条A记录包含有它的域名, IP地址, 以及TTL用于表名这个查询的缓存保留时长. 我们跳过headless类型的记录, 就说说一个正常的服务记录有哪些内容.
对于某个服务, 我们会有一个表单, 比如service-name.ns-name.svc.cluster.local
, 在这其中包含有你的服务名称, 服务所在ns的名称, 一个svc表示解析的是service, 还有集群域名后缀. 你提供上面这个字符串, 就会返回给你它的IP地址. 默认的, 你可以通过service-name.ns-name
解析出一个service的IP地址, 假设是同一个ns下, 你可以直接使用service-name
就能解析出它的IP.
举个例子来说, 任何K8s集群都会有一个 API-Server 服务名字叫做 kubernetes, 也都会有一个ns 叫做 default, 那么我们就可以查查这个服务的IP是多少, 假设我们集群里有一个pod叫做busybox, 这个pod里带有 nslookup 作为域名解析工具, 它会解析出什么呢?
Last updated
Was this helpful?