LAB #2 on GKE
Deploy app by ARGO CD
0. 사전 준비 사항
실습을 진행하기 위한 터미널 생성을 위해 GCP Cloud Shell ( )을 활성화 합니다.
[그림 1] Cloud Shell과 GKE 구성
실습을 위한 소스 코드를 내려 받습니다.
[hj@cs-491314827780-default ~ (☸️ |hj-gke:default)]$ git clone
https://github.com/sysnet4admin/Iac.git
Cloning into 'IaC'...
remote: Enumerating objects: 2094, done.
<snipped>
Receiving objects: 100% (2094/2094), 17.78 MiB | 20.83 MiB/s, done.
Resolving deltas: 100% (1133/1133), done.
내려 받은 디렉터리로 이동하여 구조가 다음과 같은 확인합니다.
[hj@cs-491314827780-default ~ (☸️ |hj-gke:default)]$ cd IaC/
[hj@cs-491314827780-default IaC (☸️ |hj-gke:default)]$ ls
Argo GCP Jenkins manifests NXOSv README.md tools
Docker GitOps k8s nGrinder Prometheus Terraform
2
Note: 이 중에 GitOps에 있는 내용을 사용할 것인데, 배포할 앱은 각자의 깃 저장소에 저장해
두어야 합니다.
1.GKE 배포하기
쿠버네티스 실습을 진행할수 있도록 GKE를 배포합니다.
1.1.gcloud 명령어로 서울에서 배포 가능한 GKE 버전 알아보기
[hj@cs-491314827780-default IaC (☸️ |hj-gke:default)]$ gcloud container get-server-config
--region=asia-northeast3 --format=json
Fetching server config for asia-northeast3
{
"channels": [
{
"channel": "RAPID",
"defaultVersion": "1.26.1-gke.1500",
"validVersions": [
"1.26.1-gke.1500",
"1.25.7-gke.1000",
"1.25.6-gke.200",
"1.24.10-gke.2300",
"1.23.16-gke.1400",
"1.22.17-gke.5400",
"1.22.17-gke.4300",
"1.21.14-gke.18100"
]
},
{
"channel": "REGULAR",
"defaultVersion": "1.24.9-gke.3200",
"validVersions": [
"1.25.7-gke.1000",
"1.24.9-gke.3200",
"1.23.16-gke.1100",
"1.22.17-gke.4000",
"1.21.14-gke.15800"
]
},
{
"channel": "STABLE",
"defaultVersion": "1.24.9-gke.3200",
"validVersions": [
"1.24.9-gke.3200",
"1.23.16-gke.1100",
"1.22.17-gke.3100",
"1.21.14-gke.15800",
3
"1.21.14-gke.14600"
]
}
],
"defaultClusterVersion": "1.24.9-gke.3200",
"defaultImageType": "COS_CONTAINERD",
"validImageTypes": [
"COS_CONTAINERD",
"COS",
"UBUNTU",
"UBUNTU_CONTAINERD",
"WINDOWS_LTSC",
"WINDOWS_LTSC_CONTAINERD",
"WINDOWS_SAC",
"WINDOWS_SAC_CONTAINERD"
],
"validMasterVersions": [
"1.25.7-gke.1000",
"1.25.6-gke.200",
"1.24.10-gke.2300"
<snipped>
Note: kube-apiserver와 kubelet 등과의 허용되는 버전 차이에 대해서는 다음의 링크를
참조하세요
1.2.한 번에 control-plane이 asia-northeast3-a에 있는 GKE로 배포하기
시점에 따라 cluster-version이 없을 수 있으니, 적절한 변경이 필요합니다.
[hj@cs-491314827780-default IaC (☸️ |hj-gke:default)]$ gcloud container clusters create
megazone-gke-multi-zonal 
--num-nodes=1 
--zone asia-northeast3-a 
--node-locations=asia-northeast3-a,asia-northeast3-b,asia-northeast3-c 
--cluster-version=1.25.7-gke.1000 
--enable-ip-alias 
--location-policy=BALANCED
Note: The Pod address range limits the maximum size of the cluster. Please refer to
https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr to learn how to
optimize IP address allocation.
Creating cluster megazone-gke-multi-zonal in asia-northeast3-a... Cluster is being
health-checked (master is healthy)...done.
Created
[https://container.googleapis.com/v1/projects/dbgong-team-20200512/zones/asia-northeast3-a/c
lusters/megazone-gke-multi-zonal].
To inspect the contents of your cluster, go to:
https://console.cloud.google.com/kubernetes/workload_/gcloud/asia-northeast3-a/megazone-gke-
multi-zonal?project=dbgong-team-20200512
4
kubeconfig entry generated for megazone-gke-multi-zonal.
NAME: megazone-gke-multi-zonal
LOCATION: asia-northeast3-a
MASTER_VERSION: 1.25.7-gke.1000
MASTER_IP: 34.64.87.231
MACHINE_TYPE: e2-medium
NODE_VERSION: 1.25.7-gke.1000
NUM_NODES: 3
STATUS: RUNNING
Note: 자세한 glcoud container 옵션을 다음의 링크를 참조하세요
1.2.배포된 GKE 상태 및 버전 확인하기
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-megazone-gke-mult-default-pool-0848afc4-qmmf Ready <none> 111s v1.25.7-gke.1000
gke-megazone-gke-mult-default-pool-603823cf-mlwj Ready <none> 111s v1.25.7-gke.1000
gke-megazone-gke-mult-default-pool-d39da12f-c6r1 Ready <none> 111s v1.25.7-gke.1000
1.3.배포된 kube-system 애플리케이션 확인하기
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
event-exporter-gke-755c4b4d97-wpwr6 2/2 Running 0 4m4s
fluentbit-gke-c8m5b 2/2 Running 0 3m4s
fluentbit-gke-crkpk 2/2 Running 0 3m3s
fluentbit-gke-s9rgk 2/2 Running 0 3m3s
gke-metrics-agent-5s5xw 2/2 Running 0 3m3s
gke-metrics-agent-jmhn2 2/2 Running 0 3m4s
gke-metrics-agent-ns8kp 2/2 Running 0 3m3s
konnectivity-agent-6c7d8d7ccd-68269 1/1 Running 0 3m55s
konnectivity-agent-6c7d8d7ccd-grm44 1/1 Running 0 2m39s
konnectivity-agent-6c7d8d7ccd-rg7mt 1/1 Running 0 2m39s
konnectivity-agent-autoscaler-7dc78c8c9-7xgkr 1/1 Running 0 3m53s
kube-dns-7b9b6ffbd9-hqkvz 4/4 Running 0 4m6s
kube-dns-7b9b6ffbd9-jldn9 4/4 Running 0 2m40s
kube-dns-autoscaler-5f56f8997c-vd9wr 1/1 Running 0 4m6s
kube-proxy-gke-megazone-gke-mult-default-pool-0848afc4-qmmf 1/1 Running 0 114s
kube-proxy-gke-megazone-gke-mult-default-pool-603823cf-mlwj 1/1 Running 0 2m15s
kube-proxy-gke-megazone-gke-mult-default-pool-d39da12f-c6r1 1/1 Running 0 2m3s
l7-default-backend-d6b749b76-xzfpj 1/1 Running 0 3m51s
metrics-server-v0.5.2-67864775dc-vg5b8 2/2 Running 0 2m23s
pdcsi-node-h4tvw 2/2 Running 0 3m4s
pdcsi-node-kgxpm 2/2 Running 0 3m3s
pdcsi-node-s9gqk 2/2 Running 0 3m3s
5
2.Argo CD 설치 및 구성
Argo CD 저장소를 헬름에 추가하고 Argo CD를 쿠버네티스에 배포합니다.
2.1.Argo CD에 대한 헬름 저장소를 추가
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ helm repo add argo
https://argoproj.github.io/argo-helm
"argo" has been added to your repositories
2.2.Argo CD의 헬름 저장소를 최신 내용으로 업데이트 하기
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "argo" chart repository
Update Complete. ⎈Happy Helming!⎈
2.3.헬름 저장소의 목록을 확인
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ helm repo list
NAME URL
argo https://argoproj.github.io/argo-helm
2.4.헬름으로 Argo CD 배포
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ helm install argocd argo/argo-cd 
--set server.service.type=LoadBalancer 
--set configs.params."server.insecure"=true 
--set server.image.tag=v2.6.7 
--namespace=argocd 
--create-namespace
NAME: argocd
LAST DEPLOYED: Wed Apr 12 04:59:07 2023
NAMESPACE: argocd
STATUS: deployed
REVISION: 1
TEST SUITE: None
6
NOTES:
In order to access the server UI you have the following options:
1. kubectl port-forward service/argocd-server -n argocd 8080:443
and then open the browser on http://localhost:8080 and accept the certificate
2. enable ingress in the values file `server.ingress.enabled` and either
- Add the annotation for ssl passthrough:
https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#option-1-ssl-passthrough
- Set the `configs.params."server.insecure"` in the values file and terminate SSL at
your ingress:
https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#option-2-multiple-ingress-
objects-and-hosts
After reaching the UI the first time you can login with username: admin and the random
password generated during the installation. You can find the password by running:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" |
base64 -d
(You should delete the initial secret afterwards as suggested by the Getting Started Guide:
https://argo-cd.readthedocs.io/en/stable/getting_started/#4-login-using-the-cli)
2.5.노출된 Deployment와 Service 상태를 확인
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl get po,svc -n argocd
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 1/1 Running 0 2m40s
pod/argocd-applicationset-controller-5dd87cc68-8zfqc 1/1 Running 0 2m40s
pod/argocd-dex-server-64b965fd-2xxgv 1/1 Running 0 2m40s
pod/argocd-notifications-controller-74b84c4bf5-9r9tl 1/1 Running 0 2m40s
pod/argocd-redis-6c9f5c7dcc-h89lt 1/1 Running 0 2m40s
pod/argocd-repo-server-594fcbb47d-xx9kt 1/1 Running 0 2m40s
pod/argocd-server-77b68b89b8-xt25h 1/1 Running 0 2m40s
NAME TYPE CLUSTER-IP EXTERNAL-IP
PORT(S) AGE
service/argocd-applicationset-controller ClusterIP 10.88.40.181 <none>
7000/TCP 2m40s
service/argocd-dex-server ClusterIP 10.88.33.226 <none>
5556/TCP,5557/TCP 2m40s
service/argocd-redis ClusterIP 10.88.44.0 <none>
6379/TCP 2m40s
service/argocd-repo-server ClusterIP 10.88.33.119 <none>
8081/TCP 2m40s
7
service/argocd-server LoadBalancer 10.88.35.84 34.64.50.202
80:31187/TCP,443:30755/TCP 2m40s
2.6.웹 브라우저에 Argo CD의 로드밸런서(LoadBalancer) IP를 입력해서 상태 확인
2.7.로그인을 위해 admin 암호를 admin-hoonjo 로 변경
# bcrypt password = admin-hoonjo >>> $2a$10$rRyBsGSHK6.uc8fntPwVIuLVHgsAhAX7TcdrqW/RADU0uh7CaChLa
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl -n argocd patch secret
argocd-secret 
-p '{"stringData": {
"admin.password": "$2a$10$lix6ghybmAoZEfEjAkJS9eTRQcAIaA7kYFCdmpJlDdeQKPWKL2JMG",
"admin.passwordMtime": "'$(date +%FT%T%Z)'"
}}'
secret/argocd-secret patched
8
Note1: 직접 bcrypt 암호를 만들고자 한다면 다음의 웹페이지를 이용하세요.
Bcrypt Hash Generator - Online - Browserling Web Developer Tools
Note2: 기본 암호가 궁금하다면? 다음의 명령을 수행하세요.
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl -n argocd get secret
argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
AMAgkEzreMKd9mE6
2.8.로그인을 위해 admin / admin-hoonjo를 입력
2.9.정상적으로 로그인 됨을 확인
9
3.Argo CD의 Web UI를 통해서 GitOps 구현하기
아르고 CD를 이용해서 깃옵스를 구현해 봅시다.
3.1.Argo CD에 새로운 애플리케이션을 추가
3.2.애플리케이션 이름과 프로젝트 이름(default)로 구성
10
Application Name: web-gitops
Project Name: default
Note: 디폴트(default)가 아닌 경우 꼭 프로젝트 이름부터 만들어야함
3.3.소스의 URL을 입력
소스의 URL을 각자의 깃 저장소를 입력해야 합니다. 그래야 추후에 commit & push를 진행할
수 있습니다.
Repository URL: https://github.com/sysnet4admin/IaC.git
Path: GitOps
11
3.4.배포할 곳을 지정
Cluster URL: https://kubernetes.default.svc
Namespace: default
3.5.생성(CREATE) 메뉴를 누르고 새로 생성된 프로젝트를 확인
12
3.6.생성된 새로운 프로젝트 눌러서 상세 내용을 확인
13
3.7.소스와 동일하게 구성하기 위해서(GitOps) 싱크(SYNC) 메뉴를 누름
14
3.7.싱크를 진행하기 위해 SYNCHRONIZE 메뉴를 누름
3.8.진행되는 싱크를 확인하고 Pod가 3개 배포 완료되는 것도 함께 확인함
15
3.9.실제로 배포된 애플리케이션의 상태를 알기 위해 kubectl 명령으로 확인
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl get po,svc
NAME READY STATUS RESTARTS AGE
pod/gitops-chk-info-64f565554b-lc8m2 1/1 Running 0 5m
16
pod/gitops-chk-info-64f565554b-p5zdb 1/1 Running 0 5m
pod/gitops-chk-info-64f565554b-pjtpm 1/1 Running 0 5m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.88.32.1 <none> 443/TCP 16d
service/lb-gitops-chk-info LoadBalancer 10.88.41.101 34.64.33.205 80:30327/TCP 5m
3.10.GitOps 동작 확인을 위해 소스 Replicas의 갯수를 3개에서 1개로 변경함
3.11.배포된 내용과 깃허브(Github) 내용이 다른 것을 인지한 상태(OutOfSync)인 것을
확인
17
3.12.다시 싱크하기 위해서 싱크(SYNC) 메뉴와 싱크로나이즈(SYNCHRONIZE) 메뉴를
다시 누름
18
3.13.싱크되어 배포된 Pod가 1개로 변경된 것을 확인
3.14.실제로 배포된 애플리케이션이 1개로 변경되었는지 kubectl 명령으로 확인
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl get po,svc
NAME READY STATUS RESTARTS AGE
pod/gitops-chk-info-64f565554b-p5zdb 1/1 Running 0 25m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.88.32.1 <none> 443/TCP 16d
service/lb-gitops-chk-info LoadBalancer 10.88.41.101 34.64.33.205 80:30327/TCP 25m
19
3.15.다음 실습을 위해서 web-gitops 프로젝트를 삭제(DELETE)함
프로젝트 이름(web-gitops) 입력이 필요합니다.
20
21
4.argo 바이너리를 통해서 Argo CD의 admin 암호 변경하기
실무에서는 아르고 CD는 웹보다 argo 바이너리를 통해서 주로 진행됩니다.
4.1.내려받기
GCP Cloud Shell의 특성 상 /usr/local/bin에는 바이너리가 저장되지 않아 특정 위치로
변경하였습니다.
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ sudo curl -sSL -o ~/.local/bin/argocd
https://github.com/argoproj/argo-cd/releases/download/v2.6.7/argocd-linux-amd64
4.2.실행 권한 추가하기
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ sudo chmod +x ~/.local/bin/argocd
4.3.argocd 실행 권한 확인
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ argocd
argocd controls a Argo CD server
Usage:
argocd [flags]
argocd [command]
Available Commands:
<snipped>
4.4.argocd 를 통해서 argo CD 서버 로그인
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ argocd login `kubectl get svc
argocd-server -n argocd -o jsonpath='{.status.loadBalancer.ingress[0].ip}'`
WARNING: server is not configured with TLS. Proceed (y/n)? y
Username: admin
Password: <admin-hoonjo>
'admin:login' logged in successfully
Context '34.64.50.202' updated
22
4.5.Argo CD에 활성화된 계정 확인
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ argocd account list
NAME ENABLED CAPABILITIES
admin true login
4.6.argo 명령을 통해서 admin 암호를 변경
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ argocd account update-password
*** Enter password of currently logged in user (admin): <admin-hoonjo>
*** Enter new password for user admin: <NEW-PASSWORD>
*** Confirm new password for user admin: <NEW-PASSWORD>
Password updated
Context '34.64.50.202' updated
4.7.변경된 암호로 다시 Argo CD 로그인 및 확인
23
5.argo 바이너리를 통해서 GitOps 구현하기
이제 argo 바이너리를 통해서 작업할 수 있는 좀 더 실무적인 실습을 진행해 봅시다.
5.1.GitOps를 위한 Argo CD 애플리케이션이 있는 디렉터리로 이동 후 확인
[hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ cd ~/Iac/Argo/argo-cd/
[hj@cs-491314827780-default argo-cd (☸️ |mzs-gke:default)]$ cat app-gitops.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitops
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/sysnet4admin/IaC.git
targetRevision: HEAD
path: GitOps
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
Automated:
# prune: false # git 저장소에 리소스가 삭제되는 경우 삭제할지 말지를 결정
selfHeal: true # 자동으로 변경 사항을 감지하고 sync-up함 (default 5초)
# 다만 Refresh가 3분이라서 최대 3분 소요
5.2.GitOps를 위한 Argo CD 애플리케이션를 배포
[hj@cs-491314827780-default argo-cd (☸️ |mzs-gke:default)]$ kubectl apply -f app-gitops.yaml
application.argoproj.io/gitops created
24
5.3.배포된 상태 변화를 확인
5.4.GCP Cloud Shell에서 배포된 애플리케이션 및 서비스의 상태 확인
[hj@cs-491314827780-default argo-cd (☸️ |mzs-gke:default)]$ kubectl get po,svc
NAME READY STATUS RESTARTS AGE
pod/gitops-chk-info-64f565554b-m7k9b 1/1 Running 0 6m3s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.88.32.1 <none> 443/TCP 20d
service/lb-gitops-chk-info LoadBalancer 10.88.37.104 34.64.178.90 80:31993/TCP 6m4s
5.5.GitOps 동작 확인을 위해 소스 Replicas의 갯수를 1개에서 5개로 변경하고 push함
25
5.6.프로젝트를 누른 후에 자동으로 REFRESH되고 SYNC 되는 것을 보기 위해
주기적으로 웹브라우저 화면을 f5 등으로 다시 고침함 (최대 3분이 걸림)
5.7.kubectl로 변화된 애플리케이션과 서비스를 확인함
[hj@cs-491314827780-default argo-cd (☸️ |mzs-gke:default)]$ kubectl get po,svc
pod/gitops-chk-info-64f565554b-2tjk5 1/1 Running 0 2m41s
pod/gitops-chk-info-64f565554b-h6rsm 1/1 Running 0 17m
pod/gitops-chk-info-64f565554b-jjmdm 1/1 Running 0 2m41s
pod/gitops-chk-info-64f565554b-jxnjh 1/1 Running 0 2m41s
pod/gitops-chk-info-64f565554b-xn754 1/1 Running 0 2m41s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.88.32.1 <none> 443/TCP 20d
service/lb-gitops-chk-info LoadBalancer 10.88.37.104 34.64.178.90 80:31993/TCP 29m
5.8.랩을 종료하기 전에 argo 명령으로 현재 프로젝트를 삭제함
[hj@cs-491314827780-default argo-cd (☸️ |mzs-gke:default)]$ kubectl delete -f
app-gitops.yaml
application.argoproj.io "gitops" deleted
26
5.9.왼쪽 위에 Applications 메뉴를 클릭해서 현재 Argo CD에 진행되는 프로젝트가
없음을 확인
읽고 볼거리
1. 깃옵스(GitOps)를 여행하려는 입문자를 위한 안내서
2. 커피 고래의 GitOps ArgoCD
3. Argo CD 이해하기 (영상)
27

[GitOps] Argo CD on GKE (v0.9.2).pdf

  • 1.
    LAB #2 onGKE Deploy app by ARGO CD
  • 2.
    0. 사전 준비사항 실습을 진행하기 위한 터미널 생성을 위해 GCP Cloud Shell ( )을 활성화 합니다. [그림 1] Cloud Shell과 GKE 구성 실습을 위한 소스 코드를 내려 받습니다. [hj@cs-491314827780-default ~ (☸️ |hj-gke:default)]$ git clone https://github.com/sysnet4admin/Iac.git Cloning into 'IaC'... remote: Enumerating objects: 2094, done. <snipped> Receiving objects: 100% (2094/2094), 17.78 MiB | 20.83 MiB/s, done. Resolving deltas: 100% (1133/1133), done. 내려 받은 디렉터리로 이동하여 구조가 다음과 같은 확인합니다. [hj@cs-491314827780-default ~ (☸️ |hj-gke:default)]$ cd IaC/ [hj@cs-491314827780-default IaC (☸️ |hj-gke:default)]$ ls Argo GCP Jenkins manifests NXOSv README.md tools Docker GitOps k8s nGrinder Prometheus Terraform 2
  • 3.
    Note: 이 중에GitOps에 있는 내용을 사용할 것인데, 배포할 앱은 각자의 깃 저장소에 저장해 두어야 합니다. 1.GKE 배포하기 쿠버네티스 실습을 진행할수 있도록 GKE를 배포합니다. 1.1.gcloud 명령어로 서울에서 배포 가능한 GKE 버전 알아보기 [hj@cs-491314827780-default IaC (☸️ |hj-gke:default)]$ gcloud container get-server-config --region=asia-northeast3 --format=json Fetching server config for asia-northeast3 { "channels": [ { "channel": "RAPID", "defaultVersion": "1.26.1-gke.1500", "validVersions": [ "1.26.1-gke.1500", "1.25.7-gke.1000", "1.25.6-gke.200", "1.24.10-gke.2300", "1.23.16-gke.1400", "1.22.17-gke.5400", "1.22.17-gke.4300", "1.21.14-gke.18100" ] }, { "channel": "REGULAR", "defaultVersion": "1.24.9-gke.3200", "validVersions": [ "1.25.7-gke.1000", "1.24.9-gke.3200", "1.23.16-gke.1100", "1.22.17-gke.4000", "1.21.14-gke.15800" ] }, { "channel": "STABLE", "defaultVersion": "1.24.9-gke.3200", "validVersions": [ "1.24.9-gke.3200", "1.23.16-gke.1100", "1.22.17-gke.3100", "1.21.14-gke.15800", 3
  • 4.
    "1.21.14-gke.14600" ] } ], "defaultClusterVersion": "1.24.9-gke.3200", "defaultImageType": "COS_CONTAINERD", "validImageTypes":[ "COS_CONTAINERD", "COS", "UBUNTU", "UBUNTU_CONTAINERD", "WINDOWS_LTSC", "WINDOWS_LTSC_CONTAINERD", "WINDOWS_SAC", "WINDOWS_SAC_CONTAINERD" ], "validMasterVersions": [ "1.25.7-gke.1000", "1.25.6-gke.200", "1.24.10-gke.2300" <snipped> Note: kube-apiserver와 kubelet 등과의 허용되는 버전 차이에 대해서는 다음의 링크를 참조하세요 1.2.한 번에 control-plane이 asia-northeast3-a에 있는 GKE로 배포하기 시점에 따라 cluster-version이 없을 수 있으니, 적절한 변경이 필요합니다. [hj@cs-491314827780-default IaC (☸️ |hj-gke:default)]$ gcloud container clusters create megazone-gke-multi-zonal --num-nodes=1 --zone asia-northeast3-a --node-locations=asia-northeast3-a,asia-northeast3-b,asia-northeast3-c --cluster-version=1.25.7-gke.1000 --enable-ip-alias --location-policy=BALANCED Note: The Pod address range limits the maximum size of the cluster. Please refer to https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr to learn how to optimize IP address allocation. Creating cluster megazone-gke-multi-zonal in asia-northeast3-a... Cluster is being health-checked (master is healthy)...done. Created [https://container.googleapis.com/v1/projects/dbgong-team-20200512/zones/asia-northeast3-a/c lusters/megazone-gke-multi-zonal]. To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/asia-northeast3-a/megazone-gke- multi-zonal?project=dbgong-team-20200512 4
  • 5.
    kubeconfig entry generatedfor megazone-gke-multi-zonal. NAME: megazone-gke-multi-zonal LOCATION: asia-northeast3-a MASTER_VERSION: 1.25.7-gke.1000 MASTER_IP: 34.64.87.231 MACHINE_TYPE: e2-medium NODE_VERSION: 1.25.7-gke.1000 NUM_NODES: 3 STATUS: RUNNING Note: 자세한 glcoud container 옵션을 다음의 링크를 참조하세요 1.2.배포된 GKE 상태 및 버전 확인하기 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl get nodes NAME STATUS ROLES AGE VERSION gke-megazone-gke-mult-default-pool-0848afc4-qmmf Ready <none> 111s v1.25.7-gke.1000 gke-megazone-gke-mult-default-pool-603823cf-mlwj Ready <none> 111s v1.25.7-gke.1000 gke-megazone-gke-mult-default-pool-d39da12f-c6r1 Ready <none> 111s v1.25.7-gke.1000 1.3.배포된 kube-system 애플리케이션 확인하기 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE event-exporter-gke-755c4b4d97-wpwr6 2/2 Running 0 4m4s fluentbit-gke-c8m5b 2/2 Running 0 3m4s fluentbit-gke-crkpk 2/2 Running 0 3m3s fluentbit-gke-s9rgk 2/2 Running 0 3m3s gke-metrics-agent-5s5xw 2/2 Running 0 3m3s gke-metrics-agent-jmhn2 2/2 Running 0 3m4s gke-metrics-agent-ns8kp 2/2 Running 0 3m3s konnectivity-agent-6c7d8d7ccd-68269 1/1 Running 0 3m55s konnectivity-agent-6c7d8d7ccd-grm44 1/1 Running 0 2m39s konnectivity-agent-6c7d8d7ccd-rg7mt 1/1 Running 0 2m39s konnectivity-agent-autoscaler-7dc78c8c9-7xgkr 1/1 Running 0 3m53s kube-dns-7b9b6ffbd9-hqkvz 4/4 Running 0 4m6s kube-dns-7b9b6ffbd9-jldn9 4/4 Running 0 2m40s kube-dns-autoscaler-5f56f8997c-vd9wr 1/1 Running 0 4m6s kube-proxy-gke-megazone-gke-mult-default-pool-0848afc4-qmmf 1/1 Running 0 114s kube-proxy-gke-megazone-gke-mult-default-pool-603823cf-mlwj 1/1 Running 0 2m15s kube-proxy-gke-megazone-gke-mult-default-pool-d39da12f-c6r1 1/1 Running 0 2m3s l7-default-backend-d6b749b76-xzfpj 1/1 Running 0 3m51s metrics-server-v0.5.2-67864775dc-vg5b8 2/2 Running 0 2m23s pdcsi-node-h4tvw 2/2 Running 0 3m4s pdcsi-node-kgxpm 2/2 Running 0 3m3s pdcsi-node-s9gqk 2/2 Running 0 3m3s 5
  • 6.
    2.Argo CD 설치및 구성 Argo CD 저장소를 헬름에 추가하고 Argo CD를 쿠버네티스에 배포합니다. 2.1.Argo CD에 대한 헬름 저장소를 추가 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ helm repo add argo https://argoproj.github.io/argo-helm "argo" has been added to your repositories 2.2.Argo CD의 헬름 저장소를 최신 내용으로 업데이트 하기 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "argo" chart repository Update Complete. ⎈Happy Helming!⎈ 2.3.헬름 저장소의 목록을 확인 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ helm repo list NAME URL argo https://argoproj.github.io/argo-helm 2.4.헬름으로 Argo CD 배포 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ helm install argocd argo/argo-cd --set server.service.type=LoadBalancer --set configs.params."server.insecure"=true --set server.image.tag=v2.6.7 --namespace=argocd --create-namespace NAME: argocd LAST DEPLOYED: Wed Apr 12 04:59:07 2023 NAMESPACE: argocd STATUS: deployed REVISION: 1 TEST SUITE: None 6
  • 7.
    NOTES: In order toaccess the server UI you have the following options: 1. kubectl port-forward service/argocd-server -n argocd 8080:443 and then open the browser on http://localhost:8080 and accept the certificate 2. enable ingress in the values file `server.ingress.enabled` and either - Add the annotation for ssl passthrough: https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#option-1-ssl-passthrough - Set the `configs.params."server.insecure"` in the values file and terminate SSL at your ingress: https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#option-2-multiple-ingress- objects-and-hosts After reaching the UI the first time you can login with username: admin and the random password generated during the installation. You can find the password by running: kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d (You should delete the initial secret afterwards as suggested by the Getting Started Guide: https://argo-cd.readthedocs.io/en/stable/getting_started/#4-login-using-the-cli) 2.5.노출된 Deployment와 Service 상태를 확인 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl get po,svc -n argocd NAME READY STATUS RESTARTS AGE pod/argocd-application-controller-0 1/1 Running 0 2m40s pod/argocd-applicationset-controller-5dd87cc68-8zfqc 1/1 Running 0 2m40s pod/argocd-dex-server-64b965fd-2xxgv 1/1 Running 0 2m40s pod/argocd-notifications-controller-74b84c4bf5-9r9tl 1/1 Running 0 2m40s pod/argocd-redis-6c9f5c7dcc-h89lt 1/1 Running 0 2m40s pod/argocd-repo-server-594fcbb47d-xx9kt 1/1 Running 0 2m40s pod/argocd-server-77b68b89b8-xt25h 1/1 Running 0 2m40s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/argocd-applicationset-controller ClusterIP 10.88.40.181 <none> 7000/TCP 2m40s service/argocd-dex-server ClusterIP 10.88.33.226 <none> 5556/TCP,5557/TCP 2m40s service/argocd-redis ClusterIP 10.88.44.0 <none> 6379/TCP 2m40s service/argocd-repo-server ClusterIP 10.88.33.119 <none> 8081/TCP 2m40s 7
  • 8.
    service/argocd-server LoadBalancer 10.88.35.8434.64.50.202 80:31187/TCP,443:30755/TCP 2m40s 2.6.웹 브라우저에 Argo CD의 로드밸런서(LoadBalancer) IP를 입력해서 상태 확인 2.7.로그인을 위해 admin 암호를 admin-hoonjo 로 변경 # bcrypt password = admin-hoonjo >>> $2a$10$rRyBsGSHK6.uc8fntPwVIuLVHgsAhAX7TcdrqW/RADU0uh7CaChLa [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl -n argocd patch secret argocd-secret -p '{"stringData": { "admin.password": "$2a$10$lix6ghybmAoZEfEjAkJS9eTRQcAIaA7kYFCdmpJlDdeQKPWKL2JMG", "admin.passwordMtime": "'$(date +%FT%T%Z)'" }}' secret/argocd-secret patched 8
  • 9.
    Note1: 직접 bcrypt암호를 만들고자 한다면 다음의 웹페이지를 이용하세요. Bcrypt Hash Generator - Online - Browserling Web Developer Tools Note2: 기본 암호가 궁금하다면? 다음의 명령을 수행하세요. [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d AMAgkEzreMKd9mE6 2.8.로그인을 위해 admin / admin-hoonjo를 입력 2.9.정상적으로 로그인 됨을 확인 9
  • 10.
    3.Argo CD의 WebUI를 통해서 GitOps 구현하기 아르고 CD를 이용해서 깃옵스를 구현해 봅시다. 3.1.Argo CD에 새로운 애플리케이션을 추가 3.2.애플리케이션 이름과 프로젝트 이름(default)로 구성 10
  • 11.
    Application Name: web-gitops ProjectName: default Note: 디폴트(default)가 아닌 경우 꼭 프로젝트 이름부터 만들어야함 3.3.소스의 URL을 입력 소스의 URL을 각자의 깃 저장소를 입력해야 합니다. 그래야 추후에 commit & push를 진행할 수 있습니다. Repository URL: https://github.com/sysnet4admin/IaC.git Path: GitOps 11
  • 12.
    3.4.배포할 곳을 지정 ClusterURL: https://kubernetes.default.svc Namespace: default 3.5.생성(CREATE) 메뉴를 누르고 새로 생성된 프로젝트를 확인 12
  • 13.
    3.6.생성된 새로운 프로젝트눌러서 상세 내용을 확인 13
  • 14.
    3.7.소스와 동일하게 구성하기위해서(GitOps) 싱크(SYNC) 메뉴를 누름 14
  • 15.
    3.7.싱크를 진행하기 위해SYNCHRONIZE 메뉴를 누름 3.8.진행되는 싱크를 확인하고 Pod가 3개 배포 완료되는 것도 함께 확인함 15
  • 16.
    3.9.실제로 배포된 애플리케이션의상태를 알기 위해 kubectl 명령으로 확인 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl get po,svc NAME READY STATUS RESTARTS AGE pod/gitops-chk-info-64f565554b-lc8m2 1/1 Running 0 5m 16
  • 17.
    pod/gitops-chk-info-64f565554b-p5zdb 1/1 Running0 5m pod/gitops-chk-info-64f565554b-pjtpm 1/1 Running 0 5m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.88.32.1 <none> 443/TCP 16d service/lb-gitops-chk-info LoadBalancer 10.88.41.101 34.64.33.205 80:30327/TCP 5m 3.10.GitOps 동작 확인을 위해 소스 Replicas의 갯수를 3개에서 1개로 변경함 3.11.배포된 내용과 깃허브(Github) 내용이 다른 것을 인지한 상태(OutOfSync)인 것을 확인 17
  • 18.
    3.12.다시 싱크하기 위해서싱크(SYNC) 메뉴와 싱크로나이즈(SYNCHRONIZE) 메뉴를 다시 누름 18
  • 19.
    3.13.싱크되어 배포된 Pod가1개로 변경된 것을 확인 3.14.실제로 배포된 애플리케이션이 1개로 변경되었는지 kubectl 명령으로 확인 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ kubectl get po,svc NAME READY STATUS RESTARTS AGE pod/gitops-chk-info-64f565554b-p5zdb 1/1 Running 0 25m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.88.32.1 <none> 443/TCP 16d service/lb-gitops-chk-info LoadBalancer 10.88.41.101 34.64.33.205 80:30327/TCP 25m 19
  • 20.
    3.15.다음 실습을 위해서web-gitops 프로젝트를 삭제(DELETE)함 프로젝트 이름(web-gitops) 입력이 필요합니다. 20
  • 21.
  • 22.
    4.argo 바이너리를 통해서Argo CD의 admin 암호 변경하기 실무에서는 아르고 CD는 웹보다 argo 바이너리를 통해서 주로 진행됩니다. 4.1.내려받기 GCP Cloud Shell의 특성 상 /usr/local/bin에는 바이너리가 저장되지 않아 특정 위치로 변경하였습니다. [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ sudo curl -sSL -o ~/.local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/v2.6.7/argocd-linux-amd64 4.2.실행 권한 추가하기 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ sudo chmod +x ~/.local/bin/argocd 4.3.argocd 실행 권한 확인 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ argocd argocd controls a Argo CD server Usage: argocd [flags] argocd [command] Available Commands: <snipped> 4.4.argocd 를 통해서 argo CD 서버 로그인 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ argocd login `kubectl get svc argocd-server -n argocd -o jsonpath='{.status.loadBalancer.ingress[0].ip}'` WARNING: server is not configured with TLS. Proceed (y/n)? y Username: admin Password: <admin-hoonjo> 'admin:login' logged in successfully Context '34.64.50.202' updated 22
  • 23.
    4.5.Argo CD에 활성화된계정 확인 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ argocd account list NAME ENABLED CAPABILITIES admin true login 4.6.argo 명령을 통해서 admin 암호를 변경 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ argocd account update-password *** Enter password of currently logged in user (admin): <admin-hoonjo> *** Enter new password for user admin: <NEW-PASSWORD> *** Confirm new password for user admin: <NEW-PASSWORD> Password updated Context '34.64.50.202' updated 4.7.변경된 암호로 다시 Argo CD 로그인 및 확인 23
  • 24.
    5.argo 바이너리를 통해서GitOps 구현하기 이제 argo 바이너리를 통해서 작업할 수 있는 좀 더 실무적인 실습을 진행해 봅시다. 5.1.GitOps를 위한 Argo CD 애플리케이션이 있는 디렉터리로 이동 후 확인 [hj@cs-491314827780-default ~ (☸️ |mzs-gke:default)]$ cd ~/Iac/Argo/argo-cd/ [hj@cs-491314827780-default argo-cd (☸️ |mzs-gke:default)]$ cat app-gitops.yaml apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: gitops namespace: argocd spec: project: default source: repoURL: https://github.com/sysnet4admin/IaC.git targetRevision: HEAD path: GitOps destination: server: https://kubernetes.default.svc namespace: default syncPolicy: Automated: # prune: false # git 저장소에 리소스가 삭제되는 경우 삭제할지 말지를 결정 selfHeal: true # 자동으로 변경 사항을 감지하고 sync-up함 (default 5초) # 다만 Refresh가 3분이라서 최대 3분 소요 5.2.GitOps를 위한 Argo CD 애플리케이션를 배포 [hj@cs-491314827780-default argo-cd (☸️ |mzs-gke:default)]$ kubectl apply -f app-gitops.yaml application.argoproj.io/gitops created 24
  • 25.
    5.3.배포된 상태 변화를확인 5.4.GCP Cloud Shell에서 배포된 애플리케이션 및 서비스의 상태 확인 [hj@cs-491314827780-default argo-cd (☸️ |mzs-gke:default)]$ kubectl get po,svc NAME READY STATUS RESTARTS AGE pod/gitops-chk-info-64f565554b-m7k9b 1/1 Running 0 6m3s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.88.32.1 <none> 443/TCP 20d service/lb-gitops-chk-info LoadBalancer 10.88.37.104 34.64.178.90 80:31993/TCP 6m4s 5.5.GitOps 동작 확인을 위해 소스 Replicas의 갯수를 1개에서 5개로 변경하고 push함 25
  • 26.
    5.6.프로젝트를 누른 후에자동으로 REFRESH되고 SYNC 되는 것을 보기 위해 주기적으로 웹브라우저 화면을 f5 등으로 다시 고침함 (최대 3분이 걸림) 5.7.kubectl로 변화된 애플리케이션과 서비스를 확인함 [hj@cs-491314827780-default argo-cd (☸️ |mzs-gke:default)]$ kubectl get po,svc pod/gitops-chk-info-64f565554b-2tjk5 1/1 Running 0 2m41s pod/gitops-chk-info-64f565554b-h6rsm 1/1 Running 0 17m pod/gitops-chk-info-64f565554b-jjmdm 1/1 Running 0 2m41s pod/gitops-chk-info-64f565554b-jxnjh 1/1 Running 0 2m41s pod/gitops-chk-info-64f565554b-xn754 1/1 Running 0 2m41s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.88.32.1 <none> 443/TCP 20d service/lb-gitops-chk-info LoadBalancer 10.88.37.104 34.64.178.90 80:31993/TCP 29m 5.8.랩을 종료하기 전에 argo 명령으로 현재 프로젝트를 삭제함 [hj@cs-491314827780-default argo-cd (☸️ |mzs-gke:default)]$ kubectl delete -f app-gitops.yaml application.argoproj.io "gitops" deleted 26
  • 27.
    5.9.왼쪽 위에 Applications메뉴를 클릭해서 현재 Argo CD에 진행되는 프로젝트가 없음을 확인 읽고 볼거리 1. 깃옵스(GitOps)를 여행하려는 입문자를 위한 안내서 2. 커피 고래의 GitOps ArgoCD 3. Argo CD 이해하기 (영상) 27