K8S
-
Dockerfile CMD vs ENTRYPOINTK8S 2021. 6. 15. 17:56
Dockerfile을 이용해서 ubnutu image를 빌드하고 컨테이너가 시작되자마자 sleep 5라는 커맨드를 실행하고 싶다. 이때는 dockerfile에서 CMD sleep 5 라고 지정해주면 컨테이너가 시작하자마자 sleep 5가 실행된다. 하지만 sleep 5 CMD를 가진 우분투 이미지를 가지고 sleep 10을 실행하고 싶을때는 어떻게 해야할까? docker run ubuntu-sleeper sleep 10 으로 실행할 수도 있겠지만 sleep이 아닌 복잡한 커맨드라면 힘들 수 있다. 이때 ENTRYPOINT를 이용하면 이러한 문제를 쉽게 해결할 수 있다. 위와 같이 ENTRYPOINT sleep으로 지정한 후, container를 생성할 때, docker run ubuntu-sleeper ..
-
K8S Multiple Scheduler 생성하기K8S 2021. 6. 14. 17:46
이번 포스팅은 쿠버네티스 클러스터 내에서 스케줄러를 하나 더 만들고 이를 사용해보는 실습을 한다. kubeadm으로 클러스터를 생성하면 /etc/kubernetes/manifest 경로에 있는 definition file들에 의해 static pod 형태로 생성된 포드를 볼 수 있다. (뒤에 -controlplane이 붙은 포드들이 static pod들이다) multiple scheduler를 만들기 위해 /etc/kubernetes/manifest 경로의 scheduler file을 사용한다. 참고로 생성할 스케줄러는 /etc/kubernetes/manifest 경로가 아닌 다른 경로에서 수정해주어야 한다. 이유는 다음을 참고 K8S Scheduling 정리2 (Resource, Daemonsets, ..
-
K8S Scheduling 정리2 (Resource, Daemonsets, Static pod)K8S 2021. 6. 13. 18:02
1. 리소스 관리 Docker container에서의 컨테이너 리소스 제한은 없다. 즉 계속 확장된다. 하지만 쿠버네티스에서 리소스 사용량을 제한하며 default resource request는 container당 0.5vcpu와 256Mi, default resource limit는 container당 1vcpu와 512Mi로 생성된다. 물론 default이므로 리소스 사용 제한을 다음과 같이 다르게 변경해 줄수도 있다. 2. Daemonsets 클러스터 각 노드에 포드를 하나씩 생성하는 오브젝트다. 대표적인 데몬셋으로 kube-proxy가 있다. 클러스터에 노드가 추가되면 데몬셋 포드 또한 추가되며 노드가 detach될 경우에도 마찬가지로 포드가 제거된다. 각 노드에 포드를 하나씩 생성하기 때문에 ..
-
K8S Scheduling 정리 (Taint, Toleration, Node Affinity)K8S 2021. 6. 12. 22:40
1. manual scheduling k8s 스케줄러는 포드가 어떤 노드에 될 것인지 결정한다. 만약 스케줄러에 장애가 생긴다면 포드를 생성해도 포드는 pending상태에 머문다. 이때 manual한 방법으로 스케줄링 시켜줄 수 있는데 다음과 같이 nodeName에 할당할 노드명을 적어주면 정상적으로 동작시킬 수 있다. 2. annotation annoatation은 tool detail, version, build information등을 기록하기 위한 용도로 사용된다. 3. label을 기반으로 pod 찾기 selector를 이용하여 원하는 label에 속하는 포드를 구할 수 있다. 여러개의 label에 속한 포드를 찾고 싶다면 콤마를 이용한다. 4. taint, toleration 1) node01..
-
K8S 아키텍처 정리 (Kube-scheduler, Kubelet, Kube-proxy)K8S 2021. 6. 2. 22:06
1. Kube-Scheduler 스케줄러는 어떤 포드가 어떤 노드로 갈지를 결정하는 등 스케줄을 짠다. 하지만 스케줄을 짤 뿐, 실제로 노드 위에 포드를 놓지는 않는다. (노드 위에 포드를 할당하는 것은 Kubelet의 역할) 스케줄러는 오직 포드를 어떤 노드로 옮길 것인지만 결정한다. 그렇다면 스케줄러는 어떻게 적당한 노드를 선택하고 포드를 옮길까? 스케줄러는 먼저 포드들을 관찰하면서 포드가 할당되기 좋은 최적의 노드를 결정한다. 예를 들어 다음과 같이 CPU 10을 필요로 하는 포드를 CPU 4, CPU 4, CPU 12, CPU 16를 리소스를 갖는 노드에 배포한다고 해보자. 이 때 다음과 같은 과정을 통해 최적의 노드를 결정한다. 1) Filter Nodes 해당 포드에 적합하지 않는 노드는 먼저..
-
K8S 아키텍처 정리(ETCD, Kube-api server, Kube-controller-manager)K8S 2021. 6. 1. 12:52
1. ETCD ETCD는 안전하고 빠른 distributed reliable key-value store로 다음과 같은 RDB를 생각하면 된다. ETCD는 기본적으로 2379번 포트를 이용하며 다음 커맨드를 통해 key value을 저장할 수 있다. ./etcdctl set key1 value1 ETCD에서 값 반환하기 ./etcdctl get key1 K8S에서 ETCD의 역할 kubectl command에서 얻을 수 있는 모든 정보는 마스터 노드의 ETCD 서버로부터 얻는다. 노드를 추가할 때, 포드를 배포할때, 레플리카 셋을 변경할때 등 상태가 변화할때 ETCD 서버에서 업데이트된다. K8S 배포형태는 2가지의 타입이 있는데 scratch를 이용한 배포와 kubeadm이 있다. scratch를 이용..
-
클라우드: 쿠버네티스 인그레스(Ingress) 실습하기(feat.minikube)K8S 2021. 5. 3. 16:57
이번 포스팅은 쿠버네티스의 Ingress obejct에 대해 다룬다. 이전에 다루었던 Nodeport service는 외부의 트래픽을 그냥 받아들였다면 이번에 사용해볼 Ingress는 외부의 트래픽을 어떻게 처리할 것인지 결정한다. 인그레스 오브젝트가 담당할 수 있는 기능은 크게 다음과 같은 것들이 있다. 1. 라우팅 2. 도메인처리 3. SSL/TLS 보안처리 그리고 이번 실습은 라우팅만 사용해보면서 인그레스에 대한 감을 익힌다. 참고로 필자는 미니큐브를 이용하여 인그레스를 사용하고 다음과 같은 구조로 nginx를 배포할 것이다. 구조에 대해 간략하게 설명하자면 클러스터에서 외부의 트래픽을 제일 처음으로 받는 서버는 인그레스 컨트롤러 서버이다. 그리고 우리는 인그레스 컨트롤러 서버에 원하는 인그레스 규..
-
클라우드: Django 웹서버 K8S NodePort로 배포하기K8S 2021. 4. 28. 21:02
우선 NodePort service에 대해서 잘 모른다면 다음을 참고하자. 클라우드: 쿠버네티스 서비스(Service) ClusterIP와 NodePort 실습하기 이전의 경우에서는 kubectl describe 커맨드로 포드의 내부의 IP를 찾고, 마스터노드를 통해 포드에 직접 접근했다. 네트워크: 쿠버네티스 포드(Pod) 오브젝트 사용하기 쿠버네티스는 대부분의 리소스 seungjuitmemo.tistory.com 이번 포스팅은 필자의 개인 서버에 쿠버네티스 NodePort 방식으로 전에 만들었던 django 웹을 배포할 것이다. 예전에 잘 쓰지 않는 노트북에 우분투를 설치해서 서버로 사용중인데 단지 NodePort방식으로 웹서버를 배포해보면 어떨까 싶어서 이 포스팅을 작성한다. 대략적인 아키텍처는 다..