Developing for Kubernetes with minikube

이 가이드는 로컬 Kubernetes 개발 환경을 설정하기 위한 크로스 플랫폼 리소스로 제공됩니다. 이 가이드에서는 minikube를 사용할 것입니다. 이는 공식적으로 승인된 표준이기 때문입니다.

minikube로 시작하기

공식 문서인 Kubernetes 프로젝트에서 제공하는 minikube를 사용하여 로컬에서 Kubernetes 실행하기를 발췌하여 상세히 설명하겠습니다.

kubectl 설치

공식 문서는 여러 옵션을 제공하지만, 결과적으로 세 가지 중 하나를 수행할 수 있습니다:

  • 구글 클라우드 플랫폼의 Cloud SDK 페이지에서 Google Cloud SDK의 일부로 다운로드합니다. gcloud를 설치한 후 kubectl을 설치할 수 있습니다:

    sudo gcloud components install kubectl
    

    만약 이미 이 방법으로 kubectl을 설치했다면 최신 버전으로 업데이트하는지 확인하세요:

    sudo gcloud components update
    
  • cURL이나 해당 OS의 적절한 패키지 관리 시스템을 사용하여 설치합니다:

minikube 설치

minikube 문서를 참조하여 GitHub 릴리스에서 직접 설치하는 것을 권장합니다.

VM 드라이버 선택

이 가이드에서 크로스 플랫폼 호환성을 위해 VirtualBox를 사용할 것입니다. 하지만 VMware Fusion, HyperV, KVM, Xhyve에 대한 드라이버도 있습니다.

minikube 시작/중지

GitLab 차트를 개발하는 데에는 minikube 리소스 요청을 기본값보다 높게 설정해야 합니다. 주요 컴포넌트는 minikube start --help 명령으로 찾을 수 있습니다. 아래 선택적으로 변경할 구성 항목을 제공하겠습니다.

  • --cpus int: minikube VM에 할당된 CPU 개수 (기본값 2). 완전한 차트를 배포하려면 최소 4가 필요합니다.
  • --memory int: minikube VM에 할당된 RAM 양 (기본값 2048). 최소 6144 (6 GB)가 필요하며 권장되는 양은 10240 (10 GB) 입니다.
  • --disk-size string: minikube VM에 할당된 디스크 용량 (형식: <number>[<unit>], unit = b, k, m 또는 g) (기본값 20g). GitLab 리포지터리데이터베이스 요구 사항을 참조하세요.

    note
    이 디렉터리는 ~/.minikube/machines/minikube/에 홈 디렉터리 내에 생성됩니다.
  • --kubernetes-version string: minikube VM에서 사용할 Kubernetes 버전 (예: v1.2.3).
  • --registry-mirror stringSlice: Docker 데몬에 전달할 레지스트리 미러.
note
이 값들을 두 번째 start 명령어에서 변경하려면 먼저 minikube delete로 기존 인스턴스를 삭제하거나 매뉴얼으로 VirtualBox 매니저로 속성을 수정해야 합니다.

모든 도구를 설치하고 구성한 후에 minikube를 시작하고 중지하는 명령어는 다음과 같습니다:

minikube start --cpus 4 --memory 10240

이 명령은 다음과 유사한 출력을 제공해야 합니다:

로컬 Kubernetes v1.7.0 클러스터 시작 중...
VM 시작 중...
Minikube ISO 다운로드 중
 97.80 MB / 97.80 MB [==============================================] 100.00% 0s
VM의 IP 주소 가져오는 중...
클러스터로 파일 이동 중...
인증서 설정 중...
클러스터 컴포넌트 시작 중...
클러스터에 연결 중...
kubeconfig 설정 중...
Kubectl이 이 클러스터를 사용하도록 구성됨.
[helm.gitlab.io]$ minikube ip
192.168.99.100
[helm.gitlab.io]$ minikube stop
로컬 Kubernetes 클러스터 중지 중...
머신이 중지됨.

minikube ip 명령의 결과를 확인하세요. 출력이 192.168.99.100이 아니라면 나중에 IP가 필요할 것입니다.

minikube 사용하기

minikube는 단일 노드 클러스터로 취급하여 Kubernetes 설치로 직접 사용할 수 있습니다. minikube와 완전한 특성을 갖춘 Kubernetes 클러스터 간에 약간 다른 동작이 있습니다. (예: Google Container Engine (GKE))

다른 점:

  • 지속적인 볼륨: hostPath만 지원.

지원되지 않는 기능:

  • 로드 밸런서 (클라우드 제공 업체 필요).
  • 고급 스케줄링 정책 (다중 노드 필요).

주의: 지속적 볼륨

minikube는 tmpfs에 부팅되므로 hostPath 유형의 지속적 볼륨을 지원합니다. 다수의 디렉터리가 minikube stop을 통해 재부팅을 거치지 않으면 유지되지 않습니다.

더 자세한 정보 및 지속되는 디렉터리 디렉터리은 minikube 시작 가이드에서 확인할 수 있습니다.

Add-ons 활성화

minikube는 기본 구성 이외의 몇 가지 기능을 처리합니다. 이 프로젝트를 개발하는 데에는 Ingress에 액세스할 필요가 있습니다.

minikube addons enable ingress

대시보드에 연결

대시보드 URL은 다음 명령을 호출하여 찾을 수 있습니다:

minikube dashboard --url

차트 배포

이 차트를 minikube에 배포할 때 일부 차트 리소스를 줄이거나 비활성화해야 합니다. nginx-ingress 차트를 사용하여 포트 22, 80, 443을 제공할 수 없습니다. 이를 비활성화하고 Ingress 클래스를 nginx-ingress.enabled=false,global.ingress.class="nginx"로 설정하는 것이 좋습니다.

certmanager 차트는 minikube와 함께 사용할 수 없습니다. 따라서 certmanager.install=false,global.ingress.configureCertmanager=false로 설정하여 비활성화해야 합니다. 이 경우, 자체 SSL 인증서를 제공하지 않는다면 자체 서명된 인증서가 생성될 것입니다. gitlab-runner 차트는 gitlab-runner.certsSecretName을 통해 자체 서명된 인증서를 수락합니다. 릴리스 이름이 gitlab이라고 가정하면 인증서 이름은 gitlab-wildcard-tls-chain이 될 것입니다.

gitlab-shell 차트는 minikube에서 사용할 수 있지만 이미 minikube에서 사용 중인 22 포트 이외의 다른 포트로 매핑해야 합니다. gitlab.gitlab-shell.service.type=NodePortgitlab.gitlab-shell.service.nodePort=<고번호 포트>를 구성하여 지정한 포트를 통해 리포지터리를 복제할 수 있도록 할 수 있습니다. UI의 복제 링크에 이 포트가 반영되도록 하려면 global.shell.port=<고번호 포트>를 구성하세요.

다음 섹션들에서는 로컬 Git 클론에서 이러한 차트들을 어떻게 설치하는지 보여줍니다. 원하는 브랜치 또는 태그를 확인하고 해당 체크아웃의 기본 폴더에 있는지 확인하세요.

GitLab 차트 리포지터리 복제

git clone https://gitlab.com/gitlab-org/charts/gitlab.git
cd gitlab

권장 설정으로 GitLab 배포

추천되는 4 CPU 및 10 GB RAM을 사용할 때는 기본으로 values-minikube.yaml을 사용하세요.

helm dependency update
helm upgrade --install gitlab . \
  --timeout 600s \
  -f https://gitlab.com/gitlab-org/charts/gitlab/raw/master/examples/values-minikube.yaml

최소한의 설정으로 GitLab 배포

최소 리소스로 3 CPU 및 6GB RAM을 사용하는 경우 모든 레플리카를 줄이고 불필요한 서비스를 비활성화해야 합니다. 적절한 기본값으로 values-minikube-minimum.yaml을 참조하세요.

helm dependency update
helm upgrade --install gitlab . \
  --timeout 600s \
  -f https://gitlab.com/gitlab-org/charts/gitlab/raw/master/examples/values-minikube-minimum.yaml

만약 minikube ip의 출력이 192.168.99.100이 아니라면, 예제 구성 파일에서 IP 엔드포인트를 재정의하기 위해 다음 인수들을 추가하세요:

  --set global.hosts.domain=$(minikube ip).nip.io \
  --set global.hosts.externalIP=$(minikube ip)

DNS 처리

제공되는 예제 구성은 도메인을 192.168.99.100.nip.io로 구성하여 호스트 파일의 변경 또는 다른 도메인 이름 해상도 서비스의 오버헤드를 줄이려고 시도합니다. 그러나 이는 nip.io의 네트워크 접근성에 의존합니다.

만약 이를 사용할 수 없다면, 호스트 파일을 변경하거나 다른 DNS 해상도 방법을 제공해야 할 수 있습니다.

예시 /etc/hosts 파일 추가:

192.168.99.100 gitlab.some.domain registry.some.domain minio.some.domain

자체 서명 CA 통합

차트가 배포된 후, 사용자가 자체 서명된 인증서를 사용하는 경우 생성된 CA 인증서를 가져오는 방법에 대한 공지를 받게 될 것입니다. 이 인증서는 시스템 리포지터리에 추가하여 모든 브라우저, Docker 데몬 및 git 명령이 배포된 인증서를 신뢰하는 것으로 인식하도록 할 수 있습니다. 이 방법은 사용 중인 운영 체제에 따라 다릅니다.

BounCA에는 대부분의 운영 체제를 다루는 좋은 튜토리얼이 있습니다.

로그인

GitLab 인스턴스에는 명시된 도메인을 방문하여 액세스할 수 있습니다. 이 예제에서는 https://gitlab.192.168.99.100.nip.io가 사용됩니다. 초기 루트 비밀번호에 대한 시크릿을 매뉴얼으로 생성했다면 해당 비밀번호로 루트 사용자로 로그인할 수 있습니다. 그렇지 않은 경우, GitLab이 루트 사용자를 위한 무작위 비밀번호를 자동으로 생성했습니다. 다음 명령을 사용하여 이를 추출할 수 있습니다(<name>을 사용한 명령어에서 사용한 릴리스의 이름인 gitlab로 바꿔 입력):

kubectl get secret <name>-gitlab-initial-root-password -ojsonpath='{.data.password}' | base64 --decode ; echo