Configuración del proveedor de DNS de clúster
Se asigna un nombre DNS (Sistema de nombres de dominio) a cada servicio del clúster de IBM Cloud® Kubernetes Service, que el proveedor de DNS del clúster registra para resolver solicitudes de DNS. Para obtener más información sobre DNS para servicios y pods, consulte la documentación de Kubernetes.
El proveedor de DNS de clúster es CoreDNS, que es un servidor DNS autoritativo de propósito general que proporciona una integración compatible con versiones anteriores, pero extensible,
con Kubernetes. Debido a que CoreDNS es un solo proceso ejecutable, tiene menos dependencias y partes móviles que puedan experimentar problemas que otros proveedores de DNS de clúster. El proyecto también se ha escrito en el mismo lenguaje que
el proyecto Kubernetes, Go
, lo que ayuda a proteger la memoria. Por último, CoreDNS admite casos de uso más flexibles que otros proveedores de DNS en clúster, ya que puede crear entradas DNS personalizadas, como las configuraciones
comunes en los documentos de CoreDNS.
Escalado automático del proveedor de DNS de clúster
De forma predeterminada, CoreDNS incluye un despliegue para escalar automáticamente los pods de CoreDNS como respuesta al número de nodos trabajadores y núcleos dentro del clúster. Puede ajustar los parámetros del programa de escalado automático de CoreDNS editando el mapa de configuración de escalado automático de CoreDNS. Por ejemplo, si las apps hacen un uso intensivo del proveedor de DNS de clúster, es posible que tenga que aumentar el número mínimo de pods de CoreDNS para dar soporte a la app. Para más información, consulte la documentación de Kubernetes.
Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.
-
Verifique que el despliegue del programa de escalado automático de CoreDNS está disponible. En la salida de la CLI, verifique que haya un despliegue disponible (AVAILABLE).
kubectl get deployment -n kube-system coredns-autoscaler
Salida de ejemplo
NAME READY UP-TO-DATE AVAILABLE AGE coredns-autoscaler 1/1 1 1 69d
-
Edite los valores predeterminados correspondientes al programa de escalado automático de CoreDNS. Busque el campo
data.linear
, que toma como valor predeterminado un pod CoreDNS por cada 16 nodos de trabajador o 256 núcleos, con un mínimo de dos pods CoreDNS independientemente del tamaño del clúster (preventSinglePointFailure: true
). Para obtener más información, consulte la documentación de Kubernetes.kubectl edit configmap -n kube-system coredns-autoscaler
Salida de ejemplo
apiVersion: v1 data: linear: '{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true}' kind: ConfigMap metadata: ...
Personalización del proveedor de DNS de clúster
Puede personalizar CoreDNS editando el mapa de configuración de CoreDNS. Por ejemplo, es posible que desee configurar dominios de apéndice y servidores DNS en sentido ascendente para resolver servicios que apunten a hosts externos. Además, puede configurar varios Corefiles dentro de CoreDNS ConfigMap. Para más información, consulte la documentación de Kubernetes.
El almacenamiento en memoria caché de DNS de NodeLocal
se basa en CoreDNS para mantener la memoria caché de las resoluciones de DNS. Para mantener la coherencia de la resolución de DNS, mantenga sin cambios la memoria caché de DNS
de NodeLocal
y las configuraciones de CoreDNS aplicables, como los dominios de apéndice.
Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.
-
Verifique que el despliegue CoreDNS está disponible. En la salida de la CLI, verifique que haya un despliegue disponible (AVAILABLE).
kubectl get deployment -n kube-system coredns
Salida de ejemplo
NAME READY UP-TO-DATE AVAILABLE AGE coredns 3/3 3 3 69d
-
Edite los valores predeterminados correspondientes al mapa de configuración de CoreDNS. Utilice un archivo Corefile en la sección
data
del mapa de configuración para personalizar los dominios de apéndice (stub) y los servidores DNS en sentido ascendente. Para más información, consulte la documentación de Kubernetes.El plugin
proxy
de CoreDNS ha quedado en desuso y ha sido sustituido por el pluginforward
. Si actualiza el mapa de configuración de CoreDNS, asegúrese de sustituir todas las instancias deproxy
porforward
.kubectl edit configmap -n kube-system coredns
Salida de ejemplo de CoreDNS
apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system data: Corefile: | import <MyCorefile> .:53 { errors health { lameduck 10s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 { disable success cluster.local disable denial cluster.local } loop reload loadbalance } <MyCorefile>: | abc.com:53 { errors cache 30 loop forward . 1.2.3.4 }
-
Opcional: añada archivos Corefile personalizados al mapa de configuración de CoreDNS. En el ejemplo siguiente, incluya
import <MyCoreFile>
en la seccióndata.Corefile
y rellene la seccióndata.<MyCorefile>
con la información del Corefile personalizado. Para obtener más información, consulte la documentación de importación de Corefile.El plugin
proxy
de CoreDNS ha quedado en desuso y ha sido sustituido por el pluginforward
. Si actualiza el mapa de configuración de CoreDNS, asegúrese de sustituir todas las instancias deproxy
porforward
.kubectl edit configmap -n kube-system coredns
Ejemplo de salida de Corefile personalizado
apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system data: Corefile: | import <MyCorefile> .:53 { errors health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure upstream 172.16.0.1 fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 { disable success cluster.local disable denial cluster.local } loop reload loadbalance } <MyCorefile>: | abc.com:53 { errors cache 30 loop forward . 1.2.3.4 }
-
Después de unos minutos, los pods de CoreDNS captan los cambios del mapa de configuración.
Configuración de memoria caché de DNS NodeLocal
Configure el agente de memoria caché de DNS NodeLocal
en determinados nodos trabajadores para mejorar el rendimiento y la disponibilidad de DNS del clúster en el clúster de IBM Cloud Kubernetes Service. Para más información, consulte
los documentos de la Kubernetes.
De forma predeterminada, las solicitudes de DNS de clúster para pods que utilizan una política de DNS de
ClusterFirst
se envían al servicio de DNS de clúster. Si habilita la colocación en memoria caché de DNS NodeLocal
en un nodo trabajador, las solicitudes DNS del clúster para estos pods que se encuentran en el nodo
trabajador se envían en su lugar a la memoria caché de DNS local, que escucha en la dirección IP de enlace local 169.254.20.10. La memoria caché de DNS también escucha en la IP del clúster del servicio kube-dns
en el espacio de
nombres kube-system
.
No añada la etiqueta de memoria caché de DNS si ya utiliza DNS con distinción de zonas en el clúster. Además, el almacenamiento en memoria caché de DNS de NodeLocal
se basa en CoreDNS para mantener
la memoria caché de las resoluciones de DNS. Para mantener la coherencia de la resolución de DNS, mantenga sin cambios la memoria caché de DNS de NodeLocal
y las configuraciones de CoreDNS aplicables, como los dominios de apéndice.
La memoria caché de DNS NodeLocal
está disponible a nivel general en clústeres que ejecutan Kubernetes 1.18 o posteriores, pero que siguen inhabilitados de forma predeterminada.
Habilitación de la memoria caché de DNS NodeLocal
Habilite la memoria caché de DNS NodeLocal
para uno o más nodos trabajadores en el clúster de Kubernetes.
Los pasos siguientes actualizan los pods de DNS que se ejecutan en nodos trabajadores específicos. También puede etiquetar la agrupación de nodos trabajadores de modo que los nodos futuros hereden la etiqueta.
Antes de empezar, actualice las políticas de red de salida de DNS que se vean afectadas por esta función, como las políticas que dependen de selectores de pod o espacio de nombres para la salida de DNS.
kubectl get networkpolicy --all-namespaces -o yaml
-
Si personaliza dominios de apéndice y servidores DNS en sentido ascendente para CoreDNS, también debe personalizar la memoria caché de DNS de
NodeLocal
con estos dominios de apéndice y servidores DNS en sentido ascendente. -
Obtenga una lista de los nodos del clúster. Los pods del agente de almacenamiento en memoria caché de DNS
NodeLocal
forman parte de un conjunto de daemons que se ejecuta en cada nodo.kubectl get nodes
-
Añada la etiqueta
ibm-cloud.kubernetes.io/node-local-dns-enabled=true
al nodo trabajador. La etiqueta inicia el pod del agente de memoria caché de DNS en el nodo trabajador.-
Añada la etiqueta a uno o varios nodos trabajadores.
-
Para etiquetar todos los nodos trabajadores del clúster: añada la etiqueta a todas las agrupaciones de nodos trabajadores existentes.
-
Para etiquetar un nodo trabajador individual:
kubectl label node <node_name> --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled=true"
-
-
Verifique que el nodo tiene la etiqueta comprobando que el campo
NODE-LOCAL-DNS-ENABLED
está establecido entrue
.kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
Salida de ejemplo
NAME STATUS ROLES AGE VERSION NODE-LOCAL-DNS-ENABLED 10.xxx.xx.xxx Ready,SchedulingDisabled <none> 28h v1.32+IKS true
-
Verifique que el pod del agente de almacenamiento en memoria caché de DNS se está ejecutando en el nodo trabajador.
kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
Salida de ejemplo
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES node-local-dns-pvnjn 1/1 Running 0 1m 10.xxx.xx.xxx 10.xxx.xx.xxx <none> <none>
-
-
Repita los pasos anteriores para cada nodo trabajador para habilitar la colocación en memoria caché de DNS.
Inhabilitación de la memoria caché de DNS NodeLocal
Puede inhabilitar la memoria caché de DNS NodeLocal
para uno o para varios nodos trabajadores.
-
Elimine la etiqueta
ibm-cloud.kubernetes.io/node-local-dns-enabled
del nodo trabajador. Esta acción finaliza el pod del agente de almacenamiento en memoria caché de DNS en el nodo trabajador.Ejecute el mandato siguiente para eliminar la etiqueta de todos los nodos de trabajador del clúster.
kubectl label node --all --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
Ejecute el mandato siguiente para eliminar la etiqueta de un nodo de trabajador individual.
kubectl label node <node_name> "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
-
Verifique que la etiqueta se ha eliminado comprobando que el campo
NODE-LOCAL-DNS-ENABLED
está vacío.kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
Salida de ejemplo
NAME STATUS ROLES AGE VERSION NODE-LOCAL-DNS-ENABLED 10.xxx.xx.xxx Ready,SchedulingDisabled <none> 28h v1.32+IKS
-
Verifique que el pod ya no se está ejecutando en el nodo en el que está inhabilitada la memoria caché de DNS. La salida no muestra ningún pod.
kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
Salida de ejemplo
No resources found.
-
-
Repita los pasos anteriores para cada nodo trabajador para inhabilitar la colocación en memoria caché de DNS.
Personalización de la memoria caché de DNS local
Puede personalizar la memoria caché de DNS NodeLocal
editando cualquiera de las dos mapas de configuración.
- Mapa de configuración
node-local-dns
: personalice la configuración de memoria caché de DNS deNodeLocal
. - Mapa de configuración
node-local-dns-config
: amplíe la configuración de la memoria caché de DNSNodeLocal
mediante la personalización de dominios de apéndice y servidores DNS en sentido ascendente para resolver los servicios que apuntan a hosts externos.
El almacenamiento en memoria caché de DNS de NodeLocal
se basa en CoreDNS para mantener la memoria caché de las resoluciones de DNS. Para mantener la coherencia de la resolución de DNS, mantenga sin cambios la memoria caché de DNS
de NodeLocal
y las configuraciones de CoreDNS aplicables, como los dominios de apéndice.
Edición del mapa de configuración node-local-dns
para actualizaciones generales de configuración
Edite el mapa de configuración node-local-dns
para personalizar la configuración de la memoria caché de DNS de NodeLocal
.
Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.
-
Verifique que el conjunto de daemons de memoria caché DNS de
NodeLocal
esté disponible.kubectl get ds -n kube-system node-local-dns
Salida de ejemplo
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE node-local-dns 4 4 4 4 4 ibm-cloud.kubernetes.io/node-local-dns-enabled=true 82d
-
Edite los valores predeterminados o añada Corefiles personalizados al mapa de configuración de memoria caché de DNS
NodeLocal
. Cada Corefile que importe debe utilizar la vía de accesocoredns
. Para más información, consulte la documentación de Kubernetes.Solo se admite un conjunto limitado de complementos para la caché DNS de
NodeLocal
.kubectl edit configmap -n kube-system node-local-dns
Salida de ejemplo
apiVersion: v1 kind: ConfigMap metadata: name: node-local-dns namespace: kube-system data: Corefile: | # Add your NodeLocal DNS customizations as import files under ./coredns directory. # Refer to /docs/containers?topic=containers-cluster_dns for details. import ./coredns/<MyCorefile> cluster.local:53 abc.com:53 { errors cache { success 9984 30 denial 9984 5 } reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__CLUSTER__DNS__ { force_tcp } prometheus :9253 health 169.254.20.10:8080 } in-addr.arpa:53 { errors cache 30 reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__CLUSTER__DNS__ { force_tcp } prometheus :9253 } ip6.arpa:53 { errors cache 30 reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__CLUSTER__DNS__ { force_tcp } prometheus :9253 } .:53 { errors cache 30 { disable success cluster.local disable denial cluster.local } reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__UPSTREAM__SERVERS__ { force_tcp } prometheus :9253 } <MyCorefile>: | # Add custom corefile content ...
-
Después de unos minutos, los pods de memoria caché de DNS
NodeLocal
captan los cambios del mapa de configuración.
Edición del mapa de configuración node-local-dns-config
para ampliar con dominios de apéndice o servidores en sentido ascendente
Edite el mapa de configuración node-local-dns-config
para ampliar la configuración de la memoria caché de DNS NodeLocal
, por ejemplo para personalizar los dominios de apéndice o los servidores de DNS en sentido ascendente.
Para más información, consulte la documentación de Kubernetes.
Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.
-
Verifique que el conjunto de daemons de memoria caché DNS de
NodeLocal
esté disponible.kubectl get ds -n kube-system node-local-dns
Salida de ejemplo
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE node-local-dns 4 4 4 4 4 ibm-cloud.kubernetes.io/node-local-dns-enabled=true 82d
-
Confirme que la memoria caché de DNS
NodeLocal
tenga un mapa de configuración.-
Determine si el mapa de configuración de memoria caché de DNS
NodeLocal
exista.kubectl get cm -n kube-system node-local-dns-config
Salida de ejemplo cuando no hay un mapa de configuración
Error from server (NotFound): ConfigMaps "node-local-dns-config" not found
-
Si el mapa de configuración no existe, cree un mapa de configuración de memoria caché de DNS de
NodeLocal
.kubectl create cm -n kube-system node-local-dns-config
Salida de ejemplo
configmap/node-local-dns-config created
-
-
Edite el mapa de configuración de memoria caché DNS
NodeLocal
. El mapa de configuración utiliza la sintaxis de KubeDNS para personalizar los dominios de apéndice y los servidores DNS en sentido ascendente. Para más información, consulte la documentación de Kubernetes.kubectl edit cm -n kube-system node-local-dns-config
Salida de ejemplo
apiVersion: v1 kind: ConfigMap metadata: name: node-local-dns-config namespace: kube-system data: stubDomains: | {"abc.com" : ["1.2.3.4"]}
-
Después de unos minutos, los pods de memoria caché de DNS
NodeLocal
captan los cambios del mapa de configuración.
Configuración de DNS con distinción de zonas
Configure DNS con distinción de zonas para mejorar el rendimiento y la disponibilidad de DNS del clúster en su clúster multizona de IBM Cloud Kubernetes Service. Esta configuración
amplía la memoria caché de DNS NodeLocal
para dar preferencia al tráfico de DNS de clúster dentro de la misma zona.
De forma predeterminada, el clúster está configurado con recursos DNS a nivel de clúster, no a recursos DNS con distinción de zonas. Incluso después de configurar un DNS con distinción de zonas, los recursos de DNS a nivel de clúster se siguen ejecutando como un DNS de reserva. Los recursos de DNS con distinción de zonas están separados del DNS a nivel de clúster y el cambio de DNS con distinción de zonas no afecta al DNS a nivel de clúster.
No utilice la etiqueta de memoria caché de DNS cuando utilice DNS con distinción de zonas en el clúster.
Configuración de DNS con distinción de zonas
Realice el paso siguiente para configurar DNS con reconocimiento de zona en el clúster multizona.
-
Actualice las políticas de red de salida de DNS que se vean afectadas por DNS con reconocimiento de zona, como las políticas que dependen de selectores de espacio de nombres o pod para la salida de DNS. Ejecute el siguiente comando para obtener una lista de sus políticas de red.
kubectl get networkpolicy --all-namespaces -o yaml
-
Etiquete el
coredns
ConfigMap en el espacio de nombreskube-system
conibm-cloud.kubernetes.io/deploy-zone-aware-dns=true
.kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true"
-
Renovar el maestro de clúster para desplegar los recursos DNS que tienen en cuenta las zonas.
ibmcloud ks cluster master refresh -c <cluster_name_or_ID>
-
Espere a que finalice la operación de renovación; para ello revise el Estado del nodo maestro en los detalles del clúster.
ibmcloud ks cluster get -c <cluster_name_or_ID>
-
Si personaliza dominios de apéndice y servidores DNS en sentido ascendente para CoreDNS, también debe personalizar la memoria caché de DNS de
NodeLocal
con estos dominios de apéndice y servidores DNS en sentido ascendente. -
Defina una variable de entorno para las zonas del clúster.
ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
-
Inicie los pods de CoreDNS y del programa de escalado automático de CoreDNS en todas las zonas.
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=1 done
-
Compruebe que los pods de CoreDNS y del programa de escalado automático de CoreDNS se están ejecutando en todas las zonas.
for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" -o wide kubectl get pods -n kube-system -l "k8s-app=coredns-${ZONE}" -o wide done
-
Inicie los pods de memoria caché de DNS
NodeLocal
en todos los nodos trabajadores.kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true"
-
Verifique que los pods de memoria caché de DNS
NodeLocal
se están ejecutando en todos los nodos trabajadores.for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=node-local-dns-${ZONE}" -o wide done
-
Etiquete sus agrupaciones de nodos trabajadores para que los nodos trabajadores futuros hereden la etiqueta
ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true
.
Inhabilitación y supresión de DNS con distinción de zonas
Para eliminar DNS con distinción de zonas, primero tiene que inhabilitar DNS con distinción de zonas cada zona del clúster multizonas. A continuación, suprima los recursos de DNS con distinción de zonas.
-
Elimine la etiqueta
ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true
de las agrupaciones de nodos trabajadores. -
Defina una variable de entorno para las zonas del clúster.
ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
-
Detenga los pods de memoria caché de DNS
NodeLocal
en todos los nodos trabajadores.kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled-"
-
Detenga los pods del programa de escalado automático de CoreDNS en todas las zonas.
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=0 done
-
Compruebe que los pods del programa de escalado automático de CoreDNS ya no se están ejecutando en ninguna zona.
for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" done
-
Detenga los pods de CoreDNS en todas las zonas.
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-${ZONE}" --replicas=0 done
-
Elimine la etiqueta
ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true
del mapa de configuracióncoredns
en el espacio de nombreskube-system
.kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns-"
-
Renueve el nodo maestro del clúster para suprimir los recursos de DNS con distinción de zonas.
ibmcloud ks cluster master refresh --cluster <cluster-name-or-id>
-
Espere a que finalice la operación de renovación; para ello revise el Estado del nodo maestro en los detalles del clúster.
ibmcloud ks cluster get -c <cluster_name_or_ID>