kubernetes配置DNS
之前,在搭建fabric的k8s启动方式,启动的kfk、zookeeper,解析不到服务名,虽然可以  
通过修改/etc/hosts解决,但是很麻烦,并且,fabric提供的镜像,进入容器后,发现很多工  
具没有,甚至不能apt安装.
  所以,考虑配置DNS,这里有两个选择,kube-dns和core-dns,最先配置了kube-dns,遇到  
了问题,容器启动失败,后换成core-dns,也是同样的问题,这很有可能跟搭建的集群有关.
  最终发现是自己搭建集群,启动参数设置的又问题,这个工具有点大,参数有点多,慢慢学.

集群环境说明

为了简单搭建集群,以尽快学习相关知识,进入到原生云领域.这里不向大家那样搭建多个  
节点,而只在一个节点上进行,及master和node在同一台物理机器上.这样专注于业务功能  
开发,而不是集群的运维.
  • 节点环境
阿里云 ubuntu16.04环境

name

ip

master/node1

172.16.199.55(私有ip)

  • kubernetes1.11手动搭建
  • 忙完这段时间的工作(阿里比赛和实验室的专利),撰写完整的单节点搭建k8s环境,此处留坑
  • 搭建core-dns
  • 下载core-dns
git clone https://github.com/coredns/deployment.git
cd deployment/kubernetes
  • deployment/kubernetes 目录结构
liudeMacBook-Pro:kubernetes liu$ tree
.
├── README.md
├── coredns.yaml.sed  
├── deploy.sh     
└── rollback.sh   

0 directories, 4 files
  • 生成coredns.yaml
#将部署结果保存到coredns.yaml

./deploy.sh -i 169.169.0.2 -d cluster.local >coredns.yaml

#为方便操作可写成脚本(主要是,之前debug太多次)
  • 部署coredns
kubectl create -f .


#一段时间后,正常的话

root@liu:~/data/deployment# kubectl get pods -n kube-system
NAME                       READY     STATUS    RESTARTS   AGE
coredns-55f86bf584-bp6sx   1/1       Running   0          11s
coredns-55f86bf584-gfpkr   1/1       Running   0          11s       #但,一开始,我只一直是如下的情况,稍后解决
root@liu:~#  kubectl get pods -n   kube-system
NAME                       READY     STATUS             RESTARTS   AGE
coredns-7c49789867-gwlhm   0/1       CrashLoopBackOff   18         1h
coredns-7c49789867-kf292   0/1       CrashLoopBackOff   18         1h
  • 修改kubelet启动参数,添加–cluster-dns 和–cluster-domain,并重启kubelet
KUBELET_ARGS=" --cluster-dns=169.169.0.2  --cluster-domain=cluster.local  --kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
  • 测试dns
  • 创建busybox.yaml(注意:yaml不能使用tab,并注意空格数)
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always
  • 创建测试pod
root@liu:~# kubectl create -f busybox.yaml
root@liu:~# kubectl get pod
NAME      READY     STATUS    RESTARTS   AGE
busybox   1/1       Running   1          1h
  • 测试dns
#成功状态

root@liu:~# kubectl exec -ti busybox -- nslookup baidu.com
Server:    100.100.2.136
Address 1: 100.100.2.136

Name:      baidu.com
Address 1: 123.125.115.110
Address 2: 220.181.57.216


# k8s官网上的那个测试,失败的原因是kubernetes.default被墙了

root@liu:~# kubectl exec -ti busybox -- nslookup kubernetes.default
Server:    100.100.2.136
Address 1: 100.100.2.136

nslookup: can't resolve 'kubernetes.default'
command terminated with exit code 1

#开启vpn后,测试记过如下图

k8s 配置elk k8s 配置dns_k8s 配置elk


以上是正常的创建过程,但实际中遇到了各种问题
  • Q1:coredns/kubedns容器创建失败
root@liu:~# kubectl get pod -n kube-system
NAME                       READY     STATUS             RESTARTS   AGE
coredns-55f86bf584-7d9q7   0/1       CrashLoopBackOff   14         53m
coredns-55f86bf584-sdgkd   0/1       CrashLoopBackOff   14         53m
root@liu:~/data/deployment# kubectl logs -n kube-system -f     coredns-55f86bf584-7hjmp
2018/09/02 04:17:43 plugin/kubernetes: open /var/run/secrets/kubernetes.io/serviceaccount/token: no such file or directory
  • A:该错误是apiserver没有设置启动参数 –admission-control=ServiceAccount
  • 修改apiserver启动参数
KUBE_API_ARGS="--etcd-servers=http://127.0.0.1:2379 --insecure-bind-address=0.0.0.0   --service-cluster-ip-range=169.169.0.0/16 --service-node-port-range=1-65535 --admission-control=ServiceAccount,NamespaceLifecycle,LimitRanger,ResourceQuota --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
  • 修改kube-controller-manager 启动参数–service-account-private-key-file
KUBE_CONTROLLER_MANAGER_ARGS="--service-account-private-key-file=/var/run/kubernetes/apiserver.key --master=http://172.16.199.55:8080 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
仅修改apiserver,会造成创建rc,生不成rc,即查询不到pod
  • 参考:
  • kubernetes下heapster的部署案例
  • Kubernetes 解决/var/run/secret/kubernetes.io/serviceaccount/token no such file or directory问题
  • 还有一个问题待解决找不到参数crt