티스토리 뷰

<출처> 

https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-intro/





Objectives

  • K8S 파드에 대해 배운다.
  • K8S 노드에 대해 배운다.
  • 배포된 애플리케이션을 트러블슈팅 해본다.


Kubernetes Pods


모듈 2에서 디플로이먼트를 생성할 때, K8S 는 애플리케이션 인스턴스를 호스트 해줄 파드를 생성해 줬다. 파드는 하나 또는 그 이상의 애플리케이션 컨테이너(Docker나 rkt 와 같은)의 그룹을 나타내는 K8S 의 추상화 개념이다. 그리고 이들 컨테이너는 다음과 같은 리소스를 공유한다.

  • 볼륨과 같은 스토리지
  • 유일한 클러스터 IP 주소와 같은 네트워킹
  • 컨테이너 이미지 버전 또는 사용할 특정 포트와 같이 각 컨테이너가 동작하게 될 방식에 대한 정보

파드는 특유한 "논리적 호스트" 애플리케이션 모형을 만들어, 상대적으로 밀접하게 결합되어진 다양한 애플리케이션 컨테이너를 포함할 수 있다. 파드는 Node.js 앱과 더불어 Node.js 웹 서버에 의해 퍼블리쉬 되는 데이터를 제공하는 상이한 컨테이너를 함께 포함시킬 수 있다. 파드 내 컨테이너들은 IP주소, 그리고 포트 스페이스를 공유하고 항상 함께 위치하고 함께 스케줄링 되고 동일 노드 상의 컨텍스트를 공유하면서 동작한다.

파드는 K8S 플랫폼 상에서 최소 단위가 된다.  K8S에서 디플로이먼트를 생성할때, 그 디플로이먼트는 컨테이너 내부에서 컨테이너와 함께 파드를 생성한다.

각 파드는 스케줄 되어진 노드에 묶이게 된다. 그리고 (재구동 정책에 따라) 소멸되거나 삭제되기 전까지 노드에 유지된다. 노드가 실패 날 경우, 클러스터 내 이용가능한 다른 노드를 대상으로 스케줄 된다. 


Summary:

  • Pods
  • Nodes
  • Kubectl main commands


파드는  하나 또는 그 이상의 애플리케이션 컨테이너들(Docker나 rkt 와 같은)의 그룹을 나타내는 K8S 의 추상화 개념이다. 그리고 이 컨테이너는 스토리지(볼륨들), IP 조소, 그리고 애플리케이션 컨테이너를  어떻게구동해야 할지에 대한 정보 등을 공유한다.


Pods overview



Nodes


파드는 언제나 노드 상에서 동작한다. 노드는 K8S 에서 워커 머신을 말하며 클러스터에 따라 가상 또는 물리 머신일 수 있다. 각 노드는 마스터에 의해 관리된다. 하나의 노드는 여러 개의 파드를 가질 수 있고, K8S 마스터는 클러스터 내 노드들 사이에서 파드의 스케줄링을 자동으로 처리한다.

마스터의 자동 스케줄링은 각 노드 상의 가용한 리소스를 고려하여 이루어 진다.

모든 K8S 노드는 최소한 다음과 같이 동작한다:


  • Kubelet, K8S 마스터와 노드 간에 통신을 책임지는 프로세스; 하나의 머신 상에서 동작하는 파드와 컨테이너를 관리한다.
  • Docker, rkt 와 같은 컨테이너 런타임은 레지스트리에서 컨테이너 이미지를 가져와 묶인 것을 풀고 애플리케이션을 동작시키는 책임을 맡는다. 



Node overview




Troubleshooting with kubectl


배포된 애플리케이션과 환경에 대한 정보를 확인해보자.


  • kubectl get - 리소스를 리스트 한다.
  • kubectl describe - 리소스에 대한 상세한 정보를 보여준다.
  • kubectl logs - 파드 내 컨테이너 로그를 출력한다. 
  • kubectl exec - 파드 내 컨테이너를 대상으로 명령을 실행한다. 


위 명령을 통해 언제 애플리케이션이 배포되었고, 현재 상태는 어떠하며, 어디에서 동작 중이고 그 구성정보가 무엇인지에 대해 알아 볼 수 있을 것이다.



Interactive Tutorial - Exploring Your App


이번 시나리오에서  kubectl get, describe, logs 그리고 exec 명령을 이용하여 어떻게 K8S 애플리케이션에 대한 장애조치를 할 수 있는지 배우게 될 것이다.


Step 1: Create a new service


애플리케이션의 잘 동작하고 있는지 확인해 보자. 현재 존재하는 파드의 정보를 확인해 보자. 


1
2
3
4
root@zerobig-vm:~# kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5c69669756-d4kgp   1/1       Running   1          9h
 
cs


다음으로, 컨테이너들을 빋드하면서 무슨 이미지들이 사용되어졌고 파드 내 어떤 컨테이너가 존재하는지 describe pods 명령으로 상세하게 살펴보자.

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
root@zerobig-vm:~# kubectl describe pods
Name:           kubernetes-bootcamp-5c69669756-d4kgp
Namespace:      default
Node:           minikube/10.0.2.15
Start Time:     Thu, 09 Aug 2018 00:31:44 +0900
Labels:         pod-template-hash=1725225312
                run=kubernetes-bootcamp
Annotations:    <none>
Status:         Running
IP:             172.17.0.5
Controlled By:  ReplicaSet/kubernetes-bootcamp-5c69669756
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://7174b4be1ebce8c7516680bb45ff300d64b38c6b66710f9e38f2d6a59dfed47a
    Image:          gcr.io/google-samples/kubernetes-bootcamp:v1
    Image ID:       docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 09 Aug 2018 09:25:51 +0900
    Last State:     Terminated
      Reason:       Error
      Exit Code:    255
      Started:      Thu, 09 Aug 2018 00:32:58 +0900
      Finished:     Thu, 09 Aug 2018 09:24:40 +0900
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-7d4h2 (ro)
Conditions:
  Type           Status
  Initialized    True
  Ready          True
  PodScheduled   True
Volumes:
  default-token-7d4h2:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-7d4h2
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason                 Age   From               Message
  ----    ------                 ----  ----               -------
  Normal  Scheduled              9h    default-scheduler  Successfully assigned kubernetes-bootcamp-5c69669756-d4kgp to minikube
  Normal  SuccessfulMountVolume  9h    kubelet, minikube  MountVolume.SetUp succeeded for volume "default-token-7d4h2"
  Normal  Pulling                9h    kubelet, minikube  pulling image "gcr.io/google-samples/kubernetes-bootcamp:v1"
  Normal  Pulled                 9h    kubelet, minikube  Successfully pulled image "gcr.io/google-samples/kubernetes-bootcamp:v1"
  Normal  Created                9h    kubelet, minikube  Created container
  Normal  Started                9h    kubelet, minikube  Started container
  Normal  SuccessfulMountVolume  35m   kubelet, minikube  MountVolume.SetUp succeeded for volume "default-token-7d4h2"
  Normal  SandboxChanged         35m   kubelet, minikube  Pod sandbox changed, it will be killed and re-created.
  Normal  Pulled                 35m   kubelet, minikube  Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine
  Normal  Created                35m   kubelet, minikube  Created container
  Normal  Started                35m   kubelet, minikube  Started container
cs


파드의 컨테이너에 대한 자세한 내용이 확인된다. IP 주소, 포트정보 그리고 파드의 생명주기와 연관된 이벤트들의 리스트 등등

describe 출력정보가 방대하고 아직 이해하기 어려운 내용들도 담겨져 있기는 하나 교육의 후반부에서는 친숙하게 될 것이니 그리 걱정할 필요는 없다.



Step 2:  Show the app in the terminal


분리된, 사설망에서 작동하는 파드를 다시 호출 해보자. 그 파드와 상호작용하며 디버그 할 수 있도록 (파드에) 접근할 수 있는 proxy 가 필요하다.

이를 위해, 우리는 두 번째 터미널 윈도우에서 kubectl proxy 명령을 수행할 것이다. 


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


이제 다시, 파드 이름을 취해 파드가 proxy 를 통해서 직접 쿼리 하도록 할 것이다. 취한 파드 이름을 POD_NAME 환경 변수에 넣어 줄 것이다.


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


애플리케이션의 출력을 확인하기 위해 curl 명령을 수행해 보자.


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



Step 3: View the container logs


애플리케이션이 일반적으로 STDOUT으로 보내는 내용이 무엇이든 파드 내 컨테이너에 대한 logs가 된다. 다음 명령을 통해 이 logs를 확인할 수 있다.


1
2
3
4
5
root@zerobig-vm:~# kubectl logs kubernetes-bootcamp-5c69669756-d4kgp
Kubernetes Bootcamp App Started At: 2018-08-09T00:25:52.599Z | Running On:  kubernetes-bootcamp-5c69669756-d4kgp
 
Running On: kubernetes-bootcamp-5c69669756-d4kgp | Total Requests: 1 | App Uptime: 2812.331 seconds | Log Time: 2018-08-09T01:12:44.930
 
cs





Step 4: Executing command on the container


일단 파드가 올라와 구동되면 컨테이너에서 직접 명령을 실행할 수 있다. exec 명령을 이용해서 파라미터로서의 파드 이름을 이용할 수 있다.

환경변수를 리스트로 나타나게 해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@zerobig-vm:~# kubectl exec kubernetes-bootcamp-5c69669756-d4kgp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-5c69669756-d4kgp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
HOME=/root
cs


다시한번 언급하지만, 파드 내 하나의 컨테이너만 존재하므로 컨테이너 이름 자체는 생략할 수 있다는 점을 주의하자.

다음으로, 파드 내 컨테이너에서 bash 세션을 시작해 보자.


1
2
3
4
root@zerobig-vm:~# kubectl exec -it kubernetes-bootcamp-5c69669756-d4kgp bash
root@kubernetes-bootcamp-5c69669756-d4kgp:/# uname -a            
Linux kubernetes-bootcamp-5c69669756-d4kgp 4.15.0 #1 SMP Mon Jul 16 20:23:29 UTC 2018 x86_64 GNU/Linux 
cs


Node.js 애플리케이션이 동작하고 있는 컨테이너 상에 콘솔이 열리게 되고 애플리케이션의 소스코드는 server.js 파일 내에 있다.

curl  명령을 통해 애플리케이션의 동작 여부를 확인 할 수 있다. 

연결을 종료하려면 exit 을 타이핑하여 빠져 나온다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@kubernetes-bootcamp-5c69669756-d4kgp:/# cat server.js
var http = require('http');
var requests=0;
var podname= process.env.HOSTNAME;
var startTime;
var host;
var handleRequest = function(request, response) {
  response.setHeader('Content-Type''text/plain');
  response.writeHead(200);
  response.write("Hello Kubernetes bootcamp! | Running on: ");
  response.write(host);
  response.end(" | v=1\n");
  console.log("Running On:" ,host, "| Total Requests:"++requests,"| App Uptime:", (new Date() - startTime)/1000 , "seconds""| Log Time:",new Date());
}
var www = http.createServer(handleRequest);
www.listen(8080,function () {
    startTime = new Date();;
    host = process.env.HOSTNAME;
    console.log ("Kubernetes Bootcamp App Started At:",startTime, "| Running On: " ,host, "\n" );
});
root@kubernetes-bootcamp-5c69669756-d4kgp:/# curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-d4kgp | v=1
root@kubernetes-bootcamp-5c69669756-d4kgp:/# exit
exitroot@zerobig-vm:~#
cs




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