쿠버네티스 1.4는 이번 주 초에 출시되었습니다. 자세한 내용은 블로그 공지사항 그리고 변경 로그.
이번 릴리스에는 몇 가지 새로운 기능이 추가되었지만 제가 기대하는 주요 기능은 다음과 같습니다:
- 다음을 사용하여 쿠버네티스를 설치합니다.
kubeadm명령을 실행합니다. 이것은 https://github.com/kubernetes/kubernetes/releases 에서 다운로드하는 일반적인 메커니즘에 추가됩니다. 그리고
kubeadm 초기화그리고kubeadm join명령은 다음과 매우 유사하게 보입니다.도커 스웜 초기화그리고도커 스웜 조인에 대한 도커 스웜 모드. - 페더레이션 복제본 세트
- ScheduledJob을 사용하면 일정한 간격으로 배치 작업을 실행할 수 있습니다.
- 파드를 노드로 제한하기 포드의 친화성 및 반친화성
- 우선순위 예약 포드 수
- 멋진 모습 Kubernetes 대시보드 (자세한 내용은 나중에 설명합니다)
이 블로그에서 확인할 수 있습니다:
- Amazon Web Services를 사용하여 Kubernetes 클러스터 만들기
- Couchbase 서비스 만들기
- Couchbase에 JSON 문서를 저장하는 Spring Boot 애플리케이션을 실행합니다.
이 블로그의 모든 리소스 설명 파일은 다음 링크에서 찾을 수 있습니다. github.com/arun-gupta/kubernetes-java-sample/tree/master/maven.
쿠버네티스 클러스터 시작
바이너리 다운로드 github.com/kubernetes/kubernetes/releases/download/v1.4.0/kubernetes.tar.gz 를 추출하고 쿠버네티스/클러스터 에서 경로 시작
2노드 Kubernetes 클러스터:
|
1 |
NUM_NODES=2 NODE_SIZE=m3.medium KUBERNETES_PROVIDER=aws kube-up.sh |
로그는 다음과 같이 표시됩니다:
|
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
... Starting cluster in us-west-2a using provider aws ... calling verify-prereqs ... calling kube-up Starting cluster using os distro: jessie Uploading to Amazon S3 +++ Staging server tars to S3 Storage: kubernetes-staging-0eaf81fbc51209dd47c13b6d8b424149/devel upload: ../../../../../var/folders/81/ttv4n16x7p390cttrm_675y00000gn/T/kubernetes.XXXXXX.bCmvLbtK/s3/bootstrap-script to s3://kubernetes-staging-0eaf81fbc51209dd47c13b6d8b424149/devel/bootstrap-script Uploaded server tars: SERVER_BINARY_TAR_URL: https://s3.amazonaws.com/kubernetes-staging-0eaf81fbc51209dd47c13b6d8b424149/devel/kubernetes-server-linux-amd64.tar.gz SALT_TAR_URL: https://s3.amazonaws.com/kubernetes-staging-0eaf81fbc51209dd47c13b6d8b424149/devel/kubernetes-salt.tar.gz BOOTSTRAP_SCRIPT_URL: https://s3.amazonaws.com/kubernetes-staging-0eaf81fbc51209dd47c13b6d8b424149/devel/bootstrap-script INSTANCEPROFILE arn:aws:iam::598307997273:instance-profile/kubernetes-master 2016-07-29T15:13:35Z AIPAJF3XKLNKOXOTQOCT4 kubernetes-master / ROLES arn:aws:iam::598307997273:role/kubernetes-master 2016-07-29T15:13:33Z / AROAI3Q2KFBD5PCKRXCRM kubernetes-master ASSUMEROLEPOLICYDOCUMENT 2012-10-17 STATEMENT sts:AssumeRole Allow PRINCIPAL ec2.amazonaws.com INSTANCEPROFILE arn:aws:iam::598307997273:instance-profile/kubernetes-minion 2016-07-29T15:13:39Z AIPAIYSH5DJA4UPQIP4BE kubernetes-minion / ROLES arn:aws:iam::598307997273:role/kubernetes-minion 2016-07-29T15:13:37Z / AROAIQ57MPQYSHRPQCT2Q kubernetes-minion ASSUMEROLEPOLICYDOCUMENT 2012-10-17 STATEMENT sts:AssumeRole Allow PRINCIPAL ec2.amazonaws.com Using SSH key with (AWS) fingerprint: SHA256:dX/5wpWuUxYar2NFuGwiZuRiydiZCyx4DGoZ5/jL/j8 Creating vpc. Adding tag to vpc-6b5b4b0f: Name=kubernetes-vpc Adding tag to vpc-6b5b4b0f: KubernetesCluster=kubernetes Using VPC vpc-6b5b4b0f Adding tag to dopt-8fe770eb: Name=kubernetes-dhcp-option-set Adding tag to dopt-8fe770eb: KubernetesCluster=kubernetes Using DHCP option set dopt-8fe770eb Creating subnet. Adding tag to subnet-623a0206: KubernetesCluster=kubernetes Using subnet subnet-623a0206 Creating Internet Gateway. Using Internet Gateway igw-251eab41 Associating route table. Creating route table Adding tag to rtb-d43cedb3: KubernetesCluster=kubernetes Associating route table rtb-d43cedb3 to subnet subnet-623a0206 Adding route to route table rtb-d43cedb3 Using Route Table rtb-d43cedb3 Creating master security group. Creating security group kubernetes-master-kubernetes. Adding tag to sg-d20ca0ab: KubernetesCluster=kubernetes Creating minion security group. Creating security group kubernetes-minion-kubernetes. Adding tag to sg-cd0ca0b4: KubernetesCluster=kubernetes Using master security group: kubernetes-master-kubernetes sg-d20ca0ab Using minion security group: kubernetes-minion-kubernetes sg-cd0ca0b4 Creating master disk: size 20GB, type gp2 Adding tag to vol-99a30b11: Name=kubernetes-master-pd Adding tag to vol-99a30b11: KubernetesCluster=kubernetes Allocated Elastic IP for master: 52.40.9.27 Adding tag to vol-99a30b11: kubernetes.io/master-ip=52.40.9.27 Generating certs for alternate-names: IP:52.40.9.27,IP:172.20.0.9,IP:10.0.0.1,DNS:kubernetes,DNS:kubernetes.default,DNS:kubernetes.default.svc,DNS:kubernetes.default.svc.cluster.local,DNS:kubernetes-master Starting Master Adding tag to i-f95bdae1: Name=kubernetes-master Adding tag to i-f95bdae1: Role=kubernetes-master Adding tag to i-f95bdae1: KubernetesCluster=kubernetes Waiting for master to be ready Attempt 1 to check for master nodeWaiting for instance i-f95bdae1 to be running (currently pending) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be running (currently pending) Sleeping for 3 seconds... [master running] Attaching IP 52.40.9.27 to instance i-f95bdae1 Attaching persistent data volume (vol-99a30b11) to master 2016-09-29T05:14:28.098Z /dev/sdb i-f95bdae1 attaching vol-99a30b11 cluster "aws_kubernetes" set. user "aws_kubernetes" set. context "aws_kubernetes" set. switched to context "aws_kubernetes". user "aws_kubernetes-basic-auth" set. Wrote config for aws_kubernetes to /Users/arungupta/.kube/config Creating minion configuration Creating autoscaling group 0 minions started; waiting 0 minions started; waiting 0 minions started; waiting 0 minions started; waiting 2 minions started; ready Waiting for cluster initialization. This will continually check to see if the API for kubernetes is reachable. This might loop forever if there was some uncaught error during start up. ..............................................................................................................................................................................................................................Kubernetes cluster created. Sanity checking cluster... Attempt 1 to check Docker on node @ 54.70.225.33 ...working Attempt 1 to check Docker on node @ 54.71.36.48 ...working Kubernetes cluster is running. The master is running at: https://52.40.9.27 The user name and password to use is located in /Users/arungupta/.kube/config. ... calling validate-cluster Waiting for 2 ready nodes. 0 ready nodes, 0 registered. Retrying. Waiting for 2 ready nodes. 0 ready nodes, 0 registered. Retrying. Waiting for 2 ready nodes. 0 ready nodes, 0 registered. Retrying. Waiting for 2 ready nodes. 0 ready nodes, 2 registered. Retrying. Waiting for 2 ready nodes. 0 ready nodes, 2 registered. Retrying. Found 2 node(s). NAME STATUS AGE ip-172-20-0-111.us-west-2.compute.internal Ready 39s ip-172-20-0-112.us-west-2.compute.internal Ready 42s Validate output: NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health": "true"} etcd-1 Healthy {"health": "true"} Cluster validation succeeded Done, listing cluster services: Kubernetes master is running at https://52.40.9.27 Elasticsearch is running at https://52.40.9.27/api/v1/proxy/namespaces/kube-system/services/elasticsearch-logging Heapster is running at https://52.40.9.27/api/v1/proxy/namespaces/kube-system/services/heapster Kibana is running at https://52.40.9.27/api/v1/proxy/namespaces/kube-system/services/kibana-logging KubeDNS is running at https://52.40.9.27/api/v1/proxy/namespaces/kube-system/services/kube-dns kubernetes-dashboard is running at https://52.40.9.27/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard Grafana is running at https://52.40.9.27/api/v1/proxy/namespaces/kube-system/services/monitoring-grafana InfluxDB is running at https://52.40.9.27/api/v1/proxy/namespaces/kube-system/services/monitoring-influxdb To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. |
이것은 Kubernetes 클러스터가 성공적으로 시작되었음을 보여줍니다.
카우치베이스 서비스 배포
카우치베이스 서비스 및 복제 컨트롤러를 만듭니다:
|
1 2 3 |
kubectl.sh create -f couchbase-service.yml service "couchbase-service" created replicationcontroller "couchbase-rc" created |
구성 파일은 다음 위치에 있습니다. github.com/arun-gupta/kubernetes-java-sample/blob/master/maven/couchbase-service.yml. 이렇게 하면 Couchbase 서비스가 생성되고
백업 복제 컨트롤러입니다. 서비스 이름은 카우치베이스 서비스. 이것은 나중에 Spring Boot 애플리케이션이 데이터베이스와 통신하는 데 사용됩니다. 파드의 상태를 확인합니다:
|
1 2 3 4 5 |
kubectl.sh get -w pods NAME READY STATUS RESTARTS AGE couchbase-rc-gu9gl 0/1 ContainerCreating 0 6s NAME READY STATUS RESTARTS AGE couchbase-rc-gu9gl 1/1 Running 0 2m |
파드 상태가 컨테이너 생성에서 실행 중으로 변경되는 방식에 유의하세요. 그 사이에 이미지가 다운로드되고 시작됩니다.
스프링 부트 애플리케이션 실행
애플리케이션을 실행합니다:
|
1 2 |
kubectl.sh create -f bootiful-couchbase.yml pod "bootiful-couchbase" created |
구성 파일은 다음 위치에 있습니다. github.com/arun-gupta/kubernetes-java-sample/blob/master/maven/bootiful-couchbase.yml. 이 서비스에서,
COUCHBASE_URI 환경 변수 값이 카우치베이스 서비스. 앞서 생성한 서비스 이름입니다. 이 서비스에 사용된 도커 이미지는 아룽업타/부티풀-카우치베이스 를 사용하여 생성되며
패브릭8-maven-플러그인 에 표시된 것처럼 github.com/arun-gupta/kubernetes-java-sample/blob/master/maven/webapp/pom.xml#L57-L68.
구체적으로 Docker 이미지에 대한 명령은 다음과 같습니다:
|
1 |
java -Dspring.couchbase.bootstrap-hosts=$COUCHBASE_URI -jar /maven/${project.artifactId}.jar |
이를 통해 다음을 보장합니다. COUCHBASE_URI 환경 변수가 재정의되고 있습니다. spring.couchbase.bootstrap-hosts 속성에 정의된 대로 application.properties 의 로그를 확인합니다. 로그를 가져옵니다:
|
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 |
kubectl.sh logs -f bootiful-couchbase . ____ _ __ _ _ /\ / ___'_ __ _ _(_)_ __ __ _ ( ( )___ | '_ | '_| | '_ / _` | \/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |___, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.4.0.RELEASE) 2016-09-29 05:37:29.227 INFO 5 --- [ main] org.example.webapp.Application : Starting Application v1.0-SNAPSHOT on bootiful-couchbase with PID 5 (/maven/bootiful-couchbase.jar started by root in /) 2016-09-29 05:37:29.259 INFO 5 --- [ main] org.example.webapp.Application : No active profile set, falling back to default profiles: default 2016-09-29 05:37:29.696 INFO 5 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@4ccabbaa: startup date [Thu Sep 29 05:37:29 UTC 2016]; root of context hierarchy 2016-09-29 05:37:34.375 INFO 5 --- [ main] c.c.client.core.env.CoreEnvironment : ioPoolSize is less than 3 (1), setting to: 3 2016-09-29 05:37:34.376 INFO 5 --- [ main] c.c.client.core.env.CoreEnvironment : computationPoolSize is less than 3 (1), setting to: 3 2016-09-29 05:37:35.026 INFO 5 --- [ main] com.couchbase.client.core.CouchbaseCore : CouchbaseEnvironment: {sslEnabled=false, sslKeystoreFile='null', sslKeystorePassword='null', queryEnabled=false, queryPort=8093, bootstrapHttpEnabled=true, bootstrapCarrierEnabled=true, bootstrapHttpDirectPort=8091, bootstrapHttpSslPort=18091, bootstrapCarrierDirectPort=11210, bootstrapCarrierSslPort=11207, ioPoolSize=3, computationPoolSize=3, responseBufferSize=16384, requestBufferSize=16384, kvServiceEndpoints=1, viewServiceEndpoints=1, queryServiceEndpoints=1, searchServiceEndpoints=1, ioPool=NioEventLoopGroup, coreScheduler=CoreScheduler, eventBus=DefaultEventBus, packageNameAndVersion=couchbase-java-client/2.2.8 (git: 2.2.8, core: 1.2.9), dcpEnabled=false, retryStrategy=BestEffort, maxRequestLifetime=75000, retryDelay=ExponentialDelay{growBy 1.0 MICROSECONDS, powers of 2; lower=100, upper=100000}, reconnectDelay=ExponentialDelay{growBy 1.0 MILLISECONDS, powers of 2; lower=32, upper=4096}, observeIntervalDelay=ExponentialDelay{growBy 1.0 MICROSECONDS, powers of 2; lower=10, upper=100000}, keepAliveInterval=30000, autoreleaseAfter=2000, bufferPoolingEnabled=true, tcpNodelayEnabled=true, mutationTokensEnabled=false, socketConnectTimeout=1000, dcpConnectionBufferSize=20971520, dcpConnectionBufferAckThreshold=0.2, dcpConnectionName=dcp/core-io, callbacksOnIoPool=false, queryTimeout=7500, viewTimeout=7500, kvTimeout=2500, connectTimeout=5000, disconnectTimeout=25000, dnsSrvEnabled=false} 2016-09-29 05:37:36.063 INFO 5 --- [ cb-io-1-1] com.couchbase.client.core.node.Node : Connected to Node couchbase-service 2016-09-29 05:37:36.256 INFO 5 --- [ cb-io-1-1] com.couchbase.client.core.node.Node : Disconnected from Node couchbase-service 2016-09-29 05:37:37.727 INFO 5 --- [ cb-io-1-2] com.couchbase.client.core.node.Node : Connected to Node couchbase-service 2016-09-29 05:37:38.316 INFO 5 --- [-computations-3] c.c.c.core.config.ConfigurationProvider : Opened bucket books 2016-09-29 05:37:40.655 INFO 5 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup Book{isbn=978-1-4919-1889-0, name=Minecraft Modding with Forge, cost=29.99} 2016-09-29 05:37:41.497 INFO 5 --- [ main] org.example.webapp.Application : Started Application in 14.64 seconds (JVM running for 16.631) 2016-09-29 05:37:41.514 INFO 5 --- [ Thread-5] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@4ccabbaa: startup date [Thu Sep 29 05:37:29 UTC 2016]; root of context hierarchy 2016-09-29 05:37:41.528 INFO 5 --- [ Thread-5] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown 2016-09-29 05:37:41.577 INFO 5 --- [ cb-io-1-2] com.couchbase.client.core.node.Node : Disconnected from Node couchbase-service 2016-09-29 05:37:41.578 INFO 5 --- [ Thread-5] c.c.c.core.config.ConfigurationProvider : Closed bucket books |
여기서 살펴볼 주요 출력 문은 다음과 같습니다.
|
1 |
Book{isbn=978-1-4919-1889-0, name=Minecraft Modding with Forge, cost=29.99} |
이는 JSON 문서가 Couchbase 데이터베이스에 업서트(삽입 또는 업데이트)되었음을 나타냅니다.
Kubernetes 대시보드
Kubernetes 대시보드 는 더 포괄적으로 보이며 CLI와 90% 패리티를 갖는다고 주장합니다. 사용 kubectl.sh 구성 보기 명령을 사용하여 클러스터에 대한 구성 정보를 볼 수 있습니다. 다음과 같습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
apiVersion: v1 clusters: - cluster: certificate-authority-data: REDACTED server: https://52.40.9.27 name: aws_kubernetes contexts: - context: cluster: aws_kubernetes user: aws_kubernetes name: aws_kubernetes current-context: aws_kubernetes kind: Config preferences: {} users: - name: aws_kubernetes user: client-certificate-data: REDACTED client-key-data: REDACTED token: 3GuTCLvFnINHed9dWICICidlrSv8C0kg - name: aws_kubernetes-basic-auth user: password: 8pxC121Oj7kN0nCa username: admin |
그리고 clusters.cluster.server 속성 값은 쿠버네티스 마스터의 위치를 보여줍니다. 그리고 사용자 속성은 대시보드에 액세스하는 데 사용할 수 있는 두 명의 사용자를 표시합니다. 두 번째 사용자는 기본 인증을 사용하므로
사용자 이름 그리고 비밀번호 속성 값입니다. 저희의 경우 대시보드 UI는 https://52.40.9.27/ui 에서 액세스할 수 있습니다.

이 멋진 대시보드에서 모든 Kubernetes 리소스를 쉽게 확인할 수 있습니다.
쿠버네티스 클러스터 종료
마지막으로 Kubernetes 클러스터를 종료합니다:
|
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 42 43 |
kube-down.sh Bringing down cluster using provider: aws Deleting instances in VPC: vpc-6b5b4b0f Deleting auto-scaling group: kubernetes-minion-group-us-west-2a Deleting auto-scaling launch configuration: kubernetes-minion-group-us-west-2a Deleting auto-scaling group: kubernetes-minion-group-us-west-2a Waiting for instances to be deleted Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... Waiting for instance i-f95bdae1 to be terminated (currently shutting-down) Sleeping for 3 seconds... All instances deleted Releasing Elastic IP: 52.40.9.27 Deleting volume vol-99a30b11 Cleaning up resources in VPC: vpc-6b5b4b0f Cleaning up security group: sg-cd0ca0b4 Cleaning up security group: sg-d20ca0ab Deleting security group: sg-cd0ca0b4 Deleting security group: sg-d20ca0ab Deleting VPC: vpc-6b5b4b0f Done |
https://www.couchbase.com/products/cloud/kubernetes 에서 다양한 오케스트레이션 프레임워크를 사용하여 Couchbase를 실행하는 방법에 대한 자세한 내용을 확인할 수 있습니다. 추가 참조:
- 카우치베이스 포럼 또는 스택오버플로우
- 팔로우하세요 @couchbasedev 또는 @couchbase
- 자세히 알아보기 카우치베이스 서버