自建dns实现tke集群apiserver域名内网自动解析

2021-10-11 14:27:48 浏览数 (1)

腾讯云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访问集群看下是否能成功

能正常访问则说明自动解析配置成功。

0 人点赞