OpenShift4(CodeReady Contaainess)에서 Argo CD 가져오기, 활용

개시하다
이 기사는 OpenShift4 환경(엄밀히 말하면 Mac를 가져오는 CodeReady Contaainess 환경)에서 GitOps 도구로 사용할 Argo CD를 가져왔습니다.
또 아고 CD에 배포된 샘플 애플리케이션을 개발해 선언문을 업데이트하고 그 내용이 오픈시프트에 반영됐는지 확인한다.
참고 자료/페이지
GTOps on OpenShift 시작
Argo CD Getting Started
작업 환경
다음 환경에서 시도하고 있습니다.
항목
컨텐트
기계.
MacBook Pro(16인치, Late 2019)(8코어, 64GB 스토리지)
OS
macOS Catalina (10.15.3)
CodeReady Containers
1.6.0+8ef676f (OpenShift version: 4.3.0 (embedded in binary))
oc 명령
4.4.0
Argo CD CLI
v1.5.1+8a3b36b
Argo CD(server)
v1.5.0+bdda410
OpenShift에 Argo CD 설치
OpenShift에 Argo CD를 설치합니다.
oc login 명령을 사용하여 로그인한 후 Argo CD용 namespace를 만듭니다.
❯ kubectl create namespace argocd
namespace/argocd created
제작된 "argocd"namespace에 Argo CD를 설치합니다.
❯ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io unchanged
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io unchanged
serviceaccount/argocd-application-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-server created
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller unchanged
clusterrole.rbac.authorization.k8s.io/argocd-server unchanged
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller unchanged
clusterrolebinding.rbac.authorization.k8s.io/argocd-server unchanged
configmap/argocd-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
secret/argocd-secret created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server-metrics created
service/argocd-server created
deployment.apps/argocd-application-controller created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
Argo CD의 다양한 Pod가 실행 중인지 확인합니다.
❯ oc get pods -n argocd
NAME                                            READY   STATUS    RESTARTS   AGE
argocd-application-controller-7c587fb9d-mnp87   1/1     Running   0          100s
argocd-dex-server-595c68bc44-5wmwq              1/1     Running   0          100s
argocd-redis-8c568b5db-7jdtl                    1/1     Running   0          100s
argocd-repo-server-b94d7dcb6-5nptx              1/1     Running   0          100s
argocd-server-764bb4b-728qm                     1/1     Running   0          100s
GTOps on OpenShift 시작에서 말한 바와 같이 웹 콘솔에 접근하는 루트를 만들지만 CodeReady Contaainess가 자신의 인증서를 사용하기 때문에 patch를 Deployment에 적용하고 루트를 만듭니다.
(이 단계는 Introduction to GitOps with OpenShift에도 기재되어 있다)
❯ PATCH='{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"argocd-server"}],"containers":[{"command":["argocd-server","--insecure","--staticassets","/shared/app"],"name":"argocd-server"}]}}}}'

❯ oc -n argocd patch deployment argocd-server -p $PATCH
deployment.extensions/argocd-server patched

❯ oc -n argocd create route edge argocd-server --service=argocd-server --port=http --insecure-policy=Redirect
route.route.openshift.io/argocd-server created
Argo CD 웹 사이트 콘솔에 로그인
웹 콘솔에 로그인한 호스트 이름을 확인합니다.다음 HOST/PORT 항목은 호스트 이름입니다.
❯ oc get route -n argocd
NAME            HOST/PORT                               PATH   SERVICES        PORT   TERMINATION     WILDCARD
argocd-server   argocd-server-argocd.apps-crc.testing          argocd-server   http   edge/Redirect   None
브라우저를 통해 https://<위의 HOST/PORT>/에 액세스하면 Argo CD의 웹 콘솔 로그인 화면에 액세스할 수 있습니다.

Argo CD의 매니저 사용자 이름과 초기 암호는 다음과 같습니다.
  • 관리자 사용자 이름: admin
  • 초기 비밀번호:argocd-server의Pod명
  • 다음 암호의 Pod 이름을 얻을 수 있습니다.
    ❯ kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
    
    그러나 Argo CD를 가져오고 삭제한 후 다시 가져오면 비밀번호에 Pod 이름을 입력하면 로그인 오류가 발생합니다.
    이 경우 다음 페이지를 참조하여 Secret으로 설정된 암호를 변경한 후 로그인할 수 있습니다.
    Argo CD FAQ : I forgot the admin password, how do I reset it?
    Argo CD CLI 설치
    Homebrew에서 Argo CD CLI를 설치합니다.
    > brew tap argoproj/tap
    
    > brew install argoproj/tap/argocd
    
    CLI를 통해 로그인
    CLI 액세스는 "argocd-server"서비스의 포트를 사용하여 전달됩니다.
    Argo CD Getting Started에서는 ARgocd-server 서비스를 Load Balancer로 변경하는 절차도 소개했지만 포트 전송이 가장 쉽다.
    다른 콘솔에서 kubectl port-forward를 실행합니다.
    ❯ kubectl port-forward svc/argocd-server -n argocd 8080:443
    
    그런 다음 CLI를 통해 로그인합니다.
    ❯ argocd login localhost:8080
    
    사용자 이름과 암호가 필요하지만 웹 콘솔에 로그인한 사용자(admin)와 암호를 입력합니다.
    로그인에 성공하면 관리자 암호가 변경됩니다.
    ❯ argocd account update-password
    
    샘플 응용 프로그램의 디자인
    우선, 나는 견본 응용을 개발하는 프로젝트를 하나 할 것이다.이곳의 프로젝트 이름은 "argocd-example-apps"입니다.
    ❯ oc new-project argocd-example-apps
    Now using project "argocd-example-apps" on server "https://api.crc.testing:6443".
    
    You can add applications to this project with the 'new-app' command. For example, try:
    
        oc new-app ruby~https://github.com/sclorg/ruby-ex.git
    
    to build a new example application in Python. Or use kubectl to deploy a simple Kubernetes application:
    
        kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node
    
    https://github.com/argoproj/argocd-example-apps에 Argo CD로 CD를 테스트할 수 있는 샘플이 있습니다.
    이 GiitHub의 창고를 자신의 계좌로 포크하세요.
    Fork 이후 창고의 URL은 https://github.com/<GiitHub의 계정 이름>/argocd-example-apps입니다.
    그런 다음 Argo CD의 웹 UI에서 애플리케이션을 개발합니다.
    로그인 후 화면에서 +NEW APP 버튼을 클릭합니다.

    아래와 같이 입력한 다음 다른 기본 상태에서 CREATE 버튼을 누릅니다.
    Namespace에서 방금 제작한 OpenShift 프로젝트의 프로젝트 이름(argocd-example-appls)을 설정합니다.



    이렇게 하면 웹 UI에 guestbook 응용 프로그램이 나타납니다.
    그러나 상태는 OutOfSync이며 OpenShift를 실제로 적용하지는 않았습니다.

    프로그램을 디버깅하기 위해 Giit의 상태 (= 선언 파일에 정의된 상태) 와 OpenShift의 상태를 동기화합니다.
    따라서 Giit 창고에 저장된 선언 파일을 적용하고 실제 응용 프로그램을 디버깅합니다.
    위 화면에서 SYNC 버튼을 클릭합니다.
    그런 다음 다음 SYNCHRONIZE 버튼을 클릭합니다.

    이후 잠시 기다리면 다음과 같은 상태가 된다.
    Status는 "Synced"로 Giit와 동기화된 상태임을 알 수 있습니다.

    설계된 Pod이 시작되었는지 확인합니다.
    ❯ oc get pods
    NAME                            READY   STATUS             RESTARTS   AGE
    guestbook-ui-65b878495d-g9shv   0/1     CrashLoopBackOff   6          8m44s
    
    ❯ oc logs guestbook-ui-65b878495d-g9shv
    AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.128.0.58. Set the 'ServerName' directive globally to suppress this message
    (13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
    (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
    no listening sockets available, shutting down
    AH00015: Unable to open logs
    
    ❯ oc get pod guestbook-ui-65b878495d-g9shv -o yaml | grep -i serviceAccountName
      serviceAccountName: default
    
    ocget pods를 시도하면 CrashLoopBack Off가 됩니다.
    oclogs로 로그를 확인하면 80개의 포트가 Listen이 되지 않을 것 같습니다.
    OpenShift에서 실행되는 컨테이너는 OpenShift에서 무작위로 분배된 UID로 실행되지만 80개의 포트를 사용하려면 루트 권한이 필요합니다.
    따라서 Pod의 서비스 Acount'default'에는anyuid SCC를 수여하여 컨테이너 이미지의 Docker file의 USER 지도로 설정된 사용자가 컨테이너를 실행할 수 있도록 해야 한다.
    ❯ oc adm policy add-scc-to-user anyuid -z default
    securitycontextconstraints.security.openshift.io/anyuid added to: ["system:serviceaccount:argocd-example-apps:default"]
    
    Pod를 한 번 삭제하고 자동으로 복원된 Pod가 런닝인지 확인합니다.
    ❯ oc delete pod/guestbook-ui-65b878495d-g9shv
    pod "guestbook-ui-65b878495d-g9shv" deleted
    
    ❯ oc get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    guestbook-ui-65b878495d-9l6vq   1/1     Running   0          2m19s
    
    ocexpose에 프로그램을 공개합니다.
    ❯ oc expose svc/guestbook-ui
    route.route.openshift.io/guestbook-ui exposed
    
    ❯ oc get route
    NAME           HOST/PORT                                           PATH   SERVICES       PORT   TERMINATION   WILDCARD
    guestbook-ui   guestbook-ui-argocd-example-apps.apps-crc.testing          guestbook-ui   80                   None
    
    ocget route를 통해 가져온 호스트에 접근합니다.
    http://guestbook-ui-argocd-example-apps.apps-crc.testing/
    선언 문건을 갱신해 보다
    마지막으로 선언문을 업데이트해 GiitHub에 반영하고, Argo CD를 통해 Sync를 진행하여 OpenShift에 반영할 수 있음을 확인한다.
    git clone 창고의 마스터 지점에서guestbook/guestbook-ui-deployment.yaml의 spec.replicas를 1에서 2로 변경합니다.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: guestbook-ui
    spec:
      replicas: 2    # 1から2に変更
      revisionHistoryLimit: 3
      selector:
        matchLabels:
          app: guestbook-ui
      template:
        metadata:
          labels:
            app: guestbook-ui
        spec:
          containers:
          - image: gcr.io/heptio-images/ks-guestbook-demo:0.2
            name: guestbook-ui
            ports:
            - containerPort: 80
    
    변경된 파일commiit,push를 GiitHub로 가져옵니다.
    Argo CD의 Sync에 들어가기 전에 guestbook 애플리케이션의 상태를 확인합니다.
    ❯ argocd app list
    NAME       CLUSTER                         NAMESPACE            PROJECT  STATUS     HEALTH   SYNCPOLICY  CONDITIONS  REPO                                             PATH       TARGET
    guestbook  https://kubernetes.default.svc  argocd-example-apps  default  OutOfSync  Healthy  <none>      <none>      https://github.com/imanissy/argocd-example-apps  guestbook  HEAD
    
    STATUS가 OutOfSunc가 된 것은 ocexpose에 따라 route를 제작했기 때문이다.
    (원래는route에 대해서도 선언문서에 정의해야 하는데 여기서 생략)
    argocd app sync에서 guesstbook 응용 프로그램을 GiitHub과 동기화합니다.
    ❯ argocd app sync guestbook
    TIMESTAMP                  GROUP                     KIND   NAMESPACE                           NAME    STATUS    HEALTH        HOOK  MESSAGE
    2020-04-27T23:40:44+09:00  route.openshift.io       Route  argocd-example-apps          guestbook-ui  OutOfSync                       
    2020-04-27T23:40:44+09:00                         Service  argocd-example-apps          guestbook-ui    Synced   Healthy              
    2020-04-27T23:40:44+09:00   apps               Deployment  argocd-example-apps          guestbook-ui    Synced   Healthy              
    
    Name:               guestbook
    Project:            default
    Server:             https://kubernetes.default.svc
    Namespace:          argocd-example-apps
    URL:                http://localhost:8080/applications/guestbook
    Repo:               https://github.com/imanissy/argocd-example-apps
    Target:             HEAD
    Path:               guestbook
    SyncWindow:         Sync Allowed
    Sync Policy:        <none>
    Sync Status:        OutOfSync from HEAD (5efadca)
    Health Status:      Progressing
    
    Operation:          Sync
    Sync Revision:      5efadca55276c68f0e01ac24522d37ab8700fe25
    Phase:              Succeeded
    Start:              2020-04-27 22:02:10 +0900 JST
    Finished:           2020-04-27 22:02:12 +0900 JST
    Duration:           2s
    Message:            successfully synced (all tasks run)
    
    GROUP               KIND        NAMESPACE            NAME          STATUS     HEALTH       HOOK  MESSAGE
    route.openshift.io  Route       argocd-example-apps  guestbook-ui  OutOfSync                     ignored (requires pruning)
                        Service     argocd-example-apps  guestbook-ui  Synced     Healthy            service/guestbook-ui unchanged
    apps                Deployment  argocd-example-apps  guestbook-ui  Synced     Progressing        deployment.apps/guestbook-ui configured
    FATA[0003] 1 resources require pruning                           
    
    Deployment에 대해 "deployment.apps/guesstbook-ui configured"라는 메시지가 나타났다고 deployment가 밝혔다.yaml의 변경이 반영된 것 같습니다.
    Pod의 상태도 확인해야 한다.
    ❯ oc get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    guestbook-ui-65b878495d-4xs5t   1/1     Running   0          80s
    guestbook-ui-65b878495d-9l6vq   1/1     Running   0          27m
    
    Deployment에서 설정한 복사본 수 = 2의 변경이 실제로 반영되었다.
    argocd app history에서 반영된 이력을 확인할 수 있습니다.
    ❯ argocd app history guestbook
    ID  DATE                           REVISION
    0   2020-04-27 21:06:53 +0900 JST  HEAD (11113c9)
    1   2020-04-27 21:59:23 +0900 JST  HEAD (11113c9)
    2   2020-04-27 22:02:12 +0900 JST  HEAD (5efadca)
    
    이렇게 하면 아고 CD를 활용해 기트 창고 상태를 기반으로 한 응용의 반영(상태 동기화)을 실현할 수 있다.

    좋은 웹페이지 즐겨찾기