1. 问题现象

公司内部SaaS产品运行在阿里云kubernetes环境,使用阿里云[标准托管版]进行部署使用,[标准托管版] 版就是用户只需要自己运维k8s node节点,master节点由阿里云进行维护,当k8s环境部署完成之后,将公司生产业务部署后发现部分业务模块无法解析到阿里云OSS自定义的对象存储域名,导致业务出现异常;

业务模块是可以通过域名访问其他业务模块及互联网域名的,而且业务模块配置了SNAT都是可以访问互联网的

1.1. 问题分析

公司域名后缀为*.oneprocloud.com,统一方便管理,所有的资源均使用子域名

在阿里云我们采用2个4核16G的云主机作为Node节点进行部署公司生产业务,因为有部分业务模块需要访问阿里云OSS对象存储进行访问数据,OSS对象存储我们设置了自定义域名,为了方便访问,短域名地址为"downloads.oneprocloud.com",并配置了智能DNS解析,办公笔记本可以解析短域名地址,即判定自定义短域名生效,可以正常使用

在k8s业务模块内进行如下测试:

  • nslookup进行解析互联网地址,是可以正常解析的
# www.baidu.com可以正常解析
[root@jumpserver-7596dc7dcb-lcs4n ~]# nslookup www.baidu.com
Server:         10.0.0.10
Address:        10.0.0.10#53Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 220.181.38.149
Name:   www.a.shifen.com
Address: 220.181.38.150
  • nslookup解析自定义阿里云OSS域名地址,发现无法进行解析
# www.baidu.com可以正常解析
[root@jumpserver-7596dc7dcb-lcs4n ~]# nslookup downloads.oneprocloud
Server:         10.0.0.10
Address:        10.0.0.10#53Server:         10.0.0.10
Address:        10.0.0.10#53Non-authoritative answer:
*** Can't find downloads.oneprocloud.com: No answer

经过以上测试,分析为在k8s集群内部,都是去找coredns 10.0.0.10 DNS进行解析域名,www.baidu.com 就可以解析,但是我们自定义的downloads.oneprocloud.com就无法解析,这个现象很诡异,我们接着查看coredns的配置:

查看k8s集群的coredns配置:

# 查看kube-system下的coredns configmap
[root@jumpserver-7596dc7dcb-lcs4n ~]# kubectl get configmap -n kube-system
NAME                                 DATA   AGE
ack-cluster-profile                  6      16d
acr-configuration                    5      16d
coredns                              1      16d
extension-apiserver-authentication   6      16d
kube-flannel-cfg                     2      16d
kube-proxy-worker                    2      16d
kubeadm-config                       1      16d
kubelet-config-1.11                  1      16d
kubelet-config-1.12                  1      16d
kubelet-config-1.18                  1      16d
kubernetes-dashboard-settings        1      13d# 查看coredns的configmap的定义是如何的,其实就是看看dns的配置
[root@jumpserver-7596dc7dcb-lcs4n ~]# kubectl get configmap -n kube-system coredns -o yaml
apiVersion: v1
data:Corefile: |.:53 {errorshealth {lameduck 5s}readykubernetes oneprocloud.com in-addr.arpa ip6.arpa {  # 在Corefile配置文件我们发现dns的域配置的oneprocloud.compods verifiedupstreamfallthrough in-addr.arpa ip6.arpattl 30}autopath @kubernetesprometheus :9153forward . /etc/resolv.confcache 30loopreloadloadbalance}
kind: ConfigMap
metadata:annotations: # 这边的配置信息也是 oneprocloud.com域名kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"v1","data":{"Corefile":".:53 {\n    errors\n    health {\n       lameduck 5s\n    }\n    ready\n\n    kubernetes oneprocloud.com in-addr.arpa ip6.arpa {\n\n      pods verified\n      upstream\n      fallthrough in-addr.arpa ip6.arpa\n      ttl 30\n    }\n    autopath @kubernetes\n    prometheus :9153\n    forward . /etc/resolv.conf\n    cache 30\n    loop\n    reload\n    loadbalance\n}\n"},"kind":"ConfigMap","metadata":{"annotations":{},"creationTimestamp":"2021-01-11T10:33:07Z","managedFields":[{"apiVersion":"v1","fieldsType":"FieldsV1","fieldsV1":{"f:data":{".":{},"f:Corefile":{}},"f:metadata":{"f:annotations":{".":{},"f:kubectl.kubernetes.io/last-applied-configuration":{}}}},"manager":"rc","operation":"Update","time":"2021-01-11T10:33:07Z"}],"name":"coredns","namespace":"kube-system","resourceVersion":"24861979","selfLink":"/api/v1/namespaces/kube-system/configmaps/coredns","uid":"7891c2a7-bff4-4f81-abaa-d06abb0ddf35"}}creationTimestamp: "2021-01-11T10:33:07Z"managedFields:- apiVersion: v1fieldsType: FieldsV1fieldsV1:f:data: {}f:metadata:f:annotations: {}manager: rcoperation: Updatetime: "2021-01-11T10:33:07Z"- apiVersion: v1fieldsType: FieldsV1fieldsV1:f:data:f:Corefile: {}f:metadata:f:annotations:f:kubectl.kubernetes.io/last-applied-configuration: {}manager: kubectloperation: Updatetime: "2021-01-27T10:22:30Z"name: corednsnamespace: kube-systemresourceVersion: "145403500"selfLink: /api/v1/namespaces/kube-system/configmaps/corednsuid: 7891c2a7-bff4-4f81-abaa-d06abb0ddf35

问题分析结果如下:

通过以上信息查看,其实oneprocloud.com是coredns的解析域,这个应该是在阿里云上部署k8s的时候设置的,这个域名会在k8s集群内部进行生效,作用是什么那,比如两个业务模块之间需要访问的话,我定义了模块的services,我就可以通过xxx.oneprocloud.com这个域名去访问其他业务模块是实现域名注册,xxx就为子域名,只能在k8s集群内部访问,其实我们定义的downloads.oneprocloud.com也是 xxx的子域名,但是并没有在k8s集群内部定义这种services,所以解析的时候,coredns认为这是同一个域内部的,然后去解析发现解析不到,但是为什么www.baidu.com域名可以访问那,是因为非oneprocloud.com后缀域,coredns正常集群外域名如果coredns解析不了,会去coredns的ecs配置的nameserver解析。所以才会出现www.baidu.com可以解析,downloads.oneprocloud.com解析不了的现象;

2. 问题处理方法

针对此问题,个人能力有限,不确定是否有更好的解决办法,例如设置tag文件,写明同一个域的其他子域名,如果coredns在内部集群解析不到的话,先去查询此tag文件,然后再进行找外部dns进行解析,只是个人想法

以上问题的发生,因为k8s环境已经部署完成,业务也已经部署了,总不能重新部署吧,那这个代价也太大了,有没有办法修改coredns配置,让其更改一个另外的解析域。

我这边大概想到2个方案:

  • 第一个方案

k8s集群内部解析域不变,变动外部自定义OSS对象域名,更换成其他的后缀域名

  • 第二个方案

改变k8s集群内部解析域,外部自定义OSS对象域名保持不变

根据以上两个方案分析,其实第二个方案还是比较合适的,因为公司内部的注册域这个肯定不可能变化的,我总不能再注册一个其他的后缀域吧,这个维护和代价成本也比较大,k8s集群内部域其实就是一个内部的,只要服务能够直接可以解析就可以了,所以第二个方案比较合适,第二个方案的处理办法继续往下

2.1. 修改k8s内部解析域名

如何按照我们的解决方案,第二个方案更改k8s集群内部coredns配置,需要如下两个操作步骤:

  1. 修改集群的coredns configmap文件
  2. 修改所有k8s集群node节点的kubelet服务的配置文件,并重启kubelet服务
  3. 重建业务pod服务

2.1.1. 修改集群coredns cm文件

  • 查看集群coredns cm配置文件并保存
[root@jumpserver-7596dc7dcb-lcs4n ~]# kubectl get configmap -n kube-system coredns -o yaml > coredns-configmap.yaml
  • 修改coredns cm配置 (以下红色标记的两处域名,修改成其他自定义)
[root@jumpserver-7596dc7dcb-lcs4n ~]# vim coredns-configmap.yaml
apiVersion: v1
data:Corefile: |.:53 {errorshealth {lameduck 5s}readykubernetes **cluster.local** in-addr.arpa ip6.arpa {pods verifiedupstreamfallthrough in-addr.arpa ip6.arpattl 30}autopath @kubernetesprometheus :9153forward . /etc/resolv.confcache 30loopreloadloadbalance}
kind: ConfigMap
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"v1","data":{"Corefile":".:53 {\n    errors\n    health {\n       lameduck 5s\n    }\n    ready\n\n    kubernetes **oneprocloud.com** in-addr.arpa ip6.arpa {\n\n      pods verified\n      upstream\n      fallthrough in-addr.arpa ip6.arpa\n      ttl 30\n    }\n    autopath @kubernetes\n    prometheus :9153\n    forward . /etc/resolv.conf\n    cache 30\n    loop\n    reload\n    loadbalance\n}\n"},"kind":"ConfigMap","metadata":{"annotations":{},"creationTimestamp":"2021-01-11T10:33:07Z","managedFields":[{"apiVersion":"v1","fieldsType":"FieldsV1","fieldsV1":{"f:data":{".":{},"f:Corefile":{}},"f:metadata":{"f:annotations":{".":{},"f:kubectl.kubernetes.io/last-applied-configuration":{}}}},"manager":"rc","operation":"Update","time":"2021-01-11T10:33:07Z"}],"name":"coredns","namespace":"kube-system","resourceVersion":"24861979","selfLink":"/api/v1/namespaces/kube-system/configmaps/coredns","uid":"7891c2a7-bff4-4f81-abaa-d06abb0ddf35"}}creationTimestamp: "2021-01-11T10:33:07Z"managedFields:- apiVersion: v1fieldsType: FieldsV1fieldsV1:f:data: {}f:metadata:f:annotations: {}manager: rcoperation: Updatetime: "2021-01-11T10:33:07Z"- apiVersion: v1fieldsType: FieldsV1fieldsV1:f:data:f:Corefile: {}f:metadata:f:annotations:f:kubectl.kubernetes.io/last-applied-configuration: {}manager: kubectloperation: Updatetime: "2021-01-27T10:22:30Z"name: corednsnamespace: kube-systemresourceVersion: "145403500"selfLink: /api/v1/namespaces/kube-system/configmaps/corednsuid: 7891c2a7-bff4-4f81-abaa-d06abb0ddf35
  • 重新进行应用
[root@jumpserver-7596dc7dcb-lcs4n ~]# kubectl apply -f coredns-configmap.yaml

2.1.2. 修改所有k8s集群node节点配置文件

这里需要注意是所有的节点kubelet配置文件都需要更改并重启服务,包含以后横向扩展的node节点,一定要记得也要同步修改节点配置文件,例如:当前2个node节点更改了,后续增加1个多个节点,同样也需要重复以下步骤,不然还是无法进行解析

  • 修改配置文件/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

修改配置文件中标红的内容,修改成自定义的域名,要和coredns configmap修改的域名保持一致

[Service]
Environment="KUBELET_EXTRA_ARGS=--node-labels=HM-SAAS-Lable=Production"
EnvironmentFile=-/etc/kubernetes/kubelet-customized-args.conf
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_SYSTEM_PODS_ARGS=--max-pods 64 --pod-max-pids 16384 --pod-manifest-path=/etc/kubernetes/manifests"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --dynamic-config-dir=/etc/kubernetes/kubelet-config --v=3"
Environment="KUBELET_DNS_ARGS=--enable-controller-attach-detach=true --cluster-dns=10.0.0.10 --pod-infra-container-image=registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.2 --enable-load-reader --cluster-domain=**cluster.local** --cloud-provider=external --hostname-override=cn-beijing.192.168.1.156 --provider-id=cn-beijing.i-2ze6kkewztaauih0izyr"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --authentication-token-webhook=true --anonymous-auth=false --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
Environment="KUBELET_CERTIFICATE_ARGS=--tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256 --tls-cert-file=/var/lib/kubelet/pki/kubelet.crt --tls-private-key-file=/var/lib/kubelet/pki/kubelet.key --rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CGROUP_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS $KUBELET_CUSTOMIZED_ARGS
  • 重新加载配置文件并重启kubelet服务
[root@iZ2ze6kkewztaauih0izyrZ ~]# systemctl daemon-reload
[root@iZ2ze6kkewztaauih0izyrZ ~]# systemctl restart kubelet

2.1.3. 重建业务pod服务

将所有的业务pod重建,不然无法使用最新的coredns配置进行服务注册发现

# 按照业务pod重建方式
# kubectl replace --force -f xxxx.yaml

2.1.4. 验证业务域名访问

  • 验证corends cm配置

  • 验证域名解析

通过nslookup进行解析测试,发现已经可以正常解析外部域名

3. 问题分析结论

在k8s集群内部设置了域,例如*.oneprocloud.com,那么oneprocloud.com就会被认为是集群内的域名,只向coredns进行域名解析,如果你在互联网也设置了同样后缀的DNS域名解析,在coredns内部是解析不了的,需配置配置其他外部域进行访问,正常集群外域名如果coredns解析不了,例如:*.baidu.com 那么coredns会去coredns所在ecs节点配置的nameserver进行解析。

k8s集群coredns无法解析外部域名相关推荐

  1. k8s集群DNS无法解析问题的处理过程

    搭建k8s集群时DNS无法解析问题的处理过程 问题描述 在搭建Kubernetes集群过程中,安装了kube-dns插件后,运行一个ubuntu容器,发现容器内无法解析集群外域名,一开始可以解析集群内 ...

  2. 【好文收藏】K8S集群部署CoreDNS服务

    K8S集群部署CoreDNS服务 k8s集群中的应用通常是通过ingress实现微服务发布的,前文介绍过在K8S集群中使用traefik实现服务的自动发布,其实现方式是traefik通过集群的DNS服 ...

  3. k8s集群配置使用coredns代替kube-dns

    简介 CoreDNS是一个Go语言实现的链式插件DNS服务端,是CNCF成员,是一个高性能.易扩展的DNS服务端.可以很方便的部署在k8s集群中,用来代替kube-dns. 使用kubeadm初始化时 ...

  4. k8s集群配置域名证书支持https与http

    1.检查k8s集群是否有默认证书 查看集群默认traefik-ingress: kubectl get ds -n kube-system [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来 ...

  5. jenkins连接外部k8s集群

    安装kubernetes插件 配置连接k8s集群的验证文件 查看k8s的 /root/.kube/config文件 获取/root/.kube/config中certificate-authority ...

  6. vmware 搭建k8s无法ping通子节点_一波四折 —— 记一次K8S集群应用故障排查

    一波四折--记一次K8S集群应用故障排查Part1 初露端倪 一个周四的下午,客户的报障打破了微信群的平静. "我们部署在自建K8S集群上的应用突然无法正常访问了,现在业务受到了影响!&qu ...

  7. k8s集群二进制部署 1.17.3

    K8s简介 Kubernetes(简称k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容 ...

  8. Linux云计算虚拟化-使用rancher搭建k8s集群并发布电商网站

    文章目录 Linux云计算虚拟化-使用Rancher搭建k8s集群并使用lnmp架构发布电商网站 1. Rancher介绍 2. 使用Rancher搭建k8s集群 2.1 实验环境介绍 2.2 在ra ...

  9. k8s集群管理(一)

    cfssl 工具 cfssl-certinfo 验证证书信息 用法: cfssl-certinfo -cert xxx.pem cfssl-certinfo -domain www.baidu.com ...

最新文章

  1. JFinal 源码导读第二天(2)configPlugin,configRoute
  2. bluez 设置绑定pin码_国家工信部紧急提醒:一定要设置这个密码!
  3. Mac NIFI 安装
  4. [HNOI 2011]数矩形
  5. 钱趣多风控新举措:源头选择与物理隔离
  6. 一阶系统单位阶跃响应的特点_第八讲 系统的时域响应
  7. 监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
  8. php 条形码生成器,PHP条形码图像生成器
  9. php什么是变量6,PHP变量是什么
  10. 分布式事务架构设计原理
  11. 树莓派蜜罐节点部署实战
  12. Java如何调用webservice
  13. 锂电池一级保护 二级保护
  14. MATLAB | 那些你不得不知道的MATLAB小技巧(一)
  15. [柒穆雨]学习ps有什么用?
  16. powerquery分组_Power Query系列 - 排序Ranking
  17. HttpProxy网络请求代理
  18. win10 下 升级 npm
  19. 【链想会】第八期 分布式商业管理的内在逻辑和价值思考
  20. Redis分布式锁实现并发秒杀商品设计思路

热门文章

  1. 推荐一个好用的ros plot工具 plot juggler 以及ROS常用的绘图工具
  2. 感冒了,很难受,但.....
  3. vue echarts中改变canvas长和宽 自适应
  4. 使用云服务安装Hyperledger Fabric 全过程
  5. 法新社:谷歌Android成为CES展会明星 微软Windows遭冷落
  6. 休闲娱乐APP,你是否感兴趣呢
  7. 电脑网络里面无法显示本计算机,电脑的本地连接不见了怎么办 电脑的本地连接不见了解决方法...
  8. ncae的c语言编程高阶怎么考,ncae考试科等目.doc
  9. JAVA和SQL中时间的格式化 (yyyy-MM-dd HH:mm:ss转换规则)知识总结
  10. 2022年中国医疗设备电源市场现状研究分析与发展前景预测报告