08/02/2022 - ARGOCD, DOCKER, GIT, GO, HELM, KUBERNETES
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.
İ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
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.
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.
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.
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.
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.
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.
Üç 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.
├── .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
# 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 }}
# 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 ./...
# 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 }}
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"]
apiVersion: v2
name: pacman
type: application
icon: https://
description: This is an HTTP API
version: 0.0.0
appVersion: v0.0.3
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
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
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
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Chart.Name }}
namespace: {{ .Values.namespace }}
data:
HTTP_ADDR: {{ .Values.env.HTTP_ADDR }}
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 }}
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
.gitignore
*.md
.infra/
.git/
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))
}
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)
}
}
Bu, şimdilik sadece ArgoCD'nin bildirimsel yapılandırmalarını korumak içindir!
└── infra
└── argocd
└── pacman
├── dev.yaml
├── prod.yaml
├── project.yaml
└── sbox.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
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
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
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
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
$ 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
$ 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 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'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.1525556/TCP,5557/TCP,5558/TCP 3d16h
service/argocd-metrics ClusterIP 10.108.140.338082/TCP 3d16h
service/argocd-redis ClusterIP 10.108.70.1396379/TCP 3d16h
service/argocd-repo-server ClusterIP 10.110.39.1058081/TCP,8084/TCP 3d16h
service/argocd-server ClusterIP 10.99.239.980/TCP,443/TCP 3d16h
service/argocd-server-metrics ClusterIP 10.111.75.2088083/TCP 3d16h
service/kubernetes ClusterIP 10.96.0.1443/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
Ö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