Esta página te guÃa a través del proceso de implementación y validación de DNS externos para los componentes de tu Operador Kubernetes desplegados a lo largo de varios clústeres de Kubernetes sin un service mesh.
Requisitos previos
Antes de empezar, realiza las siguientes tareas:
Instale
kubectl.Actualiza según sea necesario y configura las variables de entorno definidas en el siguiente archivo
env_variables.sh.# This script builds on top of the environment configured in the setup guides.# It depends (uses) the following env variables defined there to work correctly.# If you don't use the setup guide to bootstrap the environment, then define them here.# ${K8S_CLUSTER_0}# ${K8S_CLUSTER_1}# ${K8S_CLUSTER_2}# ${K8S_CLUSTER_0_ZONE}# ${K8S_CLUSTER_1_ZONE}# ${K8S_CLUSTER_2_ZONE}# ${K8S_CLUSTER_0_CONTEXT_NAME}# ${K8S_CLUSTER_1_CONTEXT_NAME}# ${K8S_CLUSTER_2_CONTEXT_NAME}# ${MDB_GKE_PROJECT} export DNS_SA_NAME="ext-dns-sa${K8S_CLUSTER_SUFFIX:-}"export DNS_SA_EMAIL="${DNS_SA_NAME}@${MDB_GKE_PROJECT}.iam.gserviceaccount.com" export CUSTOM_DOMAIN="mongodb.custom"export DNS_ZONE="mongodb${K8S_CLUSTER_SUFFIX:-}"
Código fuente
Se puede encontrar todo el código fuente incluido en el repositorio de MongoDB Kubernetes operador.
Procedimiento
Cree un secreto de Kubernetes que contenga la clave de la cuenta de servicio.
# create secret with service account keykubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n external-dns create secret generic external-dns-sa-secret --from-file credentials.json=secrets/external-dns-sa-key.jsonkubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n external-dns create secret generic external-dns-sa-secret --from-file credentials.json=secrets/external-dns-sa-key.jsonkubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n external-dns create secret generic external-dns-sa-secret --from-file credentials.json=secrets/external-dns-sa-key.jsonInstalar ExternalDNS.
ExternalDNS hace que los recursos de Kubernetes sean detectables a través de servidores DNS públicos. Despliega la implementación de Kubernetes eternal-dns y los objetos de permisos relacionados en el namespace que acabas de crear.
# Render the manifest once so ${DNS_ZONE}/${CUSTOM_DOMAIN} are substituted.rendered_manifest=$(eval "cat <<EOF$(cat yamls/externaldns.yaml)EOF")
echo "${rendered_manifest}" | kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n external-dns apply -f -echo "${rendered_manifest}" | kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n external-dns apply -f -echo "${rendered_manifest}" | kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n external-dns apply -f -apiVersion: v1kind: ServiceAccountmetadata: name: external-dns labels: app.kubernetes.io/name: external-dnsapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: external-dns labels: app.kubernetes.io/name: external-dnsrules: - apiGroups: [""] resources: ["services","endpoints","pods","nodes"] verbs: ["get","watch","list"] - apiGroups: ["extensions","networking.k8s.io"] resources: ["ingresses"] verbs: ["get","watch","list"]apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: external-dns-viewer labels: app.kubernetes.io/name: external-dnsroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: external-dnssubjects: - kind: ServiceAccount name: external-dns namespace: external-dnsapiVersion: apps/v1kind: Deploymentmetadata: name: external-dns labels: app.kubernetes.io/name: external-dnsspec: strategy: type: Recreate selector: matchLabels: app.kubernetes.io/name: external-dns template: metadata: labels: app.kubernetes.io/name: external-dns spec: serviceAccountName: external-dns containers: - name: external-dns image: registry.k8s.io/external-dns/external-dns:v0.16.1 args: - --source=service - --source=ingress - --provider=google - --google-zone-visibility=private - --zone-id-filter=${DNS_ZONE} - --domain-filter=${CUSTOM_DOMAIN} - --log-format=json # google cloud logs parses severity of the "text" log format incorrectly - --interval=10s - --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization - --registry=txt # # uncomment below if static credentials are used env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /etc/secrets/service-account/credentials.json volumeMounts: - name: google-service-account mountPath: /etc/secrets/service-account/ volumes: - name: google-service-account secret: secretName: external-dns-sa-secretConfigura la zona DNS.
Este ejemplo incluye una zona privada DNS. Esto significa que solo se puede acceder a los recursos implementados en la zona DNS desde los clústeres GKE que creamos. Si tienes previsto acceder a tus recursos fuera de tus clústeres de GKE, utiliza una zona de DNS pública. Para hacerlo, debes tener un dominio registrado.
FQ_CLUSTER_0="projects/${MDB_GKE_PROJECT}/locations/${K8S_CLUSTER_0_ZONE}/clusters/${K8S_CLUSTER_0}"FQ_CLUSTER_1="projects/${MDB_GKE_PROJECT}/locations/${K8S_CLUSTER_1_ZONE}/clusters/${K8S_CLUSTER_1}"FQ_CLUSTER_2="projects/${MDB_GKE_PROJECT}/locations/${K8S_CLUSTER_2_ZONE}/clusters/${K8S_CLUSTER_2}"
gcloud dns managed-zones create "${DNS_ZONE}" \ --description="" \ --dns-name="${CUSTOM_DOMAIN}" \ --visibility="private" \ --gkeclusters="${FQ_CLUSTER_0}","${FQ_CLUSTER_1}","${FQ_CLUSTER_2}"