- 安装kubedns插件
- 系统预定义的 RoleBinding
- 配置 kube-dns ServiceAccount
- 配置
kube-dns服务 - 配置
kube-dnsDeployment - 执行所有定义文件
- 检查 kubedns 功能
安装kubedns插件
官方的yaml文件目录:kubernetes/cluster/addons/dns。
该插件直接使用kubernetes部署,官方的配置文件中包含以下镜像:
gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.1gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.1gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.1
我clone了上述镜像,上传到我的私有镜像仓库:
harbor-001.jimmysong.io/library/k8s-dns-dnsmasq-nanny-amd64:1.14.1harbor-001.jimmysong.io/library/k8s-dns-kube-dns-amd64:1.14.1harbor-001.jimmysong.io/library/k8s-dns-sidecar-amd64:1.14.1
同时上传了一份到时速云备份:
index.tenxcloud.com/jimmy/k8s-dns-dnsmasq-nanny-amd64:1.14.1index.tenxcloud.com/jimmy/k8s-dns-kube-dns-amd64:1.14.1index.tenxcloud.com/jimmy/k8s-dns-sidecar-amd64:1.14.1
以下yaml配置文件中使用的是私有镜像仓库中的镜像。
kubedns-cm.yamlkubedns-sa.yamlkubedns-controller.yamlkubedns-svc.yaml
已经修改好的 yaml 文件见:../manifests/kubedns
系统预定义的 RoleBinding
预定义的 RoleBinding system:kube-dns 将 kube-system 命名空间的 kube-dns ServiceAccount 与 system:kube-dns Role 绑定, 该 Role 具有访问 kube-apiserver DNS 相关 API 的权限;
$ kubectl get clusterrolebindings system:kube-dns -o yamlapiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata:annotations:rbac.authorization.kubernetes.io/autoupdate: "true"creationTimestamp: 2017-04-11T11:20:42Zlabels:kubernetes.io/bootstrapping: rbac-defaultsname: system:kube-dnsresourceVersion: "58"selfLink: /apis/rbac.authorization.k8s.io/v1beta1/clusterrolebindingssystem%3Akube-dnsuid: e61f4d92-1ea8-11e7-8cd7-f4e9d49f8ed0roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:kube-dnssubjects:- kind: ServiceAccountname: kube-dnsnamespace: kube-system
kubedns-controller.yaml 中定义的 Pods 时使用了 kubedns-sa.yaml 文件定义的 kube-dns ServiceAccount,所以具有访问 kube-apiserver DNS 相关 API 的权限。
配置 kube-dns ServiceAccount
无需修改。
配置 kube-dns 服务
$ diff kubedns-svc.yaml.base kubedns-svc.yaml30c30< clusterIP: __PILLAR__DNS__SERVER__---> clusterIP: 10.254.0.2
- spec.clusterIP = 10.254.0.2,即明确指定了 kube-dns Service IP,这个 IP 需要和 kubelet 的
--cluster-dns参数值一致;
配置 kube-dns Deployment
$ diff kubedns-controller.yaml.base kubedns-controller.yaml58c58< image: gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.1---> image: harbor-001.jimmysong.io/library/k8s-dns-kube-dns-amd64:v1.14.188c88< - --domain=__PILLAR__DNS__DOMAIN__.---> - --domain=cluster.local.92c92< __PILLAR__FEDERATIONS__DOMAIN__MAP__---> #__PILLAR__FEDERATIONS__DOMAIN__MAP__110c110< image: gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.1---> image: harbor-001.jimmysong.io/library/k8s-dns-dnsmasq-nanny-amd64:v1.14.1129c129< - --server=/__PILLAR__DNS__DOMAIN__/127.0.0.1#10053---> - --server=/cluster.local./127.0.0.1#10053148c148< image: gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.1---> image: harbor-001.jimmysong.io/library/k8s-dns-sidecar-amd64:v1.14.1161,162c161,162< - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.__PILLAR__DNS__DOMAIN__,5,A< - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.__PILLAR__DNS__DOMAIN__,5,A---> - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local.,5,A> - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local.,5,A
- 使用系统已经做了 RoleBinding 的
kube-dnsServiceAccount,该账户具有访问 kube-apiserver DNS 相关 API 的权限;
执行所有定义文件
$ pwd/root/kubedns$ ls *.yamlkubedns-cm.yaml kubedns-controller.yaml kubedns-sa.yaml kubedns-svc.yaml$ kubectl create -f .
检查 kubedns 功能
新建一个 Deployment
$ cat >> my-nginx.yaml << EOFapiVersion: extensions/v1beta1kind: Deploymentmetadata:name: my-nginxspec:replicas: 2template:metadata:labels:run: my-nginxspec:containers:- name: my-nginximage: harbor-001.jimmysong.io/library/nginx:1.9ports:- containerPort: 80EOF$ kubectl create -f my-nginx.yaml
Export 该 Deployment, 生成 my-nginx 服务
$ kubectl expose deploy my-nginx$ kubectl get services --all-namespaces |grep my-nginxdefault my-nginx 10.254.179.239 <none> 80/TCP 42m
创建另一个 Pod,查看 /etc/resolv.conf 是否包含 kubelet 配置的 --cluster-dns 和 --cluster-domain,是否能够将服务 my-nginx 解析到 Cluster IP 10.254.179.239。
$ kubectl create -f nginx-pod.yaml$ kubectl exec nginx -i -t -- /bin/bashroot@nginx:/# cat /etc/resolv.confnameserver 10.254.0.2search default.svc.cluster.local. svc.cluster.local. cluster.local. jimmysong.iooptions ndots:5root@nginx:/# ping my-nginxPING my-nginx.default.svc.cluster.local (10.254.179.239): 56 data bytes76 bytes from 119.147.223.109: Destination Net Unreachable^C--- my-nginx.default.svc.cluster.local ping statistics ---root@nginx:/# ping kubernetesPING kubernetes.default.svc.cluster.local (10.254.0.1): 56 data bytes^C--- kubernetes.default.svc.cluster.local ping statistics ---11 packets transmitted, 0 packets received, 100% packet lossroot@nginx:/# ping kube-dns.kube-system.svc.cluster.localPING kube-dns.kube-system.svc.cluster.local (10.254.0.2): 56 data bytes^C--- kube-dns.kube-system.svc.cluster.local ping statistics ---6 packets transmitted, 0 packets received, 100% packet loss
从结果来看,service名称可以正常解析。
注意:直接ping ClusterIP是ping不通的,ClusterIP是根据IPtables路由到服务的endpoint上,只有结合ClusterIP加端口才能访问到对应的服务。
