大纲
k8s内置DNS服务
配置Pod的域名服务
CornDNS配置
默认Pod的域名
自定义Pod的域名
实战需求
1 Pod有自己的域名
2 集群内部的Pod可以通过域名访问其他的Pod
基础准备:
k8s1.17安装完成后自动创建 CoreDNS服务,k8s会为 Service 和 Pod 创建 DNS 记录,k8s集群内访问Service或Pod可以使用域名而非ip
Kubelet 为每个 Pod 配置/etc/resolv.conf文件
可以使用 dnsPolicy 来配置Pod 的 DNS 策略
spec:
imagePullSecrets:
- name: myaliyunsecret
restartPolicy: Always
# 配置dns策略
dnsPolicy: Default
containers:
- image: registry.cn-hangzhou.aliyuncs.com/jimliu/order-service:latest
name: order-service
可以使用 dnsConfig 来配置Pod的DNS
dnsPolicy为任意策略时都可以设置,但是当dnsPolicy=“None“时必须设置。dnsPolicy有三个配置项
apiVersion: v1
kind: Pod
metadata:
name: custom-dns
spec:
containers:
- name: tomcat-run
image: tomcat
dnsPolicy: "None" # Kubernetes 环境中的 DNS 设置 使用pod自定DSN
dnsConfig:
nameservers: # DNS服务器列表
- 8.8.8.8
searches: # 配置DNS 搜索域
- mynamespace.svc.cluster-domain.example
options:
- name: ndots
- value: "1"
- name: edns0
配置dnsConfig后 Pod容器内的 /etc/resolv.conf 就会使用以上配置的内容
可以使用 hostAliases 类型直接配置 /etc/hosts 实现本地域名映射
hostAliases:
- ip: 192.168.0.206
hostnames:
- app-server-1.medcrab.com
k8s 1.70默认使用CoreDNS 作为DNS服务
如果有一些集群外并且是自己使用的内网域名,除了可以使用在Pod yaml中使用hostAliases 配置外还可以在CoreDNS 中配
可以看到Pod中无法访问自己的内网域名
可能需要安装ping
apt-get install inetutils-ping
kubectl edit configmap coredns -n kube-system 编辑coredns配置
添加
hosts {
192.168.0.206 app-server-1.medcrab.com
fallthrough
}
再次访问域名 成功
注意 Pod yaml中 dnsPolicy 至少是 ClusterFirst
其他关于coredns的配置 可参考官方文档 https://coredns.io/
在默认情况下 k8s集群会自动给Pod创建域名,集群内部Pod可以使用域名访问其他Pod
Pod默认的域名格式为:[pod ip].[namespace].pod.[cluster-domain]
例如k8s集群default命名空间中有如下pod: my-quarkus-demo
则Pod my-quarkus-demo 的域名
10-244-1-21.default.pod.cluster.local
进入另外一个Pod 验证my-quarkus-demo 的域名
域名验证成功
可能需要安装的软件 nslookup curl
apt-get update
apt-get install dnsutils
apt-get install curl
默认使用ip的方式,不利于正式的生产环境。(Pod的切换可能会导致IP的变化)
可以在Pod yaml配置中设置hostname字段定义容器环境的主机名, 并设置subdomain字段定义容器环境的子域名。
spec:
hostname: 主机名称
subdomain: 子域名
部署Pod后此时的域名格式为:[hostname].[subdomain].[namespace].svc.[cluster-domain]
例如k8s集群default命名空间中有如下pod: order-service-pod
此时pod域名为
order-service-pod.medcrabk8s-inner-order.default.svc.cluster.local
进入pod内部查看 /etc/hosts文件
要想在K8S集群内部使用自定义的域名访问 还需要创建一个 Headless Services (无头服务)
headless-service.yaml内容如下
apiVersion: v1
kind: Service
metadata:
name: medcrabk8s-inner-order # 注意name为 pod中 subdomain 的名称
spec:
selector:
app: order-service
clusterIP: None #注意 clusterIP 为None
ports:
- port: 5555
进入另外一个Pod 验证order-service-pod 的域名
验证成功