2. Setup CoreDNS

Common

These instructions apply to Beijing and newer releases.

Create VMs

Create two VMs - master and worker with below config -

VCPUs2
Disk20 GB
RAM8 GB


Configure Kubernetes Cluster

Follow steps from below link to install a Kubernetes cluster using kubeadm, comprising just two VMs created in above step -

https://lf-onap.atlassian.net/wiki/display/DW/Deploying+Kubernetes+Cluster+with+kubeadm

Steps before "Configuring SDN-C ONAP" stage need only be followed. We are using "coredns" feature gate instead of "kube-dns".


Verify below pods up and running after completing all steps

Note:Instead of kube-dns pod, coredns pod is created.


ubuntu@coredns-1:/dockerdata-nfs$ ls -lrt
total 44
-rw-r--r-- 1 root root  1366 Mar  1 15:00 Corefile
-rw-r--r-- 1 root root   979 Mar  5 14:06 zone.db
ubuntu@coredns-1:/dockerdata-nfs$
root@coredns-1:~# kubectl get pods --all-namespaces
NAMESPACE     NAME                                READY     STATUS    RESTARTS   AGE
kube-system   etcd-kubefed-1                      1/1       Running   0          1h
kube-system   kube-apiserver-kubefed-1            1/1       Running   0          1h
kube-system   kube-controller-manager-kubefed-1   1/1       Running   0          1h
kube-system   coredns-789ff8fd8d-2gxnc            1/1       Running   0          1h
kube-system   kube-proxy-g7bxn                    1/1       Running   0          1h
kube-system   kube-proxy-q82lg                    1/1       Running   0          1h
kube-system   kube-scheduler-kubefed-1            1/1       Running   0          1h
kube-system   tiller-deploy-546cf9696c-fbckp      1/1       Running   0          1h
kube-system   weave-net-9zlrh                     2/2       Running   0          1h
kube-system   weave-net-dn7fj                     2/2       Running   1          1h
root@coredns-1:~#

Modify coredns deployment to configure DNS zone

  1. Put attached files - Corefile and zone.db in /dockerdata-nfs using root user.

    ubuntu@coredns-1:/dockerdata-nfs$ ls -lrt
    total 44
    -rw-r--r-- 1 root root  1366 Mar  1 15:00 Corefile
    -rw-r--r-- 1 root root   979 Mar  5 14:06 zone.db
    ubuntu@coredns-1:/dockerdata-nfs$
    
    
  2. Edit coredns configmap to reflect the new zone file.

    #Below command opens the codedns configmap for editing. Edit and save the file.
    
    ubuntu@coredns-1:~# kubectl edit configmap coredns -n kube-system
    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: v1
    data:
      Corefile: |
        .:53 {
            errors
            log
            health
            kubernetes cluster.local 10.96.0.0/12 {
               pods insecure
            }
            file /dockerdata-nfs/zone.db example.com
            prometheus
            proxy . /etc/resolv.conf
            cache 30
        }
      zone.db: "$ORIGIN example.com.     ; designates the start of this zone file in the
        namespace\n$TTL 1h         ; default expiration time of all resource records without
        their own TTL value\nexample.com.  IN  SOA   ns.example.com. username.example.com.
        ( 2007120710 1d 2h 4w 1h )\nexample.com.  IN  NS    ns                    ; ns.example.com
        is a nameserver for example.com\nexample.com.  IN  NS    ns.somewhere.example.
        ; ns.somewhere.example is a backup nameserver for example.com\nexample.com.  IN
        \ A     10.147.101.135             ; IPv4 address for example.com\nns            IN
        \ A     10.247.5.11             ; IPv4 address for ns.example.com\nwww           IN
        \ CNAME example.com.          ; www.example.com is an alias for example.com\nwwwtest
        \      IN  CNAME www              ; wwwtest.example.com is another alias for www.example.com\nsdnc.example.com.
        \   IN      SRV    30202 10 10 example.com.\nsdnc         IN  A  10.147.99.140"
    kind: ConfigMap
    metadata:
      creationTimestamp: 2018-02-28T20:13:03Z
      name: coredns
      namespace: kube-system
      resourceVersion: "102077"
      selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
      uid: c8489771-1cc3-11e8-a0cb-fa163eabcb60
     
    configmap "coredns" edited
    ubuntu@coredns-1:~#

    Following changes are applied:

    WhereAdded Line

    Corefile: |

    .:53{

    ...

    }

    file /dockerdata-nfs/zone.db example.com
    #Before line:
    kind: ConfigMap


    #Note that IP addresses in "A record" should point to current active site's master node.
    example.com.  IN   A   <coredns-vm master ip address>
    ns            IN   A   <nameserver on fed VM as configured originally in /etc/resolv.conf>
    sdnc        IN  A  <active site's master IP>              //Add active Site IP to direct traffic to.

     zone.db: "$ORIGIN example.com.     ; designates the start of this zone file in the
    namespace\n$TTL 1h ; default expiration time of all resource records without
    their own TTL value\nexample.com. IN SOA ns.example.com. username.example.com.
    ( 2007120710 1d 2h 4w 1h )\nexample.com. IN NS ns ; ns.example.com
    is a nameserver for example.com\nexample.com. IN NS ns.somewhere.example.
    ; ns.somewhere.example is a backup nameserver for example.com\nexample.com. IN
    \ A 10.147.101.135 ; IPv4 address for example.com\nns IN
    \ A 10.247.5.11 ; IPv4 address for ns.example.com\nwww IN
    \ CNAME example.com. ; www.example.com is an alias for example.com\nwwwtest
    \ IN CNAME www ; wwwtest.example.com is another alias for www.example.com\nsdnc.example.com.
    \ IN SRV 30202 10 10 example.com.\nsdnc IN A 10.147.99.140"

    The files in step 1 should contain the same entries of coredns configmap, described in step 2. If the files in step 1, are pointing traffic to site IP1 (for example), the coredns configmap in step 2, should also configure site IP1.

  3. Edit coredns deployment to specify mount volumes and zone key for coredns.

    ubuntu@coredns-1:~# kubectl -n kube-system edit deployment coredns
    deployment "coredns" edited
    ubuntu@coredns-1:~#
    Make the following changes
    PurposeChanges


    mount point for new zone file

    mount point for new coredns config file

    define new zone key in volumes

    FieldAdded/Replaced Value

    .spec.template.spec.containers.volumeMounts



    .spec.template.spec.containers.args

    Replaced Values:

    - mountPath: /dockerdata-nfs
    name: config-volume


    - conf

    - /dockerdata-nfs/Corefile

     .spec.template.spec.volumes.items

    Added Values:

    - key: zone.db
    path: zone.db

    Deployment config will look as in file coredns-edit-deploymnt.yaml after making athe bove changes.
    Note that editing the deployment will create a new coredns pod and terminate the old one. Verify the new pod is up and running after editing deployment.

    ubuntu@coredns-1:/root$ kubectl get pods --all-namespaces | grep coredns
    kube-system         coredns-789ff8fd8d-2gxnc                        1/1       Running   0          5d
    ubuntu@coredns-1:/root$
  4. Edit /etc/resolv.conf to point nameserver to configured coreDNS server.

    ubuntu@coredns-1:~# kubectl get svc --all-namespaces | grep kube-dns
    kube-system         kube-dns               ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP   5d
     
    #Use the above cluster IP to configure in /etc/resolv.conf as shown below
    ubuntu@coredns-1:/root$ sudo vi /etc/resolv.conf
    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    nameserver 10.96.0.10
    #nameserver 10.247.5.11
    search openstacklocal
    ubuntu@coredns-1:
     
  5.  Lookup the configured domain to verify it is pointing to site as configured above.

    ubuntu@coredns-1:/dockerdata-nfs$ nslookup sdnc.example.com
    Server:         10.96.0.10
    Address:        10.96.0.10#53
    Name:   sdnc.example.com
    Address: 10.147.101.23
     
    #verify it is resolving sites like google.ca backwardly
    ubuntu@coredns-1:/dockerdata-nfs$ nslookup google.ca
    Server:         10.96.0.10
    Address:        10.96.0.10#53
    Non-authoritative answer:
    Name:   google.ca
    Address: 172.217.23.131