Guide de l'utilisateur du CD Argo: Comment créer un GitOps complet?

Alors que Kubernetes continue de s'imposer comme la norme de l'industrie pour l'orchestration de conteneurs, trouver des moyens efficaces d'utiliser des modèles déclaratifs pour vos applications et vos outils est la clé du succès. Dans cet article, nous allons configurer un cluster K3s Kubernetes dans AWS, puis utiliser Argo CD et Vault pour implémenter des GitOps sécurisés. Vous pouvez afficher l'infrastructure et l'application parapluie Kubernetes dans les deux liens suivants:

 
https://github.com/atoy3731/aws-k8s-terraform

https://github.com/atoy3731/k8s-tools-app

 
Voici les composants que nous utiliserons:

 

  • AWS - Il s'agit du fournisseur de cloud que nous utiliserons dans l'infrastructure sous-jacente. Il gérera nos machines virtuelles et le réseau requis pour que Kubernetes fonctionne, et permettra à Ingress d'entrer dans le cluster depuis le monde extérieur.
     

  • K3s - une distribution Kubernetes légère développée par Rancher. Il nettoie de nombreuses fonctionnalités alpha et plugins cloud, et utilise également une base de données relationnelle (RDS dans ce cas) au lieu de etcd pour le stockage back-end.

 

  • Interface utilisateur pilotée par Rancher-API, vous pouvez facilement gérer votre cluster Kubernetes

 

  • Implémentation de la gestion des clés de Vault-Hashicorp. J'utiliserai l'implémentation des coffres-forts de Banzai Cloud Vault, qui peut injecter la clé directement dans le pod en utilisant le webhook d'admission. Cela réduit considérablement votre besoin de stocker des clés dans le référentiel Git.

 

  • Argo CD-Ceci est un outil GitOps qui vous permet de maintenir l'état des ressources Kubernetes dans Git. Argo CD synchronisera automatiquement vos ressources Kubernetes avec les ressources de l'entrepôt Git et garantira également que les modifications manuelles apportées au manifeste dans le cluster seront automatiquement restaurées. Cela garantit votre modèle de déploiement déclaratif.

 

  • Cert Manager ou LetsEncrypt - fournit une méthode pour générer et mettre à jour automatiquement des certificats pour Kubernetes Ingress.
     

Commençons par l'infrastructure AWS.
 

Préparation préliminaire

 

Vous devez installer la CLI suivante sur votre système:
 

  • Terraform

  • Kubectl

  • AWS

 

Dans le même temps, vous avez également besoin des autorisations d'accès d'administrateur AWS et d'une clé d'accès. Si vous n'en avez pas, vous pouvez créer un compte avec une carte de crédit.
 

Enfin, vous avez besoin d'un nom de domaine hébergé géré / mis à jour pour pointer vers votre Elastic Load Balancer (ELB) basé sur Kubernetes. Si vous n'en avez pas, je vous suggère d'ouvrir un compte sur NameCheap, puis d'acheter un nom de domaine .dev. Il est bon marché et fonctionne bien.
 

Infrastructure AWS

 
Pour notre infrastructure AWS, nous utiliserons Terraform avec le support S3 pour conserver l'état. Cela nous fournit un moyen de définir notre infrastructure de manière déclarative et d'apporter des modifications à plusieurs reprises lorsque nous en avons besoin. Dans le référentiel d'infrastructure, vous verrez un fichier k3s / example.tfvars. Nous devons mettre à jour ce fichier en fonction de notre environnement / situation d'utilisation spécifique et définir les valeurs suivantes:

 

  • db_username - Le nom d'utilisateur de l'administrateur de l'instance RDS qui sera appliquée au stockage backend Kubernetes

  • db_password - Le mot de passe administrateur de l'utilisateur RDS. Cela devrait normalement être passé lors de la saisie de la commande terraform apply, mais pour plus de simplicité, nous le définirons dans le fichier.

  • public_ssh_key - votre clé SSH publique, vous l'utiliserez lorsque vous aurez besoin de SSH sur Kubernetes EC2.

  • keypair_name - Le nom de la paire de clés à appliquer à votre public_ssh_key.

  • key_s3_bucket_name - Le compartiment généré stockera votre fichier kubeconfig lorsque le cluster est créé avec succès.

 

Si vous souhaitez modifier la taille du cluster ou définir des CIDR spécifiques (routage inter-domaine sans classe), vous pouvez définir certains champs facultatifs ci-dessous, mais par défaut, vous obtiendrez un K3 avec 6 nœuds (3 serveurs, 3 agents) Grappe.
 

En même temps, vous devrez créer un compartiment S3 pour stocker votre état Terraform et modifier les champs de compartiment dans les fichiers k3s / backends / s3.tfvars et k3s / main.tf pour qu'ils correspondent.

 

Une fois que nous avons mis à jour tous les champs et créé le compartiment d'état S3, commençons à appliquer Terraform. Tout d'abord, assurez-vous d'avoir un utilisateur IAM de gestion dans votre compte AWS et que vous avez correctement défini les variables d'environnement ou le fichier d'informations d'identification AWS sur le système pour pouvoir s'interfacer avec l'API AWS, puis exécutez la commande suivante:
 

cd k3s/
terraform init -backend-config=backends/s3.tfvars
terraform apply -var-file=example.tfvars

 
Une fois que vous exécutez la commande ci-dessus, Terraform affiche l'état AWS attendu une fois l'application réussie. Si tout semble comme prévu, entrez yes. À ce stade, en raison du cluster RDS, la configuration des ressources AWS prend entre 5 et 10 minutes.
 

Vérifiez votre cluster Kubernetes

 

Une fois que Terraform a été appliqué avec succès (attendez quelques minutes de plus pour vous assurer que K3s a été déployé), vous devez utiliser la commande suivante pour récupérer le fichier kubeconfig du compartiment S3 (remplacez example.tfvarsle nom du compartiment que vous avez entré):
 

aws s3 cp s3://YOUR_BUCKET_NAME/k3s.yaml ~/.kube/config

 
Cette opération devrait aboutir, vous permettant désormais de communiquer avec votre cluster. Vérifions l'état de nos nœuds et nous assurons qu'ils sont tous prêts avant de continuer.
 

$ kubectl get nodes
NAME                         STATUS   ROLES    AGE   VERSION
ip-10-0-1-208.ec2.internal   Ready    <none>   39m   v1.18.9+k3s1
ip-10-0-1-12.ec2.internal    Ready    master   39m   v1.18.9+k3s1
ip-10-0-1-191.ec2.internal   Ready    master   39m   v1.18.9+k3s1
ip-10-0-2-12.ec2.internal    Ready    master   39m   v1.18.9+k3s1
ip-10-0-2-204.ec2.internal   Ready    <none>   39m   v1.18.9+k3s1
ip-10-0-1-169.ec2.internal   Ready    <none>   39m   v1.18.9+k3s1

 
Jetons également un œil au statut d'Argo CD, qui est automatiquement déployé via le manifeste:
 

$ kubectl get pods -n kube-system | grep argocd
helm-install-argocd-5jc9s                        0/1     Completed   1          40m
argocd-redis-774b4b475c-8v9s8                    1/1     Running     0          40m
argocd-dex-server-6ff57ff5fd-62v9b               1/1     Running     0          40m
argocd-server-5bf58444b4-mpvht                   1/1     Running     0          40m
argocd-repo-server-6d456ddf8f-h9gvd              1/1     Running     0          40m
argocd-application-controller-67c7856685-qm9hm   1/1     Running     0          40m

 
Nous pouvons maintenant continuer à configurer des DNS génériques pour notre automatisation d'entrée et de certificat.

 

Configuration DNS

 

Pour DNS, j'ai obtenu le nom de domaine atoy.dev via Namecheap, mais vous pouvez utiliser n'importe quel fournisseur DNS de votre choix. Ce que nous devons faire est de créer une entrée CNAME générique pour acheminer toutes les demandes vers AWS ELB, qui gère l'entrée de l'application.

 
Tout d'abord, obtenez le nom d'hôte de votre équilibreur de charge élastique en visitant votre console AWS, accédez à la section EC2 et cliquez sur Équilibreurs de charge dans la barre de menus de gauche. Ensuite, vous devriez voir un nouveau LoadBalancer créé avec des caractères aléatoires. Si vous vérifiez la balise, elle doit faire référence à votre nouveau cluster Kubernetes.
 
Guide de l'utilisateur du CD Argo: Comment créer un GitOps complet?
 
Vous devez copier le nom DNS de cette entrée. Visitez la page DNS avancé de NamecCheap pour mon nom de domaine et entrez l'entrée CNAME pour * .demo.atoy.dev . Pointez sur le nom de domaine que vous avez copié à partir d'AWS. Vous pouvez ajuster ce nom en fonction de votre fournisseur / nom de domaine:
 
Guide de l'utilisateur du CD Argo: Comment créer un GitOps complet?

 
Pour vérifier qu'il est valide, vous pouvez installer / utiliser nslookup pour vous assurer qu'il est résolu avec le nom d'hôte correct:
 

$ nslookup test.demo.atoy.dev
Server:  71.252.0.12
Address: 71.252.0.12#53

Non-authoritative answer:
test.demo.atoy.dev canonical name = a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.com.
Name: a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.com
Address: 52.20.5.150
Name: a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.com
Address: 23.20.0.2

 
Passons maintenant à l'application Umbrella.
 

Application Argo CD et Umbrella

 

Nous savons déjà qu'Argo CD a été déployé, mais nous allons maintenant utiliser le modèle de déploiement App-of-Apps d'Argo CD pour déployer le reste de notre suite d'outils. Étant donné que nous utilisons GitOps, vous devez transférer le référentiel k8s-tools-app vers votre propre compte Github, puis nous devons apporter quelques modifications pour correspondre à votre environnement respectif.
 

  1. Vous devez effectuer une recherche / remplacement global pour https://github.com/atoy3731/k8s-tools-app.git et le changer en la nouvelle URL git du référentiel de la fourchette précédente. Cela vous permet de gérer votre propre environnement afin que le CD Argo puisse être extrait de là. De plus, vous devez vous assurer que votre référentiel Git est public afin que Argo CD puisse y accéder.
     

  2. Dans resources / tools / resources / other-resources.yaml, modifiez argoHost et issuerEmail pour qu'ils correspondent à votre nom de domaine et à votre adresse e-mail.

 

  1. Dans resources / tools / resources / rancher.yaml, modifiez le nom d'hôte et l'adresse e-mail pour qu'ils correspondent à leur nom de domaine et à leur adresse e-mail.
     

  2. Dans resources / apps / resources / hello-world.yaml, modifiez les deux références app.demo.aptoy.dev pour qu'elles soient cohérentes avec votre nom de domaine.

 

Une fois que vous avez effectué ces mises à jour, continuez à soumettre / envoyer vos modifications à votre référentiel Github forké. Vous êtes maintenant prêt à appliquer l'application parapluie. Effectuez les opérations suivantes dans l'entrepôt cloné localement:
 

$ kubectl apply -f umbrella-tools.yaml
appproject.argoproj.io/tools created
application.argoproj.io/umbrella-tools created

 
Désormais, Argo CD commencera à configurer tous les autres outils, qui sont définis par le référentiel de votre cluster. Vous pouvez obtenir la liste des applications déployées en procédant comme suit:
 

$ kubectl get applications -n kube-system
NAME                AGE
other-resources     56m
umbrella-tools      58m
rancher             57m
vault-impl          57m
vault-operator      58m
vault-webhook       57m
cert-manager        57m
cert-manager-crds   58m

 
Vous devrez attendre environ 5 minutes pour que tout soit prêt et laisser LetsEncrypt générer un certificat temporaire. Une fois que les choses fonctionnent comme prévu, vous devriez voir deux entrées Ingress générées, auxquelles vous pouvez accéder via votre navigateur:
 

$ kubectl get ingress -A
NAMESPACE       NAME             CLASS    HOSTS                     ADDRESS                                                                  PORTS     AGE
cattle-system   rancher          <none>   rancher.demo.atoy.dev   a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.com   80, 443   59m
kube-system     argocd-ingress   <none>   argo.demo.atoy.dev      a4c6dfd75b47a4b1cb85fbccb390fe1f-529310843.us-east-1.elb.amazonaws.com   80, 443   58m

 
Vous pouvez maintenant https: //rancher.YOUR-DOMAIN parcourir Rancher, par https: //argo.YOUR-DOMAIN parcourir le CD Argo.

 
REMARQUE 1 : Afin d'éviter toute limitation de débit de LetsEncrypt, nous utilisons des certificats temporaires invalides. Un avantage de ceci est que lorsque vous visitez Argo, Rancher ou votre application hello world dans votre navigateur, cela vous donnera une exception SSL. Utilisez le navigateur Chrome et entrez ceci n'est pas sûr lorsque votre page anormale se charge, cela vous permettra de la contourner. Vous pouvez également apprendre à mettre à jour ClusterIssuer of Cert-manager pour utiliser des certificats approuvés au niveau de la production.

 

NOTE 2 : K3s est pré-installé avec un Traefik comme contrôleur d'entrée.Pour simplifier, nous l'utilisons directement.

 

REMARQUE 3 : Après vous être connecté à Rancher pour la première fois, vous devez générer un mot de passe et accepter l'URI utilisé pour accéder à Rancher. L'URI doit être préchargé dans le formulaire, vous pouvez donc cliquer directement sur "OK".

 

REMARQUE 4 : pour se connecter au CD Argo, il utilise admin comme nom d'utilisateur et le nom du pod argocd-server comme mot de passe. Vous pouvez obtenir le nom du pod de ce serveur via les opérations suivantes (argocd-server-5bf58444b4-mpvht dans cet exemple).
 

$ kubectl get pods -n kube-system | grep argocd-server
argocd-server-5bf58444b4-mpvht                   1/1     Running     0          64m

 
Vous devriez maintenant pouvoir accéder à l'interface utilisateur du CD Argo, vous connecter et l'afficher comme indiqué ci-dessous:
 
Guide de l'utilisateur du CD Argo: Comment créer un GitOps complet?
 
Maintenant que notre outil a été déployé, stockons la clé dans le coffre-fort pour que l'application hello world puisse l'extraire.

 

Créer une clé dans Vault

 

Pour simplifier les choses, il existe un script d'aide dans votre bibliothèque d'outils. Exécutez les commandes suivantes pour obtenir le jeton de l'administrateur Vault et les commandes de transfert de port:
 

$ sh tools/vault-config.sh
Your Vault root token is: s.qEl4Ftr4DR61dmbH3umRaXP0

Run the following:
export VAULT_TOKEN=s.qEl4Ftr4DR61dmbH3umRaXP0
export VAULT_CACERT=/Users/adam.toy/.vault-ca.crt
kubectl port-forward -n vault service/vault 8200 &

You will then be able to access Vault in your browser at: [https://localhost:8200](https://localhost:8200)

 
Exécutez la commande de sortie, puis accédez à https: // localhost: 8200. Entrez le jeton racine ci-dessus pour vous connecter.

 

Lorsque vous vous connectez, vous devriez être sur une page de moteur clé. Cliquez sur Secret / entrée, puis sur Créer un secret en haut à droite. Nous allons créer une clé de démonstration, alors ajoutez ce qui suit et cliquez sur Enregistrer:
 
Guide de l'utilisateur du CD Argo: Comment créer un GitOps complet?
 
Nous avons maintenant la clé prête pour l'application hello world.
 

Déployer l'application Hello World

 

Maintenant, revenons à notre version parente, exécutons le code suivant pour déployer l'application hello world:
 

$ kubectl apply -f umbrella-apps.yaml
appproject.argoproj.io/apps created
application.argoproj.io/umbrella-apps created

 
Une fois la création terminée, revenez à l'interface utilisateur du CD Argo, vous devriez d'abord voir deux nouvelles applications, parapluie-apps et demo-app. Cliquez sur demo-app et attendez que toutes les ressources s'exécutent normalement: une
 
Guide de l'utilisateur du CD Argo: Comment créer un GitOps complet?
 
fois que l'état est sain, vous devriez pouvoir accéder à votre application en visitant https: //app.YOUR-DOMAIN.
 
Guide de l'utilisateur du CD Argo: Comment créer un GitOps complet?
 
Vérifions également si notre clé Vault est injectée dans notre pod d'application. Dans l'application de démonstration d'Argo CD UI, cliquez sur un pod de l'application, puis cliquez sur l'onglet du journal en haut. Il doit y avoir deux conteneurs sur la gauche, sélectionnez le conteneur de déploiement de test. En haut du journal, vous devriez voir votre clé entre les deux signes égaux:
 
Guide de l'utilisateur du CD Argo: Comment créer un GitOps complet?
 

Tester GitOps

 

Testons maintenant le CD Argo pour nous assurer qu'il peut se synchroniser automatiquement lorsque nous apportons des modifications à l'entrepôt.
 

Dans votre bibliothèque d'outils, recherchez le fichier resources / apps / resources / hello-world.yaml et modifiez la valeur de replicaCount de 5 à 10. Soumettez et transmettez vos modifications à la branche principale, puis revenez à l'application de démonstration dans l'interface utilisateur du CD Argo. Quand Argo CD atteint son intervalle de rafraîchissement, il commencera automatiquement à déployer 5 autres copies de l'application (si vous ne voulez pas attendre, vous pouvez cliquer sur le bouton rafraîchir dans votre application parapluie-apps Argo **):
 
Guide de l'utilisateur du CD Argo: Comment créer un GitOps complet?
 

Clair

 

Si vous prévoyez de détruire votre cluster, vous devez d'abord accéder à la console AWS, au service EC2, puis cliquer sur Load Balancers. Vous verrez que le fournisseur de cloud Kubernetes a créé un ELB, mais il n'est pas géré par Terraform et vous devez le nettoyer. Vous devez également supprimer le groupe de sécurité utilisé par ELB.

 

Après avoir nettoyé l'ELB, exécutez la commande suivante et entrez yes lorsque vous y êtes invité :
 

terraform destroy -var-file=example.tfvars

 

Et après?

 
Nous avons déjà un bon ensemble d'outils pour déployer des applications à l'aide de GitOps. Alors, quelle est la prochaine étape? Si vous êtes prêt à accepter le défi, vous pouvez essayer de déployer votre propre application à côté de l'application hello world, ou même essayer d'implémenter CI / CD en mettant à jour la balise miroir dans l'entrepôt de manifestes d'application. De cette manière, lorsqu'une nouvelle image d'application est créée, les nouvelles balises seront automatiquement mises à jour dans le référentiel de manifestes et la nouvelle version sera déployée sur le CD Argo.

Je suppose que tu aimes

Origine blog.51cto.com/12462495/2573142
conseillé
Classement