xiaohanliang
Docker
Docker
  • hi
  • STORAGE DRIVER
    • 1. 什么叫联合挂载
    • 2. 镜像ID是从哪来的
    • 3. 如何组装出一个镜像
    • 4. 为什么有这么多fs@aufs
    • 5. 为什么有这么多fs@overlay
    • 6. 为什么有这么多fs@dm
    • 7. 正确安装devicemapper
  • EXEC DRIVER
    • 1. 资源限制-cgroup
    • 2. 制造小型监狱
    • 3. 切换根目录是什么概念
    • 4. 标准极简容器runC
    • 5. 尝试安装runc工具
  • KUBERNETES NETWORK
    • 0. [WIP]我想串联容器网络的故事
    • 1. 容器网络是什么样的网络
    • 2. cnm认为应该怎样让容器组网
    • 3. 为什么会有一大堆cni插件
    • 4. 为什么要设计出pod
    • 5. 怎样形成一个服务
    • 6. Service就是iptables规则
    • 7. IPVS也能实现Service
    • 8. 从集群外访问服务-nodeport
    • 9. 从集群外访问服务-ingress
    • 10. 想要把域名变成IP
    • 11. DNS是怎么实现的
    • 12. 最常见的方案@flannel
    • 13. 使用tun设备封包@flannel
    • 14. 使用vxlan设备封包@flannel
    • 15. 可不可以不封包@flannel
Powered by GitBook
On this page
  • introduction
  • 基本使用

Was this helpful?

  1. KUBERNETES NETWORK

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 获得解析.

$ cat /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster-dns=10.0.0.1 --cluster-domain=cluster.local"

基本使用

我们通常想象出的 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 作为域名解析工具, 它会解析出什么呢?

$ kubectl exec -it busybox -- nslookup kubernetes.default

# 这是使用的 dns 服务地址
Server:    10.0.0.1
Addrress1: 10.0.0.1#53

# 这是解析出来的结果, API-server 服务放在了 10.0.0.10
Name:      kubernetes.default
Addrress1: 10.0.0.10

# 同样的, 我们可以加上一些默认后缀, 结果都是一样的
Name:      kubernetes.default.svc
Addrress1: 10.0.0.10
Name:      kubernetes.default.svc.cluster.local
Addrress1: 10.0.0.10
Previous9. 从集群外访问服务-ingressNext11. DNS是怎么实现的

Last updated 4 years ago

Was this helpful?