NGINX Modern Apps Reference Architecture (MARA) 프로젝트를 시작했을 때 우리는 IaaS 공급업체로 AWS를 선택했습니다. 이미 해당 플랫폼에 익숙했고, 부서 예산으로 비용을 충당할 수 있었기 때문입니다. 물론 모든 사람이 동일한 경험이나 예산을 가지고 있는 것은 아니며, 여러분 중 많은 분들이 K3s , Canonical MicroK8s , minikube 와 같은 Kubernetes 배포판을 사용하여 실험실 기반 환경이나 워크스테이션에서 MARA를 로컬로 실행할 수 있는 옵션을 제공해 달라고 요청하셨습니다.
여러분의 의견을 듣고 오늘 MicroK8s에서 MARA를 테스트했으며 직접 배포할 수 있도록 지침을 제공하게 되어 기쁩니다!
우리가 테스트에 MicroK8s를 선택한 이유는 무엇입니까? 이 솔루션은 쉽게 배포할 수 있는 모델로 메모리 사용량이 적고 MARA에 필요한 DNS, 스토리지, 송신 기능을 제공합니다. MicroK8s를 사용하면 테스트 시나리오를 쉽고 반복적으로 반복하여 합리적인 수준의 성능을 제공하는 배포에 필요한 최소 요구 사항을 확인할 수 있습니다.
우리는 이 작업을 통해 다른 Kubernetes 배포판에 대한 테스트가 용이해질 것으로 기대합니다. 다양한 배포판의 현재 상태에 대한 정보는 GitHub 저장소를 참조하세요. 목록에 추가하고 싶은 선호하는 배포판이 있으면 포크하고 테스트하고 풀 리퀘스트를 만들어 보세요!
MARA를 로컬에서 실행하는 데 가장 큰 제약은 메모리와 CPU입니다. 예비 테스트 중에 우리는 메모리 고갈 문제의 대부분이 Elasticsearch와 관련이 있다는 것을 발견했습니다. Kibana는 메모리 양이 매우 적은( 16GB 미만) 구성에서는 거의 사용할 수 없습니다. 이 문제를 해결하기 위해, Elasticsearch 전체 배포에 일반적으로 포함되는 중복 보호 기능을 제거하는 MARA 구성 파일에서 설정을 제공했습니다. 이로 인해 실패 모드의 수가 늘어나지만, 리소스가 제한된 환경에서는 불가피한 타협입니다.
CPU에 대한 제약은 샘플 Bank of Sirius 애플리케이션에 가해지는 부하량과 직접적으로 연결됩니다. MARA 배포에는 Bank of Sirius에 부하를 생성하는 Locust가 포함되어 있으며, 사용자가 제어하는 사용자 수 설정과 새 사용자의 생성 속도가 포함됩니다.
시리우스 은행의 부하가 증가하면 나머지 시스템에도 영향을 미칩니다. 사용자 수나 생성 속도가 너무 높으면 MARA 성능이 저하되어 구성 요소가 충돌하거나 멈출 가능성이 높습니다. 이러한 동작을 유발하는 값은 사용 가능한 CPU에 따라 달라지지만, 요구 사항 에 지정된 용량 이상으로 배포하면 최대 64명의 사용자와 한 번에 16명의 사용자에 의해 생성된 부하를 처리할 수 있습니다.
이제 배경 지식을 갖추었으니, MicroK8s에서 MARA를 세울 준비가 되었습니다!
Ubuntu 20.04(Focal) 이상을 실행하는 시스템(베어메탈 Linux 서버, 가상화 또는 클라우드)에서 루트
액세스(최소:
MARA에 필요한 모든 라이브러리와 바이너리가 포함된 로컬 시스템의 Python 3 가상 환경입니다. Python 3이 아직 설치되지 않았다면 다음 명령을 실행하세요.
$ sudo apt update$ sudo apt install -y python3-venv
NGINX Ingress Controller 송신에 할당할 MicroK8s의 통합 MetalLB 부하 분산 장치에 사용할 최소 하나의 여유 IPv4 주소가 필요합니다. 로컬호스트를 통해 Bank of Sirius 애플리케이션에 접속하는 경우, 사용 가능한 개인 ( RFC 1918 호환) 주소라면 모두 허용됩니다. 예를 들어, 네트워크가 192.168.100.0/24인 경우 10.10.10.10과 같은 주소를 사용할 수 있습니다.
풀루미 계정과 액세스 토큰. 아직 없는 경우 MARA 배포 의 1단계 에서 생성합니다.
Pulumi를 사용하면 상태 파일을 S3 호환 객체 저장소나 로컬 파일 시스템에 저장할 수 있지만, 이 글을 쓰는 시점에서는 MARA에서는 이를 지원하지 않습니다. 이런 제한은 MARA 또는 Pulumi의 향후 릴리스에서 제거될 예정입니다.
MicroK8s 설치:
$ sudo snap install microk8s --classicmicrok8s (1.23/stable) v1.23.3 from Canonical✓ installed
microk8s
명령을 실행하는 데 필요한 권한을 설정합니다. 을 위한 <사용자 이름>
, 귀하의 계정을 대체하십시오 뿌리
시스템에 대한 권한:
$ sudo usermod -a -G microk8s <username>$ sudo chown -f -R <username> ~/.kube
$ newgrp microk8s
새로운 권한이 적용되도록 루트 권한이 있는 계정에서 로그아웃했다가 다시 로그인하세요.
DNS , 스토리지 , MetalLB 에 대한 MicroK8s 애드온을 활성화합니다.
프롬프트에서 X . X . X . X ‑ X . X . X . Y
형태의 IP 주소 범위를 지정하여 다음을 나타냅니다.
192.168.100.100-192.168.100.110
, 아래에 사용된 값)192.168.100.100-192.168.100.100
)$ microk8s enable dns storage metallbEnabling 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
MicroK8s가 실행 중인지 확인하세요:
$ microk8s statusmicrok8s 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
...
대부분의 유틸리티가 찾을 것으로 예상하는 파일( ~/.kube/config )에 MicroK8s 구성을 로드하고 디렉토리 및 파일에 권장되는 권한을 설정합니다.
$ microk8s config > ~/.kube/config$ sudo chmod 0644 ~/.kube/config
MARA 저장소를 복제하고 Bank of Sirius 하위 모듈을 초기화합니다.
$ git clone https://github.com/nginxinc/kic-reference-architectures.git$ cd kic-reference-architectures/
$ git submodule update --init --recursive --remote
복제된 MARA 리포의 루트 디렉토리에서 작업합니다(이전 단계에서 해당 디렉토리를 변경했습니다). MicroK8s 클러스터에 대한 Python 가상 환경을 설정합니다.
$ ./bin/setup_venv.sh
이 명령은 긴 추적을 생성합니다. 오류가 있는 경우 MARA GitHub 저장소의 알려진 문제/주의 사항 섹션에서 제안 사항을 확인하세요.
Python 가상 환경을 활성화합니다. 이 명령은 가상 환경을 사용하도록 PATH
및 기타 환경 변수를 설정합니다.
$ source ./pulumi/python/venv/bin/activate
MARA 배포를 위해 MicroK8s 클러스터가 올바르게 구성되었는지 확인하세요.
$ ./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. |
==============================================================
이 섹션에서 MARA를 배포하는 데 사용되는 start.sh
스크립트는 배포를 성공적으로 수행하기 위해 추가 작업이 필요한 옵션을 제공합니다. 단순화를 위해 여기서는 다음과 같은 기본 배포를 가정합니다.
공지사항을
참조하세요.공지사항을
확인하세요.MicroK8s 클러스터에 MARA 배포:
아직 Pulumi를 사용하도록 워크스테이션을 구성하지 않은 경우 Pulumi에 로그인하라는 메시지가 표시되고(필요한 경우 계정 생성) Pulumi 계정과 연결된 API 토큰을 입력하라는 메시지가 표시됩니다.
$ ./bin/start.shAdding 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.
배포 유형을 선택하고 프롬프트에 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.
프롬프트에서, 생성할 Pulumi 스택의 이름을 지정합니다(여기서는 mara
). 이는 Pulumi 계정 내에서 고유해야 합니다.
Enter the name of the Pulumi stack to use in all projects: maraSubmodule 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.
프롬프트에서 kubeconfig 파일의 전체 경로와 클러스터 이름을 지정합니다. 여기 있습니다 /집/<사용자 이름>/.kube/config
그리고 마이크로k8s-클러스터
.
Provide an absolute path to your kubeconfig filevalue: /home/<username>/.kube/config
Provide your clustername
value: microk8s-cluster
Attempting to connect to kubernetes cluster
다음 프롬프트에서 클러스터의 정규화된 도메인 이름(FQDN)을 지정하세요. 스크립트는 두 가지 목적으로 FQDN을 사용합니다. NGINX Ingress Controller를 구성하고 자체 서명된 인증서를 만드는 것입니다(두 번째 용도는 값이 IP 주소일 수 없음을 의미합니다). mara.example.com을
다른 FQDN으로 대체한 경우 다음 단계에서도 해당 FQDN을 사용해야 합니다.
Create a fqdn for your deploymentvalue: mara.example.com
Grafana 관리자 비밀번호를 지정하세요:
Create a password for the grafana admin user; this password will be used to access the Grafana dashboardThis 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 배포 시작을 알립니다)마지막 단계(Bank of Sirius의 경우)가 완료되면 추적은 MetalLB가 NGINX Ingress Controller에 할당한 IP 주소를 보고합니다(여기서는192.168.100.100
) 및 배포를 위해 선택한 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
이전 단계에서 보고된 FQDN과 IP 주소 간의 매핑을 FQDN을 확인하는 데 사용하는 도구(로컬 /etc/hosts 파일 또는 DNS 서버 등)에서 만듭니다.
MARA 배포 요청이 성공했는지 확인합니다. -k
옵션을 포함하면 curl이
자체 서명된 인증서를 허용합니다. 인증서에 대한 자세한 정보를 표시하려면 -v
옵션을 추가하세요.
$ curl -k -I https://mara.example.comHTTP/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
브라우저에서 https://mara.example.com 으로 이동하여 Bank of Sirius 웹사이트를 표시합니다. 이 글을 쓰는 시점에서는 많은 브라우저(Firefox와 Safari 포함)에서 자체 서명된 인증서를 이용하여 사이트에 대한 경고를 안전하게 클릭할 수 있습니다. Chrome을 사용하지 않는 것이 좋습니다. 최근 보안 변경으로 인해 사이트에 접속하지 못할 가능성이 있습니다.
test-forward.sh
스크립트를 실행하여 Kubernetes 포트 포워딩을 설정하여 MARA 관리 제품군의 도구( Elasticsearch , Grafana , Kibana , Locust , Prometheus) 에 액세스할 수 있습니다. 스크립트는 적절한 서비스 이름을 결정하고 kubectl
명령을 실행하여 이를 로컬 포트로 전달합니다.
메모: 포트 포워딩이 제대로 작동하려면 브라우저가 이 명령을 실행하는 명령 셸과 동일한 시스템에서 실행되어야 합니다. 그렇지 않은 경우(예를 들어 가상화 환경을 사용하는 경우) 명령은 성공한 것처럼 보이지만 포트 포워딩은 실제로 작동하지 않습니다. 자세한 내용은 GitHub 저장소에서 MARA의 관리 도구 액세스를 참조하세요.
$ ./bin/test-forward.shConnections 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
다 됐어요! 이러한 지침을 따르면 약 20분 내에 사용자 환경에서 작동하는 MARA 배포가 시작됩니다. 이 시점에서 다른 Kubernetes 애플리케이션과 마찬가지로 Bank of Sirius 애플리케이션과 상호작용할 수 있습니다. 좋은 시작점은 내장된 관찰 도구를 사용하여 Locust로 서로 다른 양의 부하를 생성할 때 환경이 어떻게 작동하는지 테스트하는 것입니다.
우리의 목표는 가능한 한 많은 Kubernetes 사용자에게 MARA를 최대한 유용하게 만드는 것입니다. 일부 구성 요소에 대한 선택이 마음에 들지 않으신가요? 공유하고 싶다면 구성 요소를 대체하고 풀 리퀘스트를 열어보세요 . 또한, 저희 저장소의 이슈 및 토론 페이지에서 생각을 공유하고 질문을 올려주세요. 의심스러운 가정에 대한 질문도 포함됩니다.
이 게시물은 시리즈의 일부입니다. 시간이 지남에 따라 MARA에 기능을 추가함에 따라 블로그에 세부 정보를 게시하고 있습니다.
"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."