리소스 제약적인 MicroK8s 환경에서 MARA로 배포하는 모범사례

NGINX가 MARA(Modern Apps Reference Architecture) 프로젝트 작업을 시작했을 때 이미 플랫폼에 익숙하고 부서 예산을 사용하여 비용을 지불할 수 있었기 때문에 AWS를 IaaS 공급자로 선택했습니다. 물론 모든 사람이 동일한 경험이나 예산을 갖고 있는 것은 아니며 많은 분들이 K3, Canonical MicroK8s, minikube와 같은 Kubernetes 배포판을 사용하여 실험실 기반 환경이나 워크스테이션에서 로컬로 MARA를 실행할 수 있는 옵션을 제공하도록 요청했습니다.

많은 의견을 듣고 오늘 MicroK8s에서 MARA를 테스트했으며 직접 배포할 수 있도록 지침을 제공하게 되어 기쁩니다!

테스트를 위해 MicroK8s을 선택한 이유는 무엇입니까? MARA(Modern Apps Reference Architecture)가 필요로 하는 DNS, 스토리지 및 egress 기능을 낮은 메모리 공간으로 배포하기 쉬운 모델로 제공하기 때문입니다. MicroK8s을 사용하면 테스트 시나리오를 쉽고 반복적으로 반복하여 합리적인 수준의 성능을 제공하는 배포에 대한 최소 요구 사항을 결정할 수 있습니다.

우리는 이 작업이 다른 Kubernetes 배포판의 테스트를 용이하게 할 것으로 기대합니다. 다양한 배포의 현재 상태에 대한 정보는 GitHub 리포지토리를 참조하세요. 목록에서 보고 싶은 즐겨찾는 배포가 있는 경우 풀 req를 fort, 테스트 및 생성하도록 초대합니다!

목차

1. 리소스 제약 처리
2. MicroK8에 MARA 배포
  2-1. MicroK8s 설치 및 구성
  2-2. MARA 리포지토리 복제 및 MicroK8s Cluster 설정
  2-3. MARA 배포
3. 요약

1. 리소스 제약 처리

MARA를 로컬에서 실행하는 데 있어 가장 큰 제약은 메모리와 CPU입니다. 예비 테스트 중에 메모리 고갈과 관련된 대부분의 문제가 Elasticsearch와 관련되어 있음을 발견했습니다. Kibana는 메모리 양이 매우 적은 구성(16GB 미만)에서는 거의 사용할 수 없습니다. 이 문제를 해결하기 위해 전체 Elasticsearch 배포가 일반적으로 가지고 있는 중복 보호를 제거하는 설정을 MARA 구성 파일에 제공했습니다. 이렇게 하면 오류 모드 수가 증가하지만 리소스가 제한된 환경에서는 필요한 절충안입니다.

CPU에 대한 제약은 샘플 Bank of Sirius 애플리케이션에 부과된 로드 양과 직접 연결됩니다. MARA 배포에는 사용자 수에 대한 사용자 제어 설정과 신규 사용자에 대한 생성 비율을 사용하여 Bank of Sirius에 부하를 생성하는 Locust가 포함됩니다.

Bank of Sirius의 부하를 늘리면 시스템의 나머지 부분에도 영향을 줍니다. 사용자 수 또는 생성 비율이 너무 높으면 구성 요소가 충돌하거나 중단될 가능성이 있는 지점까지 MARA 성능이 저하됩니다. 이 동작을 유발하는 값은 사용 가능한 CPU에 따라 다르지만 요구 사항에 지정된 용량 이상으로 배포하여 최대 64명의 사용자가 생성한 로드와 한 번에 16명의 사용자가 생성하는 부하를 처리할 것으로 예상할 수 있습니다.

2. MicroK8에 MARA 배포

그 배경을 없애고 MicroK8s에서 MARA를 지지할 준비가 되었습니다!

요구 사항

  • Ubuntu 20.04(Focal) 이상을 실행하는 시스템(베어메탈 Linux 서버, 가상화 또는 클라우드)에 대한 루트 액세스 권한:
    • 20GB 디스크
    • 16GB 메모리
    • 4개의 CPU에 해당
  • MARA에 필요한 모든 라이브러리와 바이너리가 있는 로컬 시스템의 Python 3 가상 환경. Python 3이 아직 설치되지 않은 경우 다음 명령을 실행합니다.
$  sudo apt update
$  sudo apt install -y python3-venv
  • NGINX Ingress Controller egress에 할당할 MicroK8s의 통합 MetalLB 로드 밸런서에 대한 하나 이상의 무료 IPv4 주소. localhost를 통해 Bank of Sirius 애플리케이션에 액세스하는 경우 사용 가능한 모든 개인(RFC 1918 호환) 주소를 사용할 수 있습니다. 예를 들어, 네트워크가 192.168.100.0/24인 경우 10.10.10.10과 같은 주소를 사용할 수 있습니다.
  • 풀루미 계정 및 액세스 토큰. 아직 없는 경우 MARA 배포의 1단계에서 생성합니다.

Pulumi를 사용하면 상태 파일을 S3 호환 개체 저장소 또는 로컬 파일 시스템에 저장할 수 있지만 MARA는 작성 시점에서 이를 지원하지 않습니다. 이 제한은 MARA 또는 Pulumi의 향후 릴리스에서 제거됩니다.

2-1. MicroK8s 설치 및 구성

1. MicroK8s 설치:

$ sudo snap install microk8s --classic
microk8s (1.23/stable) v1.23.3 from Canonical✓ installed

2. microk8s 명령을 실행하는 데 필요한 권한을 설정합니다. <username>에 대해 시스템에 대한 root 권한이 있는 계정으로 대체합니다.

$ sudo usermod -a -G microk8s <username>
$ sudo chown -f -R <username> ~/.kube
$ newgrp microk8s

3. root 권한이 있는 계정에서 로그아웃했다가 다시 로그인하면 새 권한이 적용됩니다.

4. DNS, 스토리지 및 MetalLB용 MicroK8s add-ons을 활성화합니다.

프롬프트에서 다음 중 하나를 나타내기 위해 X.X.X.X‑X.X.X.Y 형식의 IP 주소 범위를 지정합니다.

  • 사설 IP 주소의 실제 범위(예: 192.168.100.100-192.168.100.110, 아래에 사용된 값)
  • 단일 사설 IP 주소(예: 192.168.100.100-192.168.100.100)
$ microk8s enable dns storage metallb
Enabling DNS
Applying manifest
...
Restarting kubelet
DNS is enabled
Enabling default storage class
...
Storage will be available soon
Enabling MetalLB
Enter each IP address range delimited by comma (e.g. '10.64.140.43-10.64.140.49,192.168.0.105-192.168.0.111'): 192.168.100.100-192.168.100.110
Applying Metallb manifest
...
MetalLB is enabled

5. MicroK8s가 실행 중인지 확인합니다.

$ microk8s status
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
addons:
  enabled:
    dns           # CoreDNS
    ha-cluster    # Configure high availability on the current node
    metallb       # Loadbalancer for your Kubernetes cluster
    storage       # Storage class; allocates storage from host directory
...

6. 대부분의 유틸리티가 찾을 것으로 예상하는 파일(~/.kube/config)에 MicroK8s 구성을 Load하고 디렉터리 및 파일에 대한 권장 권한을 설정합니다.

$ microk8s config > ~/.kube/config
$ sudo chmod 0644 ~/.kube/config

2-2. MARA 리포지토리 복제 및 MicroK8s Cluster 설정

1. MARA 저장소를 복제하고 Bank of Sirius 하위 모듈을 초기화합니다.

$ git clone https://github.com/nginxinc/kic-reference-architectures.git
$ cd kic-reference-architectures/
$ git submodule update --init --recursive --remote

2. 복제된 MARA 리포지토리의 루트 디렉터리(이전 단계에서 디렉터리를 변경함)에서 작업하여 MicroK8s 클러스터에 대한 Python 가상 환경을 설정합니다.

$ ./bin/setup_venv.sh

이 명령은 긴 추적을 생성합니다. 오류가 있는 경우 MARA GitHub 리포지토리의 알려진 문제/주의 사항 섹션에서 제안 사항을 확인하세요.

3. Python 가상 환경을 활성화합니다. 이 명령은 가상 환경을 사용하도록 PATH 및 기타 환경 변수를 설정합니다.

$ source ./pulumi/python/venv/bin/activate

4. MicroK8s 클러스터가 MARA 배포에 대해 올바르게 구성되었는지 확인합니다.

$ ./bin/testcap.sh

This script will perform testing on the current kubernetes installation using the currently active kubernetes configuration and context.
Any failures should be investigated, as they will indicate that the
installation does not meet the minimum set of capabilities required to run MARA.

...
==============================================================
| All tests passed! This system meets the basic requirements |
| to deploy MARA.                                            |
==============================================================

2-3. MARA 배포

이 섹션에서 MARA를 배포하는 데 사용되는 start.sh 스크립트는 배포에 성공하기 위해 추가 작업이 필요한 옵션을 수용합니다. 단순화를 위해 여기서는 다음과 같은 기본 배포를 가정합니다.

  • 지원되는 다른 배포 옵션 중 하나가 아닌 kubeconfig 파일을 사용합니다. 다른 옵션에 대한 자세한 내용은 GitHub 리포지토리에서 시작하기 가이드를 참조하세요.
  • MARA를 테스트한 최신 버전의 NGINX 오픈소스를 사용합니다(최신 버전일 필요는 없음).
  • NGINX 오픈소스를 기반으로 하는 NGINX Ingress Controller를 사용합니다. NGINX Plus 기반 NGINX Ingress Controller를 사용하려면 Kubernetes 클러스터의 F5 Docker 레지스트리에서 NGINX Plus 기반 이미지를 사용해야 합니다. 첫 번째 NOTICE를 확인하세요! 자세한 내용은 아래 3단계를 참조하세요.
  • 단일 표준 Kubernetes 컨텍스트를 사용합니다. 두 번째 NOTICE를 참조하세요! 3단계에서.

MicroK8s 클러스터에 MARA 배포:

1. start.sh 스크립트를 실행합니다.

Pulumi를 사용하도록 워크스테이션을 아직 구성하지 않은 경우 Pulumi에 로그인(필요한 경우 계정 생성)한 다음 Pulumi 계정과 연결된 API 토큰을 입력하라는 메시지가 표시됩니다.

$ ./bin/start.sh
Adding to [/home/ubuntu/kic-reference-architectures/bin/venv/bin] to PATH
Manage your Pulumi stacks by logging in.
Run `pulumi login --help` for alternative login options.
Enter your access token from https://app.pulumi.com/account/tokens
    or hit <ENTER> to log in using your browser            : <token>

Please read the documentation for more details.

2. 배포 유형을 선택하고 프롬프트에서 k를 입력하여 kubeconfig 파일로 배포를 빌드합니다. make 및 Docker가 설치되지 않는다는 경고를 무시하십시오. 배포는 대신 레지스트리의 NGINX Ingress Controller 이미지를 사용합니다.

Type a for AWS, k for kubeconfig? k

Calling kubeconfig startup script
make is not installed - it must be installed if you intend to build NGINX Kubernetes Ingress Controller from source.
docker is not installed - it must be installed if you intend to build NGINX Kubernetes Ingress Controller from source.

3. 프롬프트에서 생성할 Pulumi 스택의 이름(여기서는 mara)을 지정합니다. Pulumi 계정 내에서 고유해야 합니다.

Enter the name of the Pulumi stack to use in all projects: mara
Submodule source found
Configuring all Pulumi projects to use the stack: mara
Created stack 'mara'

NOTICE! Currently the deployment via kubeconfig only supports pulling images from the registry! A JWT is required in order to access the NGINX Plus repository. This should be placed in a file in the extras directory in the root, in a file named jwt.token

See https://docs.nginx.com/nginx-ingress-controller/installation/using-the-jwt-token-docker-secret/ for more details and examples.

No JWT found; writing placeholder manifest

NOTICE! When using a kubeconfig file you need to ensure that your environment is configured to connect to Kubernetes properly. If you have multiple kubernetes contexts (or custom contexts) you may need to remove them and replace them with a simple ~/.kube/config file. This will be addressed in a future release.

4. 프롬프트에서 kubeconfig 파일의 전체 경로와 클러스터 이름을 지정합니다. 여기에 /home/<username>/.kube/config 및 microk8s-cluster가 있습니다.

Provide an absolute path to your kubeconfig file
value: /home/<username>/.kube/config
Provide your clustername
value: microk8s-cluster
Attempting to connect to kubernetes cluster

5. 다음 프롬프트에서 클러스터의 FQDN(정규화된 도메인 이름)을 지정합니다. 스크립트는 NGINX Ingress Controller를 구성하고 자체 서명된 인증서를 생성하는 두 가지 목적으로 FQDN을 사용합니다(두 번째 사용은 값이 IP 주소가 될 수 없음을 의미함). mara.example.com을 다른 FQDN으로 대체하는 경우 다음 단계에서도 이를 사용해야 합니다.

Create a fqdn for your deployment
value: mara.example.com

6. Grafana 관리자 암호를 지정합니다.

Create a password for the grafana admin user; this password will be used to access the Grafana dashboard
This should be an alphanumeric string without any shell special characters; it is presented in plain text due to current limitations with Pulumi secrets. You will need this password to access the Grafana dashboard.
value: <password>
  • 설치 프로세스의 추적이 나타나고 각 단계에 대해 다음 정보가 표시됩니다.
  • 단계에서 수행된 주요 작업을 설명하는 배너(예: Logstore는 Elasticsearch 배포 시작 신호)
  • 풀미가 수행할 작업 목록
  • 각 Pulumi 작업에 대한 실시간 상태 표시기
  • Pulumi 및 MARA에서 생성한 진단(예: 정의된 호스트 이름 및 IP 주소)
  • 영향을 받는 리소스의 수
  • 경과 시간

최종 단계(Bank of Sirius의 경우)가 완료되면 추적은 MetalLB(여기서는 192.168.100.100)에 의해 NGINX Ingress Controller에 할당된 IP 주소와 배포를 위해 선택한 FQDN(여기서는 mara.example.com)을 다른 것과 함께 보고합니다. 배포에 대한 정보입니다.

The startup process has finished successfully

Next Steps:
1. Map the IP address (192.168.100.100) of your Ingress Controller with your FQDN (mara.example.com).
2. Use the ./bin/test-forward.sh program to establish tunnels you can use to connect to the management tools.
3. Use kubectl, k9s, or the Kubernetes dashboard to explore your deployment.

To review your configuration options, including the passwords defined, you can access the pulumi secrets via the following commands:

Main Configuration: pulumi config -C /jenkins/workspace/jaytest/bin/../pulumi/python/config

Bank of Sirius (Example Application) Configuration: pulumi config -C /jenkins/workspace/jaytest/bin/../pulumi/python/kubernetes/applications/sirius

K8 Loadbalancer IP: kubectl get services --namespace nginx-ingress

Please see the documentation in the github repository for more information

7. FQDN을 확인하는 데 사용하는 도구(예: 로컬 /etc/hosts 파일 또는 DNS 서버)에서 이전 단계에서 보고된 FQDN과 IP 주소 간의 매핑을 만듭니다.

8. MARA 배포에 대한 요청이 성공했는지 확인합니다. curl이 자체 서명된 인증서를 허용하도록 -k 옵션을 포함합니다. 인증서에 대한 추가 정보를 표시하려면 -v 옵션을 추가하십시오.

$ curl  -k -I https://mara.example.com
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Day, DD Mon YYYY hh:mm:ss TZ
Content-Type: text/html; charset=utf-8
Content-Length: 7016
Connection: keep-alive

9. 브라우저에서 https://mara.example.com으로 이동하여 Bank of Sirius 웹사이트를 표시합니다. 작성 당시 많은 브라우저(Firefox 및 Safari 포함)에서 자체 서명된 인증서를 사용하여 사이트에 대해 표시되는 경고를 안전하게 클릭할 수 있습니다. Chrome을 사용하지 않는 것이 좋습니다. 최근 보안 변경으로 인해 사이트 액세스가 금지될 수 있습니다.

10. test-forward.sh 스크립트를 실행하여 Kubernetes 포트 전달을 설정하면 Elasticsearch, Grafana, Kibana, Locust 및 Prometheus와 같은 MARA 관리 제품군의 도구에 액세스할 수 있습니다. 스크립트는 적절한 서비스 이름을 결정하고 kubectl 명령을 실행하여 로컬 포트로 전달합니다.

참고: 포트 전달이 올바르게 작동하려면 브라우저가 이 명령을 실행하는 명령 셸과 동일한 시스템에서 실행 중이어야 합니다. 그렇지 않은 경우(예: 가상화 환경을 사용하고 있기 때문에) 명령은 성공한 것처럼 보이지만 실제로는 포트 전달이 작동하지 않습니다. 자세한 내용은 GitHub 리포지토리에서 MARA의 관리 도구 액세스를 참조하십시오.

$ ./bin/test-forward.sh
Connections Details
====================================
Kibana:        http://localhost:5601
Grafana:       http://localhost:3000
Locust:        http://localhost:8089
Prometheus:    http://localhost:9090
Elasticsearch: http://localhost:9200
====================================

Issue Ctrl-C to Exit

3. 요약

이 지침을 따르면 작동하는 MARA 배포가 약 20분 이내에 사용자 환경에서 시작되어 실행됩니다. 이 시점에서 다른 Kubernetes 애플리케이션과 마찬가지로 Bank of Sirius 애플리케이션과 상호 작용할 수 있습니다. 시작하기에 좋은 곳은 내장된 관찰 가능성 도구를 사용하여 Locust에서 다양한 양의 로드를 생성할 때 환경이 어떻게 작동하는지 테스트하는 것입니다.

NGINX의 목표는 MARA를 가능한 한 많은 Kubernetes 사용자에게 최대한 유용하게 만드는 것입니다.