이 블로그 게시물에서는 다음 블로그 게시물에 대한 후속 조치로 ASP.NET 코어 Kubernetes 튜토리얼을 다룹니다. ASP.NET 핵심 마이크로서비스: 시작하기.
방금 이 영상을 보고 예상했던 것보다 훨씬 더 크게 웃었습니다. pic.twitter.com/R1wleGZM0B
- 카르멘 크린콜리 - @crincoli.org (@CarmenCrincoli) 2019년 8월 6일
이전 블로그 게시물에서는 로컬 배포 및 개발 목적으로 docker-compose를 사용하여 Couchbase를 사용하는 ASP.NET Core 마이크로서비스를 만들었습니다. 프로덕션 준비가 완료되면, 서비스는 종종 다음과 같은 관리형 Kubernetes 서비스에 배포됩니다. AKS, EKS, GKE등
이 ASP.NET Core Kubernetes 자습서에는 Azure AKS와 관련된 몇 가지 단계가 포함되어 있지만, 이 자료의 대부분은 모든 Kubernetes 클러스터에 적용할 수 있습니다.
ASP.NET Core Kubernetes 튜토리얼 개요
이 ASP.NET 코어 쿠버네티스 자습서에서는 이러한 단계를 안내해드리겠습니다:
- 도커 이미지를 빌드하여 도커 허브로 푸시하기
- Azure에서 AKS 클러스터 만들기
- AKS에 ASP.NET Core 마이크로서비스 배포
- 쿠버네티스 오퍼레이터를 사용하여 카우치베이스 서버를 배포합니다.
또한 선택 사항이지만 매우 유용한 몇 가지 주제를 다루려고 합니다:
- DNS SRV를 사용하여 ASP.NET Core 마이크로서비스가 데이터베이스를 찾을 수 있도록 허용하기
- AKS 파드에 대한 터널 액세스를 위해 kubectl로 포트 포워딩 설정하기
- AKS에서 Kubernetes 대시보드 보기
- ASP.NET Core 마이크로서비스를 인터넷에 노출하기 위해 Kubernetes에서 로드 밸런서 서비스 설정하기
이 튜토리얼을 최대한 활용하기 위한 전제 조건입니다:
- 도커 설치, 도커 및 도커 허브에 대한 기본 지식
- 반드시 필요한 것은 아니지만 비주얼 스튜디오가 설치되어 있어야 합니다.
- Azure 계정(계정이 없는 경우 다음을 수행할 수 있습니다. 지금 가입하고 $200 크레딧 받기 를 무료로 다운로드하세요.) EKS, GKE 등을 사용하려는 경우에도 이 튜토리얼을 따라할 수 있지만 몇 가지 단계를 직접 대체해야 합니다.
- kubectl(쿠버네티스용)이 설치됨
도커 이미지 빌드
쿠버네티스 배포는 컨테이너 이미지를 사용합니다. 프라이빗 컨테이너 레지스트리를 위한 많은 옵션이 있습니다( Azure 컨테이너 레지스트리), 하지만 이 튜토리얼에서는 간단하게 설명하기 위해 평범한 오래된 도커 허브.
먼저 이전 블로그 게시물에서 만든 ASP.NET 코어 마이크로서비스에서 Docker 이미지를 빌드하는 것으로 시작하겠습니다. Visual Studio에서 Docker파일을 마우스 오른쪽 버튼으로 클릭하고 "빌드 도커 이미지"를 선택하기만 하면 됩니다.
이미지가 빌드되면 로컬 Docker 이미지 리포지토리에 표시됩니다. 명령줄에서 "docker images"를 사용하여 이 리포지토리를 볼 수 있습니다:
1 2 3 4 |
PS C:\사용자\mgroves> 도커 이미지 리포지토리 태그 이미지 ID 생성됨 크기 매트그로브/헬로마이크로서비스 최신 b2387e47a826 3 주 전 213MB 헬로마이크로서비스 최신 b2387e47a826 3 주 전 213MB |
다음 단계는 다음과 같습니다. 이 이미지를 도커 허브로 푸시합니다. (이전에 Docker 허브를 사용해 본 적이 없는 경우 검토하세요). 저는 이미지를 Docker에 푸시했습니다. 도커 푸시 매트그로브/헬로마이크로서비스
명령을 실행한다. 대부분 이미지에 릴리스 번호를 태그하여 Kubernetes가 배포하려는 정확한 버전을 가져오는지 확인하고 싶을 것입니다.
이 단계를 건너뛰고 싶다면 제 Docker 이미지를 예로 사용할 수 있습니다: 매트그로브/헬로마이크로서비스.
배포를 위한 YAML 파일 작성
이제 Docker 이미지를 게시했으므로, Kubernetes 배포를 위한 YAML 파일 작성을 시작할 수 있습니다. 이 자습서에서는 Kubernetes에 대해 알아야 할 모든 것을 다루지는 않지만 가능한 한 주목할 만한 부분을 지적할 것입니다. 이 자습서에서는 Couchbase Operator와 함께 제공되는 YAML 파일과 함께 총 3개의 YAML 파일을 생성합니다.
이러한 각 YAML 파일은 쿠버네티스 리소스에 해당한다. 쿠버네티스는 클러스터에서 생성한 리소스에 따라 클러스터를 오케스트레이션합니다.
ASP.NET 코어 마이크로서비스 리소스와 카우치베이스 클러스터 리소스는 각각 하나 이상의 "pods" 를 생성하고 있습니다. 다른 유형의 리소스는 다음과 같습니다. "비밀" (민감한 정보를 관리 및 저장하기 위해) 및 "서비스" (포드 세트를 노출하기 위해) 및 기타 여러 가지를 사용할 수 있습니다.
ASP.NET 핵심 마이크로서비스
먼저 ASP.NET Core 마이크로서비스 배포를 위한 YAML 파일부터 만들어 보겠습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
apiVersion: 앱/v1beta1 1.8.0 이전 버전은 apps/v1beta1을 사용하세요. 종류: 배포 메타데이터: 이름: hello-마이크로서비스-앱-배포 사양: 선택기: matchLabels: 앱: hello-마이크로서비스-앱 복제본: 1 #는 배포가 템플릿과 일치하는 # 파드를 실행하도록 지시한다. 템플릿: # 이 템플릿의 파드 정의를 사용하여 파드를 생성한다. 메타데이터: 레이블: 앱: hello-마이크로서비스-앱 사양: 컨테이너: - 이름: hello-마이크로서비스-앱 이미지: 매트그로브/헬로마이크로서비스 이미지 풀 정책: 항상 포트: - 컨테이너 포트: 80 이름: 서버 환경: - 이름: Couchbase__사용자 이름 valueFrom: secretKeyRef: 이름: cb-헬로마이크로서비스-auth 키: 사용자 이름 - 이름: 카우치베이스__암호 valueFrom: secretKeyRef: 이름: cb-헬로마이크로서비스-auth 키: 비밀번호 - 이름: 카우치베이스__커넥션스트링 값: 카우치베이스://cb-hellomicroservices-srv 리소스: 요청: cpu: 100m 메모리: 128Mi 제한: cpu: 250m 메모리: 256Mi |
hello-microservice.yaml에 대한 참고 사항:
spec.replicas
: 이것은 쿠버네티스가 이 서비스의 파드 수를 생성할지 알려준다. 처음에는 1개로도 충분하지만, 확장함에 따라 더 많은 파드가 필요할 것입니다(그리고 나중에 다루게 될 LoadBalancer도 필요할 것입니다).spec.template.spec.containers.image
: 이것은 쿠버네티스에 어떤 이미지를 사용할지 알려준다. 제 경우에는 이 튜토리얼의 앞부분에서 빌드하고 Docker 허브에 배포한 매트그로브/헬로마이크로서비스가 사용됩니다.환경
: 이는 각 컨테이너에 대한 환경 변수를 정의합니다. 이미지에서 이러한 자격 증명을 하드코딩하는 대신 이전 블로그 게시물에서 했던 것처럼 사용자 이름, 비밀번호 및 연결 문자열을 ASP.NET Core 마이크로서비스에 전달하고 있습니다. Couchbase__ConnectionString 및 DNS SRV에 대해서는 나중에 자세히 설명합니다.- Couchbase 클러스터가 다른 네임스페이스에 있는 경우 "service.namespace"를 사용할 수도 있습니다.
카우치베이스 클러스터
다음으로, 다음은 데이터베이스에 대한 YAML 파일입니다. 카우치베이스 쿠버네티스 운영자:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
apiVersion: 카우치베이스.com/v1 종류: 카우치베이스클러스터 메타데이터: 이름: cb-헬로마이크로서비스 사양: baseImage: 카우치베이스 버전: 6.5.0-베타2 authSecret: cb-헬로마이크로서비스-auth 노출 관리자 콘솔: true 관리자 콘솔 서비스: - 데이터 클러스터: 데이터서비스메모리쿼터: 256 인덱스서비스메모리쿼터: 256 검색서비스메모리쿼터: 256 이벤트 서비스 메모리 할당량: 256 분석서비스메모리쿼터: 1024 인덱스 스토리지 설정: 플라즈마 자동 페일오버 타임아웃: 30 자동 장애 조치 최대 횟수: 3 자동 페일오버 온 데이터 디스크 문제: true 자동 페일오버 온 데이터 디스크 이슈 시간 기간: 30 자동 페일오버 서버 그룹: false 버킷: - 이름: 헬로마이크로서비스 유형: 카우치베이스 메모리 쿼터: 256 복제본: 0 ioPriority: 높은 퇴거 정책: 전체 퇴거 충돌 해결: seqno 활성화Flush: false enableIndexReplica: false 서버: - 크기: 1 이름: 모든 서비스 서비스: - 데이터 - 색인 - 쿼리 |
이 YAML 파일 자체만으로는 오퍼레이터를 사용하기에 충분하지 않지만, 오퍼레이터 설치는 이 튜토리얼의 뒷부분에서 설명할 것이다. 또한 Operator 패턴은 점점 더 일반화되고 있으며 Kubernetes에서 상태 저장 소프트웨어를 관리하는 효과적인 방법이지만, YAML은 사용 중인 데이터베이스에 따라 달라집니다(즉, 이 YAML은 Couchbase Server에서만 작동합니다).
couchbase-cluster.yaml에 대한 참고 사항:
spec.version
사용할 Couchbase 컨테이너 이미지를 지정합니다. 저는 베타2 릴리스를 사용하고 있습니다. 이 글을 쓰는 현재 이 운영자는 Enterprise 버전에서만 작동합니다. 이는 곧 변경될 수 있습니다.spec.cluster
,spec.buckets
,spec.servers
Couchbase Server 클러스터에 대한 다양한 설정을 정의합니다. 제발 전체 목록은 문서를 참조하세요. 설정의 일부입니다. 이 예제 파일은 일부만 다루고 있습니다.
카우치베이스 "비밀"
또한 "시크릿" 리소스도 생성했습니다. 시크릿은 자격 증명, 비밀번호, 권한 토큰 등과 같은 구성 정보를 저장하고 관리할 수 있는 곳으로, Kubernetes API 자체에서 사용할 수 있습니다.
1 2 3 4 5 6 7 8 |
apiVersion: v1 종류: 비밀 메타데이터: 이름: cb-헬로마이크로서비스-auth 유형: 불투명 데이터: 사용자 이름: QWRtaW5pc3RyYXRvcg== # 관리자 비밀번호: cGFzc3dvcmQ= # 비밀번호 |
이 비밀에는 Couchbase(및 ASP.NET Core 마이크로서비스)에서 사용하려는 자격 증명이 포함되어 있습니다. 값은 base64로 인코딩됩니다(주석의 실제 값). 이 예제 자격 증명은 실제 배포에 충분하지 않으므로 추측하기 어려운 것으로 변경하세요.
참고 메타데이터.이름
는 "cb-hellomicroservices-auth"입니다. 이 시크릿이 어떻게 참조되는지 보려면 hello-microservice.yaml 및 couchbase-cluster.yaml을 다시 살펴보세요.
DNS SRV
hello-microservice.yaml을 다시 살펴보세요. 아래 환경
에서 "Couchbase__ConnectionString" 및 "couchbase://cb-hellomicroservices-srv"의 이름/값 쌍을 확인할 수 있습니다. ASP.NET Core IP 주소나 Couchbase Server 노드의 URL을 제공하는 대신, 연결 문자열을 사용하여 이를 DNS SRV 항목.
Couchbase 클러스터에서 Couchbase를 실행하는 실제 파드는 정기적으로 이름을 변경할 가능성이 있습니다. 따라서 DNS SRV를 사용하여 Couchbase 서비스를 찾는 것이 좋습니다. 다행히도 Couchbase 자율 운영자는 DNS SRV 항목을 자동으로 생성합니다.
곧 쿠버네티스 대시보드에서 확인할 수 있게 되겠지만, 그 동안은 Couchbase 클러스터 이름에 "-srv"를 더한 이름이라는 점에 유의하세요. 따라서 저희의 경우, "cb-hellomicroservices-srv"가 됩니다.
이전 블로그 게시물 이후 ASP.NET 코어 마이크로서비스에 한 가지 사소한 변경을 했습니다: 이제 저는 Couchbase.Extensions.DnsDiscovery 라이브러리.
NuGet에서 이 라이브러리를 추가하고 앱설정.json에서 Server 대신 ConnectionString을 사용하는 것 외에 변경해야 할 다른 사항은 다음과 같습니다. 카우치베이스Dns디스커버리 추가
내에서 서비스 구성
메서드를 사용합니다.
1 2 |
서비스.카우치베이스 추가(구성.섹션 가져오기("Couchbase")); 서비스.카우치베이스Dns디스커버리 추가(); |
아주 간단합니다. DNS SRV에 대한 자세한 내용은 다음을 확인하세요. SRV 레코드 를 참조하세요.
AKS에 배포
이제 AKS에 배포할 준비가 되었습니다. 지금까지 준비된 내용은 다음과 같습니다:
- 도커 허브의 ASP.NET 코어 도커 이미지
- ASP.NET Core 배포용 YAML 파일
- 카우치베이스 클러스터 배포를 위한 YAML 파일
- 카우치베이스 시크릿을 위한 YAML 파일(2와 3에서 참조)
AKS에 배포하기 위해 빠른 시작: Azure CLI를 사용하여 Azure Kubernetes Service 클러스터 배포하기 를 참조하세요. 다음은 제가 수행한 단계에 대한 간략한 요약입니다:
(로컬 명령줄을 사용하려면 다음이 있는지 확인하세요. azure-cli 가 설치되어 있어야 합니다. 그렇지 않은 경우 Azure 클라우드 셸).
먼저 Azure에 로그인합니다: az 로그인
. 웹 브라우저에 자격 증명을 입력하라는 메시지가 표시됩니다.
로그인한 후 먼저 '리소스 그룹'을 만듭니다. 이 그룹은 Azure 내의 조직 그룹입니다. 데이터 센터를 지정합니다(저는 eastus를 사용했습니다).
az 그룹 생성 --이름 helloMicroserviceGroup --location eastus
다음으로 방금 만든 리소스 그룹을 사용하여 AKS 클러스터를 만듭니다. 이를 위한 많은 옵션이 있습니다. 이 연습을 비교적 저렴하고 간단하게 유지하기 위해, 저는 Standard_B2s VM 크기를 사용하여 3개의 노드를 생성하기로 했습니다. Couchbase의 프로덕션 배포의 경우, 더 강력한 크기가 필요하거나 원할 것입니다.
az aks create --resource-group helloMicroserviceGroup --name helloMicroserviceAks --node-count 3 --node-vm-size Standard_B2s --enable-addons monitoring --generate-ssh-keys
이 단계는 실행하는 데 시간이 다소 걸립니다. Azure에서 이 Kubernetes AKS 클러스터를 설정하는 데 약 10분 정도 소요될 것으로 예상합니다.
클러스터가 생성되면 자격 증명 가져오기
를 사용하여 kubectl이 사용할 클러스터를 알린다.
az aks get-credentials --resource-group helloMicroserviceGroup --name helloMicroserviceAks
이제 다음을 수행해야 할 때입니다. create 일부 쿠버네티스 리소스. 처음 6개의 YAML 파일은 "Kubernetes" 아래에서 다운로드할 수 있습니다. couchbase.com/downloads.
1 2 3 4 5 6 |
kubectl create -f crd.yaml kubectl create -f 입학.yaml kubectl create -f 연산자-역할.yaml kubectl create -f 연산자-서비스-계정.yaml kubectl create -f 연산자-역할-바인딩.yaml kubectl create -f 연산자-배포.yaml |
그런 다음 이 튜토리얼에서 만든 세 개의 YAML 파일을 사용합니다:
1 2 3 |
kubectl create -f 비밀.yaml kubectl create -f 카우치베이스-클러스터.yaml kubectl create -f hello-마이크로서비스.yaml |
쿠버네티스 파드의 상태를 확인하려면, 다음을 사용한다. kubectl 파드 가져오기
. Couchbase 포드가 준비되는 데 몇 분 정도 걸립니다.
포트 포워딩
위의 배포에서, Kubernetes 배포 중 어떤 것도 실제로 Kubernetes 외부에 노출되지 않습니다. 마이크로서비스가 작동하는지 확인할 수 있는 한 가지 방법은 kubectl 포트 포워드
명령을 실행합니다. 그러면 지정된 파드에 로컬호스트 "터널"이 생성됩니다.
예를 들어, 로컬 호스트 포트 5000에서 포트 80에서 실행되는 ASP.NET Core 마이크로서비스로 터널을 만들어 보겠습니다:
kubectl 포트 포워드 5000:80
이제 브라우저에서 http://locahost:5000 을 사용하여 마이크로서비스에 액세스할 수 있습니다.
마찬가지로 기본 제공 웹 기반 Couchbase Server UI로 터널을 설정할 수 있습니다:
kubectl 포트 포워드 CB-헬로마이크로서비스-0000 8091:8091
이제 http://localhost:8091 을 사용하여 Couchbase 클러스터에 액세스할 수 있습니다.
포트 포워드 명령은 개발자와 운영팀에 도움이 될 수 있지만, 계속 읽으면서 Kubernetes 서비스를 인터넷에 노출하는 방법을 알아보세요.
로드밸런서를 통한 서비스 노출
포트 포워딩을 통해 Kubernetes 클러스터 외부의 파드에 액세스할 수 있지만, 파드가 불가피하게 충돌하거나 죽고 새로운 IP 주소, 파드 이름 등으로 다시 태어나는 경우 어떻게 될까요? 쿠버네티스를 사용하면 다음을 수행할 수 있습니다. "서비스" 만들기 를 사용하여 하나 이상의 파드를 논리적으로 처리할 수 있습니다.
서비스는 배포와 마찬가지로 YAML 파일에서 지정할 수 있습니다.
다음을 사용하여 서비스를 만들 수도 있습니다. kubectl 노출
. 예를 들어, 배포에서 생성한 ASP.NET Core 포드에 대한 액세스를 제공하는 로드 밸런서 서비스를 노출할 수 있습니다:
kubectl 노출 배포 헬로-마이크로서비스-앱-디플로이먼트 --port=80 --type=로드밸런서
서비스가 생성되면 외부 IP 주소가 생성됩니다. 다음을 사용하여 서비스 정보를 볼 수 있습니다. kubectl 서비스 받기
.
1 2 3 4 5 6 7 8 |
PS C:\사용자\mgroves> kubectl get 서비스 이름 유형 클러스터-IP 외부-IP PORT(S) AGE cb-헬로마이크로서비스 ClusterIP 없음 <없음> 8091/TCP,18091/TCP 17d cb-헬로마이크로서비스-srv ClusterIP 없음 <없음> 11210/TCP,11207/TCP 17d cb-헬로마이크로서비스-ui NodePort 10.0.194.12 <없음> 8091:30624/TCP,18091:31169/TCP 17d 카우치베이스-연산자-입학 ClusterIP 10.0.218.95 <없음> 443/TCP 17d 쿠버네티스 ClusterIP 10.0.0.1 <없음> 443/TCP 17d hello-마이크로서비스-앱-배포 로드밸런서 10.0.6.87 20.NN.NN.21 80:32710/TCP 13s |
웹 브라우저에서 해당 IP 주소(이 예에서는 20.NN.NN.21)를 열면 배포의 파드에 대한 로드 밸런싱된 액세스가 이루어집니다. 확장 또는 축소(즉, 복제본 수를 변경)해도 서비스는 동일하게 유지되며 계속 액세스를 제공합니다.
Kubernetes 대시보드
쿠버네티스에는 수많은 명령줄 명령을 기억할 필요 없이 큰 그림을 시각화하는 데 유용한 자체 UI 대시보드가 있습니다. 대시보드에 액세스하려면 AKS용 Kubernetes 대시보드:
액세스를 활성화하기 위해 Kubernetes 대시보드에 대한 ClusterRoleBinding을 생성합니다:
kubectl 생성 클러스터 역할 바인딩 kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
그런 다음 Azure의 aks 찾아보기를 사용하여 대시보드를 시작합니다:
az aks 찾아보기 --자원 그룹 헬로마이크로서비스그룹 --이름 헬로마이크로서비스Aks
이렇게 하면 웹 브라우저가 자동으로 대시보드를 열도록 트리거됩니다:
대시보드에서 모든 포드, 서비스, 시크릿, 노드 등을 볼 수 있습니다.
다음 단계
AKS를 사용 중이라면 완료되면 리소스 그룹을 제거하는 것을 잊지 마세요. 그렇지 않으면 Azure 계정에서 계속 실행되어 컴퓨팅 시간이 청구됩니다. 이 자습서에서 하나의 명령으로 전체 리소스 그룹을 제거할 수 있습니다:
az 그룹 삭제 --이름 헬로마이크로서비스그룹
이 ASP.NET Core Kubernetes 자습서에서는 많은 내용을 다루었지만, 올바른 방향을 제시하고 "안녕하세요, 세상"이라는 예제로 시작하기에 충분했기를 바랍니다.
지난 블로그 게시물에서와 마찬가지로, 이 ASP.NET Core Kubernetes 튜토리얼은 Twitch의 두 라이브 코딩 스트림의 산물입니다. 다음을 볼 수 있습니다. 파트 1 그리고 파트 2 에서 확인하세요. 궁금한 점이 있으시다면 트위치 라이브 스트리밍 다음에 채팅하세요!
쿠버네티스는 매우 광범위한 주제입니다. 여기서부터 다양한 방향으로 나아갈 수 있습니다. 다음은 확인해 볼 수 있는 몇 가지 링크입니다:
-
이 튜토리얼에서는 버전 1.2의 카우치베이스 쿠버네티스 오퍼레이터를 사용합니다. 버전 2.0(곧 출시 예정)의 YAML은 달라질 것입니다.
-
에서 Microsoft AKS 문서:
-
제 동료 데니스 로사로부터, 쿠버네티스의 마이크로서비스 예와 그의 블로그 게시물 Kubernetes와 Spring Boot로 Elastic 마이크로서비스 구축하기
-
에서 Kubernetes:
-
애플리케이션과 서비스 연결에서 로드밸런서를 언급하는
-
이 ASP.NET Core Kubernetes 자습서는 이전 게시물(링크: https://www.couchbase.com/blog/asp-net-core-microservices-getting-started/)의 후속 게시물임을 알려드립니다.
[ASP.NET 핵심 마이크로서비스: 시작하기]를 참조하세요. 아직 읽어보지 않았다면 배경 지식을 놓치고 있을 수 있습니다. -
트윌리오는 또한 유사한 블로그 게시물 는 몇 달 전에 Azure 컨테이너 레지스트리를 사용합니다.