在安装好了k8s整个环境,安装完成dashboard工具之后,接下来我们来进行安装kube-dns.
在github下载kubernetes代码,在目录kubernetes/cluster/addons/dns下,有很多kubedns的yaml部署文件,我们现在只需要关注kubedns-cm.yaml, kubedns-controller.yaml.sed, kubedns-sa.yaml, kubedns-svc.yaml.sed这4个文件,如下图所示。
为什么只需要关注这4个文件呢,因为我们看一下部署dns的脚本是怎么部署的,在kubernetes/centos/deployAddons.sh脚本中,有部署kubedns的函数,如下图所示。
部署函数:
function deploy_dns {
echo "Deploying DNS on Kubernetes"
sed -e "s/\\\$DNS_DOMAIN/${DNS_DOMAIN}/g" "${KUBE_ROOT}/cluster/addons/dns/kubedns-controller.yaml.sed" > kubedns-controller.yaml
sed -e "s/\\\$DNS_SERVER_IP/${DNS_SERVER_IP}/g" "${KUBE_ROOT}/cluster/addons/dns/kubedns-svc.yaml.sed" > kubedns-svc.yaml
KUBEDNS=`eval "${KUBECTL} get services --namespace=kube-system | grep kube-dns | cat"`
if [ ! "$KUBEDNS" ]; then
# use kubectl to create kube-dns deployment and service
${KUBECTL} --namespace=kube-system create -f kubedns-sa.yaml
${KUBECTL} --namespace=kube-system create -f kubedns-cm.yaml
${KUBECTL} --namespace=kube-system create -f kubedns-controller.yaml
${KUBECTL} --namespace=kube-system create -f kubedns-svc.yaml
echo "Kube-dns deployment and service is successfully deployed."
else
echo "Kube-dns deployment and service is already deployed. Skipping."
fi
echo
}
可以函数中部署dns只是修改了kubedns-controller.yaml.sed 中的DNS_DOMAIN变量,修改了kubedns-svc.yaml.sed 文件中的DNS_SERVER_IP变量,并重命名为kubedns-controller.yaml 和kubedns-svc.yaml, 最后就是kubectl create了。OK,接下来我们把DNS_DOMAIN变量修改成cluster.local, 默认值就是这个,我们定义DNS_SERVER_IP 为10.254.0.100,这个ip必须在service-cluster-ip-range=10.254.0.0/16中,否则会出错。
在安装前,我们需要更换下镜像,你懂得,google的镜像用不了
修改kubedns-controller.yaml 文件中的3个镜像
# image: gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.1
image: dockergy/k8s-dns-kube-dns-amd64:1.14.1
# image: gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.1
image: dockergy/k8s-dns-dnsmasq-nanny-amd64:1.14.1
# image: gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.1
image: dockergy/k8s-dns-sidecar-amd64:1.14.1
进行安装kubedns
${KUBECTL} --namespace=kube-system create -f kubedns-sa.yaml
${KUBECTL} --namespace=kube-system create -f kubedns-cm.yaml
${KUBECTL} --namespace=kube-system create -f kubedns-controller.yaml
${KUBECTL} --namespace=kube-system create -f kubedns-svc.yaml
看页面pod,可以看到pod成功创建
Node节点使用dns解析服务,kubelet配置文件中加上dns参数
cat /etc/kubernetes/kubelet
###
# kubernetes kubelet (minion) config
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"
# The port for the info server to serve on
# KUBELET_PORT="--port=10250"
# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=162.3.160.63"
# location of the api-server
KUBELET_API_SERVER="--api-servers=http://162.3.160.60:8080"
# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
# Add your own!
KUBELET_ARGS="--cluster_dns=10.254.0.100 --cluster_domain=cluster.local"
接下来我们用安装一个geuestbook来测试一下,我们安装的dns是否可用
在kubernetes源代码目录下,kubenetes/examples/guestbook/all-in-one/guestbook-all-in-one.yaml文件,我们修一下frontend的service,设置type为NodePort, 增加nodePort: 30001,我们可以通过节点ip:nodePort的形式进行访问guestbook,如下图所示:
kuectl create -f guestbook-all-in-one.yaml
创建成功pod之后我们需要验证一下dns是否可用了,我们随意找一个redis-slave 容器,查看所在的节点,ssh到节点上,进入docker
查看docker id
进入docker,docker exec -it 31110e4cf455 /bin/bash
进入docker之后,cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.254.0.100
nameserver 8.8.8.8
options ndots:5
可以看到nameserver 有指向我们的dns服务ip,这个需要在kubelet参数中指定cluster-dns 才会有这个。安装dns测试工具nslookup
apt-get update
apt-get install dnsutils
安装完成之后,nslookup redis-master
nslookup redis-master
Server: 10.254.0.100
Address: 10.254.0.100#53
Name: redis-master.default.svc.cluster.local
Address: 10.254.98.230
由此可见,dns正常生效了。