现在有一套LNMP在k8s集群里。
需要nginx将匹配到的/AAA开头的请求代理给后端,
你的第一反应nginx的配置文件里怎么写location块?
是这样吗?
那么我问你,tomcat的ip是多少?
也许你会告诉我,那要看tomcat的service类型,
如果是NodePort,那么tomcat这里就写NodeIP+NodePort
如果service类型是cluster……balabala
这样做的同学!你搭k8s来做什么??
如果tomcat挂掉之后,
k8s把它拉起的时候是在另一台服务器上呢?? 例如传说中的pod被驱逐
你再回来改nginx配置文件吗???
答不上来吧?那就对了,因为这是我踩过的坑。。
用service!用service!用service!
想当初我们没有编排工具,“徒手跑docker”的时候。创建好容器后,容器之间通信只需要依靠宿主机IP+映射 出来的端口就可以了。
现在有了k8s,还引入service的概念,搞那么多事,只为了给你一个ip和端口?
显然不是。
现在回忆一下service的yaml文件怎么写的
看到metadata下面的name了没??就是它!!
我们在k8s里面创建的资源是可以依靠service_name来相互通信的
如果忘记了,复习一下
service_name是唯一的,也就是说,我们知道了service_name同时就获取了一下信息
1、这个service会将请求通过什么端口
2、发送到什么地方去
3、不管目标的ip是多少,它只认标签来发送
但这已经足够了。
location ~xxx {
proxy_pass http://service_name:port;
}
没错,
我踩过上面这个坑,
还有下面这个坑。。。
好不容易用对了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
这个东西能解决我们的问题。老老实实安装。
主要是deploy.sh和coredns.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要和前面保持一致。
diff coredns.yaml coredns.yaml.sed
看到的输出大概这样的,是不是明白我们为啥下载 coredns.yaml.sed 这个文件了?[捂脸]
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
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也不一样
systemctl restart kubelet.service
##如果没有先改好kubelet配置文件,那么coredns会running不起来
如果遇到重启完kubelet后 查看不到dns的POD,请带上 --all-namespaces
如果带上 --all-namespaces后看到的返回
请首先检查你集群中所有机器的kubelet配置文件有没有写对
/k8s/kubernetes/cfg/kubelet
重点检查第四步中的三行,全部节点没有问题后,重新创建DNS的pod
执行
kubectl describe pod coreDNS -n kube-system
查看coreDNS的状态,着重查看EVENT,
如果是报错说因为标签没有匹配导致pod没法调度到node上,那么需要修改coreDNS.yaml