K8s无脑DNS服务搭建和访问
概述
上一个文章讲到了,采用NodePort。NodePort绑定了IP,所以对于未来的扩容、部署不友好。所以我们需要进一步学习下去。
外部访问LoadBalance和Ingress。无论哪种,都避不开一个点,就是集群内部采用DNS查询服务。
- 不要怕,很简单,照着做一定行!
- 容易犯的错误,下面会有说明
- 因为使用了DNS服务,Node节点的服务启动有顺序要求了!
1. 创建DNS服务
所需要的Yaml
- kubedns-rc.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kube-dns
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
spec:
strategy:
rollingUpdate:
maxSurge: 10%
maxUnavailable: 0
selector:
matchLabels:
k8s-app: kube-dns
template:
metadata:
labels:
k8s-app: kube-dns
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ''
scheduler.alpha.kubernetes.io/tolerations: '[{"key":"CriticalAddonsOnly", "operator":"Exists"}]'
spec:
containers:
- name: kubedns
image: registry.cn-hangzhou.aliyuncs.com/google-containers/kubedns-amd64:1.9
args:
- --domain=cluster.local.
- --dns-port=10053
- --config-map=kube-dns
- --v=2
- --kube-master-url=http://192.168.56.4:8080 # 这个地址参见《kubernetes最小集群搭建》
env:
- name: PROMETHEUS_PORT
value: "10055"
ports:
- containerPort: 10053
name: dns-local
protocol: UDP
- containerPort: 10053
name: dns-tcp-local
protocol: TCP
- containerPort: 10055
name: metrics
protocol: TCP
- name: dnsmasq
image: registry.cn-hangzhou.aliyuncs.com/google-containers/kube-dnsmasq-amd64:1.4
args:
- --cache-size=1000
- --no-resolv
- --server=127.0.0.1#10053
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
- kubedns-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: kube-dns
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: "KubeDNS"
spec:
selector:
k8s-app: kube-dns
clusterIP: 10.254.10.10 # 重点,重点,重点!!!地址可以随便设置,但!!!!这个IP一定要与flannel设置在etcd的网段保持一致。参见:《kubernetes最小集群搭建》 4.3保持一致
ports:
- name: dns
port: 53
protocol: UDP
- name: dns-tcp
port: 53
protocol: TCP
2. 修改配置(没有特殊说明,节点都要做如下检查和操作)
- 修改配置
-
修改文件
vim /etc/kubernetes/kubelet KUBELET_ARGS="--cluster_dns=10.254.10.10 --cluster_domain=cluster.local"
--cluster_dns=10.254.10.10
IP地址与kubedns-svc.yaml中的选项保持一致--cluster_domain
与kubedns-rc.yaml 中的domain保持一致!
- Node节点重新启动
systemctl stop kubelet docker kube-proxy flanneld
systemctl start flanneld docker kubelet kube-proxy
- Master节点重新启动
systemctl stop etcd flanneld kube-proxy kube-apiserver kube-controller-manager kube-scheduler
systemctl start etcd flanneld kube-proxy kube-apiserver kube-controller-manager kube-scheduler
- 创建DNS服务
$kubectl create -f kubedns-rc.yaml
$kubectl create -f kubedns-svc.yaml
2.1 检查DNS服务创建情况
-
执行命令
$kubectl get svc,ep,pod --all-namespace NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE default svc/kubernetes 10.254.0.1 <none> 443/TCP 3d kube-system svc/kube-dns 10.254.10.10 <none> 53/UDP,53/TCP 1h NAMESPACE NAME ENDPOINTS AGE default ep/kubernetes 192.168.1.114:6443 3d kube-system ep/kube-dns 10.254.1.2:53,10.254.1.2:53 1h NAMESPACE NAME READY STATUS RESTARTS AGE kube-system po/kube-dns-2768888805-978hl 2/2 Running 0 1h
可以观察到svc/kube-dns 10.254.10.10 ,并且,EndPoint也对上了!成功
执行nslookup www.baidu.com 10.254.10.10 发现正常解析。再次确认成功
2.3 实际服务注册并获取DNS查询
-
修改mysql-svc.yaml,去掉NodePort相关,
由于NodePort在运行中无法修改,需要删掉原有的mysql服务
-
删除旧服务
$kubectl delete -f mysql-svc.yaml
-
编辑资源描述文件
vim mysql-svc.yaml
apiVersion: v1 kind: Service metadata: name: mysql-svc labels: name: mysql-svc spec: ports: - port: 3306 protocol: TCP targetPort: 3306 name: mysql selector: app: mysql-pod
-
重新创建服务
$kubectl create -f mysql-svc.yaml 等待创建完毕 $nslookup mysql-svc.default.svc.cluster.local 10.254.10.10 Server: 10.254.10.10 Address: 10.254.10.10#53 Name: mysql-svc.default.svc.cluster.local Address: 10.254.57.197
完全达成!
3. 遇到的问题
3.1 Node之间访问Pod不通的问题(没有特殊说明,节点都要做如下检查和操作)
- 双网卡,第一块网卡是外网网卡,导致无法访问(参见《kubernetes最小集群搭建》,虚拟机两块网卡的设定)
在kubelet配置文件修改,为flanneld启动增加参数
vim /etc/sysconfig/flanneld
FLANNEL_OPTIONS="-iface enp0s8" # 这个网卡请参考实际虚拟机的名字
-
两个Node被分配到了一个网段的问题!
启动顺序以及缓存导致的问题
-
正确的Node启动顺序
一定要先启动flanneld!!!!
systemctl stop kubelet docker kube-proxy flanneld systemctl start flanneld docker kubelet kube-proxy
-
正确的Master启动顺序
systemctl start etcd flanneld kube-proxy kube-apiserver kube-controller-manager kube-scheduler
3.2 犯的最傻X问题
- Master主机没有启动kube-proxy导致 无法验证DNS成功。《kubernetes最小集群搭建》也做了修改