ExternalDNSによるDNS構成の自動化

13110 ワード

Kubernetesコミュニティの生態繁栄とこの分野の技術の急速な発展は、すでに知られている.Kubernetesの分野には強力で革新的な技術製品が多すぎて、最近私の注意を引いたプロジェクトはExternalDNSです.これは最近のPOC期間中にお客様が自発的に問い合わせたもので、ExternalDNSサブプロジェクトを試してみることを約束し、使用後に本当に印象的だったことに気づきました.
ExternalDNSサブプロジェクト
ExternalDNSサブプロジェクト(インキュベータプロセスが廃棄された)はsig-networkによって協賛され、Tim Hockinによって提唱され、クラウドDNSプロバイダを自動的に構成することを目的としています.これは、インフラストラクチャの自動化をさらにサポートするため、ユーザーがアプリケーションの導入と同時にDNS構成を直接完了することができるため、重要です.
従来のエンタープライズ・デプロイメント・モデルは、通常、複数の孤立したビジネス・ユニットによってデプロイメント・プロセスの異なる部分を処理します.しかし、ExternalDNSを搭載したKubernetesは、従来のエンタープライズ導入モデルとは異なり、このプロセスの一部を自動的に完了することができます.一部のソフトウェアは準備ができていますが、別のビジネス部門がDNSを手動で構成するのを待つ必要があります.ExternalDNSがあれば、この潜在的な問題は解決されます.
ExternalDNSにより、組織チームは自動化と共同責任協力を実現できます.これにより、手動構成の誤りを回避し、各方面が製品をより効果的に市場に推し進めることができます.
AKS上のExternalDNSの構成と導入
私はソフトウェア開発者として働いていました.NET分野では長年の経験がある.マイクロソフトの開発者コミュニティは私の心の中でずっと特殊な位置を持っていて、ここ数年以来私は多くのフィラデルフィア地区のAzureユーザーmeetupに参加したことがあります.ACS(Azure Container Service)とAKS(Azure Kubernetes Service)を通じてKubernetes on Azureを使用する方法を共有します.あいにく、ExternalDNSに問い合わせたユーザーも、IaaS製品としてAzureを選択しています.
AKSクラスタ上でExternalDNSを起動する手順とヘルプコードを以下に示します.このチュートリアルは、他のパブリッククラウドで管理されているKubernetesを使用しても適用されます.
前提条件
Azure ADにログインし、必要に応じて購読を設定してください.
いくつかの注意事項
1、本書の外部テンプレートファイルには、オプション設定が多数使用されていることに注意してください.
2、debugレベルログにも存在するので、troubleshootingも自分で行うことができます.
Azure AKSまたはAzure IaaSにExternalDNSを設定する
1、Azure DNSレコードの作成
RESOURCE_GROUP=MC_rancher-group_c-6vkts_eastusDNS_ZONE=vanbrackel.netaz network dns zone create -g $RESOURCE_GROUP -n $DNS_ZONE 2、登録者の必要に応じてDNSを委任する
3、サービス主体を作成してKubernetesを代表して行動する.
SUBSCRIPTION_ID="$(az account show | jq '.id')"&& SUBSCRIPTION_ID=${SUBSCRIPTION_ID//"}TENANT_ID=$(az account show | jq '.tenantId') && TENANT_ID=${TENANT_ID//"}SCOPE=$(az group show --name $RESOURCE_GROUP | jq '.id') && SCOPE=${SCOPE//"}PRINCIPAL=$(az ad sp create-for-rbac --role="Contributor"--scopes=$SCOPE -n ExternalDnsServicePrincipal)CLIENT_ID=$(echo $PRINCIPAL | jq '.appId') && CLIENT_ID=${CLIENT_ID//"}CLIENT_SECRET=$(echo $PRINCIPAL | jq '.password') && CLIENT_SECRET=${CLIENT_SECRET//"}4、あなたのクラウドプロバイダ構成を作成します.
echo "{ "tenantId": "$TENANT_ID\",\"subscriptionId\":\"$SUBSCRIPTION_ID", "aadClientId": "$CLIENT_ID\",\"aadClientSecret\":\"$CLIENT_SECRET", "resourceGroup": "$RESOURCE_GROUP"}">> azure.json 5は、クラウドプロバイダ構成を使用してKubernetes鍵を作成します.
kubectl create secret generic azure-config-file --from-file=azure.json
secret "azure-config-file"created
6、Rancher構成のAzure IaaS Backed Clustersを使用している場合は、ingress controllerをクラスタから削除します.
kubectl get nsNAME STATUS AGEcattle-system Active 1 ddefault Active 1 dingress-nginx Active 1 dkube-public Active 1 dkube-system Active 1 dkubectl delete ns/ingress-nginxnamespace「ingress-nginx」deleted注意:RancherのAKS構成を使用するクラスタの場合、ingress controllerは提供されません.
7.nginx ingress controllerをインストールし、ExternalDNSのために構成する.ingress-nginx導入とサービスを作成します.
kubectl apply -f https://raw.githubusercontent...kubectl apply -f https://raw.githubusercontent...8、RancherベースのKubernetesクラスタではRBACがデフォルトで有効になっているため、以下のスクリプトからexternaldnsという名前を作成することができる.yamlのyamlファイル、またはこのrepoのexternaldns-template.yamlファイル.
apiVersion: v1kind: ServiceAccountmetadata:
name: external-dns
apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRolemetadata: name: external-dnsrules:
  • apiGroups: [""]resources: ["services"]verbs: ["get","watch","list"]
  • apiGroups: [""]resources: ["pods"]verbs: ["get","watch","list"]
  • apiGroups: ["extensions"] resources: ["ingresses"] verbs: ["get","watch","list"]

  • apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: external-dns-viewerroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: external-dnssubjects:
  • kind: ServiceAccountname: external-dnsnamespace: default

  • apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: external-dnsspec: strategy:
    type: Recreate

    template:
    metadata:
      labels:
        app: external-dns
    spec:
      serviceAccountName: external-dns
      containers:
      - name: external-dns
        image: registry.opensource.zalan.do/teapot/external-dns:v0.5.2
        args:
        - --source=service
        - --source=ingress
        - --domain-filter=vanbrackel.net # (optional) limit to only vanbrackel.net domains; change to match the zone created above.
        - --provider=azure
        - --azure-resource-group=MC_rancher-group_c-6vkts_eastus # (optional) use the DNS zones from above
        volumeMounts:
        - name: azure-config-file
          mountPath: /etc/kubernetes
          readOnly: true
      volumes:
      - name: azure-config-file
        secret:
          secretName: azure-config-file

    EXTERNAL_DNS=$(cat externaldns-template.yaml)EXTERNAL_DNS=${EXTERNAL_DNS//DOMAIN/$DOMAIN} && echo "${EXTERNAL_DNS//RESOURCE_GROUP/$RESOURCE_GROUP}">> externaldns.yamlkubectl create -f externaldns.yaml検証1、ExternalDNSの導入と同様にingressでnginxサービスを作成する
    apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: nginxspec: template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80

    apiVersion: v1kind: Servicemetadata: name: nginx-svcspec: ports:
  • port: 80 protocol: TCP targetPort: 80

  • selector:
    app: nginx

    type: ClusterIP
    apiVersion: extensions/v1beta1kind: Ingressmetadata: name: nginx annotations:
    kubernetes.io/ingress.class: nginx

    spec: rules:
  • host: server.vanbrackel.net http:
    paths:
    - backend:
        serviceName: nginx-svc
        servicePort: 80
      path: /

  • NGINX=$(cat nginx-ingress-test-template.yaml) && echo "${NGINX//DOMAIN/$DOMAIN}">> nginx-ingress-test.yaml 2、nginx-ingress controllerの作成
    kubectl create -f nginx-ingress-test.yaml 3、少々お待ちください
    4、レコードが作成されているかどうかをチェックする
    [jason@vblinux ~ ]$ az network dns record-set a list --resource-group $RESOURCE_GROUP --zone-name $DNS_ZONE[ {
    "arecords": [
      {
        "ipv4Address": "13.68.138.206"
      }
    ],
    "etag": "0fb3eaf9-7bf2-48c4-b8f8-432e05dce94a",
    "fqdn": "server.vanbrackel.net.",
    "id": "/subscriptions/c7e23d24-5dcd-4c7c-ae84-22f6f814dc02/resourceGroups/mc_rancher-group_c-6vkts_eastus/providers/Microsoft.Network/dnszones/vanbrackel.net/A/server",
    "metadata": null,
    "name": "server",
    "resourceGroup": "mc_rancher-group_c-6vkts_eastus",
    "ttl": 300,
    "type": "Microsoft.Network/dnszones/A"

    }]5、チェックログ
    kubectl logs external-dns-655df89959-7ztm2 
    time="2018-06-13T23:57:11Z" level=info msg="config: {Master: KubeConfig: Sources:[service ingress] Namespace: AnnotationFilter: FQDNTemplate: CombineFQDNAndAnnotation:false Compatibility: PublishInternal:false ConnectorSourceServer:localhost:8080 Provider:azure GoogleProject: DomainFilter:[vanbrackel.net] ZoneIDFilter:[] AWSZoneType: AWSAssumeRole: AzureConfigFile:/etc/kubernetes/azure.json AzureResourceGroup:MC_rancher-group_c-6vkts_eastus CloudflareProxied:false InfobloxGridHost: InfobloxWapiPort:443 InfobloxWapiUsername:admin InfobloxWapiPassword: InfobloxWapiVersion:2.3.1 InfobloxSSLVerify:true DynCustomerName: DynUsername: DynPassword: DynMinTTLSeconds:0 InMemoryZones:[] PDNSServer:http://localhost:8081 PDNSAPIKey: Policy:sync Registry:txt TXTOwnerID:default TXTPrefix: Interval:1m0s Once:false DryRun:false LogFormat:text MetricsAddress::7979 LogLevel:debug}"
    time="2018-06-13T23:57:11Z" level=info msg="Connected to cluster at https://10.0.0.1:443"
    ...
    time="2018-06-14T00:02:11Z" level=debug msg="Retrieving Azure DNS zones."
    time="2018-06-14T00:02:12Z" level=debug msg="Found 1 Azure DNS zone(s)."
    time="2018-06-14T00:02:12Z" level=debug msg="Retrieving Azure DNS records for zone 'vanbrackel.net'."
    time="2018-06-14T00:02:12Z" level=debug msg="No endpoints could be generated from service default/kubernetes"
    time="2018-06-14T00:02:12Z" level=debug msg="No endpoints could be generated from service default/nginx-svc"
    time="2018-06-14T00:02:12Z" level=debug msg="No endpoints could be generated from service ingress-nginx/default-http-backend"
    time="2018-06-14T00:02:12Z" level=debug msg="No endpoints could be generated from service ingress-nginx/ingress-nginx"
    time="2018-06-14T00:02:12Z" level=debug msg="No endpoints could be generated from service kube-system/full-guppy-nginx-ingress-controller" time="2018-06-14T00:02:12Z" level=debug msg="No endpoints could be generated from service kube-system/full-guppy-nginx-ingress-default-backend"
    time="2018-06-14T00:02:12Z" level=debug msg="No endpoints could be generated from service kube-system/heapster"
    time="2018-06-14T00:02:12Z" level=debug msg="No endpoints could be generated from service kube-system/kube-dns"
    time="2018-06-14T00:02:12Z" level=debug msg="No endpoints could be generated from service kube-system/kubernetes-dashboard"
    time="2018-06-14T00:02:12Z" level=debug msg="No endpoints could be generated from service kube-system/tiller-deploy"
    time="2018-06-14T00:02:12Z" level=debug msg="Endpoints generated from ingress: default/nginx: [server.vanbrackel.net 0 IN A 13.68.138.206]"
    time="2018-06-14T00:02:12Z" level=debug msg="Retrieving Azure DNS zones."
    time="2018-06-14T00:02:12Z" level=debug msg="Found 1 Azure DNS zone(s)."
    time="2018-06-14T00:02:12Z" level=info msg="Updating A record named 'server' to '13.68.138.206' for Azure DNS zone 'vanbrackel.net'."
    time="2018-06-14T00:02:13Z" level=info msg="Updating TXT record named 'server' to '\"heritage=external-dns,external-dns/owner=default,external-dns/resource=ingress/default/nginx\"' for Azure DNS zone 'vanbrackel.net'."
    time="2018-06-14T00:03:11Z" level=debug msg="Retrieving Azure DNS zones."
    time="2018-06-14T00:03:12Z" level=debug msg="Found 1 Azure DNS zone(s)."
    time="2018-06-14T00:03:12Z" level=debug msg="Retrieving Azure DNS records for zone 'vanbrackel.net'."
    time="2018-06-14T00:03:12Z" level=debug msg="Found A record for 'server.vanbrackel.net' with target '13.68.138.206'."
    time="2018-06-14T00:03:12Z" level=debug msg="Found TXT record for 'server.vanbrackel.net' with target '\"heritage=external-dns,external-dns/owner=default,external-dns/resource=ingress/default/nginx\"'."
    time="2018-06-14T00:03:12Z" level=debug msg="No endpoints could be generated from service default/kubernetes"
    time="2018-06-14T00:03:12Z" level=debug msg="No endpoints could be generated from service default/nginx-svc" time="2018-06-14T00:03:12Z" level=debug msg="No endpoints could be generated from service ingress-nginx/default-http-backend"
    time="2018-06-14T00:03:12Z" level=debug msg="No endpoints could be generated from service ingress-nginx/ingress-nginx"
    time="2018-06-14T00:03:12Z" level=debug msg="No endpoints could be generated from service kube-system/full-guppy-nginx-ingress-controller"
    time="2018-06-14T00:03:12Z" level=debug msg="No endpoints could be generated from service kube-system/full-guppy-nginx-ingress-default-backend"
    time="2018-06-14T00:03:12Z" level=debug msg="No endpoints could be generated from service kube-system/heapster"
    time="2018-06-14T00:03:12Z" level=debug msg="No endpoints could be generated from service kube-system/kube-dns"
    time="2018-06-14T00:03:12Z" level=debug msg="No endpoints could be generated from service kube-system/kubernetes-dashboard"
    time="2018-06-14T00:03:12Z" level=debug msg="No endpoints could be generated from service kube-system/tiller-deploy"
    time="2018-06-14T00:03:12Z" level=debug msg="Endpoints generated from ingress: default/nginx: [server.vanbrackel.net 0 IN A 13.68.138.206]"
    time="2018-06-14T00:03:12Z" level=debug msg="Retrieving Azure DNS zones."
    time="2018-06-14T00:03:12Z" level=debug msg="Found 1 Azure DNS zone(s)."
    

    ExternalDNSのrepoでは、次の情報も参照できます.
    https://github.com/kubernetes...
    原文のコードをより深く理解するには、ここを突き刺してください.
    https://github.com/JasonvanBr...