上周进行了1.3的DNS服务的搭建,根据网友的提供进行验证,但是似乎有点问题,只有用ip的时候,可以验证通过,但是用service名验证似乎存在问题,这个后面具体再说。
我的搭建版本是1.3,系统是centos7,64位。下面我来说下我的部署方法:
首先根据kubernetes的安装包的解压环境,进入目录/opt/kubernetes/cluster进入目录,然后进入ubuntu目录,copy此目录下的deployAddons.sh脚本,到上级目录的centos目录下,此处的命令如下:
cd /opt/kubernetes/cluster/ubuntu
cp deployAddons.sh ../centos/
很多人可能奇怪我为什么要copy这个脚本,我也是根据网上资料看的,但是资料部署的是ubuntu环境下的,我猜想大概思想一样。然后我查看了copy的脚本,这个脚本就是用来部署k8s的两个常用插件:dns和dashboard的。里边内容就是根据你的相关值,去替换yaml文件中对应的占位符,然后生成yaml文件,来生成相关的svc以及service,就跟网上大多数资料中的 skydns-svc.yaml,skydns-rc.yaml文件一样,这里我要提下,1.3的dns服务,和之前的版本的有点区别,不再是skydns,kube2sky以及etcd这种,而是使用以下三种镜像,如果你能看懂deployAddons.sh这个脚本,就可以从它里边引用找到对应的yaml文件,从而看到所需的镜像文件,我的所需如下三种:
gcr.io/google_containers/kubedns-amd64:1.5
gcr.io/google_containers/kube-dnsmasq-amd64:1.3
gcr.io/google_containers/exechealthz-amd64:1.1
至于这种具体的变化我可能还不能很清楚的解释,单纯从部署环境的角度,你所需要准备的就是这些。还有就是需要修改下centos文件夹下的config-default文件,新增如下配置:
# Optional: Install cluster DNS. ENABLE_CLUSTER_DNS="${KUBE_ENABLE_CLUSTER_DNS:-true}" # DNS_SERVER_IP must be a IP in SERVICE_CLUSTER_IP_RANGE DNS_SERVER_IP=${DNS_SERVER_IP:-"10.254.0.10"} DNS_DOMAIN=${DNS_DOMAIN:-"cluster.local"} DNS_REPLICAS=${DNS_REPLICAS:-1}
接下来需要利用deployAddons.sh生成yaml文件,具体如下:
# PROVIDER=centos # ./deployAddons.sh
我们通过kubectl来查看一下(注意:由于DNS服务被创建在了一个名为kube-system的namespace中,kubectl执行时要指定namespace名字,否则将无法查到dns service):可以看到如下信息,说明创建完成 Creating kube-system namespace... The namespace 'kube-system' is successfully created. Deploying DNS on Kubernetes replicationcontroller "kube-dns-v17.1" created service "kube-dns" created Kube-dns rc and service is successfully deployed.
# kubectl --namespace=kube-system get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns 10.254.0.10 <none> 53/UDP,53/TCP 1m root@tb:~/opt/kubernetes/cluster/centos# kubectl --namespace=kube-system get pods NAME READY STATUS RESTARTS AGE kube-dns-v17.1-n4tnj 0/3 ErrImagePull 0 4m
在此,我要提下,如果pod状态出现ErrImagePull,或者ErrImage等相关信息,先检查下镜像文件等是否存在,以及是否和yaml配置文件一致。可以通过describe或者logs来查看具体信息,具体命令如下:
kubectl --namespace=kube-system logs kube-dns-v17.1-n4tnj 或者 kubectl --namespace=kube-system describe pods kube-dns-v17.1-n4tnj
我们可以在/home/kubernetes/cluster/centos目录下发现生成了两个yaml文件。我们发现多了两个文件:skydns-rc.yaml和skydns-svc.yaml,这两个文件就是deployAddons.sh执行时根据config-default.sh中的配置生成的两个k8s service描述文件,问题就出在skydns-rc.yaml中。查看对应的images是否和你的镜像文件名一致,也需要注意版本信息是够对应。如果有误,修改后yaml文件后,先删除dns服务,执行如下:
然后注释掉脚本deployAddons.sh中的下面两行:kubectl --namespace=kube-system delete rc/kube-dns-v17.1 svc/kube-dns replicationcontroller "kube-dns-v17.1" deleted service "kube-dns" deleted
#sed -e "s/\\\$DNS_REPLICAS/${DNS_REPLICAS}/g;s/\\\$DNS_DOMAIN/${DNS_DOMAIN}/g;" "${KUBE_ROOT}/cluster/saltbase/salt/kube-dns/skydns-rc.yaml.sed" > skydns-rc.yaml #sed -e "s/\\\$DNS_SERVER_IP/${DNS_SERVER_IP}/g" "${KUBE_ROOT}/cluster/saltbase/salt/kube-dns/skydns-svc.yaml.sed" > skydns-svc.yaml
并且修改skydns-rc.yaml文件,修改具体如下:
args: # command = "/kube-dns" - --domain=cluster.local. - --dns-port=10053 - --kube-master-url=http://27.10.9.101:8080 # 新增一行
再次执行脚本deployAddons.sh,查看日志等信息,发现无错误,现在需要考虑如何验证dns服务是否正常 DNS Server启动完成后,还需要配置kubelet: --cluster_dns=10.254.0.10 #DNS service ip --cluster_domain=cluster.local #default local domain 之后进行kubelet服务重启 如何通过DNS查找service服务??? 该工作是使用一个带有nslookup工具的Pod来验证DNS服务是否工作正常:
# cat busybox.yaml apiVersion: v1 kind: Pod metadata: name: busybox spec: containers: - name: busybox image: 27.10.9.101:5000/busybox command: - sleep - "3600" 运行kubectl create -f busybox.yaml完成创建。 在容器运行成功启动之后,通过kubectl exec <service_name> nslookup进行测试:
# kubectl exec busybox -- nslookup kubernetes 我执行这个失败了报错:nslookup: can't resolve 'kubernetes' 但是我换成ip就可以了,目前还有点疑问,等我后续理明白之后,再来解释,关于我的搭建也是根据大家的贡献奉献,特此感谢。 kubectl exec busybox -- nslookup 10.254.0.1 Server: 8.8.8.8 Address 1: 8.8.8.8 Name: 10.254.0.1 Address 1: 10.254.0.1 (这个我也不明白到底对不对???)