간단히 말해서, 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 업데이트 $ brew 설치 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 구성 # 파마가 있는 사용자에게 적절한 자격 증명을 입력하여 사용자/그룹을 생성합니다. $ aws iam create-그룹 --그룹-이름 kops $ aws iam 첨부-그룹-정책 --정책-arn arn:aws:iam::aws:정책/AmazonEC2풀액세스 --그룹-이름 kops $ aws iam 첨부-그룹-정책 --정책-arn arn:aws:iam::aws:정책/AmazonRoute53FullAccess --그룹-이름 kops $ aws iam 첨부-그룹-정책 --정책-arn arn:aws:iam::aws:정책/AmazonS3풀액세스 --그룹-이름 kops $ aws iam 첨부-그룹-정책 --정책-arn arn:aws:iam::aws:정책/IAMFullAccess --그룹-이름 kops $ aws iam 첨부-그룹-정책 --정책-arn arn:aws:iam::aws:정책/AmazonVPC풀액세스 --그룹-이름 kops $ aws iam create-사용자 --사용자-이름 kops $ aws iam 추가-사용자-에-그룹 --사용자-이름 kops --그룹-이름 kops $ aws iam create-액세스-키 --사용자-이름 kops |
kops 구성/데이터를 저장할 S3 버킷 만들기
제 경우에는 다음과 같이 명명했습니다. RD-K8S-AWS 그리고 지역 us-west-1
1 2 3 |
$ aws s3api create-버킷 --버킷 rd-k8s-aws --지역 우리-west-1 --create-버킷-구성 위치 제약 조건=우리-west-1 $ aws s3api put-버킷-버전 관리 --버킷 rd-k8s-aws --버전 관리-구성 상태=활성화됨 |
kops 상태 저장소 및 클러스터 이름에 대한 환경 변수를 정의합니다.
클러스터의 클러스터 이름을 선택합니다. rdc.k8s.local
1 2 3 |
$ 내보내기 콥스_스테이트_스토어=s3://rd-k8s-aws $ 내보내기 콥스_클러스터_이름=rdc.k8s.local |
kops로 k8s 클러스터 생성
k8s 클러스터의 AWS 지역, 인스턴스 크기 및 노드 수를 선택합니다.
1 |
$ kops create 클러스터 --노드-카운트=7 --노드-크기=m4.4x-large --영역=우리-west-2a --이름 ${콥스_클러스터_이름} --상태=${콥스_스테이트_스토어} --yes |
참고: 약 5~8분 정도 소요되며 커피를 마시기 좋은 시간입니다!
샘플 출력은 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ kops 유효성 검사 클러스터 유효성 검사 클러스터 rdc.k8s.local 인스턴스 그룹 이름 역할 기계 유형 MIN MAX SUBNETS 마스터-우리-west-1a 마스터 m3.medium 1 1 우리-west-1a 노드 노드 m4.4x-large 7 7 우리-west-1a NODE 상태 이름 역할 READY IP-172-20-42-242.us-west-1.compute.internal 노드 True IP-172-20-43-56.us-west-1.compute.internal 노드 True IP-172-20-44-17.us-west-1.compute.internal 노드 True IP-172-20-44-80.us-west-1.compute.internal 노드 True IP-172-20-48-254.us-west-1.compute.internal 노드 True IP-172-20-56-254.us-west-1.compute.internal 노드 True IP-172-20-60-79.us-west-1.compute.internal 마스터 True IP-172-20-63-146.us-west-1.compute.internal 노드 True 귀하의 클러스터 rdc.k8s.local 는 준비 |
노드 가져오기 및 k8s 클러스터 검증하기
1 2 3 |
$ kubectl get 노드 --show-레이블 $ kubectl 클러스터-정보 |
이 시점에서 kubectl 컨텍스트 또는 k8s 컨텍스트는 AWS k8s 클러스터를 가리켜야 한다.
k8s 대시보드 구성
1 |
$ kubectl 신청하기 -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml |
1 2 |
$ kubectl create 서비스 계정 대시보드 -n 기본값 $ kubectl create 클러스터 역할 바인딩 대시보드-관리자 -n 기본값 --클러스터 역할=클러스터-관리자 --서비스 계정=기본값:대시보드 |
다른 탭/단말에서 아래 명령을 실행하여 로컬 노트북에 k8s API 서버를 프록시합니다.
1 |
$ kubectl 프록시 |
토큰을 받아 k8s 대시보드에 액세스하세요.
1 |
$ kubectl get 비밀 $(kubectl get 서비스 계정 대시보드 -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --디코딩 |
토큰 사용 옵션을 선택하고 위에서 토큰을 가져오는 동안 다음을 건너뜁니다. % 결국에는
http://127.0.0.1:8001/ui [2]에서 K8S 대시보드에 로그인합니다.
K8S 클러스터 확인 및 검증
다음 명령을 사용하여 k8s 클러스터를 검증합니다.
1 |
$ kops 유효성 검사 클러스터 |
# 클러스터 생성에 언급된 노드 수가 여기에 일치하는지 확인합니다.
1 |
$ kubectl get 노드 |
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 서비스 계정 카우치베이스-연산자 --네임스페이스 기본값 $ kubectl create 클러스터 역할 바인딩 카우치베이스-연산자 --클러스터 역할 카우치베이스-연산자 --서비스 계정 기본값:카우치베이스-연산자 |
카우치베이스 운영자 배포
1 |
$ kubectl create -f https://raw.githubusercontent.com/ramdhakne/blogs/master/kops/cbyaml/operator.yaml |
이 명령을 실행하면 Couchbase Operator 도커 이미지가 다운로드됩니다. operator.yaml
파일을 생성하고 배포 는 카우치베이스 오퍼레이터의 단일 인스턴스를 관리합니다. 카우치베이스 오퍼레이터는 배포를 사용하므로 실행 중인 파드가 죽으면 다시 시작할 수 있습니다.
1 |
$ kubectl get 배포 -l 앱=카우치베이스-연산자 |
다음 출력과 비슷한 결과가 나올 때까지 오퍼레이터의 상태를 계속 폴링해야 합니다:
1 2 |
이름 DESIRED 현재 UP-TO-날짜 사용 가능 AGE 카우치베이스-연산자 1 1 1 1 47s |
카우치베이스 운영자가 실행되면 다음과 같이 표시됩니다.
1 2 3 |
$ kubectl get 포드 이름 READY 상태 다시 시작 AGE 카우치베이스-연산자-7676b7cf47-99b5v 1/1 실행 중 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 포드 이름 READY 상태 다시 시작 AGE cb-예제-aws-0000 1/1 실행 중 0 7m cb-예제-aws-0001 1/1 실행 중 0 6m cb-예제-aws-0002 1/1 실행 중 0 5m cb-예제-aws-0003 1/1 실행 중 0 4m cb-예제-aws-0004 1/1 실행 중 0 3m cb-예제-aws-0005 1/1 실행 중 0 2m cb-예제-aws-0006 1/1 실행 중 0 2m cb-예제-aws-0007 1/1 실행 중 0 1m cb-예제-aws-0008 1/1 실행 중 0 1m cb-예제-aws-0009 1/1 실행 중 0 50s 카우치베이스-연산자-7676b7cf47-99b5v 1/1 실행 중 0 17m |
카우치베이스 GUI에 액세스하려면 포트 8091로 접속해야 하며, 이를 위해 다음과 같이 포트 포워딩을 수행할 수 있습니다.
1 |
$ kubectl 포트-앞으로 cb-예제-aws-0000 8091:8091 |
카우치베이스 서버 GUI는 http://localhost:8091 에서 액세스할 수 있습니다.
서비스 복원력
서비스 복원력을 보여주기 위해, 카우치베이스 노드 손실을 시뮬레이션하여 파드를 죽일 수 있습니다.
1 |
$ kubectl 삭제 pod cb-예제-aws-0001 |
쿠버네티스가 제공하는 가장 큰 기능은 서비스 복원력입니다. 파드가 손실되면 쿠버네티스는 클러스터 정의를 확인하여 3개의 파드가 필요하다는 것을 파악하고 새 파드를 스핀업하여 클러스터에 추가한 다음 클러스터에서 리밸런싱을 수행합니다. 따라서 클러스터에서 노드 장애를 모니터링하고, 장애 발생 시 수행할 작업을 결정한 다음 리밸런싱 작업을 수행하는 중요한 관리 작업이 필요하지 않습니다. 이 모든 작업이 보이지 않는 곳에서 이루어지므로 애플리케이션은 중단 없이 작동합니다.
파드를 다시 나열하면 다음과 같은 내용이 표시되어야 합니다.
1 2 3 4 5 6 7 |
$ kubectl get 포드 --시계 ... ... cb-예제-aws-0010 0/1 보류 중 0 0s cb-예제-aws-0010 0/1 보류 중 0 0s cb-예제-aws-0010 0/1 컨테이너 생성 0 0s cb-예제-aws-0010 1/1 실행 중 0 1s |
로드 KV 부하를 생성하기 위해 cbc-pillowfight를 설치하면 이 클러스터에서 밀어붙일 수 있는 한계가 무엇인지 알 수 있습니다.
단일 앱 서버에서 다음 파라미터로 필로우파이트 실행하기
1 |
# cbc-pillowfight -U couchbase://localhost/kopsClusterBucket -u 관리자 -P 비밀번호 -J -t 4 -I 10000 -p `호스트 이름` |

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

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