간단히 말해서, kops는 쿠버네티스(k8s) 클러스터를 위한 kubectl입니다. 쿠버네티스의 강점은 공급업체 종속성을 제거하고, 다른 클라우드 공급업체로 전환해야 하거나 클라우드 워크플로우를 온프레미스로 전환해야 하는 경우 앱, 데이터베이스에 대한 이식성을 제공한다는 점입니다. 시나리오가 무엇이든, 쿠버네티스는 그러한 자유를 제공합니다.

KOPS 아키텍처
완전한 공개라는 정신에 따라 클라우드 공급업체에서 제공하는 도구를 사용하는 것이 더 쉽습니다. kops와 같은 오픈소스 도구는 똑같이 잘 작동하고 매우 효율적입니다.
카우치베이스 자율 운영자는 사용자 정의 리소스 정의(CRD)를 생성하고 카우치베이스 클러스터를 관리하기 위해 카우치베이스 전용 컨트롤러(자율 운영자)를 등록하여 쿠버네티스 API를 확장한다.
이 블로그에서는 AWS를 IaaS로 사용하며, kops 사용법과 기능, 그리고 Couchbase 클러스터를 대규모로 실행하는 Couchbase Autonomous Operator를 시연할 예정입니다.
KOPS는 무엇을 할 수 있나요?
"kops는 명령줄에서 고가용성의 프로덕션급 Kubernetes 클러스터를 생성, 파괴, 업그레이드 및 유지 관리할 수 있도록 도와줍니다. 현재 AWS(Amazon Web Services)가 공식 지원되며, GCE는 베타 지원, VMware vSphere는 알파 지원, 그리고 다른 플랫폼도 지원될 예정입니다." [1]
본론으로 들어가서 어떻게 작동하는지 살펴볼까요?
- kops 설치
- AWS에서 k8s 클러스터 생성
- k8s 대시보드 구성
- K8S 클러스터 확인 및 검증
- K8에 카우치베이스 자율 운영자 배포하기
- 카우치베이스 클러스터 배포
- 서비스 복원력
- 다음 단계
KOPS 설치
홈브루에서 OSX
|
1 2 |
$ brew update $ brew install kops |
Linux
|
1 |
$ curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64chmod +x kops-linux-amd64sudo mv kops-linux-amd64 /usr/local/bin/kops |
AWS에서 k8s 클러스터 생성
kops를 사용하여 k8s 클러스터를 생성하려면 먼저 kops에 대한 IAM 정책을 생성하고 kops가 k8s 클러스터를 생성하는 데 필요한 리소스를 프로비저닝할 수 있도록 해야 합니다. 이 작업은 한 번만 수행하면 됩니다.
kops의 전제 조건
AWS CLI 설치
MacOS의 경우
$ pip3 설치 awscli -업그레이드 --사용자
다른 플랫폼의 경우, 여기를 클릭하세요
참고: 일회성 작전만 가능
'aws configure'를 실행하여 AWS 환경을 활성화하고 아래 명령을 실행합니다.
|
1 2 3 4 5 6 7 8 9 10 |
$ aws configure # enter appropriate credentials with user with perms to create user/groups $ aws iam create-group --group-name kops $ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops $ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops $ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops $ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops $ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess --group-name kops $ aws iam create-user --user-name kops $ aws iam add-user-to-group --user-name kops --group-name kops $ aws iam create-access-key --user-name kops |
kops 구성/데이터를 저장할 S3 버킷 만들기
제 경우에는 다음과 같이 명명했습니다. RD-K8S-AWS 그리고 지역 us-west-1
|
1 2 3 |
$ aws s3api create-bucket --bucket rd-k8s-aws --region us-west-1 --create-bucket-configuration LocationConstraint=us-west-1 $ aws s3api put-bucket-versioning --bucket rd-k8s-aws --versioning-configuration Status=Enabled |
kops 상태 저장소 및 클러스터 이름에 대한 환경 변수를 정의합니다.
클러스터의 클러스터 이름을 선택합니다. rdc.k8s.local
|
1 2 3 |
$ export KOPS_STATE_STORE=s3://rd-k8s-aws $ export KOPS_CLUSTER_NAME=rdc.k8s.local |
kops로 k8s 클러스터 생성
k8s 클러스터의 AWS 지역, 인스턴스 크기 및 노드 수를 선택합니다.
|
1 |
$ kops create cluster --node-count=7 --node-size=m4.4xlarge --zones=us-west-2a --name ${KOPS_CLUSTER_NAME} --state=${KOPS_STATE_STORE} --yes |
참고: 약 5~8분 정도 소요되며 커피를 마시기 좋은 시간입니다!
샘플 출력은 다음과 같습니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ kops validate cluster Validating cluster rdc.k8s.local INSTANCE GROUPS NAME ROLE MACHINETYPE MIN MAX SUBNETS master-us-west-1a Master m3.medium 1 1 us-west-1a nodes Node m4.4xlarge 7 7 us-west-1a NODE STATUS NAME ROLE READY ip-172-20-42-242.us-west-1.compute.internal node True ip-172-20-43-56.us-west-1.compute.internal node True ip-172-20-44-17.us-west-1.compute.internal node True ip-172-20-44-80.us-west-1.compute.internal node True ip-172-20-48-254.us-west-1.compute.internal node True ip-172-20-56-254.us-west-1.compute.internal node True ip-172-20-60-79.us-west-1.compute.internal master True ip-172-20-63-146.us-west-1.compute.internal node True Your cluster rdc.k8s.local is ready |
노드 가져오기 및 k8s 클러스터 검증하기
|
1 2 3 |
$ kubectl get nodes --show-labels $ kubectl cluster-info |
이 시점에서 kubectl 컨텍스트 또는 k8s 컨텍스트는 AWS k8s 클러스터를 가리켜야 한다.
k8s 대시보드 구성
|
1 |
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml |
|
1 2 |
$ kubectl create serviceaccount dashboard -n default $ kubectl create clusterrolebinding dashboard-admin -n default --clusterrole=cluster-admin --serviceaccount=default:dashboard |
다른 탭/단말에서 아래 명령을 실행하여 로컬 노트북에 k8s API 서버를 프록시합니다.
|
1 |
$ kubectl proxy |
토큰을 받아 k8s 대시보드에 액세스하세요.
|
1 |
$ kubectl get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode |
토큰 사용 옵션을 선택하고 위에서 토큰을 가져오는 동안 다음을 건너뜁니다. % 결국에는
https://127.0.0.1:8001/ui [2]에서 K8S 대시보드에 로그인합니다.
K8S 클러스터 확인 및 검증
다음 명령을 사용하여 k8s 클러스터를 검증합니다.
|
1 |
$ kops validate cluster |
# 클러스터 생성에 언급된 노드 수가 여기에 일치하는지 확인합니다.
|
1 |
$ kubectl get nodes |
K8에 카우치베이스 자율 운영자 배포하기
이제 k8s 클러스터를 배포했으니 이제 카우치베이스 운영자를 배포할 차례입니다.
먼저 운영자를 배포하고, 운영자에 대해 RBAC을 활성화하고, Couchbase 운영자에 대한 ClusterRole을 생성해야 합니다.
|
1 |
$ kubectl create -f https://raw.githubusercontent.com/ramdhakne/blogs/master/kops/cbyaml/cluster-role.yaml |
참고: 이 역할은 한 번만 생성하면 됩니다.
클러스터롤이 생성된 후, 카우치베이스 오퍼레이터를 설치하는 네임스페이스에 서비스 어카운트를 생성한 다음, 해당 서비스 어카운트에 클러스터 역할 바인딩. 이 가이드에서는 기본값 네임스페이스에 서비스 계정을 생성합니다.
|
1 2 3 |
$ kubectl create serviceaccount couchbase-operator --namespace default $ kubectl create clusterrolebinding couchbase-operator --clusterrole couchbase-operator --serviceaccount default:couchbase-operator |
카우치베이스 운영자 배포
|
1 |
$ kubectl create -f https://raw.githubusercontent.com/ramdhakne/blogs/master/kops/cbyaml/operator.yaml |
이 명령을 실행하면 Couchbase Operator 도커 이미지가 다운로드됩니다. operator.yaml 파일을 생성하고 배포 는 카우치베이스 오퍼레이터의 단일 인스턴스를 관리합니다. 카우치베이스 오퍼레이터는 배포를 사용하므로 실행 중인 파드가 죽으면 다시 시작할 수 있습니다.
|
1 |
$ kubectl get deployments -l app=couchbase-operator |
다음 출력과 비슷한 결과가 나올 때까지 오퍼레이터의 상태를 계속 폴링해야 합니다:
|
1 2 |
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE couchbase-operator 1 1 1 1 47s |
카우치베이스 운영자가 실행되면 다음과 같이 표시됩니다.
|
1 2 3 |
$ kubectl get pods NAME READY STATUS RESTARTS AGE couchbase-operator-7676b7cf47-99b5v 1/1 Running 0 1m |
카우치베이스 서버 GUI 인증을 위한 시크릿을 배포해야 합니다.
|
1 |
$ kubectl create -f https://raw.githubusercontent.com/ramdhakne/blogs/master/kops/cbyaml/secret.yaml |
지금 10노드 Couchbase 클러스터 배포하기
|
1 |
$ kubectl create -f https://raw.githubusercontent.com/ramdhakne/blogs/master/kops/cbyaml/couchbase-cluster-multi.yaml |
카우치베이스 포드 목록 가져오기
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ kubectl get pods NAME READY STATUS RESTARTS AGE cb-example-aws-0000 1/1 Running 0 7m cb-example-aws-0001 1/1 Running 0 6m cb-example-aws-0002 1/1 Running 0 5m cb-example-aws-0003 1/1 Running 0 4m cb-example-aws-0004 1/1 Running 0 3m cb-example-aws-0005 1/1 Running 0 2m cb-example-aws-0006 1/1 Running 0 2m cb-example-aws-0007 1/1 Running 0 1m cb-example-aws-0008 1/1 Running 0 1m cb-example-aws-0009 1/1 Running 0 50s couchbase-operator-7676b7cf47-99b5v 1/1 Running 0 17m |
카우치베이스 GUI에 액세스하려면 포트 8091로 접속해야 하며, 이를 위해 다음과 같이 포트 포워딩을 수행할 수 있습니다.
|
1 |
$ kubectl port-forward cb-example-aws-0000 8091:8091 |
카우치베이스 서버 GUI는 https://localhost:8091 에서 액세스할 수 있습니다.
서비스 복원력
서비스 복원력을 보여주기 위해, 카우치베이스 노드 손실을 시뮬레이션하여 파드를 죽일 수 있습니다.
|
1 |
$ kubectl delete pod cb-example-aws-0001 |
쿠버네티스가 제공하는 가장 큰 기능은 서비스 복원력입니다. 파드가 손실되면 쿠버네티스는 클러스터 정의를 확인하여 3개의 파드가 필요하다는 것을 파악하고 새 파드를 스핀업하여 클러스터에 추가한 다음 클러스터에서 리밸런싱을 수행합니다. 따라서 클러스터에서 노드 장애를 모니터링하고, 장애 발생 시 수행할 작업을 결정한 다음 리밸런싱 작업을 수행하는 중요한 관리 작업이 필요하지 않습니다. 이 모든 작업이 보이지 않는 곳에서 이루어지므로 애플리케이션은 중단 없이 작동합니다.
파드를 다시 나열하면 다음과 같은 내용이 표시되어야 합니다.
|
1 2 3 4 5 6 7 |
$ kubectl get pods --watch ... ... cb-example-aws-0010 0/1 Pending 0 0s cb-example-aws-0010 0/1 Pending 0 0s cb-example-aws-0010 0/1 ContainerCreating 0 0s cb-example-aws-0010 1/1 Running 0 1s |
로드 KV 부하를 생성하기 위해 cbc-pillowfight를 설치하면 이 클러스터에서 밀어붙일 수 있는 한계가 무엇인지 알 수 있습니다.
단일 앱 서버에서 다음 파라미터로 필로우파이트 실행하기
|
1 |
# cbc-pillowfight -U couchbase://localhost/kopsClusterBucket -u Administrator -P password -J -t 4 -I 10000 -p `hostname` |

베개 싸움을 통한 KV 성능
단일 앱 서버에서 초당 최대 34,000건의 작업을 처리할 수 있습니다.
다른 앱 서버를 사용하여 필로우파이트 실행을 한 단계 더 높이면, 초당 약 51,000개의 작업을 처리할 수 있는 성능을 얻을 수 있습니다.

베개 싸움을 통한 KV 성능
결론
여기서 배운 것은 kops를 사용하면 Couchbase 클러스터를 대규모로 배포하는 것이 매우 쉬워지고 Autonomous 운영자는 서비스 복원력, 자동 재조정, 자동 버킷 생성, CI/CD 파이프라인과의 쉬운 통합과 같은 이점을 제공합니다. 개발/QA/UAT 및 프로덕션에 yaml 파일을 표준화할 수 있습니다.
참조:
[1] https://github.com/kubernetes/kops
[2] K8S 대시보드 문제 해결