kubernetes部署DNS

文章目录

  • k8s集群中应用(容器)之间的通信引申出的问题
    • 理解k8s中service的作用
      • 利用service-name实现容器之间的调用(通信)
        • 常见问题:调用的写法不正确
        • 正确示范
        • 常见问题:调用service-name时,被提示 无法解析
        • 解决问题: 引入coreDNS
          • 1、在官网下载配置文件模板,和替换脚本
          • 2、对比生成的yaml与模板的区别
          • 3、用yanl文件创建资源
          • 4、修改kubelet 参数
          • 5、重启kubelet
          • 6、部署coreDNS常见问题
            • 创建coreDNS的pod后,kubectl get pods 看不到相关资源
            • coreDNS无法启动
            • coreDNS一直处于pending

k8s集群中应用(容器)之间的通信引申出的问题

现在有一套LNMP在k8s集群里。
需要nginx将匹配到的/AAA开头的请求代理给后端,
你的第一反应nginx的配置文件里怎么写location块?
是这样吗?
kubernetes部署DNS_第1张图片
那么我问你,tomcat的ip是多少?
也许你会告诉我,那要看tomcat的service类型,
如果是NodePort,那么tomcat这里就写NodeIP+NodePort
如果service类型是cluster……balabala

这样做的同学!你搭k8s来做什么??
kubernetes部署DNS_第2张图片
如果tomcat挂掉之后,
k8s把它拉起的时候是在另一台服务器上呢?? 例如传说中的pod被驱逐
你再回来改nginx配置文件吗???
答不上来吧?那就对了,因为这是我踩过的坑。。


理解k8s中service的作用

用service!用service!用service!

想当初我们没有编排工具,“徒手跑docker”的时候。创建好容器后,容器之间通信只需要依靠宿主机IP+映射 出来的端口就可以了。
现在有了k8s,还引入service的概念,搞那么多事,只为了给你一个ip和端口?
显然不是。
现在回忆一下service的yaml文件怎么写的
kubernetes部署DNS_第3张图片
看到metadata下面的name了没??就是它!!
我们在k8s里面创建的资源是可以依靠service_name来相互通信的
如果忘记了,复习一下
kubernetes部署DNS_第4张图片
service_name是唯一的,也就是说,我们知道了service_name同时就获取了一下信息
1、这个service会将请求通过什么端口
2、发送到什么地方去
3、不管目标的ip是多少,它只认标签来发送
但这已经足够了。

利用service-name实现容器之间的调用(通信)

常见问题:调用的写法不正确

这样吗?
kubernetes部署DNS_第5张图片
如果是,建议回炉重造,重新学习。

正确示范

在这里插入图片描述

location ~xxx {
	proxy_pass    http://service_name:port;
}

常见问题:调用service-name时,被提示 无法解析

没错,
我踩过上面这个坑,
还有下面这个坑。。。
好不容易用对了service_name,却发现
pod之间!并!不!通!


排查过程省略了,直接讲找到原因的那一步
去到创建好的一个容器中比如dockerA_from_podA
利用命令

curl http://service_name_dockerB:123

返回是这样的

curl: (7) Failed to connect to service_name_dockerB port 123: No route to host

它说它不认识service_name怎么走。
不认识!
查资料吧。。原来有个东西叫 CoreDNS
这个东西能解决我们的问题。老老实实安装。

解决问题: 引入coreDNS

1、在官网下载配置文件模板,和替换脚本

主要是deploy.shcoredns.yaml.sed

wget https://raw.githubusercontent.com/coredns/deployment/master/kubernetes/coredns.yaml.sed
wget https://raw.githubusercontent.com/coredns/deployment/master/kubernetes/deploy.sh

执行脚本,带上参数

./deploy.sh -s -r 10.254.0.0/16 -i 10.254.0.10 -d cluster.local > coredns.yaml

参数解释

-s:跳过kube-dns configmap,并且转换到对应的CoreDNS Corefile配置
-r:用CIDR的写法定一个网段
-i:指定DNS地址
-d:指定cluster域名


什么叫CIDR?
10.254.0.0/16 ------------>IP+位数的写法就叫CIDR,不用纠结。
不知道用-r指定多少网段?
回去看看部署kubernetes-master的时候,各个步骤中多多少少有见过

service-cluster-ip-range=10.xxx.0.0/16

这样的吧?
找到之后记下来,这里运行deploy.sh带-r参数后面的CIDR要和前面保持一致。


2、对比生成的yaml与模板的区别
diff coredns.yaml coredns.yaml.sed

看到的输出大概这样的,是不是明白我们为啥下载 coredns.yaml.sed 这个文件了?[捂脸]

kubernetes部署DNS_第6张图片

3、用yanl文件创建资源
kubectl create -f coredns.yaml

会创建这些东西

serviceaccount/coredns created
clusterrole.rbac.authorization.k8s.io/system:coredns created
clusterrolebinding.rbac.authorization.k8s.io/system:coredns created
configmap/coredns created
deployment.extensions/coredns created
service/kube-dns created
4、修改kubelet 参数
vim /k8s/kubernetes/cfg/kubelet

这个文件在我们之前部署kubelet的时候有创建,所以修改的时候请仔细对照

KUBELET_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=10.20.5.192 \
--kubeconfig=/home/pakpobox/k8s/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/home/pakpobox/k8s/kubernetes/cfg/node/bootstrap.kubeconfig \
--config=/home/pakpobox/k8s/kubernetes/cfg/kubelet.config \
--cert-dir=/home/pakpobox/k8s/kubernetes/ssl \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 \
--cluster-dns=10.254.0.10 \#这行有区别
--cluster-domain=cluster.local. \#这行有区别
--resolv-conf=/run/systemd/resolve/resolv.conf "####注意这里Ubuntu和Centos路径不太一样,18.04和16.04也不一样
5、重启kubelet
systemctl restart kubelet.service     
##如果没有先改好kubelet配置文件,那么coredns会running不起来
6、部署coreDNS常见问题
创建coreDNS的pod后,kubectl get pods 看不到相关资源

如果遇到重启完kubelet后 查看不到dns的POD,请带上 --all-namespaces
如果带上 --all-namespaces后看到的返回
在这里插入图片描述

coreDNS无法启动

请首先检查你集群中所有机器的kubelet配置文件有没有写对
/k8s/kubernetes/cfg/kubelet
重点检查第四步中的三行,全部节点没有问题后,重新创建DNS的pod

coreDNS一直处于pending

执行

kubectl describe pod coreDNS -n kube-system

查看coreDNS的状态,着重查看EVENT,
如果是报错说因为标签没有匹配导致pod没法调度到node上,那么需要修改coreDNS.yaml

你可能感兴趣的:(kubernetes)