k8s-Pod域名学习总结

k8s-Pod域名学习总结

大纲

  • k8s内置DNS服务

  • 配置Pod的域名服务

  • CornDNS配置

  • 默认Pod的域名

  • 自定义Pod的域名

    实战需求
    1 Pod有自己的域名
    2 集群内部的Pod可以通过域名访问其他的Pod

基础准备:

  • 1 k8s 集群版本1.17

在这里插入图片描述

k8s内置DNS服务

k8s1.17安装完成后自动创建 CoreDNS服务,k8s会为 ServicePod 创建 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服务

k8s-Pod域名学习总结_第1张图片

如果有一些集群外并且是自己使用的内网域名,除了可以使用在Pod yaml中使用hostAliases 配置外还可以在CoreDNS 中配

可以看到Pod中无法访问自己的内网域名

可能需要安装ping
apt-get install inetutils-ping

k8s-Pod域名学习总结_第2张图片

kubectl edit configmap coredns -n kube-system 编辑coredns配置

添加 
hosts {
       192.168.0.206 app-server-1.medcrab.com
       fallthrough
}

k8s-Pod域名学习总结_第3张图片

再次访问域名 成功

k8s-Pod域名学习总结_第4张图片

注意 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 的域名

k8s-Pod域名学习总结_第5张图片

域名验证成功

可能需要安装的软件 nslookup curl
apt-get update
apt-get install dnsutils
apt-get install curl

自定义Pod的域名

默认使用ip的方式,不利于正式的生产环境。(Pod的切换可能会导致IP的变化)

可以在Pod yaml配置中设置hostname字段定义容器环境的主机名, 并设置subdomain字段定义容器环境的子域名。

spec: 
   hostname: 主机名称
   subdomain: 子域名

k8s-Pod域名学习总结_第6张图片

部署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-Pod域名学习总结_第7张图片

要想在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 的域名

k8s-Pod域名学习总结_第8张图片

验证成功

你可能感兴趣的:(docker+k8s,kubernetes,学习,docker)