Configurer Config Controller

Cette page vous explique comment configurer Config Controller. Config Controller est un service hébergé permettant de provisionner et d'orchestrer des ressources Anthos et Google Cloud. Il offre un point de terminaison d'API pouvant provisionner, activer et orchestrer des ressources Google Cloud dans le cadre d'Anthos Config Management. Pour en savoir plus sur Config Controller, consultez la présentation de Config Controller.

Avant de commencer

Avant de configurer Config Controller, vous devez effectuer les étapes suivantes :

  1. Installez et initialisez le SDK Cloud, qui fournit les commandes gcloud, kubectl et nomos utilisées dans les présentes instructions. Si vous utilisez Cloud Shell, le SDK Cloud est pré-installé.

    kubectl n'est pas installé par défaut par le SDK Cloud. Pour installer kubectl, exécutez la commande suivante :

    gcloud components install kubectl
    
  2. Créez ou autorisez la création d'un réseau par défaut. Config Controller en dépend. Pour créer un réseau par défaut, exécutez la commande suivante :

    gcloud compute networks create default --subnet-mode=auto
    

Configurer Config Controller

Créez un contrôleur de configuration à l'aide des commandes suivantes de l'outil gcloud :

  1. Activez les services sur votre projet pour utiliser les commandes suivantes de l'outil gcloud :

    gcloud services enable krmapihosting.googleapis.com \
        container.googleapis.com \
        cloudresourcemanager.googleapis.com
    
  2. Créez votre contrôleur de configuration. Cette opération peut prendre plus de 15 minutes.

    gcloud alpha anthos config controller create CONFIG_CONTROLLER_NAME \
        --location=us-central1
    

    Remplacez CONFIG_CONTROLLER_NAME par le nom que vous souhaitez attribuer à votre contrôleur.

  3. Une fois l'instance créée, elle apparaît dans la liste des instances. Pour afficher la liste des instances, exécutez la commande suivante :

    gcloud alpha anthos config controller list --location=us-central1
    
  4. Authentifiez-vous auprès de l'instance pour appliquer les fichiers manifestes :

    gcloud alpha anthos config controller get-credentials CONFIG_CONTROLLER_NAME \
        --location us-central1
    
  5. Autorisez Config Controller à gérer les ressources Google Cloud dans le projet :

    export PROJECT_ID=$(gcloud config get-value project)
    export SA_EMAIL="$(kubectl get ConfigConnectorContext -n config-control \
        -o jsonpath='{.items[0].spec.googleServiceAccount}' 2> /dev/null)"
    gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/owner" \
        --project "${PROJECT_ID}"
    

Gérer des ressources Google Cloud à l'aide de Config Controller

Une fois que vous avez terminé la configuration de Config Controller, vous êtes prêt à l'utiliser pour gérer les ressources Google Cloud.

Danscet exemple, vous allez créer un dépôt Cloud Source Repositories que vous pourrez utiliser dans la section Configurer GitOps.

  1. Créez un fichier nommé service.yaml et copiez-y le fichier YAML ci-dessous :

    # service.yaml
    
    apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1
    kind: Service
    metadata:
      name: sourcerepo.googleapis.com
      namespace: config-control
    
  2. Appliquez le fichier manifeste et attendez que Cloud Source Repositories soit activé :

    kubectl apply -f service.yaml
    kubectl wait -f service.yaml --for=condition=Ready
    
  3. Créez un fichier repo.yaml et copiez le fichier YAML ci-dessous dans ce fichier :

    # repo.yaml
    
    apiVersion: sourcerepo.cnrm.cloud.google.com/v1beta1
    kind: SourceRepoRepository
    metadata:
      name: REPO_NAME
      namespace: config-control
    

    Remplacez REPO_NAME par le nom que vous souhaitez attribuer au dépôt Cloud Source Repositories.

  4. Appliquez le fichier manifeste pour créer le dépôt :

    kubectl apply -f repo.yaml
    

Configurer GitOps

Vous pouvez synchroniser les configurations de votre dépôt Git avec votre Config Controller à l'aide de Config Sync. Dans l'exemple de cette section, vous utilisez les dépôts Cloud Source Repositories que vous avez créés dans la section précédente.

  1. Créez un fichier nommé gitops-iam.yaml et copiez-y le fichier YAML ci-dessous :

    # gitops-iam.yaml
    
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    metadata:
      name: config-sync-sa
      namespace: config-control
    spec:
      displayName: ConfigSync
    
    ---
    
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMPolicyMember
    metadata:
      name: config-sync-wi
      namespace: config-control
    spec:
      member: serviceAccount:PROJECT_ID.svc.id.goog[config-management-system/importer]
      role: roles/iam.workloadIdentityUser
      resourceRef:
        apiVersion: iam.cnrm.cloud.google.com/v1beta1
        kind: IAMServiceAccount
        name: config-sync-sa
    
    ---
    
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMPolicyMember
    metadata:
      name: allow-configsync-sa-read-csr
      namespace: config-control
    spec:
      member: serviceAccount:config-sync-sa@PROJECT_ID.iam.gserviceaccount.com
      role: roles/source.reader
      resourceRef:
        apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1
        kind: Project
        external: projects/PROJECT_ID
    

    Remplacez PROJECT_ID par l'ID du projet dans lequel Config Controller est en cours d'exécution.

  2. Appliquez le fichier manifeste pour autoriser Config Sync à accéder au dépôt.

    kubectl apply -f gitops-iam.yaml
    
  3. Pour que les configurations de votre dépôt soient synchronisées avec votre Config Controller à l'aide de Config Sync, créez un fichier nommé config-management.yaml et collez-y le code suivant :

    # config-management.yaml
    
    apiVersion: configmanagement.gke.io/v1
    kind: ConfigManagement
    metadata:
      name: config-management
    spec:
      enableMultiRepo: false
      clusterName: krmapihost-CONFIG_CONTROLLER_NAME
      git:
        policyDir: DIRECTORY
        gcpServiceAccountEmail: config-sync-sa@PROJECT_ID.iam.gserviceaccount.com
        secretType: gcpserviceaccount
        syncBranch: BRANCH
        syncRepo: REPO
      sourceFormat: unstructured
    

    Remplacez l'élément suivant :

    • CONFIG_CONTROLLER_NAME par le nom de votre contrôleur de configuration.
    • DIRECTORY : chemin d'accès du dépôt Git vers le répertoire racine contenant la configuration que vous souhaitez synchroniser. La valeur par défaut est le répertoire racine du dépôt.
    • PROJECT_ID : ID du projet.
    • BRANCH : branche du dépôt à partir de laquelle la synchronisation doit être effectuée. La branche par défaut est la branche principale (maître).
    • REPO : URL du dépôt Git à utiliser comme source fiable. Vous pouvez saisir des URL à l'aide du protocole HTTPS.

    Pour en savoir plus sur la configuration de Config Sync, consultez la section Accorder à Config Sync un accès en lecture seule à Git.

  4. Appliquez la configuration à l'aide de la commande kubectl apply :

    kubectl apply -f config-management.yaml
    

Vérifier le bon déroulement de la tâche

Vous pouvez vérifier la configuration initiale en procédant comme suit :

  1. Vérifiez que tous les contrôleurs ont bien été configurés sur votre Config Controller :

    kubectl wait pod --all --all-namespaces --for=condition=Ready
    
  2. Vérifiez que le dépôt Git est synchronisé avec Config Controller grâce à Config Sync à l'aide de la commande nomos :

    nomos status --contexts $(kubectl config current-context)
    

Supprimer votre contrôleur de configuration

Si vous décidez d'arrêter d'utiliser Config Controller, vous devez nettoyer toutes les ressources créées. Vous devez d'abord supprimer les ressources du contrôleur de configuration avant de le supprimer.

Supprimer votre Config Controller sans d'abord supprimer les ressources provisionnées laisse les ressources dans un état abandonné. Les ressources existent toujours dans Google Cloud (et entraînent des frais de facturation), mais ne sont pas gérées à partir de la configuration déclarative.

Une fois toutes vos ressources supprimées, vous pouvez supprimer Config Controller à l'aide de l'outil gcloud :

gcloud alpha anthos config controller delete --location=us-central1 CONFIG_CONTROLLER_NAME

Dépannage

Réseau par défaut

Lors de la création de votre contrôleur de configuration, vous pouvez recevoir un message d'erreur indiquant que le réseau par défaut n'est pas disponible :

Error 400: Project \"PROJECT_ID\" has no network named \"default\"., badRequest\n\n  on main.tf line 35, in resource \"google_container_cluster\" \"acp_cluster\"

Cette erreur se produit car Config Controller dépend du réseau par défaut dans Google Cloud. Pour résoudre ce problème, vous devez créer un réseau par défaut :

gcloud compute networks create default --subnet-mode=auto

Vous pouvez également sélectionner un autre réseau à l'aide de l'option --network dans la commande gcloud alpha anthos config controller create.

Bloc CIDR IPv4 du plan de contrôle

Pour créer Config Controller, nous utilisons un sous-réseau par défaut de 172.16.0.128/28 pour le bloc CIDR IPv4 du plan de contrôle. En cas de conflit dans le bloc CIDR IPv4, la création de Config Controller échoue et renvoie le message d'erreur suivant :

Cloud SSA\n\nError: Error waiting for creating GKE cluster: Invalid value for field PrivateClusterConfig.MasterIpv4CidrBlock: 172.16.0.128/28 conflicts with an existing subnet in one of the peered VPCs.

Si cette erreur s'affiche, sélectionnez un autre bloc CIDR IPv4 privé et utilisez-le à l'aide de l'option --master-ipv4-cidr-block dans la commande gcloud alpha anthos config controller create.

Pour rechercher les blocs CIDR IPv4 déjà utilisés, procédez comme suit :

  1. Exécutez la commande suivante pour connaître le nom de l'appairage :

    gcloud compute networks peerings list --network=NETWORK
    

    Remplacez NETWORK par le nom du réseau que vous souhaitez consulter.

    Vous recevez une réponse semblable à la suivante :

    NAME                                     NETWORK  PEER_PROJECT               PEER_NETWORK                            PEER_MTU  IMPORT_CUSTOM_ROUTES  EXPORT_CUSTOM_ROUTES  STATE   STATE_DETAILS
    gke-n210ce17a4dd120e16b6-7ebf-959a-peer  default  gke-prod-us-central1-59d2  gke-n210ce17a4dd120e16b6-7ebf-0c27-net            False                 False                 ACTIVE  [2021-06-08T13:22:07.596-07:00]: Connected.
    
  2. Pour afficher le bloc CIDR IPv4 utilisé par l'appairage, exécutez la commande suivante :

    gcloud compute networks peerings list-routes PEERING_NAME \
        --direction=INCOMING \
        --network=NETWORK \
        --region=us-central1
    

    Remplacez l'élément suivant :

    • PEERING_NAME par le nom d'appairage que vous souhaitez consulter.
    • NETWORK par le nom du réseau que vous souhaitez consulter.

Déploiement et Config Sync

Les configurations de votre dépôt Git sont synchronisées avec Config Controller à l'aide de Config Sync. Vous pouvez rechercher les erreurs dans ce processus de synchronisation à l'aide de la commande nomos :

nomos status  --contexts $(kubectl config current-context)

Ressources de Config Connector

Champs et ressources immuables

Certains champs des ressources Google Cloud sous-jacentes sont immuables, tels que les ID des projets ou le nom de votre réseau VPC. Config Connector bloque les modifications de ces champs et ne peut pas appliquer les modifications. Si vous souhaitez modifier l'un de ces champs immuables, vous devez d'abord supprimer la ressource d'origine (via Git) avant de l'ajouter à nouveau avec les nouvelles valeurs de votre choix.

Ressources bloquées

Dans certains cas, la suppression des ressources peut échouer (comme indiqué par nomos status). Pour résoudre ce problème, supprimez les finaliseurs de la ressource, puis supprimez la ressource manuellement. Par exemple, pour supprimer un membre IAMPolicyMember bloqué, exécutez la commande suivante :

kubectl patch IAMPolicyMember logging-sa-iam-permissions -p '{"metadata":{"finalizers":[]}}' --type=merge -n config-control
kubectl delete IAMPolicyMember logging-sa-iam-permissions -n config-control