通过域名访问k8s-pod方案

针对一些特殊业务需要通过pod名称或域名直接访问pod内部服务。本文主要提供一种暴露pod域名到公司内网的方案。

01

技术方案

1、使用coredns基于etcd的域名解析插件

2、单独部署一套server,该server负责接收agent发来的域名记录请求,并将数据写到etcd。

3、在每个k8s集群上启动一个agent,该agent负责watch集群的所有pod,并请求server外部接口将域名与ip记录到etcd中。

4、coredns读取etcd中的域名记录。

02

方案验证

验证测试coredns基于etcd的域名解析功能

环境要求:一台安装linux操作系统的机器并已安装docker,10.23.34.16

1、部署etcd,本次通过通过容器部署

apache 复制代码
docker network create app-tier --driver bridgedocker run -d --name etcd-server --network app-tier --publish  2379:2379 --publish  2380:2380 --env ALLOW_NONE_AUTHENTICATION=yes --env ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379 bitnami/etcd:latest

2、下载coredns二进制: https://github.com/coredns/coredns/releases/tag/v1.10.1。并将coredns二进制copy到/usr/bin目录下

3、创建coredns配置文件

bash 复制代码
mkdir /etc/corednsvi /etc/coredns/dns.conf ##内容如下skydns.local {    etcd {        path /skydns        endpoint http://localhost:2379    }    cache}k8sqihoo.net {    etcd {        path /k8sqihoo    # 跟第5步在etcd写入的key前缀一致        endpoint http://localhost:2379    }    cache}. {    forward . /etc/resolv.conf    cache}

4、启动coredns,执行指令:coredns -conf /etc/coredns/dns.conf &

5、从etcd中写入域名记录

bash 复制代码
docker exec -it 118d6cadf1b7 /bin/sh   #登录etcd容器etcdctl put /k8sqihoo/net/k8sqihoo/test-bjyt/yctest/pod1 '{"host":"10.216.138.203","ttl":60}' #写入域名记录,域名为pod1.yctest.test-bjyt.k8sqihoo.net,对应的pod-ip为10.216.138.203,也可以使用podName+公司后缀为名。

6、(本地或者其他虚拟机)修改/etc/resolv.conf,增加如下内容

7、测试验证,如下图可以看到通过域名可以ping通ip

整体方案

如上暴露域名的方式已明确,现主要问题是如何将pod域名和ip写入到etcd中。

1、在dns侧需要一个sever服务,该服务对外提供增加删除更新dns记录的接口,

2、在k8s侧需要一个agent用于watch对集群外暴露域名的pod,将podname,namespace等进行拼接组成域名(根据自身需要进行拼接),并将域名与ip传给server服务,记录到etcd中。删除时进行同样请求操作。

03

使用总结

1、在部署时dns-node可以考虑使用高可用方案,使用vip即可。

2、考虑到资源浪费,dns-node中的etcd可以跟k8s共用一套。

3、考虑到集群pod增删频率过快,导致的dns-node压力过大,可以针对有需要暴露pod域名需求的业务使用,通过pod anntation识别。

4、为使用方便可作为子集域名服务加到公司dns服务中。


更多技术干货,

请关注"360智汇云开发者"👇

360智汇云官网:https://zyun.360.cn(复制在浏览器中打开)

更多好用又便宜的云产品,欢迎试用体验~

添加工作人员企业微信👇,get更快审核通道+试用包哦~

相关推荐
蜀山雪松2 小时前
全网首先 Docker Compose 启动Postgresql18
运维·docker·容器
腾讯数据架构师2 小时前
大模型openai服务网关,认证,限流,接口输入输出的修正,监控等功能
云原生·kubernetes·ai平台
你的人类朋友2 小时前
【Docker】说说卷挂载与绑定挂载
后端·docker·容器
罗亚方舟5 小时前
微服务故障排查
微服务·云原生·架构
SirLancelot17 小时前
MinIO-基本介绍(一)基本概念、特点、适用场景
后端·云原生·中间件·容器·aws·对象存储·minio
Broken Arrows10 小时前
k8s学习(一)——kubernetes重要基础概念概述
学习·容器·kubernetes
hello_25010 小时前
云原生架构与GitOps技术栈介绍
云原生·架构
Lin_Aries_042112 小时前
基于 CI/CD 平台将应用程序自动部署到 Kubernetes 集群
运维·ci/cd·docker·云原生·容器·kubernetes·jenkins
Tadas-Gao14 小时前
微服务可观测性的“1-3-5”理想:从理论到实践的故障恢复体系
java·开发语言·微服务·云原生·架构·系统架构·可观测
神秘人X70717 小时前
Docker 镜像结构详解
运维·docker·容器