1 ) DNS 概述
2 )DNS 实践
Kubernetes DNS 在群集上调度 DNS Pod 和 服务
并配置 kubelet 以告知各个容器使用 DNS 服务的 IP来解析 DNS 名称
其原理是通过这个DNS记录为每个pod提供一个单一的这个域名
然后让集群的DNS服务都能够把这个pod IP给它解析出来
我们不推荐进入这个pod的IP 地址,有一些特殊的pod,比如说静态的 pod
它的IP实际上是不变的,在这种方式下,会需要一个域名来给它固定一下
因为我们不会记这个IP地址,我们会记这个域名解析的地址
当 K8s 需要给一个pod提供个固定的域名的时候,就会涉及到创建DNS记录的这个方式
A/AAAA 记录
Pods A/AAAA 记录
pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example.
然后,Pod本身提供 的 hostname 和 subdomain 字段
hostname,就是我的主机名, 这个pod我可以认为它是一个最小的主机,这个主机已经有个名字了,比如说叫 busybox1
然后,它的子域名的名称就叫 default-subdomain ,或者叫 subdomain 也行
然后域名就是你的公司名称,集群的名称,可以是你公司的域名,比如 x.com
有了这样的参数之后,我们创建的pod,它就会自带 DNS这个域名,它的hostname 就会变成一个 full qualified 这么一个域名
通过这个域名,能够让别人通过这个DNS服务来找到我
DNS服务,比如说我访问一个网站,x.com, 在公网上域名解析,会有 x.com 对应IP地址的解析记录
所以, 通过访问这个域名,然后会拿到这个IP地址,之后,通过HTTP协议连到这个服务器上
然后进行握手认证, 以及后续可能的cookie的校验, session的校验等来给我返回这个数据,这就是网络服务提供的一个过程
创建 dns-pod.yaml
apiVersion: v1
kind: Service
metadata:
name: default-subdomain
spec:
selector:
app: busybox
clusterIP: None
ports:
- port: 1234
targetPort: 1234
---
apiVersion: v1
kind: Pod
metadata:
name: busybox1
labels:
app: busybox
spec:
hostname: busybox-1
subdomain: aaa
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"
---
apiVersion: v1
kind: Pod
metadata:
name: busybox2
labels:
app: busybox
spec:
hostname: busybox-2
subdomain: bbb
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"
$ kubectl create -f dns-pod.yaml 创建Service和2组pod
service/default-subdomain created
pod/busybox1 created
pod/busybox2 created
$ get po -w | grep busybox 查看pod的创建状态
busybox1 1/1 Running 0 108s
busybox2 1/1 Running 0 108s
$ kubectl exec -it busybox2 -- sh 登录一台pod
$ hostname busybox-2 这个是简短的
$ hostname -f busybox-2.bbb.default.svc.cluster.local 这个是全的,是dns上注册的地址
有了上面全的域名地址,就可以访问到它这个pod了,通过这种方式,K8s提供了pod的dns注册机制
DNS 会为此名字提供一个 A 记录或 AAAA 记录,指向该 Pod 的 IP
“busybox1” 和 “busybox2” 这两个 Pod 分别具有它们自己的 A 或 AAAA 记录