Menghadirkan Infrastruktur Cloud dengan Cara GitOps dengan Crossplane dan ArgoCD
https://zhmmcloud.blog/cara-menemukan-log-docker-anda/
Di blog ini, kami akan memandu Anda melalui langkah-langkah memanfaatkan Crossplane dan ArgoCD untuk menghadirkan infrastruktur dengan cara GitOps.infrastruktur sebagai kode (IaC) dan kolaborasi ke dalam kontrol versi, sebuah metodologi yang menghadirkan prinsip GitOps. Perlu diketahui bahwa blog ini menandai awal dari seri Crossplane + ArgoCD.
Pada artikel ini, kita akan mempelajari konfigurasi dasar yang diperlukan untuk menerapkan infrastruktur menggunakan pendekatan GitOps. Postingan blog selanjutnya akan memberikan wawasan yang lebih komprehensif tentang berbagai konsep.
Prasyarat
- Buruh pelabuhan (Docker)
- kind, ada banyak cara untuk menginstal kind, silakan merujuk ke tautan untuk menginstal sesuai keinginan Anda.
- kubectl, kita akan menggunakan ini untuk berinteraksi dengan cluster.
- akun Github
- Helm untuk memasang grafik lintas bidang
- Akun AWS seperti di blog ini kita akan membuat sumber daya SQS di AWS.
Apa yang akan kita buat/amati?
Pada tingkat tinggi kami akan melakukan hal berikut -
- Penyiapan Repositori Github Pribadi dengan ArgoCD
- Cluster Kubernetes dengan Crossplane dan ArgoCD
- Buat antrean AWS SQS dengan cara GitOps
- Impor antrean AWS SQS yang ada dengan cara GitOps
- Hapus sumber daya dari cluster kubernetes dan amati bahwa ArgoCD mengembalikannya
- Hapus sumber daya dari Konsol AWS dan amati bahwa Crossplane mengembalikannya
Buat Repositori GitHub Pribadi
Dengan asumsi Anda sudah memiliki akun GitHub. Langkah-langkah berikut akan membuat repositori GitHub dan menghasilkan token akses pribadi. ArgoCD akan mengawasi repositori ini untuk menyinkronkan sumber daya di cluster Kubernetes.
Buat repositori GitHub pribadi baru seperti yang ditunjukkan pada tangkapan layar di bawah, kami akan menamainya sebagai xargocd-gitops
, jika tidak tersedia Anda dapat menggunakan nama apa pun -
Setelah pembuatan repositori berhasil maka akan terlihat seperti di bawah ini -
Buat token akses Pribadi (klasik) dengan cakupan , catat tokennya, kita memerlukan ini sambil mengonfigurasi ArgoCD untuk menonton repo git pribadi kami -repo
seperti di bawah ini dan klik tombol Generate Token
Buat cluster Kubernetes menggunakan KIND
Saya telah menjelaskan secara detail di blog sebelumnya cara mengatur cluster Kubernetes yang fungsional menggunakan KIND, oleh karena itu kami tidak akan membahasnya secara detail lagi. Silakan baca blog untuk detail tentang KIND.
Buat cluster KIND seperti di bawah ini -
kind create cluster --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: "platformwale"
# configure cluster with containerd registry config dir enabled
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
nodes:
- role: control-plane
image: "kindest/node:v1.27.3"
EOF
Pastikan konteks kubectl mengarah ke cluster jenis yang dibuat di atas -
# set the context as below
kubectl config use-context kind-platformwale
# validate as below
kubectl config current-context
Instal dan Konfigurasi ArgoCD
Mari kita instal rilis stabil ArgoCD di cluster KIND yang kita buat di atas. Pada saat blog ini ditulis, rilis stabil ArgoCD berada pada versi v2.8.0.
kubectl create namespace argocd
kubectl apply -n argocd -f
https://raw.githubusercontent.com/argoproj/argo-
cd/stable/manifests/install.yaml
Pastikan semua pod argocd berjalan seperti di bawah ini -
$ kubectl get po -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 49s
argocd-applicationset-controller-74bd4b8497-5bfcd 1/1 Running 0 49s
argocd-dex-server-6c6dfb6597-twwnw 1/1 Running 0 49s
argocd-notifications-controller-6786586cb-87nxc 1/1 Running 0 49s
argocd-redis-b5d6bf5f5-xbqc5 1/1 Running 0 49s
argocd-repo-server-6658f8b96d-6jmwt 1/1 Running 0 49s
argocd-server-5fff657769-nnqwm 1/1 Running 0 49s
Instal ArgoCD CLI seperti yang disarankan dalam tautan, dalam kasus saya, saya bekerja di Mac dan menginstal CLI seperti di bawah ini -
brew install argocd
Port forward layanan argocd sehingga Anda dapat mengakses UI argocd di http://localhost:8080 seperti di bawah ini -
kubectl port-forward svc/argocd-server -n argocd 8080:443
Ubah rahasia awal untuk UI argocd dengan menjalankan perintah berikut di terminal lain -
# open another terminal
# make sure your kubecontext is pointing to the cluster you created above
kubectl config use-context kind-platformwale
# this will stdout the initial password, copy that, you will need it for the command below
argocd admin initial-password -n argocd
# login using the password from above command, the Username will be `admin` and Password will be the one you copied above
argocd login localhost:8080
# update password; it will ask for current password, which is the one from command above and provide a new password
argocd account update-password
# delete the secret holding initial argocd password
kubectl delete secret -n argocd argocd-initial-admin-secret
Pastikan Anda dapat menggunakan kata sandi baru dan masuk ke UI argocd http://localhost:8080 menggunakan Username: admin
Konfigurasikan ArgoCD untuk melihat repositori GitHub pribadi
Sekarang kita akan mengkonfigurasi ArgoCD untuk melihat Repositori Github Pribadi yang kita buat di bagian di atas. Dengan asumsi Anda telah menyalin token akses pribadi, Anda perlu mengganti di bawah dan menerapkan manifes -
GITHUB_PRIVATE_ACCESS_TOKEN=<your token>
YOUR_PRIVATE_GITHUB_REPO_URL=<e.g. https://github.com/piyushjajoo/xargocd-gitops>
YOUR_GITHUB_USERNAME=<e.g. piyushjajoo>
kubectl apply -f - <<EOF
---
# setup argocd secret for private gitops repository
apiVersion: v1
kind: Secret
metadata:
name: xargocd-gitops-credentials
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
type: Opaque
stringData:
name: xargocd-gitops
url: ${YOUR_PRIVATE_GITHUB_REPO_URL}
username: ${YOUR_GITHUB_USERNAME}
password: ${GITHUB_PRIVATE_ACCESS_TOKEN}
EOF
Pastikan rahasianya berhasil dibuat -
$ kubectl get secrets -n argocd xargocd-gitops-credentials
NAME TYPE DATA AGE
xargocd-gitops-credentials Opaque 4 4m1s
Konfigurasikan CR AppProject ArgoCD
AppProject CR berikut memungkinkan penerapan CR Aplikasi ArgoCD hanya ke argocd
namespace dalam kluster KIND -
SOURCE_REPO=<e.g. https://github.com/piyushjajoo/xargocd-gitops>
kubectl apply -f - <<EOF
# The 'applications-project' AppProject allows a non-admin user to deploy
# only Application resources in the 'argocd' namespace.
---
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: applications-project
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
description: Project for argocd applicatons
sourceRepos:
- ${SOURCE_REPO}
#
# Allow this project to deploy only to 'argocd' namespace
#
destinations:
- namespace: argocd
server: https://kubernetes.default.svc
#
# Deny all namespace-scoped resources from being created, except for Application
#
namespaceResourceWhitelist:
- group: 'argoproj.io'
kind: Application
EOF
AppProject CR berikut memungkinkan untuk menerapkan SQS
sumber daya AWS apa pun dari sqs.aws.upbound.io
API ke namespace mana pun dalam kluster KIND -
SOURCE_REPO=<e.g. https://github.com/piyushjajoo/xargocd-gitops>
kubectl apply -f - <<EOF
# 'sqs-project' is used for actual SQS crossplane resources
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: sqs-project
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
description: Project for deploying crossplane resources to the cluster
sourceRepos:
- ${SOURCE_REPO}
# can deploy to any namespace but within the kind cluster only
destinations:
- namespace: '*'
server: https://kubernetes.default.svc
# can deploy any SQS resources
clusterResourceWhitelist:
- group: 'sqs.aws.upbound.io'
kind: '*'
EOF
Pastikan AppProject
CR berhasil diinstal seperti di bawah ini -
$ kubectl get appprojects.argoproj.io -A
NAMESPACE NAME AGE
argocd applications-project 24s
argocd default 60m
argocd sqs-project 12s
Siapkan Aplikasi ArgoCD
Mari kita konfigurasikan CR Aplikasi argocd untuk menginstal sumber daya SQS apa pun di bawah direktori sqs-queues
di bawah xargocd-gitops
repositori pribadi, kita akan membuat direktori setelahnya Crossplane telah terpasang.
REPO_URL=<e.g. https://github.com/piyushjajoo/xargocd-gitops>
kubectl apply -f - <<EOF
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sqs-queues
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: sqs-project
source:
repoURL: ${REPO_URL}
targetRevision: HEAD
path: ./sqs-queues
destination:
server: https://kubernetes.default.svc
namespace: crossplane-system
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- SyncWaveOrder=true
retry:
limit: 1
backoff:
duration: 5s
factor: 2
maxDuration: 1m
EOF
Pastikan aplikasi argocd berhasil dibuat seperti di bawah ini -
$ kubectl get applications -A
NAMESPACE NAME SYNC STATUS HEALTH STATUS
argocd sqs-queues Unknown Healthy
$ argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd/sqs-queues https://kubernetes.default.svc crossplane-system sqs-project Unknown Healthy Auto-Prune ComparisonError https://github.com/piyushjajoo/xargocd-gitops ./sqs-queues HEAD
Mari kita perbaiki ComparisonError
untuk saat ini, hal ini karena direktori sqs-queues
belum ada di repositori, kesalahannya akan hilang setelah kita mengatur direktori di bagian selanjutnya.
Buat direktori bernama sqs-queues
dan tambahkan file teks tiruan apa pun misalnya. dummy
ke direktori dan komit ke git repo. Ini akan memperbaiki aplikasi argocd.
$ argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd/sqs-queues https://kubernetes.default.svc crossplane-system sqs-project Synced Healthy Auto-Prune <none> https://github.com/piyushjajoo/xargocd-gitops ./sqs-queues HEAD
Instal Crossplane dan Konfigurasikan Penyedia AWS
Di bagian ini, kita akan menginstal inti Crossplane dan pengontrol Penyedia AWS Crossplane untuk sumber daya SQS.
Instal Crossplane Core, pada saat penulisan blog ini, kami versi Crossplane v1.13.2
-
# add crossplane helm repo
helm repo add \
crossplane-stable https://charts.crossplane.io/stable
# update the added helm repo
helm repo update
# to check the current version of the crossplane core
helm search repo crossplane-stable
# install crossplane core helm chart
helm install crossplane \
crossplane-stable/crossplane \
--namespace crossplane-system \
--create-namespace
Pastikan semua pod crossplane berhasil diinstal -
$ kubectl get po -n crossplane-system
NAME READY STATUS RESTARTS AGE
crossplane-8697f8cff4-mw5j6 1/1 Running 0 35s
crossplane-rbac-manager-6f8dbd9ffd-tkcb9 1/1 Running 0 35s
Instal Penyedia AWS Crossplane seperti di bawah ini, pada saat penulisan blog ini, provider-aws-sqs berada pada versi < aku=3> -v0.38.0
cat <<EOF | kubectl apply -f -
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-aws-sqs
spec:
package: xpkg.upbound.io/upbound/provider-aws-sqs:v0.38.0
EOF
Pastikan Penyedia AWS berhasil diinstal seperti di bawah ini -
$ kubectl get providers
NAME INSTALLED HEALTHY PACKAGE AGE
provider-aws-sqs True True xpkg.upbound.io/upbound/provider-aws-sqs:v0.38.0 29s
upbound-provider-family-aws True True xpkg.upbound.io/upbound/provider-family-aws:v0.38.0 25s
Pastikan juga api-resources
untuk SQS tersedia -
$ kubectl api-resources | grep sqs.aws.upbound.io
queuepolicies sqs.aws.upbound.io/v1beta1 false QueuePolicy
queueredriveallowpolicies sqs.aws.upbound.io/v1beta1 false QueueRedriveAllowPolicy
queueredrivepolicies sqs.aws.upbound.io/v1beta1 false QueueRedrivePolicy
queues sqs.aws.upbound.io/v1beta1 false Queue
Buat Pengguna IAM dengan izin SQS
Crossplane memerlukan Izin AWS IAM untuk dapat membuat antrean SQS, dalam kasus penggunaan kami, kami cukup membuat Peran IAM dengan izin SQSFullAccess
seperti di bawah ini dari Konsol AWS.
- Buka IAM > Konsol pengguna di AWS UI
- Buat Pengguna IAM, Anda dapat memilih nama apa pun yang Anda inginkan, di layar berikutnya pilih
Attach policies directly
dan cariAmazonSQSFullAccess
dan buat Pengguna IAM.< /span> - Setelah pengguna dibuat, klik
View User
dan buka tabSecurity Credentials
dan gulir ke bawah ke bagianAccess Keys
. - Klik
Create access key
dan pastikan untuk menyalin nilainya sebelum Anda menekanDone
atau setidaknya unduh file.csv
, karena kita memerlukan kredensial ini untuk menyiapkanProviderConfig
untuk Penyedia AWS seperti yang ditunjukkan di bawah ini.
CATATAN: ada berbagai cara untuk mengonfigurasi kredensial untuk Penyedia AWS, tetapi untuk blog ini, kami akan menggunakan kredensial Pengguna IAM, di blog mendatang kami akan membahas cara lain, misalnya. Identitas yang Disuntikkan. Berbagai cara otentikasi untuk Penyedia AWS disebutkan dalam dokumen ini.
Konfigurasi Penyedia Pengaturan
Di bagian ini, kita akan menyiapkan ProviderConfig
untuk Penyedia AWS, ini adalah cara untuk membuat pengontrol AWS penyedia membuat sumber daya di Akun AWS yang Anda inginkan.
Buat file aws-credentials.txt
dengan kredensial Pengguna IAM yang Anda salin pada bagian di atas, pastikan untuk mengganti nilainya -
[default]
aws_access_key_id = REPLACE_ME_AWS_ACCESS_KEY_ID
aws_secret_access_key = REPLACE_ME_AWS_SECRET_ACCESS_KEY
Buat rahasia kubernetes seperti di bawah ini -
kubectl create secret \
generic aws-secret \
-n crossplane-system \
--from-file=creds=./aws-credentials.txt
Buat ProviderConfig
seperti di bawah ini -
cat <<EOF | kubectl apply -f -
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
name: default
spec:
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: aws-secret
key: creds
EOF
Ini adalah cara untuk mengonfigurasi default
ProviderConfig untuk penyedia-aws, yaitu jika providerConfigRef
tidak disebutkan dalam sumber daya lintas bidang yang sedang dibuat, maka akan dilakukan dengan default pilih default
ProviderConfig.
Validasi pengaturan crossplane dan penyedia aws
Selesai, sekarang kita siap membuat komitmen ke git dan melihat sumber daya dibuat. Atau mungkin validasi terakhir sebelum kami menghadirkan infrastruktur melalui GitOps.
Kirimkan sumber daya Queue
berikut menggunakan kubectl dan validasi jika antrian dibuat di Akun AWS yang Anda inginkan di wilayah yang diinginkan, perhatikan pada contoh di bawah ini kami secara eksplisit menentukan providerConfigRef -> default
, namun ini akan berfungsi meskipun kami tidak menyebutkan default
ProviderConfig -
kubectl apply -f - <<EOF
apiVersion: sqs.aws.upbound.io/v1beta1
kind: Queue
metadata:
name: demo-queue
spec:
forProvider:
name: demo-queue
region: us-west-2
providerConfigRef:
name: default
EOF
Tunggu beberapa detik sumber daya sqs-queue akan dibuat, Anda juga dapat memvalidasi di Konsol AWS -
$ kubectl get queues.sqs.aws.upbound.io
NAME READY SYNCED EXTERNAL-NAME AGE
demo-queue True True https://sqs.us-west-2.amazonaws.com/xxxxxxxxx/demo-queue 37s
Hapus antrian sebagai berikut dan pastikan antrian tersebut dihapus -
$ kubectl delete queues.sqs.aws.upbound.io demo-queue
queue.sqs.aws.upbound.io "demo-queue" deleted
$ kubectl get queues.sqs.aws.upbound.io
No resources found
Lihat keajaiban GitOps + Crossplane + ArgoCD
Kami siap melihat Crossplane dan ArgoCD beraksi. Inilah arsitekturnya -
Buat Antrean SQS baru
Buat komit dengan manifes YAML berikut di direktori sqs-queues
di repositori github yang Anda buat sebelumnya, ini adalah direktori yang telah Anda konfigurasikan sebelumnya dengan ArgoCD. Dalam skenario ini, kami membuat sumber daya baru melalui GitOps.
apiVersion: sqs.aws.upbound.io/v1beta1
kind: Queue
metadata:
name: platformwale-queue
spec:
forProvider:
name: platformwale-queue
region: us-west-2
Repo GitHub Anda akan terlihat seperti di bawah ini -
Buka UI argocd ke aplikasi sqs-queues Anda dan tekan tombol dibuat di Wilayah AWS yang ditentukan dalam Akun AWS yang dikonfigurasi.Refresh
jika argocd belum menyinkronkan repo secara otomatis, tunggu beberapa detik dan Anda akan melihat bahwa repo telah disinkronkan seperti di bawah ini, validasi juga bahwa platformwale-queue
$ kubectl get queues.sqs.aws.upbound.io
NAME READY SYNCED EXTERNAL-NAME AGE
platformwale-queue True True https://sqs.us-west-2.amazonaws.com/xxxxxxx/platformwale-queue 6m48s
Impor Antrean SQS yang ada
Mari kita lakukan sebaliknya, mari kita buat Antrean dari Konsol AWS, sebut saja platformwale-queue2
di < wilayah i=2> dan mari kita coba mengimpornya.us-west-2
Buat antrian platformwale-queue2
di us-west-2
dengan semua nilai default dan salin nilai bidang URL
. Misalnya - https://sqs.us-west-2.amazonaws.com/xxxxx/platformwale-queue2
Kirimkan manifes di bawah ini ke git repo pada direktori sqs-queues
seperti sebelumnya, kali ini Anda akan melihat bahwa, ia akan berhasil mengimpor sumber daya yang ada dan tidak akan mencoba membuat ulang sumber daya tersebut.< /span>
apiVersion: sqs.aws.upbound.io/v1beta1
kind: Queue
metadata:
name: platformwale-queue2
annotations:
crossplane.io/external-name: https://sqs.us-west-2.amazonaws.com/xxxxx/platformwale-queue2
spec:
forProvider:
name: platformwale-queue2
region: us-west-2
Keajaiban terjadi melalui crossplane.io/external-name
anotasi yang kami tentukan dalam manifes kami. Ini adalah anotasi yang diubah oleh bidang silang setelah sumber daya dibuat dan bidang silang memvalidasi apakah sumber daya ada dengan nilai yang ditentukan dalam anotasi, jika ya, ia hanya mencoba mengimpor sumber daya.
$ kubectl get queues.sqs.aws.upbound.io
NAME READY SYNCED EXTERNAL-NAME AGE
platformwale-queue True True https://sqs.us-west-2.amazonaws.com/xxxxx/platformwale-queue 16m
platformwale-queue2 True True https://sqs.us-west-2.amazonaws.com/xxxxx/platformwale-queue2 15s
Kami akan membahas impor sumber daya secara rinci di blog kami yang akan datang. Itu dia!! Di sana Anda memiliki cara GitOps yang fungsional dalam menyediakan infrastruktur menggunakan Crossplane + ArgoCD.
Deteksi Melayang Otomatis
Mari kita berambisi dan menghapus sumber daya dari cluster, Anda akan melihat bahwa suatu saat argocd akan disinkronkan ulang dan sumber daya akan kembali -
# delete the queue
$ kubectl delete queues platformwale-queue
queue.sqs.aws.upbound.io "platformwale-queue" deleted
# queue is gone and you see it being recreated, you can also valdiate in AWS Console
$ kubectl get queues
NAME READY SYNCED EXTERNAL-NAME AGE
platformwale-queue False True 2s
Mari menjadi sangat ambisius dan hapus sumber daya dari Konsol UI AWS, Anda akan melihatnya suatu saat nanti (bagi saya itu adalah ~10 menit, saya yakin ini dapat dikonfigurasi) sumber daya akan kembali -
$ kubectl describe queues platformwale-queue
....
....
....
Normal CreatedExternalResource 16s (x3 over 22m) managed/sqs.aws.upbound.io/v1beta1, kind=queue Successfully requested creation of external resource
Membersihkan
Ini sangat penting, Anda tidak ingin melihat biaya tak terduga dalam tagihan AWS Anda. GitOps membuatnya lebih lancar untuk dibersihkan. Cukup hapus file YAML yang dibuat di direktori sqs-queues lalu jalankan argocd app sync sqs-qeueues --prune, ini akan menghapus sumber daya yang manifesnya baru saja Anda hapus.
$ kubectl get queues
No resources found
Pastikan untuk menghapus Pengguna IAM yang Anda buat sebelumnya dari Konsol AWS.
Selain itu, jika Anda tidak lagi memerlukan repositori GitHub pribadi, Anda dapat menghapus repositori tersebut. Pastikan juga untuk menghapus token akses pribadi yang Anda buat jika Anda tidak ingin terus menggunakannya. Silakan manfaatkan UI GitHub untuk membersihkannya.
Terakhir, jika Anda sudah selesai menggunakan kind cluster, hapus seperti di bawah ini, mohon jangan menghapus cluster sebelum menghapus sumber daya cloud, jika tidak, Anda perlu membersihkan sumber daya cloud secara manual -
kind delete cluster --name platformwale
## validation
$ kind delete cluster --name platformwale
Deleting cluster "platformwale" ...
Deleted nodes: ["platformwale-control-plane"]
Kesimpulan
Oleh karena itu, kami telah mengamati bagaimana Crossplane dan ArgoCD dapat dimanfaatkan untuk mengimplementasikan metodologi GitOps dalam menyediakan infrastruktur. Kemampuan ini memiliki potensi besar baik bagi tim pengembang internal maupun tim platform. Kemampuan bawaan untuk mendeteksi penyimpangan dan melakukan rekonsiliasi menawarkan keuntungan luar biasa yang akan dengan antusias ditawarkan oleh setiap insinyur platform kepada kelompok pengembang internal mereka.
Sekian Terimakasih....
Tidak ada komentar:
Posting Komentar