[24단계 실습으로 정복하는 쿠버네티스] 책으로 스터디를 진행하였다.
Push 기반 파이프라인 구성
이전 스터디에서 사용한 구성을 기반으로 GitOps 도구를 추가 배포하였다.
GitLab 구축
GitLab은 Git 기반의 웹 기반 Git 저장소 관리 서비스로, GitHub과 유사한 기능을 제공한다.
GitHub과 다른점은 GitLab은 로컬에 직접 구축할 수가 있다는 점이다.
나만의 Git 저장소를 구축하고자할 때 많이 사용하는 오픈소스이며, 무료로 사용할 수 있는 CE(Community Edition) 버전과 유료로 구매해야하는 EE(Enterprise Edition) 버전으로 나뉜다.
GitLab 설치
// GitLab Chart 저장소 추가 및 최신화
(ersia:default) [root@kops-ec2 ~]# helm repo add gitlab https://charts.gitlab.io/
"gitlab" has been added to your repositories
(ersia:default) [root@kops-ec2 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "harbor" chart repository
...Successfully got an update from the "gitlab" chart repository
Update Complete. ⎈Happy Helming!⎈
// 추가 설정을 위해 로컬에 Harbor chart 다운로드
(ersia:default) [root@kops-ec2 ~]# helm fetch gitlab/gitlab --untar --version 6.8.1
(ersia:default) [root@kops-ec2 ~]# tree gitlab -L 1
gitlab
├── CHANGELOG.md
├── charts
├── Chart.yaml
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── requirements.lock
├── requirements.yaml
├── support
├── templates
└── values.yaml
3 directories, 8 files
// 아래의 내용을 수정
(ersia:default) [root@kops-ec2 ~]# vim gitlab/values.yaml
---------------------------------------------------------
52 domain: ersia.net ## 사용할 도메인
66 ingress:
67 apiVersion: ""
68 configureCertmanager: false ## true/false 옵션이 있으며, ingress controller에서 인증서를 설정하므로 false 로 설정
69 provider: aws ## Ingress Controller를 ALB로 사용하기 때문에 aws로 입력, nginx-ingress를 사용할 시 nginx로 입력
70 class: alb ## IngressClass 이름을 입력, 활성화 시 기본값은 gitlab-nginx
71 annotations: ## 아래의 annotation 추가
72 alb.ingress.kubernetes.io/scheme: internet-facing
73 alb.ingress.kubernetes.io/target-type: ip
74 alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
75 alb.ingress.kubernetes.io/certificate-arn: 'ACM에서 생성한 인증서 ARN'
76 alb.ingress.kubernetes.io/success-codes: 200-399
77 alb.ingress.kubernetes.io/group.name: "gitlab" ## 하나의 Ingress Controller로 다수의 Listner를 사용하기 위한 Group설정
78 enabled: true
79 tls:
80 enabled: false ## ACM을 사용하기 때문에 false로 설정, 기본값은 true
---------------------------------------------------------
// GitLab용 namespace 생성
(ersia:default) [root@kops-ec2 ~]# kubectl create ns gitlab
namespace/gitlab created
// 수정한 helm chart로 GitLab 설치
(ersia:default) [root@kops-ec2 ~]# 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: Fri Mar 24 01:47:50 2023
NAMESPACE: gitlab
STATUS: deployed
REVISION: 1
NOTES:
=== NOTICE
...
...
// 설치 확인
(ersia:default) [root@kops-ec2 ~]# helm list -n gitlab
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
gitlab gitlab 1 2023-03-24 01:47:50.388151322 +0900 KST deployed gitlab-6.8.4 15.8.4
참고 : https://docs.gitlab.com/charts/charts/globals#configure-ingress-settings
정상적으로 설치가 완료되면 Ingress Controller(ALB) 1개가 생성된 것을 확인할 수 있으며,
4개의 Ingress가 하나의 ALB를 공유해서 사용하는 것을 확인할 수 있다.
(만약 alb.ingress.kubernetes.io/group.name: "gitlab" 설정을 추가하지 않았다면, ALB가 4개 생성되고 Ingress에 각각 다른 ADDRESS가 할당된 것을 볼 수 있다.)
(ersia:default) [root@kops-ec2 ~]# kubectl get ingress -n gitlab
NAME CLASS HOSTS ADDRESS PORTS AGE
gitlab-kas alb kas.ersia.net k8s-gitlab-18b83d93ec-2082841353.ap-northeast-2.elb.amazonaws.com 80 83s
gitlab-minio alb minio.ersia.net k8s-gitlab-18b83d93ec-2082841353.ap-northeast-2.elb.amazonaws.com 80 83s
gitlab-registry alb registry.ersia.net k8s-gitlab-18b83d93ec-2082841353.ap-northeast-2.elb.amazonaws.com 80 83s
gitlab-webservice-default alb gitlab.ersia.net k8s-gitlab-18b83d93ec-2082841353.ap-northeast-2.elb.amazonaws.com 80 83s
각 ALB 규칙을 확인해보면 각 GitLab 서비스가 다른 Host URL로 접속해 전달하는 것을 확인할 수 있다.
GitLab 설치 후 웹페이지 접속
설치 시 입력한 도메인 앞에 gitlab을 붙인 URL로 접속하면 로그인 가능한 웹페이지를 확인할 수 있다. (예시 : gitlab.ersia.net)
기본 사용자와 패스워드는 root / 임의로 생성된 초기 패스워드 이며, 패스워드는 쿠버네티스안의 gitlab secret을 통해 확인할 수 있다.
// GitLab 설치 시 임의로 생성되는 초기 패스워드
(ersia:default) [root@kops-ec2 ~]# kubectl get secrets -n gitlab gitlab-gitlab-initial-root-password --template={{.data.password}} | base64 -d ;echo
i8bLj4s9OpBUvqn2sLFPLcEtot0EkkwgnGETejaGXAsnFwxC7wAP7WArcv1VPUcX
Kubernetes Secret 참고 : https://arisu1000.tistory.com/27844
GitLab 사용자 생성
root 계정으로 로그인 후 Admin 페이지로 접속하면, 사용자 계정을 생성할 수 있다.
일반적으로 root 계정으로 직접 작업하기보다 사용자 계정을 생성하고 계정 별 권한을 분리해 작업하는게 보안상 유리하다.
- Access Level로 일반 사용자와 관리자 계정을 나눌 수 있다.
- External 설정을 활성화 하면 구축한 GitLab의 외부 사용자로 취급되어 Private이나 비공개 프로젝트에 접근할 수 없게 된다.
- Validate user account : 신용카드 등으로 사용자 신원을 확인하는 설정이다.
사용자 생성 후 입력한 E-Mail로 초기 패스워드를 설정하는 링크를 전달한다.
만약 존재하지 않는 임의의 E-Mail을 입력했다면, root계정의 생성한 계정 Edit를 통해 초기 패스워드를 설정한다.
GitLab 프로젝트 생성 후 commit 테스트
생성한 계정으로 로그인해 웹페이지에서 Create a Project -> Create Blank Project를 선택한다.
GitHub에서 자주 확인한 프로젝트 설정을 확인 할 수 있다.
Project Name : 임의의 GitLab 프로젝트 이름을 입력한다. 해당 이름은 GitLab 프로젝트의 URL Path로 활용된다.
Visibility Level
- Private : 접근권한이 있는 사용자 또는 그룹만 접근할 수 있다.
- Internal : External로 설정된 외부 사용자를 제외한 모든 사용자가 접근할 수 있다.
- Public : 별도의 인증없이 임의의 사용자가 접근할 수 있다.
아래의 과정을 따라 테스트용 프로젝트에 접근하고 임의의 파일을 commit한다.
// git global 계정 정보 입력
(ersia:default) [root@kops-ec2 ~]# git config --global user.name "ersia"
(ersia:default) [root@kops-ec2 ~]# git config --global user.email "ersia@test.com"
(ersia:default) [root@kops-ec2 ~]# git config --list
user.name=ersia
user.email=ersia@test.com
// GitLab 저장소에 접근해 사용자 인증 후 로컬 디렉토리와 연동
(ersia:default) [root@kops-ec2 ~]# git clone https://gitlab.ersia.net/ersia/test.git
Cloning into 'test'...
Username for 'https://gitlab.ersia.net': ersia
Password for 'https://ersia@gitlab.ersia.net':
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
(ersia:default) [root@kops-ec2 ~]# tree test
test
└── README.md
0 directories, 1 file
// 임의의 파일을 생성 후 git add 수행
(ersia:default) [root@kops-ec2 test]# echo "gitlab test memo" >> test.txt
(ersia:default) [root@kops-ec2 test]# git status
On branch main
Your branch is up to date with 'origin/main'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.txt
nothing added to commit but untracked files present (use "git add" to track)
(ersia:default) [root@kops-ec2 test]# git add test.txt
// add한 파일을 로컬에 commit
(ersia:default) [root@kops-ec2 test]# git commit -m "add test.txt file"
[main 4274278] add test.txt file
1 file changed, 1 insertion(+)
create mode 100644 test.txt
// commit한 변경사항을 GitLab 저장소에 Push
(ersia:default) [root@kops-ec2 test]# git push
Username for 'https://gitlab.ersia.net': ersia
Password for 'https://ersia@gitlab.ersia.net':
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 286 bytes | 286.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://gitlab.ersia.net/ersia/test.git
0e4f2b4..4274278 main -> main
구축한 GitLab 삭제
GitLab 구축 시 values.yaml에서 persistentVolumeClaim 선언을 했기 때문에 PVC를 별도로 꼭 지워줘야 한다.
(ersia:default) [root@kops-ec2 ~]# helm uninstall -n gitlab gitlab
(ersia:default) [root@kops-ec2 ~]# kubectl delete pvc --all -n gitlab
(ersia:default) [root@kops-ec2 ~]# kubectl delete ns gitlab
참고자료
- GitLab의 권한관리와 설정방법 : https://www.bearpooh.com/116
- 쿠버네티스 시크릿(kubernetes secret) : https://arisu1000.tistory.com/27844
- ALB Ingress 사용 시 다수의 리스너 등록하기 : https://yongho1037.tistory.com/809
- GitLab 참조 아키텍처 소개 : https://insight.infograb.net/blog/2022/09/28/gitlab-reference-architecture/#아키텍처-구조