Kubernetes

kubernetes 스터디 3주차

들어가며

쿠버네티스 스터디 3주차에 배운 내용은 Gitops에 관한 내용이다. 회사에서 서비스에 사용하는 인프라에도 Gitops 시스템을 구축하여 사용중이다. 보안등의 이유로 enterprise 시스템을 많이 사용했는데, 이번 기회에 public한 환경을 구축할 수 있어서 개인적으로 더 흥미가 갔던 내용이었다. 

 

GitOps 란?

최근 화제인 bing신님을 이용하여 gitops에 대해 물어보았다

1. GitOps는 개발자들이 애플리케이션의 소스 코드뿐만 아니라 구성, 인프라 및 운영 절차에 대한 GitOps의 모범 사례를 개발 워크플로우의 시작부터 배포까지 적용하는 것입니다.

2. GitOps는 인프라 구성을 위해 Git을 버전 제어 시스템으로 사용하는 코드형 인프라 (IaC) 가 진화한 것이라고 생각하면 됩니다.

3. GitOps는 인프라를 선언적으로 관리할 수 있는 경우에 사용할 수 있으며, 이러한 특징 때문에 GitOps는 쿠버네티스 및 클라우드 네이티브 애플리케이션 개발을 위한 운영 모델로 사용되는 경우가 많습니다.

과연 bing...신 !! 

 

요약하면 Gitops란

GitOps는 github, gitlab과 같은 코드 형상관리 툴을 사용해 애플리케이션의 배포와 운영된 모든것을 관리하는 것을 의미합니다. 

 

 

 

위에서 입력한 도메진 주소로 접속합니다 !

https://harbor.mydomain.com 

Harbor portal 화면

최초 접속시 관리자 계정은 admin / Harbor12345 입니다. 

 

Harbor는 레지스트리를 PROJECT 단위로 관리합니다. 신규 프로젝트를 만들어 이미지를 푸쉬합니다.

푸쉬를 위한 주소 형태는 아래와 같습니다. 

ex) docker push harbor.{CLUSTER NAME}/{PROJECT NAME}/busybox:0.1

 

2) Gitlab 설치

GitLab은 Git 저장소를 호스팅하는 서비스입니다. GitLab은 무료로 사용할 수 있는 Community 버전과 유료로 사용할 수 있는 Enterprise 버전이 있습니다. Community 버전을 설치하면 Private 서비스를 무료로 인원 제한 없이 이용할 수 있습니다. GitLab은 SSH 키를 사용하여 Git과 서버 간의 보안 통신을 지원합니다. GitLab에서는 Guest, Reporter, Developer, Maintainer, Owner 등의 권한을 지원합니다. 

 

private한 Git 저장소를 구축하기 위해 community 버전을 설치해 보겠습니다.

 

#사용할 cert의 ARN 값을 저장합니다.
CERT_ARN=XXXXXXXXX
echo $CERT_ARN

# gitlab helm repo를 추가합니다. 
helm repo add gitlab https://charts.gitlab.io/
helm repo update

# 패키지 파일을 다운받아 values.yaml 파일을 수정합니다.
helm fetch gitlab/gitlab --untar --version 6.8.1
vim ~/gitlab/values.yaml
----------------------
global:
  hosts:
    domain: <각자자신의도메인>             # 52줄
    https: true

  ingress:                             # 66줄~
    configureCertmanager: false
    provider: aws
    class: alb
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: ${CERT_ARN}   # 각자 자신의 값으로 수정입력
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/group.name: "gitlab"
    tls:                               # 79줄
      enabled: false

 

values.yaml 파일 작성 후 gitlab 을 설치합니다. 

helm install gitlab gitlab/gitlab -f ~/gitlab/values.yaml --set certmanager.install=false --set nginx-ingress.enabled=false --set prometheus.install=false --set gitlab-runner.install=false --namespace gitlab --version 6.8.4

---

NAME: gitlab
LAST DEPLOYED: Sat Mar 25 11:39:12 2023
NAMESPACE: gitlab
STATUS: deployed
REVISION: 1
NOTES:
=== NOTICE
The minimum required version of PostgreSQL is now 12. See https://gitlab.com/gitlab-org/charts/gitlab/-/blob/master/doc/installation/upgrade.md for more details.
Help us improve the installation experience, let us know how we did with a 1 minute survey:https://gitlab.fra1.qualtrics.com/jfe/form/SV_6kVqZANThUQ1bZb?installation=helm&release=15-8

=== NOTICE
kas:
    The configuration of `gitlab.kas.privateApi.tls.enabled` has moved. Please use `global.kas.tls.enabled` instead.
    Other components of the GitLab chart other than KAS also need to be configured to talk to KAS via TLS.
    With a global value the chart can take care of these configurations without the need for other specific values.

 

Gitlab root 계정 암호 확인

kubectl get secrets -n gitlab gitlab-gitlab-initial-root-password --template={{.data.password}} | base64 -d ;echo

 

gitlab 에 접속하여 로그인하면 프라이빗한 깃 저장소를 이용할 수 있습니다 !

 

3) ArgoCD 설치

ArgoCD란 ? 

ArgoCD는 Kubernetes를 위한 GitOps CD(Continuous Delivery) 도구입니다. ArgoCD는 GitOps 방식으로 관리되는 Manifest(yaml) 파일의 변경사항을 감시하며, 현재 배포된 환경의 상태와 Github Manifest 파일에 정의된 상태를 동일하게 유지하는 역할을 수행합니다. Argo CD는 실행중인 애플리케이션을 지속적으로 모니터링하고 현재 라이브 상태를 원하는 대상 상태와 비교하는 Kubernetes 컨트롤러로 구현됩니다.

 

현업에서 운영중인 환경에 ArgoCD를 사용중입니다.. 크게 Terrafrom을 사용해 클라우드 리소스를 생성하는 과정과 생성한 환경에 ArgoCD를 사용해 기본 패키지들을 배포하는 과정으로 나눠서 운영중에 있고, CI를 위해 Tekton을 사용중입니다. 직관적인 UI와 사용하기 편리하다는 점이 ArgoCD의 장점이라고 생각합니다. 

 

ArgoCD는 기본적으로 App of App 이라는 개념을 지향합니다.

App of App은 여러 앱을 클러스터에 설치하는 패턴입니다. Helm 차트, kustomize, 일반 Manifest 등 다양한 방법을 사용하여 클러스터에 앱을 설치할 수 있습니다. 일반적으로 단일 저장소를 만들고 다른 저장소(helm 차트 등)에 대한 선언적인 애플리케이션 참조를 포함하도록 구성합니다. 그런 다음 ArgoCD에 추가하고 애플리케이션을 배포합니다. 아래처럼 하나의 application app 안에 해당 서비스를 구성하는 다양한 컴퍼넌트를 묶어 같이 배포하는 형태 입니다. 

 

ArgoCD 설치

helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
helm install argocd argo/argo-cd --set server.service.type=LoadBalancer --namespace argocd --version 5.19.14

 

admin password 확인

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

 

argocd 대시보드 접속

 

app of app 배포하기

app of app 예제는 (https://github.com/argoproj/argocd-example-apps.git) 에서 확인할 수 있습니다.

 

app of app 이 있는 application을 배포합니다. 

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: argocd
    server: https://kubernetes.default.svc
  project: default
  source:
    path: guestbook
    repoURL: https://github.com/argoproj/argocd-example-apps
    targetRevision: HEAD

 

배포 후 dashboard 에서 sync를 누르면 gustbook app이 클러스터에 배포됩니다. 

 

4) Jenkins 

Jenkins란 ? 

  1. Jenkins는 소프트웨어 개발 시 지속적으로 통합 서비스를 제공하는 툴입니다. CI (Continuous Integration) 툴 이라고 표현합니다
  2. Jenkins는 소스 코드가 변경될 때마다 빌드 및 테스트를 자동으로 실행하여 문제를 조기에 발견하고 해결할 수 있습니다.
  3. Jenkins를 사용하여 파이프라인을 구성하면 다음과 같이 서비스를 배포하기에 필요한 빌드작업, 테스트 작업, 배포작업들에 대한 스테이지를 나눠 실행할 수 있습니다. 
pipeline {

    agent any

    stages {

        stage('Build') {

            steps {

                sh 'echo "Building"'

            }

        }

        stage('Test') {

            steps {

                sh 'echo "Testing"'

            }

        }

        stage('Deploy') {

            steps {

                sh 'echo "Deploying"'

            }

        }

    }

}

 

 

Jenkins 설치

# repo 추가 및 업데이트 
helm repo add jenkins https://charts.jenkins.io
helm repo update

# 패키지 로컬 다운로드 
helm fetch jenkins/jenkins --untar

# 설치
kubectl create ns jenkins
helm install jenkins jenkins/jenkins -f values.yaml --namespace jenkins --version 4.3.9

 

배포가 완료된 후 Jenkins 대시보드에 접속합니다.

 

admin 계정의 password 를 확인하여 로그인 합니다

kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo

 

 

필요한 플러그인을 설치하고 pipeline 을 생성해 이용하면 됩니다 ! 

 

 

마치며,

다양한 툴을 설치하고 테스트해볼수 있는 시간이었다. 그 중 Jenkins는 다른 곳에서도 많이 사용하는것으로 알고 있는데, 실제로 쿠버네티스와 연결하면서 config 정보라던지, 파이프라인에서 내부 서비스에 대한 credential 정보를 필요로 하였고, 만약 jenkins가 노출되면 보안상 큰 문제가 될수도 있겠다라고 생각했다. push/pull 방식에서 굳이 선택하자면 pull 방식의 gitops를 도입하는것을 권장하고 push방식을 사용한다면 보안상 문제가 될만한 부분은 꼼꼼히 체크해야겠다.