티스토리 뷰
<출처>
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 |
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 |
'Kubernetes' 카테고리의 다른 글
09 Kubernetes Basics - Running Multiple Instances of Your App (0) | 2018.08.23 |
---|---|
08 Kubernetes Basics - Using a Service to Expose Your App (0) | 2018.08.23 |
06 Kubernetes Basics - Using kubectl to Create a Deployment (4) | 2018.08.19 |
05 Kubernetes Basics - Using Minikube to Create a Cluster (0) | 2018.08.19 |
04 Kubernetes Basics - Overview (0) | 2018.08.19 |