'cluster'에 해당하는 글 5건

 

Tomcat 에서 인스턴스를 여러개 만들어 서비스에는 성공하였지만, 각 인스턴스간에 세션을 공유해야 할 상황이라면 몇가지 설정을 추가해야 한다.

 

테스트 환경 : CentOS 7 / Tomcat 8.5
테스트 목표 : 구성된 인스턴스 간에 이동을 하더라도 session 유지

 

 

1. 현재 인스턴스 세션 확인

 

톰캣의 기본 고양이 화면 파일을 수정하여 세션ID 를 노출시켰다.

 

$ vi /app/tomcat/instance1/webapps/ROOT/index.jsp
<!-- 세션 사용하도록 항목 삭제나 변경. (기본값 session="true") -->
<%@ page session="false" %>

<!-- body 태그 안에 추가 -->
<%=session.getId()%>


http://serverIP:port1
http://serverIP:port2
http://serverIP:port3

 

EF5B9FCA054DBCEC5E3201DBA42C927A 처럼 보여지는 세션ID 는 세 인스턴스 간에 모든 다른 값을 출력할 것이다.

 

 

2. server.xml 파일 수정

server.xml 파일에 클러스터 설정의 주석을 해제한다.

상세 설정은 tomcat 웹사이트 참고 : https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html 

 

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

 


3. 방화벽 port 추가

<Membership className="org.apache.catalina.tribes.membership.McastService"
            address="228.0.0.4"
            port="45564"
            frequency="500"
            dropTime="3000"/>


클러스터 멤버를 구성하는데 필요한 Multicast 기본 포트(45564)를 추가한다.
멀티캐스트(multicast)는 한 번의 송신으로 메시지나 정보를 여러 컴퓨터에 동시에 전송하는 역할을 한다.

 

# firewall-cmd --permanent --zone=public --add-port=45564/tcp
# firewall-cmd --permanent --zone=public --add-port=45564/udp
# firewall-cmd --reload

 

 

4. web.xml 파일 수정

각 인스턴스의 webapps/ROOT/WEB-INF/web.xml 파일 아래에 distribuable 요소를 추가하면, 해당 컨텍스트에 대한 클러스터링이 진행되며 세션 공유가 가능해 진다.

<web-app ...>
  <distributable/>
</web-app>



5. Apache / Tomcat 재부팅

http://serverIP:port1
http://serverIP:port2
http://serverIP:port3

재부팅 하면 포트간에 이동하여도 동일한 세션ID 가 유지됨을 확인할 수 있다.

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret



Master


위 그림은 쿠버네티스 클러스터의 아키텍처이다. 좌측의 마스터 컴포넌트는 클러스터의 제어영역(control plane) 을 제공하여, 클러스터에 관한 전반적인 결정을 수행하고 클러스터 이벤트를 감지하고 반응한다. 마스터 컴포넌트는 클러스터 내에 어떤 노드에서든 동작할 수 있지만, 일반적으로 클러스터와 동일한 노드 상에서 구동시킨다. 아래는 마스터 내에서 동작하는 바이너리 컴포넌트들이며 쿠버네티스 초기화시 자동 설치된다.


kube-apiserver

쿠버네티스 API 로, 외부/내부에서 관리자의 원격 명령을 받을 수 있는 컴포넌트이다.


etcd

모든 클러스터 데이터를 저장하는 고가용성 키-값 저장소로, etcd 데이터에 대한 백업 계획은 필수이다.


kube-scheduler

생성된 파드를 노드에 할당해 주는 컴포넌트이다. 이것을 스케줄링이라 하며, 리소스/하드웨어/소프트웨어/정책/워크로드 등을 모두 참고하여 가장 최적화된 노드에 파드를 배치하게 될 것이다.


kube-controller-manager

아래의 컨트롤러들을 구동하는 컴포넌트이다.

- Node Controller : 노드가 다운되었을 때 알림와 대응에 관한 역할을 한다.

- Replication Controller : 지정된 수의 파드들을 유지시켜 주는 역할을 한다.

- Endpoints Controller: 서비스와 파드를 연결시켜 엔드포인트 오브젝트를 만든다.

- Service Account & Token Controllers: 새로운 네임스페이스에 대한 기본 계정과 API 접근 토큰을 생성한다.



Node


우측 하단의 노드 컴포넌트(Minions) 는 마스터 컴포넌트에 의해 관리되며 VM 이나 물리 장치가 될 수 있다. 동작중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공한다. 아래는 노드 내에서 동작하는 바이너리 컴포넌트들이며 노드 오브젝트 생성시 자동 설치된다.


kubelet

클러스터의 각 노드에서 실행되는 에이전트로, 컨테이너들이 파드에서 실행 중인지, 이상이 없는지 확인한다.


kube-proxy

호스트 상의 네트워크 규칙으로 커넥션 포워딩을 수행함으로서 쿠버네티스 Service 가 가능하도록 한다.


Container Runtime

컨테이너 런타임은 컨테이너의 동작을 책임지며, 쿠버네티스에서 지원하는 컨테이너 런타임은 다음과 같다. 

Docker, containerd, cri-o, rktlet, Kubernetes CRI (Container Runtime Interface) 구현체.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

Google Cloud Platform 에서 쿠버네티스를 운영하기 위한 방법으로 Kubernetes Engine 과 Kubernetes API 를 사용하여 어플리케이션을 배포 및 관리 할 수 있다. 간단하게 쿠버네티스를 이용하여 어플리케이션을 테스트 해보자.


GKE(Google Kubernetes Engine) 를 사용하여 쿠버네티스 클러스터 생성

kubectl 를 사용하여 Docker 컨테이너를 배포 및 관리

쿠버네티스의 Deployment 와 Service 를 사용하여 마이크로 서비스로 어플리케이션 분리



1. 구성 연결


GCP 콘솔의 APIs & services 에서 Kubernetes Engine API 와 Container Registry API 이 활성화 되어 있는지 체크하고, Cloud Shell 이나 Cloud SDK 를 사용하여 GCP 계정, 프로젝트, zone 설정 등을 확인한다.


> gcloud config list



2. 클러스터-노드 생성


> gcloud container clusters create bootcamp --num-nodes 5 --scopes "https://www.googleapis.com/auth/projecthosting,storage-rw"


NAME      LOCATION       MASTER_VERSION  MASTER_IP     MACHINE_TYPE   NODE_VERSION   NUM_NODES  STATUS

bootcamp  us-central1-a  1.11.7-gke.12   35.202.79.78  n1-standard-1  1.11.7-gke.12  5          RUNNING


위의 명령으로 클러스터(bootcamp) 와 node 가 5개 생성된다. --scopes 인수는 나중에 사용할 프로젝트 호스팅과 Google Cloud Storage API 에 대한 액세스를 제공한다.


> kubectl get nodes

NAME                                      STATUS    ROLES     AGE       VERSION

gke-bootcamp-default-pool-654208f7-2pc5   Ready     <none>    8m        v1.11.7-gke.12

gke-bootcamp-default-pool-654208f7-4hbc   Ready     <none>    8m        v1.11.7-gke.12

gke-bootcamp-default-pool-654208f7-9wxw   Ready     <none>    8m        v1.11.7-gke.12

gke-bootcamp-default-pool-654208f7-qf9k   Ready     <none>    8m        v1.11.7-gke.12

gke-bootcamp-default-pool-654208f7-x9vz   Ready     <none>    8m        v1.11.7-gke.12


GCP 콘솔에서 확인하고 싶다면 클러스터는 [Kubernetes Engine > Cluster], 노드는 [Compute Engine > VM Instances] 에서 확인할 수 있다. 아래 예제처럼 GCP 콘솔에서 직접 클러스터를 생성할 수도 있다.






3. 어플리케이션 배포


> kubectl create deployment nginx --image=nginx:1.10.0

deployment.apps/nginx created


> kubectl get pods -o wide

NAME                     READY   STATUS    RESTARTS  IP          NODE

nginx-7d79bd4478-86289   1/1     Running   0         10.48.1.5   gke-bootcamp-default-pool-654208f7-4hbc


위 명령으로 nginx 컨테이너를 담은 파드가 생성되고 노드에 배치됐다.



4. 서비스 생성 (외부IP 노출)


> kubectl expose deployment nginx --port 80 --type LoadBalancer

service/nginx exposed


> kubectl get services

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE

kubernetes   ClusterIP      10.51.240.1     <none>          443/TCP        18m

nginx        LoadBalancer   10.51.250.242   34.66.113.107   80:32693/TCP   1m


위 명령으로 LoadBalancer 타입의 서비스를 생성하여 nginx 컨테이너를 외부에서 접근할 수 있게 한다. 생성된 External-IP 와 port 는 서비스가 유지되는 동안만 유효하다. (External-IP 생성에 일정 시간이 소요될 수 있음)



5. pod 수 확장


> kubectl scale deployment nginx --replicas 3

deployment.extensions/nginx scaled


> kubectl get pods -o wide

NAME                     READY   STATUS    RESTARTS  IP          NODE                                      NOMINATED NODE

nginx-7d79bd4478-86289   1/1     Running   0         10.48.1.5   gke-bootcamp-default-pool-654208f7-4hbc

nginx-7d79bd4478-j6wql   1/1     Running   0         10.48.2.4   gke-bootcamp-default-pool-654208f7-9wxw

nginx-7d79bd4478-zznhd   1/1     Running   0         10.48.3.5   gke-bootcamp-default-pool-654208f7-2pc5


위 명령은 생성해 놓은 nginx 배포(deployment) 의 pod 수를 3 개로 늘린다. 마스터는 요청에 따라 적절한 노드를 찾아 2개의 파드를 각각 추가로 배치한다. 트래픽이 많거나 적을 경우 위와 같이 파드 수를 늘리거나 줄일 수 있다.



6. 어플리케이션 테스트


> curl https://<External IP>:80





7. 삭제


파드나 서비스를 더 이상 사용하지 않을 경우 아래와 같이 삭제한다.


> kubectl delete deployment nginx

deployment.extensions "nginx" deleted


> kubectl get pods

No resources found.


> kubectl delete service nginx




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

minikube start

Tool/Kubernetes 2019. 3. 26. 00:20

빠르게(?) 쿠버네티스를 접해 볼 수 있는 minikube 를 간단(?)하게 설치하고 시작해 봤다. minikube 의 시작은 minikube start 였다. 이 minikube start 명령이 한 일은 바로 쿠버네티스 클러스터 생성과 마스터 구성 인데, 그 과정에서 얼마나 많은 일들을 사용자 대신 해줬는지 로그를 보며 살펴보자. 


# minikube start --vm-driver=none

o   minikube v0.35.0 on linux (amd64)

>   Configuring local host environment ...


           ... 생략 ...


i   This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true

>   Creating none VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

-   "minikube" IP address is 10.0.1.111

-   Configuring Docker as the container runtime ...

-   Preparing Kubernetes environment ...

@   Downloading kubeadm v1.13.4

@   Downloading kubelet v1.13.4

-   Pulling images required by Kubernetes v1.13.4 ...

-   Launching Kubernetes v1.13.4 using kubeadm ...

:   Waiting for pods: apiserver proxy etcd scheduler controller addon-manager dns

-   Configuring cluster permissions ...

-   Verifying component health .....

+   kubectl is now configured to use "minikube"

i   For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/

=   Done! Thank you for using minikube!



  1. VM 이든 none VM 이든 2CPU, 2GB 메모리, 20GB 디스크의 가상 node 생성.
  2. 컨텍스트(minikube) 를 생성하여 ip 를 할당하고, 컨테이너 런타임으로 docker 구성.
  3. docker 에서 쿠버네티스 이미지를 받고, Master node 측 도구인 kubeadm, kubelet 을 다운받아 kubeadm 으로 클러스터를 생성.
  4. Master 및 각종 pod 컨테이너 구성 : apiserver, proxy, etcd, scheduler, controller, addon-manager, dns
  5. 컴포넌트 상태 체크.
  6. 클러스터과 사용자가 통신할 수 있도록 kubectl 를 구성. (no VM 환경에서는 직접 다운로드)





클러스터를 하나 생성하는데 이렇게 많은 작업들이 필요하다. minikube 로 인해 대부분 자동으로 세팅이 되었지만 나중에 쿠버네티스를 사용할 때는 노드스펙, 네트워크, 디스크, 각종도구 설치, 클러스터 생성 등을 모두 직접 설정해야 한다. 이제 정말 서론은 끝났다. 다음은 진짜 쿠버네티스를 경험할 차례!




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

쿠버네티스는 어디부터 시작해야 할까? 쿠버네티스 이론과 플러스로 특정 클라우드 서비스의 이론, 오픈 소스인데 무료로는 쉽게 접할 수 없을 것 같은 무시무시함, 그 시작점도 여러가지, 솔루션도 여러가지라 시작하는 것부터가 고민이다. 일단 쿠버네티스를 접할 수 있는 방법은 다음과 같이 무궁무진하다.


1. 로컬 장치 솔루션 : PC 나 노트북 등에 쿠버네티스 경량 버전을 설치하고 스피드하게 쿠버네티스 접해보기.(무료!)

2. 호스티드 솔루션 : 쿠버네티스를 설치 없이 즉시 사용할 수 있는 클라우드 솔루션.(gke, eks)

3. 턴키 클라우드 솔루션 : gce 나 ec2 같은 클라우드 컴퓨터에서 클러스터 관리 등 편리한 쿠버네티스 운영을 위한 솔루션.

4. 그 외 클라우드 공급자와 베어메탈 환경, 많은 운영체제에서의 특수조합 솔루션과 사용자 정의 솔루션.


일일이 나열하지는 않았지만 보자마자 꺼버리고 싶을 정도로 다양한 솔루션들. 난 단지 쿠버네티스를 설치하고 테스트 해보고 싶을 뿐인데, 뭐라뭐라~~~ 간단하지는 않겠지만 하고자 한다면 원하는 플랫폼에서 원하는 수준으로 쿠버네티스 솔루션 사용이 가능하다. 특정 클라우드나/서버/OS 에 따라 설치방법이과 설정이 조금씩 다르나, 클러스터 생성 - 앱 배포 - 스케일링 - 업데이트 등의 쿠버네티스의 흐름은 모두 동일하다. 부담없는 무료버전을 빠르게 설치해서 쿠버네티스 명령과 동작 좀 익히고, 중간에 시간 좀 남으면 서버에 직접 설치도 해보고, 그러다가 호스티드 솔루션으로 자연스럽게 넘어가서 운영을 할 수 있을 정도가 되어보려 한다.


시작부터 난관에 빠지긴 했지만... 설치전에 쿠버네티스가 어떻게 생겼는지를 먼저 보는게 좋겠다.



요롷게 생겼다. 어떤 솔루션이든 쿠버네티스가 설치되어 있다면, 가장 먼저 클러스터라는 공간을 생성해 주어야 하며, 그 안에는 마스터 노드(Master) 와 워커 노드(Node) 를 생성할 수 있다. 마스터는 클러스터 내에 발생하는 모든 요청들을 담당하는 중추적인 역할을 하며 하나의 클러스터에 한 개만 있으면 된다. 노드는 클러스터에 따라 물리적인 컴퓨터나 가상머신(VM) 등의 장치가 된다. 앱이 구동될 공간이며, 하나의 클러스터에 여러 개를 생성할 수 있다. 모든 준비를 마친 후 앱을 배포하도록 Master 에 지시하면 적당한 Node 에서 앱을 구동하게 될 것이다. 겉보기는 저게 다다. 이렇게 보니까 되게 쉬워 보인다. 자신감+1.


다음은 로컬 장치 솔루션 사용해 보기!




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret