美文网首页
容器内指定特定域名解析结果的几种方式

容器内指定特定域名解析结果的几种方式

作者: hezhangjian | 来源:发表于2023-07-09 18:07 被阅读0次

在本篇文章中,我们将探讨如何在容器内指定特定域名解析结果的几种方式。为了方便演示,首先我们创建一个演示用的Deployment配置文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-deployment
  labels:
    app: busybox
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        args:
        - /bin/sh
        - -c
        - "while true; do echo Hello, Kubernetes!; sleep 10;done"

这个deployment会创建1个busybox的pod,容器每隔10s会打印“Hello, Kubernetes!”到控制台

TL;DR

方案 修改级别 是否推荐 备注
修改/etc/hosts pod
添加HostAliases记录 pod/deploy/statefulset
修改Coredns配置 整个kubernetes集群
自定义DNS策略 pod/deploy/statefulset 视情况而定 如需对接三方的DNS服务器,推荐采用
使用三方DNS插件 整个kubernetes集群 不推荐,Coredns为业内主流

修改/etc/hosts

修改/etc/hosts是最传统的方式,直接在容器内修改相应的文件来实现域名解析,在Pod级别生效。由于其可维护性较差(每次pod发生重启都需要手动修改),不推荐在生产环境使用。

例如,我们可以在/etc/hosts里面添加这样一条记录

250.250.250.250 four-250
/ # ping four-250
PING four-250 (250.250.250.250): 56 data bytes

添加HostAliases记录

HostAliases是kubernetes中Pod配置的一个字段,它提供了Pod内容器的/etc/hosts文件的附加记录。这在某些情况下非常有用,特别是当你想要覆盖某个主机名的解析结果,或者提供网络中没有的主机名解析时。

这个可以在Pod、Replica、Deployment、StatefulSet的级别修改,维护性稍强。举个🌰,我们将上面的yaml修改为

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-deployment
  labels:
    app: busybox
spec:
  replicas: 3
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      hostAliases:
      - ip: "250.250.250.250"
        hostnames:
        - "four-250"
      containers:
      - name: busybox
        image: busybox
        args:
        - /bin/sh
        - -c
        - "while true; do echo Hello, Kubernetes!; sleep 10;done"

这个时候我们查看容器的/etc/hosts,发现它被kubernetes自动插入了一条记录Entries add by HostAliases。这就是hostAliases的实现原理

kubelet_pods代码中进行了这样的写入动作

func hostsEntriesFromHostAliases(hostAliases []v1.HostAlias) []byte {
    if len(hostAliases) == 0 {
        return []byte{}
    }

    var buffer bytes.Buffer
    buffer.WriteString("\n")
    buffer.WriteString("# Entries added by HostAliases.\n")
    // for each IP, write all aliases onto single line in hosts file
    for _, hostAlias := range hostAliases {
        buffer.WriteString(fmt.Sprintf("%s\t%s\n", hostAlias.IP, strings.Join(hostAlias.Hostnames, "\t")))
    }
    return buffer.Bytes()
}

Coredns配置

我们可以通过修改ConfigMap来实现让容器解析特定域名的目的。

更改Coredns配置

我们可以通过以下命令修改Coredns的配置:

kubectl edit cm coredns -n kube-system

原有的configmap

Corefile: |
    .:53 {
        log
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        hosts {
           192.168.65.2 host.minikube.internal
           fallthrough
        }
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }

在hosts里面加上特定的记录

250.250.250.250 four-250

如果您没有配置reload插件,则需要重启Coredns才能生效,默认的reload时间是30s,在plugin/reload/setup.go的defaultInterval中定义

自定义DNS策略

通过修改DNS策略。使得对于单个Pod/Deploy/StatefulSet将特定的域名解析发给特定的服务器来达到效果,如下,可以对pod添加dns的服务器以及search域

   spec:
      dnsConfig:
        nameservers:
          - 1.2.3.4
        searches:
          - search.prefix
      containers:
      - name: busybox
        image: busybox
        args:
        - /bin/sh
        - -c
        - "while true; do echo Hello, Kubernetes!; sleep 10;done"

使用第三方DNS插件

不推荐,使用其他的DNS插件,来做一些炫酷的自定义操作。而且目前Coredns也是业内的主流,没有很好的替代

相关文章

  • Docker数据管理

    容器管理数据方式: 数据卷:容器内数据直接映射到本地主机环境; 数据卷容器:使用特定容器维护数据卷。 数据卷 类似...

  • css入门基本用法

    css 定义方式 指定特定的标签 指定id选择器 指定class选择器 指定特定标签的特定id或者class 类名...

  • 4.指定class的几种方式

    1.指定class的几种方式:

  • docker 容器命令

    -t 在新容器内指定伪终端-i 允许你对容器内的标准输入进行交互 查看当前系统的版本信息 后台模式 查看容器 查看...

  • 100、云化中的问题

    1.资源隔离相关 大部分的隔离问题都是,容器内默认读取了宿主机的资源所导致的 1.1、容器内指定的核数,不指定将使...

  • 几种域名解析方式

    主要有A记录、MX记录、CNAME记录、NS记录、TXT记录 A记录A代表Address,用于指定域名对应的IP,...

  • 通过IP映射访问Docker容器

    通常外面访问容器可以通过指定端口和指定IP。我们下面用指定IP方式。 注意:防止nginx无法访问到容器,虚拟机先...

  • Docker常用命令

    运行交互式的容器 各个参数解析: -t:在新容器内指定一个伪终端或终端。 -i:允许你对容器内的标准输入 (STD...

  • 常用拷贝和替换算法

    /* copy算法 将容器内指定范围的元素拷贝到另一容器中 @param beg容器开始迭代器 @param en...

  • Docker 入门教程之lnmp环境搭建

    容器网络 首先创建网络,用于之后的容器互联,网络模式就选用 bridge,link 直接指定容器互联的方式已经逐步...

网友评论

      本文标题:容器内指定特定域名解析结果的几种方式

      本文链接:https://www.haomeiwen.com/subject/vfusudtx.html