在应用开发中,我们不应把远程服务的 ip 硬编码到应用中。有些同学习惯使用域名来标定远程服务,通过修改解析,来区分开发测试和生产环境,这是一个挺好的习惯。

在 k8s 系统中,我们使用服务名来调用服务,并通过 coredns 来进行解析。但那些集群外的服务,并且已经被硬编码的域名如何访问呢?

方法1:修改容器的 hosts
设想:把 hosts 文件内容存储在 configmap 中,通过 volume 绑定到 /etc/hosts。但很不幸,/etc/hosts 被 k8s 征用了,无法修改。

但 k8s 给我们提供了 hostAliases 来解决此问题。

apiVersion: apps/v1
kind: Deployment
metadata:name: hosts-appendlabels: app: hosts-append
spec:replicas: 1selector:matchLabels:app: hosts-appendtemplate:metadata:labels:app: hosts-appendspec:hostAliases:- ip: "127.0.0.1"hostnames:- "foo.local"- "bar.local"- ip: "10.1.2.3"hostnames:- "foo.remote"- "bar.remote"containers:- image: nginx:alpinename: hosts-appendports:- containerPort: 80protocol: TCP

部署后,pod 里面的 hosts 文件已经追加了解析记录。结果如下:

$ kubectl exec hosts-append-5576848dcf-jnt4s -- cat /etc/hosts# Kubernetes-managed hosts file.
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
10.4.0.224  hostbiza-5576848dcf-jnt4s# Entries added by HostAliases.
127.0.0.1   foo.local   bar.local
10.1.2.3    foo.remote  bar.remote

此方法的缺点是:不同环境下的域名映射是不一样的,我必须为环境编写不同的 yaml 文件。

方法2:使用私有dns解析
k8s 内部默认已经安装了 coredns 服务,可以通过修改 coredns 的配置来达到内部解析的目的。

coredns 的配置写在了 configmap 的 kube-system 命名空间下的 coredns 配置节点了。只需要增加 hosts 配置节点就好。

编辑他:

kubectl edit cm -n kube-system coredns

Corefile 配置示例(其中 hosts 节点是自定义的解析节点):

    .:53 {errorshealthkubernetes cluster.local. in-addr.arpa ip6.arpa {pods insecureupstreamfallthrough in-addr.arpa ip6.arpa}hosts {127.0.0.1   foo.local8.8.8.8    foo.remotefallthrough}prometheus :9153proxy . /etc/resolv.confcache 30reloadloadbalance}

修改完成后,要等等。配置下发完成即可生效。可以进入 pod 内部 ping 一下域名看看。

在一般的控制台,这个节点无法修改。但借助命令行 kubectl 或者其他可视化工具(如 Lens),可以修改这个配置节点。

至于开发环境下的域名解析,自己改本机 hosts 就好啦。

当然,更好的做法是把配置文件与应用解耦,所有的配置,包括远程服务的域名或 ip 都可以被远程修改。

在 k8s 中配置域名解析相关推荐

  1. k8s中Pod域名解析失败

    原文 系统环境 CoreDNS 版本:1.6.7 Docker 版本:19.03.8 Kubernetes 版本:1.18.4 操作系统版本:CentOS 7.4 CentOS 内核版本:3.10.0 ...

  2. k8s中配置namespace的最小和最大内存

    命名空间中运行的容器使用的内存的最小值和最大值. 你可以在 LimitRange 对象中指定最小和最大内存值.如果 Pod 不满足 LimitRange 施加的约束,则无法在命名空间中创建它. 创建n ...

  3. 在k8s中通过CoreDNS进行域名解析的其中三种方法

    1.CoreDNS概述 CoreDNS是一种新的DNS服务器,它开发的初衷主要是用于Linux和docker的配合使用,自kubernetes 1.11版本开始,CoreDNS取代原来的KubeDNS ...

  4. 【K8S实战系列-nignx-2】k8s中configmap挂载配置nginx.conf

    [K8S实战系统-nignx-2]k8s中configmap挂载配置nginx.conf 1. ConfigMap是什么 ConfigMap作用是存储不加密的数据到etcd中,让Pod以变量或数据卷V ...

  5. 【好文收藏】k8s中Pod 无法正常解析域名:部署 DNS 调试工具排查

    k8s 中 Pod 无法正常解析域名:部署 DNS 调试工具排查 问题描述 最近将 Kubernetes 升级到 1.18.1 版本,不过升级完后,查看工作节点的部分 Pod 无法启动,查看消息全是 ...

  6. k8s中hostname, hosts文件, DNS和代理问题, service和pod的访问问题

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 验证一个域名的ip地址可以使用 nslookup xx.xx..xx 在kubernets中不同命名空间的服务相互访问 涉及到的是Pod和Servic ...

  7. k8s部署jar包_学习K8S之路.6--- 在K8S中部署Jenkins,并使用Jenkins打包jar包

    一:部署jenkins jenkins官网:https://jenkins.io/download/ jenkins镜像:https://hub.docker.com/r/jenkins/jenkin ...

  8. k8s中几种port介绍

    1.端口所应用位置的不同 port是service的的端口 targetport是pod也就是容器的端口 nodeport是容器所在宿主机的端口(实质上也是通过service暴露给了宿主机,而port ...

  9. 9 个技巧,解决 K8s 中的日志输出问题

    作者 | 元乙  阿里云存储服务技术专家 导读:近年来,越来越多的同学咨询如何为 Kubernetes 构建一个日志系统,或者是来求助在此过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是作者想 ...

最新文章

  1. 免费创办网站_足够好的工程来创办一家互联网公司
  2. 第二课.PyTorch入门
  3. 灵活运用ISA的链接转换功能:ISA2006系列之十三
  4. eclipse中编辑properties文件无法看到中文
  5. eclipse Indigo Helios Galileo几种版本的意思
  6. 视频需求超平常数 10 倍,却节省了 60% 的 IT 成本投入是一种什么样的体验?
  7. 2020.8.26广联达笔试第二题——魔法师四种元素平衡(Python)
  8. 解决scanf_s函数报错:没有为格式字符串传递足够的参数
  9. Struts2的Action编写
  10. 常用Latex表达式符号——组合数学篇
  11. spring中配置quartz定时器
  12. MySQL数据库进阶(API的理解、Python对MySQL的接口)
  13. 缓存问题引发的一系列优化
  14. 精读-软件测试的艺术之模块测试及更高级别的测试
  15. php 限定字符长度,PHP中字符串的最大长度是多少?
  16. 线粒体和叶绿体的基因组特点_线粒体基因组有什么特点?
  17. ARM9开发板Qt环境的搭建
  18. RabbitMQ高可用性分析
  19. 开始数据治理时三个常见的陷阱和解决方法
  20. 抽卡模拟系统(包含图形界面,结果可存储到数据库中)

热门文章

  1. [转贴]LINUX新手入门及安装配置FAQv
  2. 【第十七届智能车】智能车图像处理(2)-赛道边界的简单提取和无元素循迹
  3. 基于Arduino通过并联L298N实现四驱麦克纳姆轮巡迹小车
  4. 微信sae云服务器后台创建
  5. Python | 爬虫抓取智联招聘(基础版)
  6. 非常有趣的的免费API接口,基本上很全了。
  7. 关系型数据库到文档型数据库的跨越
  8. ENSP的AR40问题解决
  9. php ios android 加密,在android/ios中加密,在php中解密
  10. 估算成本 制定预算 区别