minikube를 활용한 Kubernetes 개발

본 안내서는 로컬 Kubernetes 개발 환경을 설정하기 위한 플랫폼 간 자원으로 제공됩니다. 이 안내서에서는 minikube를 사용할 것입니다. 이것이 표준으로 인정되고 있기 때문입니다.

minikube 시작하기

공식 문서인 Running Kubernetes Locally with minikube에서 공식 문서를 추출 및 설명할 것입니다.

kubectl 설치

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

  • Google Cloud SDK의 일부로 Google Cloud Platform의 Cloud SDK 페이지에서 다운로드합니다. gcloud를 설치한 후 kubectl을 설치할 수 있습니다:

    sudo gcloud components install kubectl
    

    이미 이 방법으로 kubectl을 설치했다면 업데이트를 확인하세요:

    sudo gcloud components update
    
  • cURL 또는 해당 운영 체제의 적절한 패키지 관리 시스템을 사용하여 설치합니다:

minikube 설치

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

VM 드라이버 선택

본 안내서의 플랫폼 간 호환성을 위해 VirtualBox를 사용할 것이지만 VMware Fusion, HyperV, KVM 및 Xhyve용 드라이버도 있습니다.

minikube 시작/중지

GitLab 차트를 개발하기 위해 minikube 자원 요청이 기본값보다 높게 설정되어야 합니다. 중요한 구성 항목은 minikube start --help로 찾을 수 있습니다. 테스트하는 데 필요한 것과 목록에 나온 요구 사항에 따라 변경해야 할 것들이 제공됩니다.

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

    note
    이 디렉토리는 ~/.minikube/machines/minikube/의 홈 디렉토리에 생성됩니다.
  • --kubernetes-version string: minikube VM에서 사용할 Kubernetes 버전(예: v1.2.3).
  • --registry-mirror stringSlice: Docker 데몬에 전달할 레지스트리 미러.

이러한 값을 둘째 start 명령어에서 변경하려면, 기존 인스턴스를 먼저 minikube delete로 삭제해야 하거나 수동으로 VirtualBox Manager의 속성을 변경해야 합니다.

모든 도구를 설치하고 구성한 후에는 다음과 같이 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 설치로 직접 사용할 수 있으며 단일 노드 클러스터처럼 취급할 수 있습니다. Google Container Engine (GKE)와 같은 완전한 Kubernetes 클러스터와는 약간 다른 동작이 있습니다.

다른 점:

  • 지속적인 볼륨: hostPath만 사용 가능합니다.

사용 불가능한 것:

  • 로드 밸런서 (클라우드 제공자 필요).
  • 고급 스케줄링 정책 (여러 노드 필요).

주의할 점: 지속적인 볼륨

minikube는 hostPath 유형의 PersistentVolumes를 지원하며, 이는 VM 내부의 디렉터리로 매핑됩니다. minikube는 tmpfs로 부팅되기 때문에 대부분의 디렉터리는 minikube stop을 통해 다시 부팅 시 지속되지 않습니다.

더 자세한 내용 및 지속되는 디렉터리 목록은 minikube 시작 가이드에서 찾을 수 있습니다.

애드온 활성화

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로 설정하세요. 결과적으로 자체 서명된 인증서를 제공하지 않는 한 자체 서명된 인증서가 생성됩니다. 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 및 10GB 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>을 사용한 경우 사용자 이름으로 대체).

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