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
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
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
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
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