在 k8s 中配置域名解析

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

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

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hosts-append
  labels: 
    app: hosts-append
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hosts-append
  template:
    metadata:
      labels:
        app: hosts-append
    spec:
      hostAliases:
      - ip: "127.0.0.1"
        hostnames:
        - "foo.local"
        - "bar.local"
      - ip: "10.1.2.3"
        hostnames:
        - "foo.remote"
        - "bar.remote"
      containers:
      - image: nginx:alpine
        name: hosts-append
        ports:
        - containerPort: 80
          protocol: 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 {
        errors
        health
        kubernetes cluster.local. in-addr.arpa ip6.arpa {
            pods insecure
            upstream
            fallthrough in-addr.arpa ip6.arpa
        }
        hosts {
          127.0.0.1	foo.local
          8.8.8.8	foo.remote
          fallthrough
        }
        prometheus :9153
        proxy . /etc/resolv.conf
        cache 30
        reload
        loadbalance
    }

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

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

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

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

你可能感兴趣的:(k8s_docker)