23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
지난 블로그에서 ACR에 연결하는 2가지 방법 중에 secret을 적용한 후, ACR의 컨테이너 이미지를 pull 하여 AKS에 배포하는 것까지 확인을 완료하였습니다.
지난 블로그 링크 : AKS로 쿠버네티스 시작하기 : ACR의 이미지 배포
지난 블로그에서 전체 구성과 흐름에 대해 아래와 같이 소개를 드렸습니다.
아래 그림에서 이제 CD 진행하고자 합니다. 일반적으로 많이 활용하는 GitOps도구인 argocd 솔루션을 적용해 보도록 하겠습니다.
argocd는 k8s 애플리케이션 배포 및 관리를 자동화하는 오픈소스 도구입니다.
GitOps 방식을 지원하며, Git 리포지토리에 저장된 애플리케이션 코드와 k8s 리소스 정의 파일을 기반으로 배포를 수행합니다.
argocd는 아래의 특징으로 k8s 애플리케이션 배포 및 관리를 자동화하는데 매우 유용한 도구 중 하나입니다.
(자동화) 배포할 애플리케이션의 상태를 Git 리포지토리에 저장하고, 이를 기반으로 배포를 자동화합니다.
(선언적) Declarative 방식으로 애플리케이션을 배포하므로, 인프라 및 애플리케이션 상태를 손쉽게 관리할 수 있습니다.
(동기화) 애플리케이션 상태를 선언적 구성의 현재 버전과 자동으로 동기화할 수 있습니다.
(추적성) Git 저장소를 진실의 원천으로 사용하기 때문에, 배포 과정이 감사 가능하고 재현 가능하며 롤백 가능합니다.
(협업강화) Git 저장소와 통합되어 있기 때문에, 개발자와 운영자가 동일한 구성 파일을 공유하고 리뷰하고 승인할 수 있습니다.
(배포방식) Blue/Green, Canary, Rollout 등의 전략을 쉽게 구성할 수 있습니다.
(유연성) 애플리케이션을 수동 또는 자동으로 배포할 수 있습니다
(수용성) 수천 개의 애플리케이션 배포를 지원하며, 다수의 팀이 공유하는 대규모 Kubernetes 클러스터에서 안정적으로 동작합니다.
(확장성) 역할 기반 접근 제어(RBAC)를 통해 멀티 클러스터를 관리할 수 있습니다.
(사용성) UI와 CLI를 모두 지원합니다. UI는 사용하기 쉽고 직관적이며, CLI를 사용하면 배포 과정을 스크립트로 자동화할 수 있습니다.
(민첩성) 애플리케이션의 변경 사항을 실시간으로 감지하고 즉시 반영할 수 있습니다. 이는 지속적인 전달(CD) 파이프라인을 간소화하고 가속화합니다.
(가시성) 배포 문제를 시각화하고, 구성 이탈을 감지하고 복구할 수 있습니다
(비용) k8s의 기본 기능과 표준을 활용하여 애플리케이션을 관리합니다. 이는 별도의 인프라나 에이전트가 필요하지 않으므로 운영 비용을 줄일 수 있습니다
(오픈소스) 활발한 커뮤니티 활동이 진행되고 있습니다. 개발자들이 새로운 기능을 제안하고 구현하며, 지속적으로 업데이트됩니다. 또한, 다른 오픈소스 도구와의 통합도 잘 되어 있습니다.
아래의 kubectl 명령어로 손쉽게 설치가 가능합니다. argocd 설치시 구성되는 요소가 많아 관리 편의상 namespace를 argocd로 구분하였습니다.
$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml최초 설치시에는 argocd-sever가 ClusterIP로 셋팅됩니다.
$ kubectl get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-applicationset-controller ClusterIP 10.0.222.193 <none> 7000/TCP,8080/TCP 6s
argocd-dex-server ClusterIP 10.0.241.136 <none> 5556/TCP,5557/TCP,5558/TCP 6s
argocd-metrics ClusterIP 10.0.103.96 <none> 8082/TCP 6s
argocd-notifications-controller-metrics ClusterIP 10.0.22.86 <none> 9001/TCP 6s
argocd-redis-ha ClusterIP None <none> 6379/TCP,26379/TCP 6s
argocd-redis-ha-announce-0 ClusterIP 10.0.150.97 <none> 6379/TCP,26379/TCP 6s
argocd-redis-ha-announce-1 ClusterIP 10.0.50.211 <none> 6379/TCP,26379/TCP 5s
argocd-redis-ha-announce-2 ClusterIP 10.0.159.15 <none> 6379/TCP,26379/TCP 5s
argocd-redis-ha-haproxy ClusterIP 10.0.199.124 <none> 6379/TCP 5s
argocd-repo-server ClusterIP 10.0.140.61 <none> 8081/TCP,8084/TCP 5s
argocd-server ClusterIP 10.0.209.6 <none> 80/TCP,443/TCP 5s
argocd-server-metrics ClusterIP 10.0.106.93 <none> 8083/TCP 5sargocd 설치 했더니 ClusterIP라는 용어가 나왔습니다.
ClusterIP는 k8s에서 Service Type 중의 하나입니다. 다른 유형을 포함해서 아래와 같이 이해해 볼 수 있습니다.
서비스 타입 | 정의와 필요성 | 장점 | 단점 |
|---|---|---|---|
ClusterIP | 클러스터 내부 IP에 노출하는 방식으로 클러스터 내부에서만 통신이 필요한 경우에 사용하는 서비스 타입 - Service를 클러스터의 모든 노드에서 접근할 수 있게 함 - 가상 IP 주소를 사용하므로 같은 노드에서 같은 포트를 노출하는 여러 Pod들을 고유한 IP 주소로 접근할 수 있음 | - 가장 간단하고 기본적인 Service 타입 - 클러스터 내부에서만 통신이 필요한 경우에 적합 | - 클러스터 외부에서 접근 없음 - 로드 밸런싱이나 스케일링이 필요한 경우에는 부적합 |
NodePort | ClusterIP를 확장한 클러스터 내부뿐만 아니라 외부에서도 서비스에 접근할 수 있게 하는 서비스 타입 - Service를 각 노드의 동일한 포트에 노출, NodePort 속성으로 포트를 지정하지 않으면 임의의 포트 할당 - NodePort를 생성하면 클러스터의 모든 노드에서 해당 포트가 열리고, k8s가 자동으로 포트 트래픽을 연결된 Service로 라우팅 | - 클러스터 외부에서도 접근 가능 - 클라우드 공급자에 의존하지 않음 - 모든 노드에서 동일한 포트를 사용하므로 포트 충돌을 방지 가능 | - 포트 범위가 30000-32767로 제한 - 노드 IP 주소가 변경되면 접근이 불가능 - 로드 밸런싱이나 스케일링이 필요한 경우에는 부적합 |
LoadBalancer | 클라이언트의 요청을 효율적으로 처리할 수 있는 노드들로 라우팅하는 역할을 하는 서비스 타입 - 서비스를 클라우드 공급자의 로드 밸런서에 노출 - 컨트롤러가 클러스터 외부 리소스를 구성하여 Service에 연결된 IP 주소로 패킷을 전달 서비스와 애플리케이션의 응답성을 향상시키고, 연결 요청이 손실되지 않도록 역할 수행 한 노드가 다운되면 LoadBalancer가 남은 노드들에게 작업을 재분배 | - 클러스터 외부에서도 접근 가능 - 클라우드 공급자의 로드 밸런서를 활용하여 로드 밸런싱과 스케일링 가능 로드 밸런서의 IP 주소는 고정되어 있으므로 IP 주소 변경에 대한 걱정 없음 | - 클라우드 공급자에 의존 - 로드 밸런서의 생성과 삭제에 시간이 걸릴 수 있음, 클라우드 공급자가 지원하지 않거나 비용이 부담스러운 경우에는 사용할 수 없음 |
ExternalName | Service를 셀렉터가 아닌 DNS 이름으로 매핑하는 Service 타입 - 외부 도메인을 서브도메인으로 가리킬 필요가 있는 경우에 사용 - spec:externalName 파라미터로 이름을 정의하면, ExternalName 필드의 내용과 일치하는 CNAME 레코드를 반환 - Service를 <service-name>.<namespace>.svc.cluster.local 도메인에 매핑 - 이 도메인은 externalName 필드에 정의된 임의의 이름으로 CNAME 레코드를 반환 | - 클러스터 외부에 있는 서비스를 참조할 때 사용 - 기존 애플리케이션을 수정하지 않고도 서비스 디스커버리 메커니즘을 사용 가능 | - 클러스터 내부의 서비스를 노출할 수 없음 - CNAME 레코드를 지원하는 DNS 서버가 필요 |
$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'아래의 명령어로 찾을 수 있습니다.
$ kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d && echo위의 명령어에서 보면 jsonpath라는 것이 있는데요. json형식의 데이터 구성에서 패스워드를 찾는 방식입니다.
kubectl get secret argocd-initial-admin-secret -n argocd -o json 명령을 통해 json자료의 구성을 보면 위의 명령이 이해가 가능하실 겁니다.
$ kubectl get secret argocd-initial-admin-secret -n argocd -o json
{
"apiVersion": "v1",
"data": {
"password": "비식별처리:xxx"
},
"kind": "Secret",
"metadata": {
"creationTimestamp": "2023-04-13T05:34:28Z",
"name": "argocd-initial-admin-secret",
"namespace": "argocd",
"resourceVersion": "10825368",
"uid": "1150adbc-5fdd-41f8-b068-8fb40db6d9a0"
},
"type": "Opaque"
}패스워드를 찾고나서는 운영 관리 편의성을 위해 아래의 argocd UI에서 관리 조직에서 사용하는 패스워드로 변경해 줍니다.
이제 조직에서 서로 공유하는 패스워드로 접속이 가능합니다.
argocd는 높은 수용성으로 인해 'ssh/https/github app/google cloud' 의 연결 방식 제공으로 수천 개의 애플리케이션 배포를 안정적으로 지원합니다.
우선 간단한 오픈소스 배포를 위해 많이 활용되고 있는 bitnami ( https://charts.bitnami.com/bitnami/)를 repo로 연결하겠습니다.
Settings> Repositories> + CONNECT REPO 를 클릭하여
via https, helm type, defautl project, bitnam repo url, username을 지정한 후 'CONNECT'를 클릭하여 연결 설정을 완료합니다.
Repositories 현황 메뉴에 와서 보면 성공으로 확인 됩니다.
아래의 app name, project name, source(repo URL, chart, version) , destination(cluster URL, namespace) 를 정의하고, 상단의 'CREATE' 버튼을 누르면 손쉽게 배포가 가능합니다.
이해할 사항 몇 개만 짚어 보면,
(namespace) 애플리케이션을 배포하기 전에 일반적으로 namespace를 미리 생성해 두지 않는 경우가 많으므로 'AUTO-NAMESPACE CRETATE' 를 선택
(project name) 팀 구분 등과 같이 다수의 프로젝트를 운영관리하면서 구분이 필요할 경우 사용 가능. 여기서는 argocd 용도가 dev환경 용도만으로 사용 예정이라 default를 그대로 사용
(cluster URL) default를 사용 : 현재 context의 클러스터에 배포한다는 의미. target 클러스터를 변경하면 다른 클러스터에도 배포가 가능
아래와 같이 nginx애플리케이션이 OutOfSync 상태로 표시가 됩니다. 아래의 'SYNC' 버튼을 눌러야 최종 배포가 완료됩니다.
'SYNCHRONIZE' 하고 나서 해당 애플리케이션을 클릭하면 아래와 같이 몇 초만에 nginx 배포가 완료가 됩니다. (너무 훌륭한 사용자 경험입니다.)
argocd에서 pod를 늘리는 것이 가능합니다. nginx deploy를 클릭하여 아래와 같이 manifest edit 모드로 진입해서 replicas를 1에서 3개로 증가 시켜 봅니다.
아래와 같이 pod 3개가 배포 되었습니다. 간편히 pod늘리기도 가능하였습니다.
APP DETAILS의 EVENTS를 클릭하면 발생 이벤트도 열람 가능합니다. 에러가 발생할 때도 확인해 보면 좋겠습니다.
argocd는 관리용 클러스터에 설치하여 운영하려고 합니다. 따라서, 서비스는 argocd가 설치된 관리용 클러스터가 아닌 서비스용 클러스터에 배포가 되어야 합니다.
아래에서 하나의 예시로 argocd에 서비스용 클러스터를 추가하는 절차를 소개합니다.
argocd CLI를 이용해서 설정을 하기 이해 argocd CLI가 로컬 PC에 설치되어 있어야 합니다.
맥북 기준으로 brew install argocd 로 간단히 설치 가능
argocd CLI 환경을 사용할 수 있게 되었으니 argocd CLI 명령어 수행을 통해 타겟 클러스터 추가를 할 수 있습니다.
argocd login 명령어로 argocd Web 접속하듯이 admin/패스워드 로 접속을 완료합니다.
$ argocd login 20.196.xxx.xxx
WARNING: server certificate had error: x509: “Argo CD” certificate is not trusted. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context '20.196.xxx.xxx' updatedargocd cluster add <클러스터명> 명령어를 통해서 아래와 같이 추가가 가능합니다.
$ argocd cluster add aopAKSCluster
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `aopAKSCluster` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0004] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0004] ClusterRole "argocd-manager-role" updated
INFO[0004] ClusterRoleBinding "argocd-manager-role-binding" updated
Cluster 'https://aopakscluster-dns-59502196.hcp.koreacentral.azmk8s.io:443' added아래와 같이 argocd 웹의 Cluster 메뉴에서 추가한 타겟 클러스터를 확인할 수 있습니다.
이제 argocd가 설치된 관리용 클러스터에서 타겟 클러스터로 애플리케이션 배포가 가능합니다.
현재 타겟 클러스터는 추가가 되었지만 connection status를 보면 Unknown 상태로 표시가 됩니다.
하지만, 애플리케이션 배포를 한 번 해 보겠습니다. 상태를 유심히 확인해 보세요.
아래와 같이 타겟 클러스터에 nginx를 배포해 보겠습니다.
아래와 같이 타겟 클러스터로 배포가 확인 되었습니다.
argocd로 멀티 클러스터에 대한 배포와 관리가 가능하겠습니다.
위에서 타겟 클러스터 연결 상태를 유심히 보실 것을 말씀 드렸는데요. nginx를 정상 배포하고 나서 보니, 아래와 같이 'Successful' 상태로 변경이 되었습니다.
azure 의 MC로 시작하는 master node의 nsg를 한 번 보겠습니다.
아래와 같이 해당 서비스 IP가 nsg의 inbound rule에 자동으로 등록이 됩니다.
클러스터내의 서비스 접속을 허용하였으니 아래와 같이 ngix서비스가 정상 제공이 됩니다.
테스트가 완료되어 위의 External IP는 삭제 하도록 하겠습니다.
k8s에 애플리케이션 배포를 위한 CD 솔루션으로 특장점이 많은 argocd를 설치하였습니다.
가시성, 운용관리 편리성, 멀티클러스터 배포 가능 등을 argocd 툴 하나로 확인이 가능하였습니다.
현재 구성은 argocd를 외부IP(LoadBalancer 서비스 타입)로 접속하는 방식으로 구성을 했습니다.
운영관리 편리성을 위해 도메인을 할당하고, ingress를 설치해서 argocd를 ClusterIP로 내부화하여 서비스를 제공해 보도록 하겠습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.