K8S实现不同节点POD获取不同IP

  1. 背景介绍
    某混合云场景k8s,云上和云下的node,需要将同一个域名解析到不同的IP
  2. 方案
    利用Coredns+2个第三方插件,fwdpolicyconditional
  3. 编译Coredns(在windows上)
    安装go(略)

    下载各组件源码,并编译
    cd %GOPATH%/src
    git clone https://github.com/coredns/coredns
    cd coredns/
    notepad plugin.cfg添加如下两行

这一步要保证GOOS=windows

go generate

这一步要保证GOOS=linux

go build
在当前目录会生产coredns文件。

在linux环境运行 coredns --pulgins 查看插件是否已启用。
4. 构建Docker镜像,替换环境中已有的coredns镜像

Dockerfile
FROM alpine:3.14
ADD https://oss.xxx.com/coredns .
EXPOSE 53 53/udp
RUN chmod +x coredns
ENTRYPOINT ["/coredns"]
  1. 修改配置文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
  labels:
      addonmanager.kubernetes.io/mode: EnsureExists
data:
  Corefile: |
    .:53 {
        errors
        ready
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
        }
        hosts {
            172.20.0.4     iZ88wwyb52mZ
            172.20.0.5     iZ88r6821f9Z
            172.20.0.6     iZ885t6kiqoZ
            fallthrough
        }
        log
        prometheus :9153
        conditional {
          group idc 0
          group guangdianyun 1
          use zone0 if incidr(client_ip, '10.244.0.0/21')
          use zone0 if incidr(client_ip, '10.244.8.0/23')
          use zone0 idc if incidr(client_ip, '10.244.10.0/24')
          use zone0 if incidr(client_ip, '10.244.12.0/24')
          use zone0 if incidr(client_ip, '10.244.13.0/24')
          use zone0 if incidr(client_ip, '10.244.14.0/24')
          use zone0 if incidr(client_ip, '10.244.14.0/24')
          use zone1 if incidr(client_ip, '10.244.32.0/24')
          use zone1 if incidr(client_ip, '10.244.30.0/24')
          use zone1 if incidr(client_ip, '10.244.34.0/24')
          use zone1 if incidr(client_ip, '10.244.29.0/24')
          use zone1 if incidr(client_ip, '10.244.14.0/24')
          use zone1 if incidr(client_ip, '10.244.31.0/24')
          use zone1 if incidr(client_ip, '10.244.33.0/24')
          use zone1 if incidr(client_ip, '10.244.16.0/24')
        }
        fwdpolicy . 127.0.0.1:5390 127.0.0.1:5391 {
          policy conditional
        }
      }
        cache 30
        reload
        loadbalance
    }
    .:5390 {
      log
      hosts {
        172.30.254.3 xxx.cn
        172.30.254.3 xxxx.cn
      }
      forward . /etc/resolv.conf
    }
    .:5391 {
      log
      hosts {
        172.30.254.33 xxx.cn
        172.30.254.33 xxxx.cn
      }
      forward . /etc/resolv.conf
    }

参考:
https://zhuanlan.zhihu.com/p/387807927
https://github.com/coredns/coredns/discussions/4940

posted on 2022-05-23 19:06  yangras  阅读(380)  评论(0)    收藏  举报

导航