티스토리 뷰

<출처> 

https://kubernetes.io/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/




Objectives


  • 애플리케이션 배포에 대해 배운다.
  • kubectl 을 이용해 K8S에 첫 앱을 배포한다.



Kubernetes Deployments


일단 구동상태의 K8S 클러스터가 준비되면, 그 위에 컨테이너화된 애플리케이션들을 배포할 수 있다. 그러기 위해서, K8S 디플로이먼트 구성을 만든다. 디플로이먼트는 K8S에게 어떻게 애플리케이션의 인스턴스를 생성하고 업데이트 할지에 대해 지시한다. 디플로이먼트가 생성되면, K8S 마스터는 클러스터 내에 개별 노드들을 대상으로 해당 애플리케이션 인스턴스들을 스케줄링한다.


애플리케이션 인스턴스가 생성되면, K8S 디플로이먼트 컨트롤러는 지속적으로 그 인스턴스를 모니터링하고 인스턴스를 호스팅하고 있는 노드가 다운되거나 삭제되면 디플로이먼트 컨트롤러가 이를 대체해준다. 이렇게 장비 고장이나 유지보수를 처리하는 자가 치유(self-healing) 메커니즘을 제공한다.


오케스트레이션으로 통하지 않았던 환경에서, 설치 스크립트가 애플리케이션를 기동 시키는데 이용되긴 했지만, 장비의 오동작을 복구시켜주도록 하지는 않았다. K8S 디플로이먼트는 애플리케이션 인스턴스를 생성하고 노드에 걸쳐 지속적으로 구동하도록 해줌으로써, 근본적으로 애플리케이션 관리에 대한 접근법에서 차이를 제공한다.


Deploying your first app on Kubernetes






여러분은 Kubectl 즉, K8S CLI 를 이용하여 디플로이먼트를 생성하고 관리할 수 있다. Kubectl 은 K8S API를 이용해서 클러스터와 상호작용한다. 

디플로이먼트를 생성할 때, 구동하려는 만큼의 레플리카 수와 애플리케이션에  대한 컨테이너 이미지 정보를 함께 표기해줘야 한다. 이 정보는 나중에 업데이트하여 변경할 수 있다. 


애플리케이션이 K8S 상에 배포되기 위해서 지원되는 컨테이너 포맷들 중 하나로 패키징 되어야 한다.


첫 디플로이먼트를 위해 도커 컨테이너 내에 패키지된 Node.js 애플리케이션을 이용할 것이다. 소스 코드와 Dockerfile은  GitHub repository 에서 구할 수 있다.



Interactive Tutorial - Deploying an App


이번 시나리오의 목표는 여러분이 kubectl 을 이용하여 K8S에 첫 번째 앱을 배포할 수 있도록 도움을 주는 것이다. kubectl CLI 에 대한 기본을 익히게 될 것이고 애플리케이션과는 어떻게 상호작용 할 수 있는가에 대해서도 익히게 될 것이다.



Step1: kubectl basics


kubectl 버전을 확인하고 클러스터 내의 노드 정보를 확인해 본다. 


1
2
3
4
5
6
root@zerobig-vm:/home/study/k8s# kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:53:20Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
root@zerobig-vm:/home/study/k8s# kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     master    1d        v1.10.0
cs




Step2: Deploy our app


kubectl run 명령을 통해 K8S가 우리의 첫번째 APP을 구동시키도록 해보자. run 명령은 새로운 디플로이먼트를 생성해준다. 디프롤이먼트 이름과 앱 이미지 위치(외부 도커 허브에 호스트된 이미지들의 전체 레파지토리 URL 포함) 정보를 제공해줘야 한다.

특정 포트를 통해 APP이 구동되길 원한다면 --port 파라미터 정보도 함께 명시해야 한다.


1
2
3
4
5
6
root@zerobig-vm:/home/study/k8s# kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
deployment.apps/kubernetes-bootcamp created
root@zerobig-vm:/home/study/k8s# kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1         1         1            0           18s
 
cs


이 디플로이먼트를 통해 다음을 수행해준다.

  • 애플리케이션의 인스턴스가 구동될 수 있는 적합한 노드를 검색해 준다.
  • 노드 상에서 구동되어질 애플리케이션을 스케줄해준다.
  • 필요 시 새로운 노드상에 그 인스턴스가 다시 스케줄 되도록 클러스터를 구성해준다.



Step3: View our app


K8S 내에서 동작중인 파드는 격리된 사설 네트워크 상에서 동작한다.  기본적으로 그것들은 다른 파드로부터 보여질 수 있고 동일 K8S 클러스터 내에서 서비스가 가능하다.

그러나 외부망으로부터의 접근은 불가하다. kubectl 을 이용할 때, 우리의 애플리케이션과 커뮤니케이션하는 API 엔드포인트를 통해서 상호작용 할 수 있다.


kubectl 명령을 통해서 내부망 즉, 클러스터 범위 내에서 커뮤니케이션을 가능토록 하는 proxy 를 생성할 수 있다. 그것이 동작하는 동안에 어떤 출력도 화면에 안나타나게 되는데 Control-C 를 눌러 종료시킬 수 있다.


새로운 터미널을 하나 띄어서 proxy 를 동작시켜 보자.


1
2
root@zerobig-vm:~# kubectl proxy
Starting to serve on 127.0.0.1:8001
cs




이제 호스트 간 그리고 K8S 클러스터 간의 연결을 만들었다. proxy는 이 터미널을 통해 API 로 직접 접근가능할 수 있도록 해준다.


proxy 엔드포인트를 통해 모든 API들을 볼수 있는데 http://localhost:8001 을 통해 이용가능하다. 


<이하 생략>


예를 들면, 우리는 curl 명령 이용해 API 를 통해 직접 쿼리해 볼 수 있다.



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
root@zerobig-vm:/home/study/k8s# curl http://localhost:8001
{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/",
    "/apis/admissionregistration.k8s.io",
    "/apis/admissionregistration.k8s.io/v1beta1",
    "/apis/apiextensions.k8s.io",
    "/apis/apiextensions.k8s.io/v1beta1",
    "/apis/apiregistration.k8s.io",
    "/apis/apiregistration.k8s.io/v1",
    "/apis/apiregistration.k8s.io/v1beta1",
    "/apis/apps",
    "/apis/apps/v1",
    "/apis/apps/v1beta1",
    "/apis/apps/v1beta2",
    "/apis/authentication.k8s.io",
    "/apis/authentication.k8s.io/v1",
    "/apis/authentication.k8s.io/v1beta1",
    "/apis/authorization.k8s.io",
    "/apis/authorization.k8s.io/v1",
    "/apis/authorization.k8s.io/v1beta1",
    "/apis/autoscaling",
    "/apis/autoscaling/v1",
    "/apis/autoscaling/v2beta1",
    "/apis/batch",
    "/apis/batch/v1",
    "/apis/batch/v1beta1",
    "/apis/certificates.k8s.io",
    "/apis/certificates.k8s.io/v1beta1",
    "/apis/events.k8s.io",
    "/apis/events.k8s.io/v1beta1",
    "/apis/extensions",
    "/apis/extensions/v1beta1",
    "/apis/networking.k8s.io",
    "/apis/networking.k8s.io/v1",
    "/apis/policy",
    "/apis/policy/v1beta1",
    "/apis/rbac.authorization.k8s.io",
    "/apis/rbac.authorization.k8s.io/v1",
    "/apis/rbac.authorization.k8s.io/v1beta1",
    "/apis/storage.k8s.io",
    "/apis/storage.k8s.io/v1",
    "/apis/storage.k8s.io/v1beta1",
    "/healthz",
    "/healthz/autoregister-completion",
    "/healthz/etcd",
    "/healthz/ping",
    "/healthz/poststarthook/apiservice-openapi-controller",
    "/healthz/poststarthook/apiservice-registration-controller",
    "/healthz/poststarthook/apiservice-status-available-controller",
    "/healthz/poststarthook/bootstrap-controller",
    "/healthz/poststarthook/ca-registration",
    "/healthz/poststarthook/generic-apiserver-start-informers",
    "/healthz/poststarthook/kube-apiserver-autoregistration",
    "/healthz/poststarthook/rbac/bootstrap-roles",
    "/healthz/poststarthook/start-apiextensions-controllers",
    "/healthz/poststarthook/start-apiextensions-informers",
    "/healthz/poststarthook/start-kube-aggregator-informers",
    "/healthz/poststarthook/start-kube-apiserver-informers",
    "/logs",
    "/metrics",
    "/openapi/v2",
    "/swagger-2.0.0.json",
    "/swagger-2.0.0.pb-v1",
    "/swagger-2.0.0.pb-v1.gz",
    "/swagger.json",
    "/swaggerapi",
    "/version"
  ]
}
cs


API 서버는 자동으로 각 파드에게 엔드포인트를 생성해 주고 또한 파드 이름을 가지고 proxy를 통해 접근이 가능하다.


우선, 파드 이름을 얻고 나서 POD_NAME 환경 변수에 넣어줄 것이다.


1
2
3
root@zerobig-vm:/home/study/k8s# export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
root@zerobig-vm:/home/study/k8s# echo Name of the Pod:$POD_NAME
Name of the Pod:kubernetes-bootcamp-5c69669756-d4kgp
cs


이제 이 파드에서 동작하는 애플리케이션에 대해 HTTP request 를 할 수 있게 되었다.


1
2
3
root@zerobig-vm:/home/study/k8s# curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-d4kgp | v=1 
cs


이 url 은 파드의 API 로 라우팅 해준다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함