전체 글 87

122-127. OS Upgrades, Kubernetes Software Versions, Cluster Upgrade Process

기본적으로 업데이트를 하기 전에, ReplicaSet (이나 Deployment)를 잘 짜서, 한 서버를 내려버리더라도 다른 노드에서 필요한 Pod들이 잘 돌도록 구성할 필요가 있다.어떤 노드가 죽으면, 마스터노드가 죽은 노드에 있던 Pod들의 사망판정을 내리기까지 5분의 유예시간이 존재한다. 이것은 kube-controller-manager --pod-eviction-timeout=5m0s 명령어로 수정할 수 있다.Drain하기노드를 drain하면, 해당 노드에 대한 스케줄링은 멈추고 노드에 있던 모든 Pod들은 종료된다. ReplicaSet같은 게 제대로 설정되어 있다면, 꺼진 Pod들은 다른 노드로 옮겨 갈 것이다. Pod들이 옮겨간 뒤에, 업데이트를 하든 뭘 하든 지지고볶으면 된다.kubectl ..

100-104. Environment Variables and Configure Secrets in Application

환경변수를 줄 수 있다.spec: containers: - name: simple-webapp image: simple-webapp env: - name: APP_COLOR value: pink - name: JAVA_HOME value: /usr/ConfigMaps하지만 Pod 설정파일에 모든 환경변수를 때려박는다는것은 별로 가독성에 좋지 않을 수 있다.ConfigMaps는 쿠버에서 K-V 페어의 설정데이터를 저장하는 오브젝트이다(아마).Imperative 방식 생성kubectl create configmap conf-map-name --from-literal=APP_COLOR=pink --from-literal=JAVA_HOME=/usr/혹은 그냥 다음과 같은 파일을 만들고,..

96-97. Commands on Docker and Kubernetes

Docker에서 명령어예를 들어, 도커에서 docker run ubuntu로 우분투 이미지를 돌리면, 실행 즉시 종료되어 버린다.docker ps에는 아무것도 보이지 않고, docker ps -a를 해야 그나마 종료되었다는 사실만을 알 수 있을것이다.왜째서인가?Ubuntu의 Dockerfile을 보면, CMD ["bash"]라고 되어 있다.bash는 터미널을 찾을 수 없으면 exit한다.CMD가 끝났기 때문에, 컨테이너도 끝난다.docker run ubuntu 우분투에서-실행할-명령어를 하면, Dockerfile의 CMD ["bash"]가 오버라이드(대체) 된다.혹은, 다음처럼 새로운 Dockerfile을 만들 수도 있다.FROM ubuntuCMD sleep 5CMD는 다음과 같은 형식을 할 수 있다.C..

92. Rolling Updates and Rollbacks

Deployment를 처음 생성하면 Rollout이 트리거된다새로운 롤아웃은 새로운 Deployment Revision을 만든다 - 예를 들어 Revision 1나중에, 앱이 업그레이드되면 (즉, 컨테이너의 버전이 새로운 버전으로 올라가면)새로운 롤아웃이 트리거되고,새로운 디플로이먼트 리비전이 생성된다 - 예를 들어 Revision 2Rollout 상태 보기: kubectl rollout status deployment/myapp-developmentRollout 히스토리 보기: kubectl rollout history deployment/myapp-developmentDeployment Strategy있는 인스턴스를 다 날리고 새 인스턴스를 만든다 ("Recreate")당연히 downtime이 발생함..

84-87. Monitor Cluster Components, Managing Application Logs

# Monitor Clutser Components- Heapster (Deprecated)- Metrics Server- 쿠버 클러당 1개- In-Memory monitoring solution- Kubelet의 하위컴포넌트인 cAdvisor(Container Advisor)가 Pod에서의 퍼포먼스 메트릭을 받아다 Kubelet API에 노출함- 설치 방법:- Minikube의 경우, `minikube addons enable metrics-server`- 기타 배포판의 경우, Github Repo를 클론한 뒤에 `kubectl create -f deploy/1.8+/`- 설치가 완료되었으면 `kubectl top node`, `kubectl top pod`In-memory 모니터링 솔루션이 아니라, ..

80. Configuring Scheduler Profiles

일단 Pod이 생성되면 Scheduling Queue에 들어가게 된다그 다음 Pod에 선언된 spec.priorityClassName에 의해 정렬된다.PrioritySort 플러그인에 의해 처리그 다음엔 필터링 단계에 들어가게 된다.Pod을 구동할 수 없는 노드(Affinity, Tint, Resource 등의 제한)들은 튕겨나간다.NodeResourceFit, NodeName, NodeUnschedulable 플러그인 등에 의해 처리그 다음엔 스코어링 단계이다.해당 Pod가 차지하는 공간을 제외하고 남는 free space의 크기에 따라 점수 부여남는 free space가 클수록 높은 점수가 나온다NodeResourcesFit, ImageLocality 플러그인에 의해 처리ImageLocality: 컨..

74. Static Pods

쿠버의 아키텍처 돌아보기마스터 노드kube-apiserveretcd clusterController Managerkube-scheduler워커 노드Kubelet워커노드의 Kublet은 Pod을 어떻게 배치할지에 대해 마스터노드의 Kube-apiserver에 의존이 결정은 Kube-scheduler에서 내림이것은 etcd에 저장됨만약 마스터노드가 없다면?워커노드 혼자서 떠있다면?Kubelet 혼자서 노드를 독립적으로 관리하는 것은 가능하다!이런 상황에서 Pod을 만드려고 한다면, kube-apiserver 없이 kublet에 어떻게 Pod definition file을 넣을것인가?kubelet이 특정 디렉토리에서 설정파일을 읽도록 설정할 수 있음이렇게 설정하면, Kubelet이 설정파일을 읽은 뒤에 Pod..

71. DaemonSet

하나의 Pod가 모든 노드에서 하나씩 Replicate되도록 해 줌새 Node가 추가되면 자동으로 Pod의 Replica가 해당 노드에 추가됨새 노드가 삭제되면 자동으로 Pod도 삭제됨로그 뷰어라든지, 모니터링 agent 같은 데에 쓰면 좋다클러스터의 모든 Worker Node에는 Kube-Proxy가 존재사실 이것도 DaemonSet로 Replicated된 거거든요생성방법생긴 것은 ReplicaSet과 비슷하다apiVersion: apps/v1 // apps/v1임에 주의kind: DaemonSetmetadata: name: monitoring-daemonspec: template: metadata: labels: app: monitoring-agent spec:..

67. Resource Requests and Limits

"Resources" - CPU, Memory, ...특징: 각 컨테이너에 대해 할당되는 값이다. 하나의 Pod에 여러 컨테이너가 있다면, 각각의 컨테이너는 다른 Resource Limit을 가진다.spec: containers: - name: asdf resources: requests: memory: "4Gi" cpu: 2 limits: memory: "8Gi" cpu: 4메모리야 4GiB라고 하지만 이 CPU 숫자는 무엇인가?CPU count1 CPU = 1 vCPU Core를 가리킨다 (SMT 시스템의 경우 1 SMT 쓰레드)0...

59-63. Taints, Tolerations, Node Selectors, Affinity

Taints, Tolerations특정 "Taint"가 씌워진 노드에는 Toleration이 없는 Pod가 배치될 수 없다강의에서는 "모기기피제를 뿌린 사람과 내성 없는 벌레"라는 비유를 쓴하지만, 만약 특정 Taint에 대한 Toleration이 있는 Pod라면 해당 Taint가 씌워진 노드에 배치될 수 있다.다만, 어떤 Pod이 특정 Taint에 대한 Toleration을 가지고 있다고 해서, Taint가 일치하는 노드에만 배치된다는 것은 아님스케줄러의 마음에 따라서는, 그냥 Taint 없는 다른 노드에 갈 수도 있음이것은 "특정 노드가 어떤 Pod을 받아들일것인가"에 대한 문제이기 때문에, "특정 Pod을 어떤 노드에 지정하고 싶다"라는 경우 Node Selector를 이용하여야 함즉 Taint는 ..