腾讯云tke集群访问apiserver地址都是域名来访问的,支持内网和公网访问apiserver,如果是公网访问会创建一个公网的类型的clb,然后将域名自动解析到clb的vip上。如果是内网访问会创建一个内网clb类型的service,default命名空间下的kube-user,但是内网不会做域名的自动解析,所以通常需要配置在客户端配置hosts解析才能访问集群。客户端机器较多的时候,需要每一台配置host解析就比较麻烦,能否实现tke集群apiserver域名做内网的自动解析?
腾讯云上有推出一个Private DNS的服务就是用来做内网的自动解析的,我们可以在Private DNS中加上集群域名和对应内网clb的A记录,即可实现vpc内内网自己解析,具体配置可以参考文档https://cloud.tencent.com/document/product/457/55348
当然也可以自建dns来实现tke集群apiserver域名做内网的自动解析,今天我们来说说如何在tke集群自建dns来内网自动解析,具体的实现是部署一个dnsmasq到集群中,dnsmasq镜像项目地址https://github.com/jpillora/docker-dnsmasq,然后提供一个内网clb的service作为dns的入口,最终在节点或者vpc配置下内网clb的vip作为nameserver,即可实现vpc下内网自动解析。
1. 创建namesapce部署dnsmasq
代码语言:javascript复制# kubectl create ns dnsmasq
2. 配置dnsmasq配置文件
dnsmasq的配置文件通过configmap的方式进行挂载,具体的configmap配置如下,配置文件的说明文档可以参考http://oss.segetech.com/intra/srv/dnsmasq.conf
代码语言:javascript复制apiVersion: v1
data:
dnsmasq.conf: |-
#dns解析日志
log-queries
#域名与IP映射
address=/cls-b3mg1p92.ccs.tencent-cloud.com/10.0.0.60
address=/cls-jmdg96ew.ccs.tencent-cloud.com/10.0.0.71
kind: ConfigMap
metadata:
name: dnsmasq-conf
namespace: dnsmasq
3. 创建dnsmasq工作负载
接下来部署一个dnsmasq的deployment,这里配置的HTTP_USER和HTTP_PASS环境变量是用来进行前端配置的鉴权登录
代码语言:javascript复制apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: dnsmasq
qcloud-app: dnsmasq
name: dnsmasq
namespace: dnsmasq
spec:
replicas: 1
selector:
matchLabels:
k8s-app: dnsmasq
qcloud-app: dnsmasq
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
k8s-app: dnsmasq
qcloud-app: dnsmasq
spec:
containers:
- env:
- name: HTTP_USER
value: admin
- name: HTTP_PASS
value: "123456"
image: jpillora/dnsmasq
imagePullPolicy: Always
name: dnsmasq
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 250m
memory: 256Mi
securityContext:
privileged: false
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/dnsmasq.conf
name: vol
subPath: dnsmasq.conf
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: qcloudregistrykey
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- configMap:
defaultMode: 420
name: dnsmasq-conf
name: vol
4. 创建提供访问的service
因为腾讯云的clb类型serivce不支持部署不同协议的规则,dnsmasq的53端口需要用udp,而前端管理页面的端口8080是tcp,因此这里我们创建2个service来暴露服务。服务的udp协议53端口我们用内网clb类型,前端配置页面8080端口用clusterip类型service,然后配置一个ingress进行访问即可。
dnsmasq的服务service,这里的内网clb vip是10.0.21.13,后续将这个ip配置到nameserve即可
代码语言:javascript复制apiVersion: v1
kind: Service
metadata:
annotations:
service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxx
name: dnsmasq
namespace: dnsmasq
spec:
externalTrafficPolicy: Cluster
ports:
- name: 53-53-udp
nodePort: 31198
port: 53
protocol: UDP
targetPort: 53
selector:
k8s-app: dnsmasq
qcloud-app: dnsmasq
sessionAffinity: None
type: LoadBalancer
前端配置webui的service如下
代码语言:javascript复制apiVersion: v1
kind: Service
metadata:
name: dashboaed
namespace: dnsmasq
spec:
ports:
- name: 8080-8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
selector:
k8s-app: dnsmasq
qcloud-app: dnsmasq
sessionAffinity: None
type: ClusterIP
5. 为dnsmasq前端页面配置ingress
下面我们通过一个ingress来用域名范文我们的dnsmasq的webui
代码语言:javascript复制apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: ingress
name: dnsmasq-ingress
namespace: dnsmasq
spec:
rules:
- host: dnsmasq.tke.niewx.cn
http:
paths:
- backend:
serviceName: dashboaed
servicePort: 8080
path: /
浏览器访问域名访问webui,登录账号密码是之前的工作负载配置的环境变量
登录后,我们可以看到dnsmasq的配置和日志,如果需要修改dnsmasq的配置,也可以直接在前端修改,然后保存重启服务。
6. 节点或者vpc配置nameserver
要想用我们的自定义dns来自动解析域名,还需要在节点的/etc/resolv.conf配置下nameserver,如果想整个vpc下所有节点都配置,可以在vpc进行配置,在dns配置项加上10.0.21.13,这个对存量节点生效,需要重启节点,新节点默认会加上这个。
如果对于一些存量节点不能重启的,我们需要手动在节点的/etc/resolv.conf配置10.0.21.13这个nameserver。
7. 测试解析访问域名
最后我们来测试下域名的解析
代码语言:javascript复制[root@VM-0-3-centos kubernetes]# nslookup cls-b3mg1p92.ccs.tencent-cloud.com 10.0.21.13
Server: 10.0.21.13
Address: 10.0.21.13#53
Name: cls-b3mg1p92.ccs.tencent-cloud.com
Address: 10.0.0.60
同时我们关闭下集群公网访问,然后用kubectl访问集群看下是否能成功
能正常访问则说明自动解析配置成功。