Bu örnekte, uygulamalarımızdan biri için tam bir CI/CD ardışık düzeni uygulayacağız. CI (Sürekli Entegrasyon) için GitHub Actions kullanacağız ve CD (Sürekli Dağıtım/Teslim) için ArgoCD kullanacağız. Bazı adımları dinamik ve daha az tekrarlı hale getirmek için, sade Kubernetes manifestoları yerine Helm Charts'ı kullanacağız (bu arada Helm'in yerine klasik K8S manifesto'larını kullanmanızı engelleyen bir durum yok). Son olarak uygulama, farklı ad alanlarına sahip birkaç farklı Kubernetes kümesine dağıtılacaktır. Bu bir polyrepo uygulaması için olsa da, monorepo'ya da kolayca uyarlayabilirsiniz. Açıkçsı, Helm Charts'ı config deposuna taşıdıktan ve diğer konfigürasyonlara bazı küçük ince ayarlar yaptıktan sonra monorepo ile çok güzel giderdi.


İki GitHub deposu oluşturacağız. Uygulama kodunun ve Helm Charts'ın (nedenini açıklayacağım!) bulunduğu uygulama için bir tane. İkincisi ArgoCD'nin bildirimsel yapılandırma dosyaları içindir, çünkü her yeni bir uygulama açıldığında birçok kaynağı manuel olarak oluşturmak için kullanıcı arayüzünü kullanmak istemiyoruz (argocd komutunu kullanacağız).


Başlamadan önce, herkesin farklı gereksinimleri ve beklentileri olacağını açıkça belirtmeliyim, bu nedenle kendi yolunuza gitmekte özgürsünüz. Bu örnekte yaptığım şeylerin aynısını yapmak zorunda değilsiniz. Tüm aşamaları tam otomatik (GitFlow dallanması bunun için çok yardımcı olacaktır), tam manuel veya benim yaptığım gibi kısmen otomatik/manuel yapabilirsiniz. Daha fazla para harcamaya hazırsanız, ortam başına bir Kubernetes kümesi de oluşturabilirsiniz :) Tüm seçeneklerin artıları ve eksileri vardır.



Kubernetes yapısı


İsterseniz daha fazla küme veya ad alanı ekleyebilirsiniz.


CLUSTER     NAMESPACE   DESCRIPTION         DEPLOYMENT STRATEGY            IMAGE TAG
nonprod dev development env fully auto CI/CD latest
sbox sandbox env fully auto CI but manual CD semantic ver
prod default production env fully auto CI but manual CD semantic ver

CI/CD stratejisi


Burada, her ArgoCD uygulama girişi başına tüm kurulumumuzun nasıl davranacağını açıklıyorum. dev, GitHub deposunda HEAD/master değişikliklerinden sonra her zaman otomatik olarak dağıtılır. sbox yalnızca yeni bir sürüm oluşturulduğunda ve Helm Chart dosyasına görüntü etiketi eklendiğinde otomatik olarak devreye girer. prod, yeni bir sürüm oluşturulsa veya Helm Chart dosyasına görüntü etiketi eklenmiş olsa bile hiçbir zaman otomatik olarak devreye girmez. Varsayılan olarak otomatik dağıtım, ArgoCD'nin varsayılanı olan her üç dakikada bir gerçekleşir. Bu arada aşağıda "akış" dediğimde, belirli bir uygulamayı ve ortamını temsil eden ArgoCD UI'deki "application" girişinden bahsediyorum.


dev


Otomatik dağıtım için ArgoCD "auto-sync" etkin haldedir. ArgoCD, GitHub deposunda HEAD/master'da yapılan değişiklikleri izler. Bir değişiklik algılanırsa ve ayrıca DockerHub'daki latest imaj etiketinin kodu ArgoCD'nin bildiklerinden farklıysa, otomatik dağıtım başlar. Tüm CI/CD otomatikleştirilmiştir, bu nedenle mühendislerin dağıtım için manuel olarak herhangi bir şey yapmasına gerek yoktur.


Kubernetes için "zorla kullanıma sunma" etkinleştirildi çünkü kullandığımız imaj etiketi her zaman latest, aksi halde Pod yeniden başladığında, zaten orada olduğundan en son resmi çekmez. Zaten her yeni özellik sunulduğunda yeni bir benzersiz imaj etiketi oluşturmak istemezsiniz.


GitHub'da yeni bir sürüm oluşturmak bu akışı etkilemez.


sbox


Otomatik dağıtım için ArgoCD "auto-sync" etkin haldedir. ArgoCD, GitHub deposunda HEAD/master'da yapılan değişiklikleri izler. Yeni bir sürüm oluşturulursa ve .infra/helm/Chart.yaml:appVersion verisi, ArgoCD'nin bildiklerinden farklıysa, otomatik dağıtım başlar. Bu CD akışı kısmen otomatiktir, bu nedenle mühendislerin yeni sürüm etiketini belirtilen dosyaya eklemek için bir pull request oluşturması gerekir. Tamamlandığında, otomatik dağıtım devreye girer.


Kubernetes için "zorla kullanıma sunma" devre dışı bırakılmıştır çünkü izlediği imaj etiketi, herhangi bir değişikliğin resim çekmeyi tetikleyecek olan anlamsal bir resim etiketi sürümüdür.


GitHub deposundaki HEAD/master ve DockerHub'daki latest imaj etiketinin kodu değiştirildiğinden, bu akışın ayrıca dev akışını tetikleyecektir. ArgoCD'nin bildiği anlamsal imaj etiketi artık güncel olmadığı için prod akışı "out of sync" duruma getirilecek.


prod


Otomatik dağıtım için ArgoCD "auto-sync" etkin halde değildir. Ancak, yeni bir sürüm oluşturulursa ve .infra/helm/Chart.yaml:appVersion verisi, ArgoCD'nin bildiklerinden farklıysa, bu akış bir mühendisin "SYNC" düğmesini tıklayabileceği "out of sync" duruma getirilir. Gördüğünüz gibi, bu CD akışı tamamen manueldir, bu nedenle mühendislerin yeni sürüm etiketini belirtilen dosyaya eklemek için bir pull request oluşturması ve ardından "SYNC" simgesine tıklaması gerekir.


Kubernetes için "zorla kullanıma sunma" devre dışı bırakılmıştır çünkü izlediği imaj etiketi, herhangi bir değişikliğin resim çekmeyi tetikleyecek olan anlamsal bir resim etiketi sürümüdür.


Bu akış dev akışını etkilemeyecektir çünkü sbox akışı bu aşamaya gelmeden önce zaten durumu yönetmiştir.


Rollback


Herhangi bir ortam için bir akışı geri alırsanız, birisi herhangi bir yerde yeni bir değişiklik yapsa bile olduğu gibi kalır. HEAD/master commit değişiklikleri, yeni bir sürüm oluşturulsa veya Helm Chart dosyası güncellense bile auto-sync özelliği geri alma işleminizi geri almaz. İlk önce kilidini açmak için akışı manuel olarak SYNC ikonu ile açmanız gerekecek ki, bu iyi bir şey çünkü geri almalarınızın zamanından önce geri alınmasını istemezsiniz.


Uygulama deposunda Helm Charts tutmak


ArgoCD, birçok iyi nedenden dolayı tüm bildirimleri veya yapılandırma dosyalarını ayrı bir havuzda (örneğin config) tutmanın daha iyi olduğunu önerir. Ancak, tam otomatik dağıtım hattının tüm amacını göz ardı eden bir sorunu var. Örneğin, dev akışı için yaptığım gibi tam otomatik bir CD sağlamak istiyorsanız, ArgoCD'nin onu alması ve dağıtımı tetiklemesi amacıyla, yapılandırma deposundaki bir şeyi manuel olarak güncellemeniz gerekir. Bunun nedeni, yapılandırmalarınızın artık uygulama havuzunu değil, yapılandırma havuzunu izleyecek şekilde ayarlanmış olmasıdır. Bu, mühendis dostu bir yaklaşım değil çünkü dediğim gibi, uygulama deponuza bir şey eklediğinizde, yapılandırmada da bir şeyler yapmanız gerekecek. Bazı kişiler bu manuel işlemden kaçınmak için bir çözüm önermektedir. CI adımlarında yapılandırma deposuna bir commit göndermek gibi. Bunu biraz hileli buluyorum. Mesela ya bir çakışma nedeniyle CI adımı bozulursa ne olacak! Ayrıca, farklı bir depo çekme ve diğer bir depo içinde olan bir CI iletim hattı içinden ona bir commit gönderme fikri kulağıma pek hoş gelmiyor. Eğer isterseniz, işte benim bir örneğim.


Uygulamanız bir monorepo olarak kuruluysa, orada yüzlerce servis olabileceğinden ArgoCD'nin önerisini benimsemek çok yararlı olabilir. Böyle bir durumda, uygulama havuzundaki her bir değişiklikten sonra tüm servisler yerine, sadece belirli servisleri dağıtabilirsiniz. Kısacası, neye sahip olduğunuzu görün ve en iyisini yapın.


GitHub Actions'ın sorumluluğu


Üç eylem vardır, ancak bunlardan yalnızca ikisi ArgoCD'yi doğrudan etkiler ve bunlar "merge" ve "release" olanıdır. Ayrıntılı yorumları aşağıdaki dosyalardan okuyabilirsiniz.


"merge" eylemi, "latest" imaj etiketini kullanarak yeni bir Docker imajını gönderir. Bu, dev CD akışı içindir. "release" eylemi, daha önceden oluşturduğunuz anlamsal imaj etiketi sürümünü kullanarak yeni bir Docker imajını gönderir. Bu, sbox ve prod CD akışları içindir.


Uygulama deposu


├── .github
│   └── workflows
│   ├── merge.yaml
│   ├── pull_request.yaml
│   └── release.yaml
├── .infra
│   ├── docker
│   │   └── Dockerfile
│   └── helm
│   ├── Chart.yaml
│   ├── dev.yaml
│   ├── prod.yaml
│   ├── sbox.yaml
│   └── templates
│   ├── configmap.yaml
│   ├── deployment.yaml
│   └── service.yaml
├── .dockerignore
├── main.go
└── main_test.go

Dosyalar


merge.yaml

# Trigger the workflow only when:
# - an existing pull request with any name/type is merged to the master or develop branch
# - a commit is directly pushed to the master or develop branch

name: Merge

on:
push:
branches:
- master
- develop

jobs:

setup:
runs-on: ubuntu-latest
outputs:
ver: ${{ steps.vars.outputs.ver }}
steps:
- name: Use repository
uses: actions/checkout@v2
- name: Build variables
id: vars
run: |
echo "::set-output name=ver::$(git rev-parse --short "$GITHUB_SHA")"
- name: Upload repository
uses: actions/upload-artifact@v2
with:
name: repository
path: |
${{ github.workspace }}/.infra/docker
${{ github.workspace }}/.dockerignore
${{ github.workspace }}/main.go
${{ github.workspace }}/main_test.go
${{ github.workspace }}/go.mod
${{ github.workspace }}/go.sum

test:
needs: setup
runs-on: ubuntu-latest
steps:
- name: Use Golang 1.17
uses: actions/setup-go@v2
with:
go-version: 1.17
- name: Download repository
uses: actions/download-artifact@v2
with:
name: repository
- name: Run tests
run: go test -v -race -timeout=180s -count=1 -cover ./...

docker:
needs: [setup, test]
runs-on: ubuntu-latest
steps:
- name: Download repository
uses: actions/download-artifact@v2
with:
name: repository
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push image
uses: docker/build-push-action@v2
with:
push: true
file: .infra/docker/Dockerfile
tags: ${{ github.repository }}:latest
build-args: VER=${{ needs.setup.outputs.ver }}

pull_request.yaml

# Trigger the workflow only when:
# - a new pull request with any name/type is opened against the master, develop, hotfix/* or release/* branch
# - a commit is directly pushed to the pull request

name: Pull Request

on:
pull_request:
branches:
- master
- develop
- hotfix/*
- release/*

jobs:

setup:
runs-on: ubuntu-latest
steps:
- name: Use repository
uses: actions/checkout@v2
- name: Upload repository
uses: actions/upload-artifact@v2
with:
name: repository
path: |
${{ github.workspace }}/main.go
${{ github.workspace }}/main_test.go
${{ github.workspace }}/go.mod
${{ github.workspace }}/go.sum

test:
needs: setup
runs-on: ubuntu-latest
steps:
- name: Use Golang 1.17
uses: actions/setup-go@v2
with:
go-version: 1.17
- name: Download repository
uses: actions/download-artifact@v2
with:
name: repository
- name: Run tests
run: go test -v -race -timeout=180s -count=1 -cover ./...

release.yaml

# Trigger the workflow only when:
# - a new release is released which excludes pre-release and draft

name: Release

on:
release:
types:
- released

jobs:

setup:
runs-on: ubuntu-latest
steps:
- name: Use repository
uses: actions/checkout@v2
- name: Upload repository
uses: actions/upload-artifact@v2
with:
name: repository
path: |
${{ github.workspace }}/.docker
${{ github.workspace }}/.dockerignore
${{ github.workspace }}/main.go
${{ github.workspace }}/main_test.go
${{ github.workspace }}/go.mod
${{ github.workspace }}/go.sum

test:
needs: setup
runs-on: ubuntu-latest
steps:
- name: Use Golang 1.17
uses: actions/setup-go@v2
with:
go-version: 1.17
- name: Download repository
uses: actions/download-artifact@v2
with:
name: repository
- name: Run tests
run: go test -v -race -timeout=180s -count=1 -cover ./...

docker:
needs: [setup, test]
runs-on: ubuntu-latest
steps:
- name: Download repository
uses: actions/download-artifact@v2
with:
name: repository
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push image
uses: docker/build-push-action@v2
with:
push: true
file: .infra/docker/Dockerfile
tags: ${{ github.repository }}:${{ github.event.release.tag_name }}
build-args: VER=${{ github.event.release.tag_name }}

Dockerfile

FROM golang:1.17.5-alpine3.15 as build
WORKDIR /source
COPY . .
ARG VER
RUN CGO_ENABLED=0 go build -ldflags "-s -w -X main.ver=${VER}" -o pacman main.go

FROM alpine:3.15
COPY --from=build /source/pacman /pacman
EXPOSE 8080
ENTRYPOINT ["./pacman"]

Chart.yaml

apiVersion: v2
name: pacman
type: application
icon: https://
description: This is an HTTP API
version: 0.0.0
appVersion: v0.0.3

dev.yaml

namespace: dev

env:
HTTP_ADDR: :8080

image:
name: you/pacman
tag: latest
pull: Always

deployment:
force: true
replicas: 1
container:
name: go
port: 8080

service:
type: ClusterIP
port: 8080

prod.yaml

namespace: default

env:
HTTP_ADDR: :8080

image:
name: you/pacman
tag: ""
pull: IfNotPresent

deployment:
force: false
replicas: 2
container:
name: go
port: 8080

service:
type: ClusterIP
port: 8080

sbox.yaml

namespace: sbox

env:
HTTP_ADDR: :8080

image:
name: you/pacman
tag: ""
pull: IfNotPresent

deployment:
force: false
replicas: 2
container:
name: go
port: 8080

service:
type: ClusterIP
port: 8080

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Chart.Name }}
namespace: {{ .Values.namespace }}

data:
HTTP_ADDR: {{ .Values.env.HTTP_ADDR }}

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name }}
namespace: {{ .Values.namespace }}
labels:
app: {{ .Chart.Name }}

spec:
replicas: {{ .Values.deployment.replicas }}
selector:
matchLabels:
app: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Chart.Name }}
{{- if .Values.deployment.force }}
annotations:
roller: {{ randAlphaNum 5 }}
{{- end }}
spec:
containers:
- name: {{ .Values.deployment.container.name }}
image: "{{ .Values.image.name }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pull }}
ports:
- containerPort: {{ .Values.deployment.container.port }}
envFrom:
- configMapRef:
name: {{ .Chart.Name }}

service.yaml

apiVersion: v1
kind: Service
metadata:
name: {{ .Chart.Name }}
namespace: {{ .Values.namespace }}

spec:
type: {{ .Values.service.type }}
selector:
app: {{ .Chart.Name }}
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.deployment.container.port }}

.dockerignore

.dockerignore
.gitignore
*.md
.infra/
.git/

main.go

package main

import (
"log"
"net/http"
"os"
)

var ver string

func main() {
rtr := http.DefaultServeMux
rtr.HandleFunc("/", home{}.handle)

addr := os.Getenv("HTTP_ADDR")

log.Printf("%s: info: http listen and serve pacman: %s", ver, addr)
if err := http.ListenAndServe(addr, rtr); err != nil && err != http.ErrServerClosed {
log.Printf("%s: error: http listen and serve pacman: %s", ver, err)
}
}

type home struct{}

func (h home) handle(w http.ResponseWriter, r *http.Request) {
log.Printf("%s: info: X-Request-ID: %s\n", ver, r.Header.Get("X-Request-ID"))
_, _ = w.Write([]byte("pacman" + ver))
}

main_test.go

package main

import (
"net/http"
"net/http/httptest"
"testing"
)

func Test_home_handle(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, "/", nil)
res := httptest.NewRecorder()

home{}.handle(res, req)

if res.Code != http.StatusOK {
t.Error("expected 200 but got", res.Code)
}
}

Yapılandırma deposu


Bu, şimdilik sadece ArgoCD'nin bildirimsel yapılandırmalarını korumak içindir!


└── infra
└── argocd
└── pacman
├── dev.yaml
├── prod.yaml
├── project.yaml
└── sbox.yaml

Dosyalar


dev.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: pacman-dev
namespace: default

spec:
project: pacman
source:
repoURL: https://github.com/you/pacman
path: .infra/helm
targetRevision: HEAD
helm:
valueFiles:
- dev.yaml
destination:
namespace: dev
name: nonprod
syncPolicy:
syncOptions:
- ApplyOutOfSyncOnly=true
- CreateNamespace=true
automated:
prune: true
selfHeal: true

prod.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: pacman-prod
namespace: default

spec:
project: pacman
source:
repoURL: https://github.com/you/pacman
path: .infra/helm
targetRevision: HEAD
helm:
valueFiles:
- prod.yaml
destination:
namespace: default
name: prod
syncPolicy:
syncOptions:
- ApplyOutOfSyncOnly=true
- CreateNamespace=true

sbox.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: pacman-sbox
namespace: default

spec:
project: pacman
source:
repoURL: https://github.com/you/pacman
path: .infra/helm
targetRevision: HEAD
helm:
valueFiles:
- sbox.yaml
destination:
namespace: sbox
name: nonprod
syncPolicy:
syncOptions:
- ApplyOutOfSyncOnly=true
- CreateNamespace=true
automated:
prune: true
selfHeal: true

project.yaml

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: pacman
namespace: default

spec:
destinations:
- name: '*'
namespace: '*'
server: '*'
clusterResourceWhitelist:
- group: '*'
kind: '*'
orphanedResources:
warn: true
sourceRepos:
- https://github.com/you/pacman

GitHub hazırlığı


DOCKERHUB_USER ve DOCKERHUB_TOKEN sırlarını uygulama deposuna ekleyin. DOCKERHUB_TOKEN için kullanmak üzere önce DockerHub'da bir belirteç oluşturmanız gerekir. Örneğin. 86b2f4b8-816d-4d96-9666-ac0a8066e737 Ayrıca ARGOCD adında bir GitHub belirteci oluşturun ve repo kapsamını işaretleyin. Örneğin. ghp_816dac0a8066e737966686b2f4b84d96


Kubernetes hazırlığı


Küme oluşturma


$ minikube start -p argocd --vm-driver=virtualbox --memory=2000
Starting control plane node argocd in cluster argocd

$ minikube start -p nonprod --vm-driver=virtualbox
Starting control plane node nonprod in cluster nonprod

$ minikube start -p prod --vm-driver=virtualbox
Starting control plane node prod in cluster prod

Doğrulama


$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* argocd argocd argocd
nonprod nonprod nonprod
prod prod prod

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority: /Users/you/.minikube/ca.crt
server: https://192.168.99.105:8443
name: argocd
- cluster:
certificate-authority: /Users/you/.minikube/ca.crt
server: https://192.168.99.106:8443
name: nonprod
- cluster:
certificate-authority: /Users/you/.minikube/ca.crt
server: https://192.168.99.107:8443
name: prod
contexts:
- context:
cluster: argocd
user: argocd
name: argocd
- context:
cluster: nonprod
user: nonprod
name: nonprod
- context:
cluster: prod
user: prod
name: prod
current-context: argocd
kind: Config
preferences: {}
users:
- name: argocd
user:
client-certificate: /Users/you/.minikube/profiles/argocd/client.crt
client-key: /Users/you/.minikube/profiles/argocd/client.key
- name: nonprod
user:
client-certificate: /Users/you/.minikube/profiles/nonprod/client.crt
client-key: /Users/you/.minikube/profiles/nonprod/client.key
- name: prod
user:
client-certificate: /Users/you/.minikube/profiles/prod/client.crt
client-key: /Users/you/.minikube/profiles/prod/client.key

Helm kurulumu


Helm CLI kurulumu için Helm'i takip edin. Bunu Chart oluşturmak, doğrulamak ve hata ayıklamak için kullanıyoruz. Bu örneğe eklediğim Chartlara karşı komutlarını kullanabilirsiniz. Daha önce de söylediğim gibi, Helm mecburi değildir. Bazı küçük değişikliklerle Kubernetes bildirimlerini kullanabilirsiniz. Bununla birlikte, Helm, birçok şeyi kullanmayı keyifli hale getirir.


ArgoCD kurulumu


ArgoCD'yi kendi Kubernetes kümesine kuracağız. ArgoCD daha sonra uygulamaları diğer kümelere dağıtacaktır. Daha fazla kurulum seçeneği için burayı kontrol edin.


$ kubectl config current-context
argocd

$ kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.2.4/manifests/install.yaml

Kaldırmak isterseniz aşağıdaki komutu kullanabilirsiniz.


$ kubectl delete -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 1/1 Running 7 3d16h
pod/argocd-dex-server-97b8cff96-xtz4n 1/1 Running 0 3d16h
pod/argocd-redis-584f4df7d7-qpl6m 1/1 Running 0 3d16h
pod/argocd-repo-server-7b46f67c87-9gjfz 1/1 Running 9 3d16h
pod/argocd-server-864d74fcbb-vcwnf 1/1 Running 3 3d16h

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-dex-server ClusterIP 10.101.97.152 5556/TCP,5557/TCP,5558/TCP 3d16h
service/argocd-metrics ClusterIP 10.108.140.33 8082/TCP 3d16h
service/argocd-redis ClusterIP 10.108.70.139 6379/TCP 3d16h
service/argocd-repo-server ClusterIP 10.110.39.105 8081/TCP,8084/TCP 3d16h
service/argocd-server ClusterIP 10.99.239.9 80/TCP,443/TCP 3d16h
service/argocd-server-metrics ClusterIP 10.111.75.208 8083/TCP 3d16h
service/kubernetes ClusterIP 10.96.0.1 443/TCP 3d16h

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/argocd-dex-server 1/1 1 1 3d16h
deployment.apps/argocd-redis 1/1 1 1 3d16h
deployment.apps/argocd-repo-server 1/1 1 1 3d16h
deployment.apps/argocd-server 1/1 1 1 3d16h

NAME DESIRED CURRENT READY AGE
replicaset.apps/argocd-dex-server-97b8cff96 1 1 1 3d16h
replicaset.apps/argocd-redis-584f4df7d7 1 1 1 3d16h
replicaset.apps/argocd-repo-server-7b46f67c87 1 1 1 3d16h
replicaset.apps/argocd-server-864d74fcbb 1 1 1 3d16h

NAME READY AGE
statefulset.apps/argocd-application-controller 1/1 3d16h

Bir tarayıcı kullanarak erişebilmemiz için onu açığa çıkaralım. Bu arada, ArgoCD'yi LoadBalancer olarak yükleyebilir ve port yönlendirmesini önleyebilirsiniz.


$ kubectl port-forward svc/argd-server 8443:443

Aşağıdaki komutu kullanarak giriş yapmak için şifreyi alın.


$ kubectl get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

// Assume you got gYzYfJ5kxzJsdZGK

https://localhost:8443/ adresine gidebilir ve giriş yapmak için admin:gYzYfJ5kxzJsdZGK kullanabilirsiniz.



argocd komutunu yüklemek için aşağıdaki komutu kullanın. Bu, kullanıcı arayüzünde manuel olarak ArgoCD kaynakları oluşturmaktan kaçınmamıza yardımcı olacaktır.


$ brew tap argoproj/tap && brew install argoproj/tap/argocd

$ argocd version
argocd: v2.2.5+8f981cc.dirty
BuildDate: 2022-02-05T05:39:12Z
GitCommit: 8f981ccfcf942a9eb00bc466649f8499ba0455f5
GitTreeState: dirty
GoVersion: go1.17.6
Compiler: gc
Platform: darwin/amd64
FATA[0000] Argo CD server address unspecified

Kaynakları oluşturma


Öncelikle login olalım.


$ argocd --insecure login 127.0.0.1:8443
Username: admin
Password: gYzYfJ5kxzJsdZGK
'admin:login' logged in successfully
Context '127.0.0.1:8443' updated

Cluster ekleyelim. Bu sadece CLI ile olur.


$ argocd cluster add nonprod
INFO[0002] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0002] ClusterRole "argocd-manager-role" updated
INFO[0002] ClusterRoleBinding "argocd-manager-role-binding" updated
Cluster 'https://192.168.99.106:8443' added

$ argocd cluster add prod
INFO[0002] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0002] ClusterRole "argocd-manager-role" updated
INFO[0002] ClusterRoleBinding "argocd-manager-role-binding" updated
Cluster 'https://192.168.99.107:8443' added

Uygulama deposunu ekleyin.


$ argocd repo add https://github.com/you/pacman \
--username you \
--password ghp_816dac0a8066e737966686b2f4b84d96 \
--type git

Proje oluşturun. Gördüğünüz gibi yapılandırma deposundan okuyoruz.


$ argocd proj create --file ~/config/infra/argocd/pacman/project.yaml

Uygulamaları oluşturun. Gördüğünüz gibi uygulama deposundan okuyoruz.


$ argocd app create --file ~/pacman/.infra/helm/dev.yaml && \
argocd app create --file ~/pacman/.infra/helm/prod.yaml && \
argocd app create --file ~/pacman/.infra/helm/sbox.yaml

Ekran görüntüleri


Cluster



Repository



Project



Application