VPC (Virtual Private Cloud) 에서 첫 번째 클러스터 설정
VPC(Virtual Private Cloud)에 IBM Cloud® Kubernetes Service 클러스터를 작성하십시오.
VPC상의 IBM Cloud Kubernetes Service 클러스터를 사용하면, 가상 사설 클라우드 (VPC) 내에서 차세대 IBM Cloud 플랫폼을 기반으로 클러스터를 생성할 수 있습니다. VPC는 퍼블릭 클라우드의 동적 확장성을 통해 프라이빗 클라우드 환경의 보안을 제공합니다. VPC는 v2 API, CLI 및 콘솔 기능의 선택 그룹이 포함된 다음 버전의 IBM Cloud Kubernetes Service 인프라 제공자를 사용합니다. VPC에 대해 표준 클러스터만 작성할 수 있습니다.
대상
이 튜토리얼은 VPC에 IBM Cloud Kubernetes Service 클러스터를 처음 작성하는 관리자를 대상으로 합니다.
목표
튜토리얼 학습에서 VPC(Virtual Private Cloud)에 IBM Cloud Kubernetes Service 클러스터를 작성합니다. 그런 다음, 앱을 배치하고 로드 밸런서를 통해 앱을 공용으로 노출합니다.
얻을 수 있는 것
이 튜토리얼에서는 다음 리소스를 생성합니다. 학습서를 완료한 후 보존하지 않으려는 경우 이러한 자원을 삭제하는 선택적 단계가 있습니다.
- VPC 클러스터
- 클러스터에 배치된 간단한 Hello World 앱
- 앱을 노출하기 위한 VPC 로드 밸런서
전제조건
권한 및 명령행 환경을 설정하려면 다음 전제조건 단계를 완료하십시오.
- 권한
- 계정 소유자라면 클러스터를 생성하는 데 필요한 권한을 이미 보유하고 있으므로 다음 단계로 진행할 수 있습니다. 그렇지 않으면 계정 소유자에게 API 키를 설정하고 IBM Cloud IAM에서 최소 사용자 권한을 지정하도록 요청하십시오.
- 명령행 도구
- 명령행에서 리소스에 빠르게 액세스하려면 IBM Cloud Shell을 시도하십시오. 그렇지 않으면 다음 단계를 완료하여 로컬 명령행 환경을 설정하십시오.
- IBM Cloud CLI(
ibmcloud), Kubernetes Service 플러그인(ibmcloud ks) 및 IBM Cloud Container Registry 플러그인(ibmcloud cr)을 설치하십시오. - Red Hat OpenShift(
oc) 및 Kubernetes(kubectl) CLI를 설치하십시오. - VPC에 대해 작업하려면
infrastructure-service플러그인을 설치하십시오. 명령을 실행하기 위한 접두부는ibmcloud is입니다.ibmcloud plugin install infrastructure-service - Kubernetes Service 플러그인을 최신 버전으로 업데이트하십시오.
ibmcloud plugin update kubernetes-service kubectl버전이 VPC 클러스터의 Kubernetes 버전과 일치하는지 확인하십시오. 이 튜토리얼에서는 버전 1.35 를 실행하는 클러스터를 생성합니다.
VPC에서 클러스터 작성
IBM Cloud Kubernetes Service VPC(Virtual Private Cloud) 환경에 IBM Cloud 클러스터를 작성합니다. VPC에 대한 자세한 정보는 Virtual Private Cloud 시작하기를 참조하십시오.
- VPC 환경을 작성할 계정, 리소스 그룹 및 IBM Cloud 지역에 로그인하십시오. VPC는 클러스터를 생성하려는 것과 동일한 멀티존 메트로 리전에 설정되어야 합니다. 이 튜토리얼에서는
us-south에 VPC를 작성합니다. 기타 지원되는 지역은 VPC 클러스터에 대한 다중 구역 메트로를 참조하십시오. 연동 ID가 있는 경우, ‘--sso’ 옵션을 포함하십시오.ibmcloud login -r us-south [-g <resource_group>] [--sso] - 클러스터의 VPC를 작성하십시오. 자세한 정보는 콘솔 또는 CLI에서 VPC 작성에 대한 문서를
참조하십시오.
- 이름이
myvpc인 VPC를 작성하고 출력의 ID를 기록하십시오. VPC는 퍼블릭 클라우드 내에서 워크로드를 실행하기 위해 격리된 환경을 제공합니다. 여러 클러스터에 대해 동일한 VPC를 사용할 수 있습니다(예: 서로 다른 클러스터가 서로 통신해야 하는 별도의 마이크로서비스를 호스팅하려는 경우). 클러스터를 구분하려는 경우(예: 다른 부서용), 각 클러스터에 대해 VPC를 작성할 수 있습니다.
ibmcloud is vpc-create myvpc ``` 2. VPC에 대한 서브넷을 작성하고 해당 **ID**를 기록하십시오. VPC 서브넷을 작성할 때 다음 정보를 고려하십시오. - **구역**: 클러스터의 각 구역에 대해 하나의 VPC 서브넷이 있어야 합니다. 사용 가능한 영역은 VPC를 생성한 메트로 지역에 따라 다릅니다. 지역에서 사용 가능한 구역을 나열하려면 `ibmcloud is zones`를 실행하십시오. - **IP 주소**: VPC 서브넷은 클러스터에서 작업자 노드 및 로드 밸런서 서비스에 사설 IP 주소를 제공하므로 [충분한 IP 주소(예: 256)가 있는 서브넷을 작성](/docs/containers?topic=containers-vpc-subnets#vpc_basics_subnets)하십시오. VPC 서브넷에 있는 IP 주소의 수는 나중에 변경할 수 없습니다. - **공용 게이트웨이**: 이 학습서를 마치기 위해 공용 게이트웨이에 연결할 필요는 없습니다. 대신, 워크로드를 안전하게 노출하도록 VPC 로드 밸런서를 사용하여 작업자 노드를 공용 액세스로부터 격리할 수 있습니다. 작업자 노드가 공용 URL에 액세스해야 하는 경우 퍼블릭 게이트웨이를 접속할 수 있습니다. ```sh {: pre} ibmcloud is subnet-create mysubnet1 VPC_ID --zone us-south-1 --ipv4-address-count 256 ``` - 이름이
- 서브넷과 동일한 구역의 VPC에서 클러스터를 작성하십시오. 기본적으로, 클러스터는 퍼블릭 및 프라이빗 클라우드 서비스 엔드포인트를 포함하여 작성됩니다. 퍼블릭 클라우드 서비스 엔드포인트를 사용하여 Kubernetes 마스터에 액세스할 수 있습니다(예: 로컬 시스템에서
kubectl명령 실행). 작업자 노드는 프라이빗 클라우드 서비스 엔드포인트의 마스터와 통신할 수 있습니다. 명령 옵션에 대한 자세한 정보는cluster create vpc-gen2CLI 참조 문서를 참조하십시오.ibmcloud ks cluster create vpc-gen2 --name myvpc-cluster --zone us-south-1 --version 1.35 --flavor bx2.2x8 --workers 1 --vpc-id VPC_ID --subnet-id VPC_SUBNET_ID - 클러스터의 상태를 확인하십시오. 클러스터를 프로비저닝하는 데 몇 분 정도 소요될 수 있습니다.
- 클러스터 상태가 정상인지 확인하십시오.
ibmcloud ks cluster ls --provider vpc-gen2 ``` 2. Kubernetes 구성 파일을 다운로드하십시오. ```sh {: pre} ibmcloud ks cluster config --cluster myvpc-cluster ``` 3. Kubernetes CLI 서버 버전을 확인하여 `kubectl` 명령이 올바르게 실행되는지 확인하십시오. ```sh {: pre} kubectl version --short ``` 출력 예 ```sh {: screen} Client Version: 1.35 Server Version: 1.35+IKS ```
개인적으로 사용 가능한 앱 배치
Kbernetes 배치를 작성하여 단일 앱 인스턴스를 VPC 클러스터의 작업자 노드에 팟(Pod)으로 배치할 수 있습니다.
-
Hello world 앱의 소스 코드를 사용자 홈 디렉터리에 복사하세요. 저장소에는 각각
Lab으로 시작하는 유사한 앱의 여러 버전이 폴더에 포함되어 있습니다. 각 버전에는 다음 파일이 포함되어 있습니다.Dockerfile: 이미지의 빌드 정의app.js: Hello world 앱package.json: 앱에 대한 메타데이터
git clone https://github.com/IBM/container-service-getting-started-wt.git -
Lab 1디렉토리로 이동하십시오.cd 'container-service-getting-started-wt/Lab 1' -
기존 레지스트리 네임스페이스를 사용하거나
vpc-gen2와 같은 네임스페이스를 작성하십시오.ibmcloud cr namespace-listibmcloud cr namespace-add vpc-gen2 -
Lab 1디렉토리의 앱 파일을 포함하는 Docker 이미지를 빌드하십시오.이미지 이름에서는 소문자 영숫자 문자나 밑줄(
_)만 사용하십시오. 명령의 끝에는 반드시 마침표(.)를 사용하십시오. 마침표는 이미지를 빌드하기 위한 빌드 아티팩트 및 Dockerfile을 현재 디렉토리 내에서 찾도록 Docker에 지시합니다.docker build -t us.icr.io/<namespace>/hello-world:1 .빌드가 완료되면 다음과 같은 성공 메시지가 표시되는지 확인하십시오.
=> exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:3ca1eb1d0998f738b552d4c435329edf731fe59e427555b78ba2fb54f2017906 0.0s => => naming to <region>.icr.io/<namespace>/hello-world:1 0.0s -
IBM Cloud Container Registry에 로그인하십시오.
ibmcloud cr login -
작성한 IBM Cloud Container Registry 네임스페이스에 이미지를 푸시하십시오. 향후 앱을 변경해야 하는 경우에는 다음 단계를 반복하여 이미지의 다른 버전을 작성하십시오. 참고: 컨테이너 이미지에 대해 작업하는 경우에는 개인 정보 보호에 대해 자세히 알아보십시오.
docker push us.icr.io/<namespace>/hello-world:1 -
앱에 대한 배치를 작성하십시오. 배치는 팟(Pod)을 관리하는 데 사용되며, 여기에는 컨테이너화된 앱의 인스턴스가 포함됩니다. 다음 명령은 단일 팟(Pod)에 앱을 배치합니다. 이 튜토리얼을 위해 배치의 이름은 hello-world-deployment로 지정되었지만, 원하는 이름을 배치에 지정할 수 있습니다.
kubectl create deployment hello-world-deployment --image=us.icr.io/vpc-gen2/hello-world:1출력 예
deployment.apps/hello-world-deployment createdKubernetes 리소스에 대해 작업할 때 개인 정보 보호에 대해 자세히 알아보십시오.
-
NodePort 서비스로서 배치를 노출하여 앱에 액세스할 수 있도록 하십시오. VPC 작업자 노드가 사설 서브넷에만 연결되어 있으므로 NodePort에는 사설 IP 주소만 지정되고 공용 네트워크에는 노출되지 않습니다. 사설 네트워크에서 실행되는 기타 서비스는 NodePort 서비스의 사설 IP 주소를 사용하여 앱에 액세스할 수 있습니다.
kubectl expose deployment/hello-world-deployment --type=NodePort --name=hello-world-service --port=8080 --target-port=8080출력 예
service/hello-world-service exposed명령 옵션에 대한 정보입니다. 매개변수 설명 expose서비스의 IP 주소를 사용하여 사용자가 리소스에 액세스할 수 있도록 Kubernetes 서비스로 Kubernetes 리소스(예: 배치)를 노출합니다. deployment/*<hello-world-deployment>*이 서비스에서 노출할 리소스의 리소스 유형 및 이름입니다. --name=*<hello-world-service>*서비스의 이름입니다. --type=NodePort작성할 서비스 유형입니다. 이 학습에서는 NodePort서비스를 작성합니다. 다음 학습에서는LoadBalancer서비스를 작성합니다.--port=*<8080>*서비스가 외부 네트워크 트래픽을 청취하는 포트입니다. --target-port=*<8080>*앱에서 청취하고 서비스에서 수신 네트워크 트래픽을 지시하는 포트입니다. 이 예에서 target-port는port와 동일하지만, 사용자가 작성하는 기타 앱은 서로 다른 포트를 사용할 수도 있습니다. -
이제 모든 배치 작업이 완료되었으므로 클러스터 내에서 앱을 테스트할 수 있습니다. 앱에 액세스하는 데 사용할 수 있는 사설 IP 주소를 형성하기 위한 세부사항을 가져오십시오.
- 서비스에 대한 정보를 가져와서 지정된 NodePort를 확인하십시오.
expose명령으로 생성될 때 NodePort는 랜덤으로 지정되지만, 범위는 30000-32767 사이입니다. 이 예에서 NodePort는 30872입니다.
kubectl describe service hello-world-service ``` 출력 예 ```sh {: screen} NAME: hello-world-service Namespace: default Labels: run=hello-world-deployment Selector: run=hello-world-deployment Type: NodePort IP: 10.xxx.xx.xxx Port: <unset> 8080/TCP NodePort: <unset> 30872/TCP Endpoints: 172.30.xxx.xxx:8080 Session Affinity: None No events. ``` 2. 앱을 실행하는 팟(Pod)을 나열하고 팟(Pod) 이름을 기록해 두십시오. ```sh {: pre} kubectl get pods ``` 출력 예 ```sh {: screen} NAME READY STATUS RESTARTS AGE hello-world-deployment-d99cddb45-lmj2v 1/1 Running 0 2d ``` 3. 팟(Pod)을 설명하여 팟(Pod)이 실행 중인 작업자 노드를 찾으십시오. 출력 예에서 팟(Pod)이 실행되는 작업자 노드는 **10.xxx.xx.xxx**입니다. ```sh {: pre} kubectl describe pod hello-world-deployment-d99cddb45-lmj2v ``` 출력 예 ```sh {: screen} NAME: hello-world-deployment-d99cddb45-lmj2v Namespace: default Priority: 0 PriorityClassName: <none> Node: 10.xxx.xx.xxx/10.xxx.xx.xxx Start Time: Mon, 22 Apr 20122 12:40:48 -0400 Labels: pod-template-hash=d99cddb45 run=hello-world-deployment Annotations: kubernetes.io/psp=ibm-privileged-psp Status: Running IP: 172.30.xxx.xxx ... ``` - 서비스에 대한 정보를 가져와서 지정된 NodePort를 확인하십시오.
-
클러스터 내에서 앱에 대한 요청을 작성할 수 있도록 팟(Pod)에 로그인하십시오.
kubectl exec -it hello-world-deployment-d99cddb45-lmj2v /bin/sh -
작업자 노드 사설 IP 주소와 이전에 검색한 노드 포트를 사용하여 NodePort 서비스에 대한 요청을 수행하십시오.
wget -O - 10.xxx.xx.xxx:30872출력 예
Connecting to 10.xxx.xx.xxx:30872 (10.xxx.xx.xxx:30872) Hello world from hello-world-deployment-d99cddb45-lmj2v! Your app is up and running in a cluster! - 100% |*****************************************************************************************| 88 0:00:00 ETA팟(Pod) 세션을 닫으려면
exit를 입력하십시오.
앱을 공용으로 노출하도록 VPC용 로드 밸런서 설정
VPC 로드 밸런서를 설정하여 앱을 공용 네트워크에 노출합니다.
클러스터에서 Kubernetes LoadBalancer 서비스를 작성하면 클러스터 외부의 VPC에 VPC용 로드 밸런서가 자동으로 작성됩니다. 로드 밸런서는 다중 구역이며 작업자 노드에서 자동으로 열리는 사설 NodePort를 통해 앱에 대한 요청을 라우팅합니다. 다음 다이어그램은 작업자 노드가 사설 서브넷에만 연결되어 있는 경우에도 사용자가 로드 밸런서를 통해 앱의 서비스에 액세스하는 방법을 보여줍니다.
-
클러스터에서 Kubernetes
LoadBalancer서비스를 작성하여 hello world 앱을 공용으로 노출하십시오.kubectl expose deployment/hello-world-deployment --type=LoadBalancer --name=hw-lb-svc --port=8080 --target-port=8080출력 예
service "hw-lb-svc" exposed명령 옵션에 대한 정보입니다. 매개변수 설명 expose서비스의 IP 주소를 사용하여 사용자가 리소스에 액세스할 수 있도록 Kubernetes 서비스로 Kubernetes 리소스(예: 배치)를 노출합니다. deployment/*<hello-world-deployment>*이 서비스에서 노출할 리소스의 리소스 유형 및 이름입니다. --name=*<hello-world-service>*서비스의 이름입니다. --type=LoadBalancer작성할 Kubernetes 서비스 유형입니다. 이 학습에서는 LoadBalancer서비스를 작성합니다.--port=*<8080>*서비스가 외부 네트워크 트래픽을 청취하는 포트입니다. --target-port=*<8080>*앱에서 청취하고 서비스에서 수신 네트워크 트래픽을 지시하는 포트입니다. 이 예에서 target-port는port와 동일하지만, 사용자가 작성하는 기타 앱은 서로 다른 포트를 사용할 수도 있습니다. -
클러스터에서 Kubernetes
LoadBalancer서비스가 작성되었는지 확인하십시오. KubernetesLoadBalancer서비스를 작성하면 사용자를 위해 VPC 로드 밸런서가 자동으로 작성됩니다. VPC 로드 밸런서가 CLI 출력의 LoadBalancer Ingress 필드에서 볼 수 있는 Kubernetes LoadBalancer 서비스에 호스트 이름을 지정합니다. VPC에서 VPC 로드 밸런서는 프로비저닝하는 데 몇 분 정도 소요됩니다. VPC 로드 밸런서가 준비될 때까지는 호스트명을 통해 KubernetesLoadBalancer서비스에 접속할 수 없습니다.kubectl describe service hw-lb-svcCLI 출력 예제
NAME: hw-lb-svc Namespace: default Labels: app=hello-world-deployment Annotations: <none> Selector: app=hello-world-deployment Type: LoadBalancer IP: 172.21.xxx.xxx LoadBalancer Ingress: 1234abcd-us-south.lb.appdomain.cloud Port: <unset> 8080/TCP TargetPort: 8080/TCP NodePort: <unset> 32040/TCP Endpoints: Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 1m service-controller Ensuring load balancer Normal EnsuredLoadBalancer 1m service-controller Ensured load balancer -
VPC에 VPC 로드 밸런서가 작성되었는지 확인하십시오. 출력에서 VPC 로드 밸랜서의 Provision status가
active이고 Operating status가online인지 확인하십시오.VPC 로드 밸런서는
kube-<cluster_ID>-<kubernetes_lb_service_UID>형식으로 이름이 지정됩니다. 클러스터 ID를 보려면ibmcloud ks cluster get --cluster CLUSTER_NAME을(를) 실행하십시오. KubernetesLoadBalancer서비스 UID를 보려면kubectl get svc hw-lb-svc -o yaml를 실행하고 출력에서 metadata.uid 필드를 찾으십시오.ibmcloud is load-balancers다음 CLI 출력 예에서는
kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306으로 이름 지정된 VPC 로드 밸런서가 KubernetesLoadBalancer서비스에 대해 작성됩니다.ID Name Family Subnets Is public Provision status Operating status Resource group r006-d044af9b-92bf-4047-8f77-a7b86efcb923 kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306 Application mysubnet-us-south-3 true active online default -
2단계에서 찾은 VPC 로드 밸런서에서 지정한 Kubernetes
LoadBalancer서비스의 호스트 이름과 포트에 curl을 사용하여 앱으로 요청을 보내십시오.curl 1234abcd-us-south.lb.appdomain.cloud:8080출력 예
Hello world from hello-world-deployment-5fd7787c79-sl9hn! Your app is up and running in a cluster!
다음에 수행할 작업
이제 VPC 클러스터가 있으므로 수행할 수 있는 작업에 대해 자세히 살펴보십시오.
도움이 필요하거나 질문이 있거나 VPC 클러스터에 대한 피드백을 제공하려고 하십니까? Slack 채널에 게시하십시오.