23.08.14 월
중간 프로젝트가 끝나고 말도 안 되는 억까로 코로나에 걸려 겨우 살아나 블로그를 쓰지 못했다.
쿠버네티스 오브젝트
쿠버네티스 시스템에서 영속성을 가지는 오브젝트이다. 클러스터의 상태를 나타내기 위해 오브젝트를 이용한다.
- 어떤 컨테이너화된 애플리케이션이 동작 중인지 (그리고 어느 노드에서 동작 중인지)
- 그 애플리케이션이 이용할 수 있는 리소스
- 그 애플리케이션이 어떻게 재구동 정책, 업그레이드, 그리고 내고장성과 같은 것에 동작해야 하는지에 대한 정책
쿠버네티스 오브젝트는 하나의 "의도를 담은 레코드"이다.
오브젝트는 2개의 필드를 포함해야 하는데 spec, status이다.
spec : 오브젝트를 생성할 때 원하는 특징(의도한 상태)에 대한 설명을 제공해서 설정한다.
status : 쿠버네티스 시스템과 컴포넌트에 의해 제공되고 업데이트된 오브젝트의 현재 상태를 설명한다.
쿠버네티스에서 오브젝트를 생성할 때, 기본정보 + spec을 yaml 파일로 kubectl에 제공해야 한다.
기본 오브젝트 4가지
파드(Pod)
쿠버네티스에서 생성하고 관리 할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.
하나 이상의 컨테이너 그룹으로 그룹은 스토리지 및 네트워크를 공유하고 해당 컨테이너를 구동하는 방식에 대한 명세를 갖는다.
pod 생성 yaml 예시
apiVersion: v1 //스크립트를 실행하기 위한 쿠버네티스 API 버전
kind: Pod //리소스의 종류 정의 Pod 쿠버네티스 선언
metadata: // 리소스의 라벨, 이름 등을 지정함
name: nginx // namespace 상에서 유일한 값
spec: // 생성할 오브젝트의 구체적 내용을 정의하는 spec -> object마다 형식이 다르다.
containers: // 컨테이너 명세를 배열로 기술
- name: nginx // 컨테이너 이름
image: nginx:1.14.2 // 컨테이너 생성시 사용할 이미지
ports: // 외부 요청을 전달하기 위한 포트 목록
- containerPort: 80 // 80번 포트를 사용한다.
쿠버네티스 namespace
https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/namespaces/
쿠버네티스에서, 네임스페이스 는 단일 클러스터 내에서의 리소스 그룹 격리 메커니즘을 제공한다. 리소스의 이름은 네임스페이스 내에서 유일해야 하며, 네임스페이스 간에서 유일할 필요는 없다. 네임스페이스 기반 스코핑은 네임스페이스 기반 오브젝트 (예: 디플로이먼트, 서비스 등) 에만 적용 가능하며 클러스터 범위의 오브젝트 (예: 스토리지클래스, 노드, 퍼시스턴트볼륨 등) 에는 적용 불가능하다.
쿠버네티스 클러스터에서 사용되는 리소소들을 구분해 관리하는 그룹이다. pod와 service 등은 네임스페이스별로 생성 및 관리될 수 있으며, 네임스페이스별로 사용자 접근 권한을 다르게 설정할 수도 있다.
쿠버네티스는 namespace 즉 논리적인 분리 단위를 제공해 준다. -> 물리적 분리가 아닌 논리적 분리
볼륨 Volume
pod가 사라지더라도 사용할 수 있는 디렉터리는 볼륨 오브젝트를 통해 host에 저장할 수 있다.
서비스 Service
파드의 집합으로 쿠버네티스의 네트워크를 나타낸다.
ClusterIP - 클러스터 내부에서만 접근 가능한 pod끼리 통신하게 해주는
NodePort - 클러스터 node위의 open port를 의미하며 고정 포트로 각 노드의 포트를 열어 외부에서 접속할 수 있게 한다.
LoadBalancer - 클라우드 공급자의 로드밸런서를 사용해 서비스를 외부에 expose 한다.
ExternalName - 잘 모르겠음
ex) Deployment
파드와 레플리카셋에 대한 선언적 업데이트를 제공한다.
디플로이먼트에서 의도하는 상태를 설명하고, 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의도하는 상태로 비율을 조정하며 변경한다. 새 레플리카셋을 생성하는 디플로이먼트를 정의하거나 기존 디플로이먼트를 제거하고, 모든 리소스를 새 디플로이먼트에 적용할 수 있다.
apiVersion: apps/v1 // api 버전과 디플로이는 apps/v1을 사용해야 한다.
kind: Deployment // 해당 yaml은 deployment라고 정의
metadata: // metadata 설정
name: nginx-deployment // namespace 필드 nginx-deployment를 만든다.
labels: // 라벨을 만든다.
app: nginx // app=nginx라는 key : value 형식
spec: // spec 요구사항을 적는다.
replicas: 3 // 레플리카는 3개로
selector: // 생성된 레플리카셋을 관리할 파드를 찾아내는 방법을 정의
matchLabels: // 라벨이 맞는 파드들을 관리한다.
app: nginx // app=nginx라는 라벨을 가진 파드를 관리한다.
template: // 새 파드를 런칭하는데 사용할 템플릿 -> selector와 labels 가 일치 해야 한다.
metadata: // 파드 메타데이터
labels: // 파드 라벨
app: nginx // app=nginx
spec: //파드 템플릿 사양
containers: // 컨테이너 정보
- name: nginx // 컨테이너 이름 nginx
image: nginx:1.14.2 // 컨테이너에 사용할 이미지
ports: // 컨테이너 사용 포트
- containerPort: 80 // 80포트를 사용한다.