kubernetes

argocd 배포 환경 구성

misankim 2023. 3. 9. 22:10
argocd 배포 환경 구성



argocd 는 Kubernetes 용 선언적 GitOps 지속적 배포 도구
-> git 등의 레포를 자동/수동으로 sync 하여 kubernetes 리소스 배포



공식 사이트

 

공식 가이드

 

helm chart github



# 배포

 

kubectl create namespace argocd

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

kubectl get all -n argocd



# argocd-server 외부에서 접속 가능하도록 설정

 

## ingress 사용

 

ingress-nginx 사용 기준

 

 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - host: argocd.example.com
    http:
      paths:
      - backend:
          serviceName: argocd-server
          servicePort: https

 

## 포트 포워딩

 

kubectl port-forward svc/argocd-server -n argocd 8080:443
-> 이후 putty 등을 이용하여 ssh 터널링을 통해 localhost:8080 접속

 

## 로드밸런서 서비스 타입 사용

 

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
-> 클라우드 환경인 경우

 

## terminate https 구성인 경우
-> 앞단 lb 혹은 istio ingress gateway 파드에서 tls 를 종료시키는 경우
-> 백엔드인 argocd-server deploy 에 "--insecure" 플래그 추가

 

 

kubectl edit deployment.apps/argocd-server -n argocd

 

spec:
  template:
    spec:
      containers:
      - name: argocd-server
        command:
        - argocd-server
        - --insecure

 

❯ k exec -it pod/argocd-server-5bbd4cfc66-sb5fc -n argocd -- ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
argocd         1       0  1 02:07 ?        00:00:00 argocd-server --insecure
argocd        16       0  0 02:08 pts/0    00:00:00 ps -ef



# argocd cli 다운로드

 

최신 릴리즈 확인

 

curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64

 

mac os 환경인 경우
sudo curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/argocd-darwin-arm64


chmod +x /usr/local/bin/argocd



# 비밀번호 확인 및 초기 비밀번호 변경

 

아이디 - admin

 

## 비밀번호 확인

 

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

 

## 로그인

 

argocd login argocd.example.com
-> 아이디와 비밀번호 입력

 

## 비밀번호 변경

 

argocd account update-password
-> 기존 비밀번호와 새 비밀번호 입력



# bootcamp 앱 생성

 

## git 레포 생성

 

github 에서 새 프로젝트(argotest) 생성해줌

 

git clone https://github.com/my-github-id/argotest.git

 

## 소스 작성

 

ingress-nginx를 사용하여 외부에서 접속하는 것을 가정하여 작성되어 있음

 

[root@centos7 argotest]# cat bootcamp-ns.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: bootcamp



[root@centos7 argotest]# cat bootcamp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: bootcamp
  name: deployment-bootcamp
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: bootcamp
  replicas: 1
  template:
    metadata:
      labels:
        app.kubernetes.io/name: bootcamp
    spec:
      containers:
      - image: gcr.io/google-samples/kubernetes-bootcamp:v1
        imagePullPolicy: Always
        name: bootcamp
        ports:
        - containerPort: 8080



[root@centos7 argotest]# cat bootcamp-svc.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: bootcamp
  name: service-bootcamp
spec:
  ports:
    - port: 80
      targetPort: 8080
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: bootcamp



[root@centos7 argotest]# cat bootcamp-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: bootcamp-ingress
  namespace: bootcamp
  annotations:
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: 
    http:
      paths:
        - path: /
          pathType: ImplementationSpecific
          backend:
            service:
              name:  service-bootcamp
              port:
                number: 80



## 소스 푸쉬

 

git add .
git commit -m 'init'
git push -u origin master

 

소스 업로드 확인

 

## argocd 웹에서 git repo 접속 정보 설정

 

프라이빗 git 레포의 경우 먼저 argocd 웹 -> Settings -> Repositories -> Connect repo using https 클릭하여 git 접속 정보 설정 해줌

 

## 웹 UI 를 통해 앱 생성

 

메인 -> new app

 

Repo URL - https://github.com/my-github-id/argotest.git
Revision - master
Path - .


Destination
Cluster - https://kubernetes.default.svc
Namespace - bootcamp

 

Create 버튼 클릭하여 마무리

 

아직 sync 되지 않았기 때문에 수동으로 sync 명령어 실행하거나, 웹 UI 에서 Sync 버튼 클릭 -> Syncronize

 

## argocd cli 사용법

 

앱 생성
argocd app create guestbook --repo https://github.com/my-github-id/argotest.git --path . --dest-server https://kubernetes.default.svc --dest-namespace bootcamp

 

앱 리스트 확인
argocd app list

 

특정 프로젝트의 앱 리스트 확인
argocd app list -p 프로젝트명

 

앱 정보 확인
argocd app get bootcamp

 

앱 싱크
argocd app sync bootcamp



# 자동 sync 활성화

 

해당 앱 클릭 -> app details -> sync policy -> enable auto sync 클릭

 

웹훅을 따로 등록하지 않아도 3분마다 git 레포를 폴링하여 자동으로 sync



# git 웹훅 구성

 

 

웹훅을 구성하지 않아도 3분마다 폴링하지만 빠른 싱크를 위해 웹훅 설정
웹훅을 사용하려면 github 서버에서 argocd 도메인으로 퍼블릭 액세스가 가능해야함

 

해당 git 레포 -> Settings -> Webhooks -> Add webhook

 

Payload URL - https://argocd.example.com/api/webhook
Content type - application/json
Secret - (비밀번호 설정은 선택) 임의의 비밀번호(다음 단계에서 argocd에 등록할 예정) 입력(my-password)
SSL verification - 현재 argocd 사이트의 인증서가 도메인과 일치하지 않는 경우 필요에 따라 Disable 선택

 

## git 웹훅 구성(argocd 웹훅 비밀번호 설정)

 

git 웹훅 구성 시 secret 설정한 경우 argocd 에서도 동일한 비밀번호를 생성해줘야함
인증되지 않은 웹훅을 막기 위함

 

kubectl edit secret argocd-secret -n argocd

 

가장 마지막 라인 밑에 아래 내용 추가

 

stringData:
    webhook.github.secret: my-password



(참고) 웹 UI에서 Unable to load data: grpc: the client connection is closing 에러 발생 시

 

argocd-dex-server 포드 삭제 후 웹 UI 새로 고침

 

kubectl get all -n argocd
kubectl delete pod -n argocd argocd-dex-server-76ff776f97-rlncw

 

(참고) 외부 k8s 클러스터를 argocd 의 clusters 항목에 등록

 

클러스터 이름 확인
kubectl config get-contexts -o name

 

클러스터 등록
argocd cluster add 클러스터_이름



(참고) 원격 클러스터를 제어하기 위한 argocd 서비스 어카운트 관련 리소스
-> argocd cluster add 명령어를 수행하면 원격 클러스터에 아래 리소스가 생성됨

 

❯ cat sa.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: argocd-manager
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: argocd-manager-role
rules:
  - apiGroups:
      - '*'
    resources:
      - '*'
    verbs:
      - '*'
  - nonResourceURLs:
      - '*'
    verbs:
      - '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: argocd-manager-role-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: argocd-manager-role
subjects:
  - kind: ServiceAccount
    name: argocd-manager
    namespace: kube-system



# argocd 사용자 생성
-> 생성할 사용자명이 test 인 경우

 

 

kubectl edit cm argocd-cm -n argocd

data:
  accounts.test: login



유저 목록 조회
argocd account list

 

유저 상세 정보 확인
argocd account get --account test

 

argocd account update-password \
  --account test \
  --current-password 관리자_계정_패스워드 \
  --new-password test_유저의_새_패스워드

argocd account update-password \
  --account test \
  --current-password password \
  --new-password test123



# argocd 사용자 권한 부여
-> test 사용자에게 default 프로젝트의 모든 애플리케이션에 대한 모든 작업을 허용
-> repositories, get 권한의 경우 애플리케이션 rollback 을 위해 필요

 

 

kubectl edit cm argocd-rbac-cm -n argocd

 

data:
  policy.default: ""
  policy.csv: |
    p, test, applications, *, default/*, allow
    p, test, repositories, get, *, allow

 

혹은 롤을 생성하여 권한을 부여하고 사용자를 롤에 연결

 

data:
  policy.default: ""
  policy.csv: |
    p, role:test-role, applications, *, default/*, allow
    p, role:test-role, repositories, get, *, allow
    g, test, role:test-role



# oidc 인증을 사용하는 경우 argocd cli 로그인

 

argocd login argocd.example.com --sso
-> 웹 페이지 열리면서 로그인 진행



# argocd cli 로 애플리케이션의 github 소스 레포 변경

 

앱 리스트 확인
argocd app list

 

특정 레포를 사용하는 앱 리스트 확인
argocd app list -r git@github.com:my-github-id/my-flask-app-deploy.git

 

앱 세부정보 확인
argocd app get my-flask-app -o json | jq -r .spec.source.repoURL

 

앱 소스 레포 url 수정
argocd app patch my-flask-app --patch='[{"op": "replace", "path": "/spec/source/repoURL", "value": "git@github.com:my-github-id/my-flask-app-deploy.git"}]' --type json



# 소스 레포 일괄 수정 스크립트

 

#!/bin/sh
before_repo_url="git@github.com:my-github-id/my-flask-app-deploy.git"
after_repo_url="git@github.com:my-github-id/my-flask-app-deploy-v2.git"
app_list=`argocd app list -r $before_repo_url --grpc-web | grep -v SYNCPOLICY | awk '{ print $1 }'`

echo $app_list

for app in $app_list
do
  argocd app patch $app --patch="[{\"op\": \"replace\", \"path\": \"/spec/source/repoURL\", \"value\": \"${after_repo_url}\"}]" --type json --grpc-web
done