Kubernetes 137

Multi-Container Pods

개요 큰 단일 애플리케이션을 마이크로서비스라는 하위 요소로 분리하는 개념은 독립적이고, 작고, 다시 사용할 수 있는 코드 집합을 개발하고 배포하는 것을 가능하게 한다. 즉, 전체 애플리케이션을 수정하는 대신 필요에 따라 각 서비스를 수정하고, 축소/확대하는 것이 가능하다. 다중 컨테이너 포드 온전한 서비스를 동작시키기 위해 여러 기능이 함께 동작해야 하는 경우, 다중 컨테이너 포드를 이용할 수 있다. 포드 내의 컨테이너는 수명주기가 같고, 같은 네트워크에 존재하기 때문에 서로를 localhost로 참조할 수 있으며, 같은 볼륨에 접근할 수 있기 때문이다. 포드 정의 파일의 spec 섹션에서 containers 섹션이 배열인 이유가 바로, 멀티컨테이너 포드를 사용할 수 있게끔 하기 위해서다. apiVers..

Node Affinity

Node Affinity Pod에 특정 노트에서 호스팅하도록 한다. Node Selector가 제공하지 못하는 OR, Not 등의 고급 기능을 제공한다. Node Selector와 마찬가지로 node에 레이블이 설정되어 있어야 한다. 설정 방법 포드 정의 파일에 affinity 속성을 추가한다. apiVersion: v1 Kind: Pod metadata: myapp-pod spec: containers: - name: data-processor image: data-processor affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExcution: nodeSelectorTerms: - matchExpressions: - key: size op..

Node Selector

Node Selector 특정 노드에만 포드를 배치할 수 있도록 제한하는 방법 중 하나다. 포드 정의 파일에 nodeSelector라는 속성을 추가하여 사용한다. apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: data-processor image: data-processor nodeSelector: type: cpu type: cpu는 포드 생성 전에 지정된 레이블로, 노드에 레이블이 지정되어 있어야 한다. 쿠버네티스 스케쥴러는 이 레이블을 이용해 포드를 배치할 노드를 식별한다. 노드에 레이블 지정 kubectl labels nodes = # 예시 kubectl labels nodes node_1 size=Larg..

Taints & Tolerations

Taints Node에 Pod가 배치될 수 없도록 Node에 설정한다. Tolerations Pod에 설정하며, 일치하는 Taint가 있는 Node에 스케쥴링될 수 있도록 한다. Taints와 Tolerations은 함께 동작하면서 포드가 적절하지 않은 노드에 배치되지 않도록 한다. 포드가 특정 노드에 배치되도록 설정하는 것이 아니다. 설정 방법 Taint kubectl taint nodes # 예시 kubectl taint nodes node1 app=blue:NoSchedule taint-effect는 스케쥴링된 포드에 동일한 toleration이 없는 경우 포드 처리 방식이다. taint-effect에는 아래의 세 개 값을 설정할 수 있다. NoSchedule 포드를 노드에 배치하지 않음 Prefe..

Resource Requirement

Pod는 배치된 Node의 CPU, MEM, 디스크 등의 리소스를 소비하기 때문에, 쿠버네티스 스케쥴러는 Pod에서 요구하는 리소스 양과 Node에서 사용할 수 있는 리소스 양을 고려하여 Pod를 배치한다. Pod가 배치된 Node에 리소스가 충분하지 않으면 Pod는 Pending 상태에 머무르며, 이 부분은 describe 명령어 출력 결과의 event 란에서 확인할 수 있다. Resource Requirement 컨테이너가 필요로 하는 최소 CPU/MEM 등의 리소스 쿠버네티스 스케쥴러는 이 값을 바탕으로 Pod를 배치할 수 있을 만큼 리소스가 충분한 Node를 식별한다. Pod 배포 정의 파일에 아래와 같이 정의할 수 있다. apiVersion: v1 kind: Pod metadata: name: ..

Service Account

Service Account는 인증, 권한, 역할 기반 접근 제어 등과 같은 쿠버네티스의 보안 관련 개념과 관련된 개념이다. 사용자 계정; User Account 사람이 사용하는 계정이다. 관리 작업을 수행하기 위해 쿠버네티스 클러스터에 접근하는 관리자, 애플리케이션 배포를 위한 클러스터에 접근하는 개발자 등이 사용한다. 서비스 계정; Service Account 기계가 사용하는 계정으로 애플리케이션이 쿠버네티스 클러스터와 상호작용하는 데 사용한다. Service Account Token 서비스 계정 생성 시 자동으로 생성되며 외부 애플리케이션이 Kubernetes API에 인증할 때 사용한다. 생성된 토큰은 secret 개체로 저장된다. 서비스 계정 생성 -> 서비스 계정 토큰 생성 -> secret ..

Security Context

도커 컨테이너에 프로세스 실행 user와 capabilities를 설정할 수 있던 것과 같이 쿠버네티스에서도 동일한 부분을 설정할 수 있다. 쿠버네티스 컨테이너는 Pod에 캡슐화되어 있으므로 컨테이너 레벨, 또는 Pod 레벨에서 설정을 구성할 수 있다. Pod 레벨 Pod 내 모든 컨테이너에 설정을 적용한다. yaml 파일에서 securityContext 옵션을 사용하여 프로세스 실행 user를 지정할 수 있다. apiVersion: v1 kind: Pod metadata: name: web-pod spec: securityContext: runAsUser: 1000 containers: - name: ubuntu image: ubuntu command: ["sleep", "3600"] Container..

Secrets

configMap은 데이터를 일반 텍스트, 즉 평문으로 저장하기 때문에 암호를 저장하여 사용하기에는 적절하지 않다. 암호와 같은 민감정보를 저장해 사용할 때는 secret을 사용한다. Secret 암호나 키와 같은 중요한 정보를 저장할 때 사용한다. 해쉬 형식으로 인코딩 되어 저장된다는 것을 제외하면 configMap과 유사한다. configMap과 마찬가지로, 생성한 뒤 Pod에 주입되어 데이터를 전달한다. 생성 방법 명령형 방법으로 생성 명령어로 직접 키-값 쌍을 지정할 수 있다. 여러 키-값 쌍을 지정할 때에는 --from-literal 옵션을 여러 번 사용한다. 데이터가 많아져 복잡해지는 경우에는 파일로 데이터를 저장한 뒤, 해당 경로를 지정한다. kubectl create secret gener..

ConfigMaps

2021.07.08 - 환경 변수 설정에서는 포드 정의 파일에서 환경변수를 정의하는 방법을 알아보았다. 하지만 포드 정의 파일로 환경 변수를 정의하면 포드 정의 파일이 많아지면 환경변수를 관리하기가 어려워진다. 이런 어려움을 해결하기 위해 ConfigMap을 사용할 수 있다. ConfigMap 키-값 형태로 구성되며, Pod 생성 시 ConfigMap을 주입하여 Pod 컨테이너 내부에 호스팅 되는 애플리케이션의 환경 변수로 사용할 수 있도록 데이터 전달에 사용한다. 생성 방법 명령형 방법으로 생성 kubectl create configmap --from-literal== --from-literal== # –from-literal : 키 값 쌍 지정에 사용 kubectl create configmap --..

환경변수 설정

쿠버네티스는 다음과 같은 방법으로 환경변수를 설정할 수 있다. 1. ENV 속성 사용 yaml 파일에 ENV 속성을 사용하여 환경변수를 설정한다. apiVersion: v1 kind: Pod metadata: name: simple-webapp-color spec: containers: - name: simple-webapp-color image: simple-webapp-color ports: - containerPort: 8080 env: - name: APP_COLOR value: pink array이기 때문에 ENV 아래의 모든 항목은 array의 항목임을 나타내는 -로 시작한다. 각 항목은 name과 value 속성으로 구성되어 있으며, 각 속성이 의미하는 것은 다음과 같다. name : 컨테이..