Gitops, ArgoCD를 통한 Kubernetes 리소스 배포 자동화에 대해 알아봅니다.
GitOps 패턴이란,
Code Repository를 중심으로 배포 프로세스를 구성하는 방식을 말합니다.
배포하기위한 Code Repository와 해당 프로그램의 환경 구성 정보 및 상태를 정의하는 GitOps Repository로 구성됩니다.
Code Repository를 기반으로 Build된 프로그램의 최신정보를 GitOps Repository에 업데이트하고, 해당 정보로 Deploy Operator를 통해 원하는 환경의 인프라에 배포시킵니다.
GitOps 패턴은 소프트웨어나 구현체가 아닌 하나의 방법론에 가깝습니다.
ArgoCD는 위에서 설명한 GitOps의 구현체(Deploy Operator) 중 하나입니다.
GitOps Repository에 선언된 구성 정보를 최종적으로 ArgoCD에서 각 환경에 배포하게 됩니다.
kubectl create namespace argocd
kubectl label ns argocd istio-injection=enabled
# 설치
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 삭제
kubectl delete -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
여기까지는 기본적인 내용입니다.
저는 istio ingress -> istio gateway -> istio virtual service -> argocd service 구조로 배포할 것이기 때문에, install.yaml 파일을 아래처럼 수정했습니다.
curl https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml > install.yaml
... (생략)
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/component: server
app.kubernetes.io/name: argocd-server
app.kubernetes.io/part-of: argocd
name: argocd-server
spec:
selector:
matchLabels:
app.kubernetes.io/name: argocd-server
template:
metadata:
labels:
app.kubernetes.io/name: argocd-server
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchLabels:
app.kubernetes.io/name: argocd-server
topologyKey: kubernetes.io/hostname
weight: 100
- podAffinityTerm:
labelSelector:
matchLabels:
app.kubernetes.io/part-of: argocd
topologyKey: kubernetes.io/hostname
weight: 5
containers:
- args:
- /usr/local/bin/argocd-server
- --insecure # 이부분 수정!!!!!!(추가)
... (생략)
kubectl apply -n argocd -f install.yaml
설치는 끝입니다.
저는 추가로 istio gateway와 virutal service 도 배포해주었고, 도메인도 설정해주었습니다.
잠깐 제가 설정한 파일을 보여드리면,
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: argocd-gw
namespace: argocd
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- argocd.velog.io (임의로 지어낸겁니다 ㅋ)
port:
name: https
number: 443
protocol: HTTP
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: argocd-vs
namespace: argocd
spec:
gateways:
- argocd-gw
hosts:
- argocd.velog.io (임의로 지어낸겁니다 ㅋ)
http:
- route:
- destination:
host: argocd-server.argocd.svc.cluster.local
port:
number: 80
설정해준 도메인이나 IP로 들어가보면 귀여운 문어 외계인이 반겨줍니다.
$ argocd admin initial-password -n argocd
XXIWBz97WwjINqTd
$ argocd login <argocd domain or ip>
Username: admin
Password:XXIWBz97WwjINqTd # 위에서 확인한 계정
$ argocd account update-password --account admin
*** Enter password of currently logged in user (admin): XXIWBz97WwjINqTd # 현재 비밀번호
*** Enter new password for user admin: testtest # 바꾸고자 하는 비밀번호
*** Confirm new password for user admin: testtest # 비밀번호 확인
Password updated
Context argocd.velog.io' updated
k edit configmap argocd-cm -n argocd
# ... (생략) 아래부분 추가
data:
accounts.alice: apiKey,login
accounts.alice.enabled: "true"
# arogcd 사용자 목록 조회
argocd account list
# argocd 사용자 단일 조회
argocd account get --account alice
# argocd 사용자 비밀번호 변경
argocd account update-password --account alice
위에서 추가한 alice 계정에 몇가지 권한을 추가로 부여하기 위해 argocd-rbac-cm
ConfigMap 을 수정합니다.
kubectl edit cm argocd-rbac-cm -n argocd
policy.csv 에 권한을 추가합니다.
기본 제공 역할
role:readonly
: 모든 리소스에 대한 읽기 전용 액세스role:admin
: 모든 리소스에 대한 무제한 액세스RBAC 권한 구조
p, <role/user/group>, <resource>, <action>, <object>
p, <role/user/group>, <resource>, <action>, <appproject>/<object>
RBAC 리소스 및 작업
예시
[p | g], role:<사용자 또는 권한> [cluster | projects | applications..], [get | create..], <앱일경우 project명/application명 그외 target>, allow
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
policy.csv: |
p, role:developer, applications, *, */*, allow
p, role:developer, projects, get, *, allow
p, role:developer, projects, create, *, allow
p, role:developer, projects, update, *, allow
p, role:developer, projects, delete, *, allow
p, role:developer, repositories, *, *, allow
p, role:developer, clusters, *, *, allow
p, role:developer, certificates, get, *, allow
p, role:developer, gpgkeys, get, *, allow
p, role:developer, clusters, create, *, allow
g, alice, role:developer
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"argocd-rbac-cm","app.kubernetes.io/part-of":"argocd"},"name":"argocd-rbac-cm","namespace":"argocd"}}
creationTimestamp: "2022-01-14T00:47:29Z"
labels:
app.kubernetes.io/name: argocd-rbac-cm
app.kubernetes.io/part-of: argocd
name: argocd-rbac-cm
namespace: argocd
resourceVersion: "294426321"
uid: ab37508c-656e-4481-bab3-7efc41aba69b
~
저는 developer 라는 역할(그룹)을 만들고 역할에 권한을 부여한다음, alice 를 developer 그룹에 할당시켜줬습니다. (맨 마지막라인)
이제 만든 계정으로 다시 로그인 해보세요.