008K8s域名解析无效问题
上一节的结论
要实现域名解析,第一种方法是写本地hosts,另一种方法是修改coredns的configmap
1、写hosts的弊端
写hosts的方式最简单,但是在其他节点或者pod内部是无法访问的
2、CoreDNS
CoreDNS提供的默认域名, 仅集群内部可以访问
命名规则:[service-name].[namespace-name].svc.cluster.local
text
service-cutejava-tiny-service.namespace-cutejava-tiny-service.svc.cluster.local
CoreDNS解析过程
1、先解析/etc/hosts (pod启动时候,yaml可以配置hostname)
2、通过本机的 /etc/resolv.conf ,进行域名解析 (nameserver 10.96.0.10 代表的coderdns svc地址,然后找到coredns容器)
3、coredns容器主要通过etcd数据库查询pod 和svc 、statefu 等来进行解析
CoreDNS hosts 解析不生效(解决过程)

shell
kubectl edit configmaps node-local-dns -n kube-system
PILLAR__CLUSTER__DNS 环境变量对应 kube-dns 的 ConfigMap 定义的 CoreDNS 地址 PILLAR__CLUSTER__DNS 和 PILLAR__UPSTREAM__SERVERS 这两个参数在镜像 1.15.6 版本以上中会自动进行配置,对应的值来源于 kube-dns 的 ConfigMap 和定制的 Upstream Server 地址
text
好家伙, 默认的配置是个什么鬼。把 __PILLAR__UPSTREAM__SERVERS__ 换成 __PILLAR__CLUSTER__DNS__
shell
# 重建 node-local-dns 的pod
kubectl delete pods -n kube-system -l k8s-app=node-local-dns上面的步骤成功的把矛头指向了CoreDNS的地址
shell
# 编辑 CoreDNS 的ConfigMap
kubectl edit configmaps -n kube-system coredns
10.68.5.77 为 ingress 的 service ip地址
text
hosts {
10.68.5.77 cutejava.odboy.cn
fallthrough
}shell
# 重建 CoreDNS 的pod
kubectl delete pods -n kube-system -l k8s-app=kube-dns集群pod内部,验证域名是否生效
ping 不通没关系
shell
kubectl exec -it statefulset-cutejava-tiny-service-0 -n namespace-cutejava-tiny-service ping cutejava.odboy.cn
curl 接口通了就行
shell
kubectl exec -it statefulset-cutejava-tiny-service-0 -n namespace-cutejava-tiny-service curl http://cutejava.odboy.cn
集群外部,也就是master或node节点上
- 获取 CoreDNS 的 service ip
shell
# 我的是 10.68.0.2
kubectl get service -A|grep kube-dns|grep -v kube-dns-upstream|awk '{print $4}'
- 在需要访问集群内域名的节点上配置 /etc/resolv.conf
shell
# 在第三行之前插入 CoreDNS 地址
sed -i "3i nameserver 10.68.0.2" /etc/resolv.conf扩展:整合 1 和 2 的版本,适合怕麻烦的同学
shell
# 在第三行之前插入 CoreDNS 地址
sed -i "3i nameserver $(kubectl get service -A|grep kube-dns|grep -v kube-dns-upstream|awk '{print $4}')" /etc/resolv.conf- 在SingeK8s(这个就是之前搭建的那个单节点k8s集群)上测试ping和curl


