k8s-Pod域名学习总结
大纲
-
k8s内置DNS服务
-
配置Pod的域名服务
-
CornDNS配置
-
默认Pod的域名
-
自定义Pod的域名
实战需求
1 Pod有自己的域名
2 集群内部的Pod可以通过域名访问其他的Pod
基础准备:
- 1 k8s 集群版本1.17
k8s内置DNS服务
k8s1.17安装完成后自动创建 CoreDNS服务,k8s会为 Service 和 Pod 创建 DNS 记录,k8s集群内访问Service或Pod可以使用域名而非ip
Kubelet 为每个 Pod 配置/etc/resolv.conf文件
配置Pod的域名服务
配置Pod DNS服务
可以使用 dnsPolicy 来配置Pod 的 DNS 策略
- Default: Pod 从运行所在的节点继承名称解析配置。(注意 这里的Default 不是默认的 DNS 策略。如果未明确指定 dnsPolicy,则使用 “ClusterFirst”)
- ClusterFirst: 与配置的集群域后缀不匹配的任何 DNS 查询(例如 “www.kubernetes.io”) 都会由 DNS 服务器转发到上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。 参阅相关讨论 了解在这些场景中如何处理 DNS 查询的信息。默认DNS 策略
- ClusterFirstWithHostNet: 对于以 hostNetwork 方式运行的 Pod,应将其 DNS 策略显式设置为 “ClusterFirstWithHostNet”。否则,以 hostNetwork 方式和 “ClusterFirst” 策略运行的 Pod 将会做出回退至 “Default” 策略的行为。
- None: 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig 字段所提供的 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有三个配置项
- nameservers:用于域名解析的DNS服务器列表,(Linux 最多三个)
- searches:配置DNS 搜索域
- options:配置其他可选DNS参数
,最多可以设置3个。当Pod的dinsPolicy=“None“时,该nameserver列表必须包含至少一个IP地址,配置的nameserver列表会与系统自动设置的nameserver进行合并和去重;
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 就会使用以上配置的内容
配置Pod中的 域名映射
可以使用 hostAliases 类型直接配置 /etc/hosts 实现本地域名映射
hostAliases:
- ip: 192.168.0.206
hostnames:
- app-server-1.medcrab.com
配置CoreDNS
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/
默认Pod的域名
在默认情况下 k8s集群会自动给Pod创建域名,集群内部Pod可以使用域名访问其他Pod
Pod默认的域名格式为:[pod ip].[namespace].pod.[cluster-domain]
- [pod ip] 需要用 “-” 替换 “.” 号
- [namespace] 为Pod所在的命名空间
- [cluster-domain] 默认为 cluster.local
例如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
自定义Pod的域名
默认使用ip的方式,不利于正式的生产环境。(Pod的切换可能会导致IP的变化)
可以在Pod yaml配置中设置hostname字段定义容器环境的主机名, 并设置subdomain字段定义容器环境的子域名。
spec:
hostname: 主机名称
subdomain: 子域名
部署Pod后此时的域名格式为:[hostname].[subdomain].[namespace].svc.[cluster-domain]
- [hostname] yaml中配置的hostname
- [subdomain] yaml中配置的subdomain
- [namespace] 为Pod所在的命名空间
- [cluster-domain] 默认为 cluster.local
例如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 的域名
验证成功