Namespace
리소스를 분리(격리)한다.
- 서비스 별
- 사용자 별
- 환경: 개발, 스테이징, 프로덕션
서비스: NDS 이름이 분리되는 용도
RBAC: 권한을 NS 에 설정
[~]$ kubectl get namespace
NAME STATUS AGE
default Active 23h
kube-node-lease Active 23h
kube-public Active 23h
kube-system Active 23h
- kube-system: Kubernetes 의 핵심 컴포넌트
- kube-public: 모든 사용자가 읽기 권한
- kube-node-lease: Worker Node 에 장애가 발생했는지 확인
- default: 기본 작업 공간
kubectl create ns developments
kubectl delete ns developments
kubectl get pods -A | --all-namespaces
kubectl get pods -n kube-system
ns-dev.yml
apiVersion: v1
kind: Namespace
metadata:
name: dev
kubectl create -f ns-dev.yml
myweb-dev.yml
apiVersion: v1
kind: Pod
metadata:
name: myweb
namespace: dev
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80
name: myweb
protocol: TCP
레이블과 셀렉터
공식 문서: https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/labels/
레이블 은 파드와 같은 오브젝트에 첨부된 키와 값의 쌍이다. 레이블은 오브젝트의 특성을 식별하는 데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없다. 레이블로 오브젝트의 하위 집합을 선택하고, 구성하는데 사용할 수 있다. 레이블은 오브젝트를 생성할 때에 붙이거나 생성 이후에 붙이거나 언제든지 수정이 가능하다. 오브젝트마다 키와 값으로 레이블을 정의할 수 있다. 오브젝트의 키는 고유한 값이어야 한다.
"metadata": {
**"labels"**: {
**"key1"** : "value1",
**"key2"** : "value2"
}
}
레이블은 UI와 CLI에서 효율적인 쿼리를 사용하고 검색에 사용하기에 적합하다. 식별되지 않는 정보는 어노테이션으로 기록해야 한다.
권장 레이블
권장 레이블 공식 문서: https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/common-labels/
레이블은 주로 검색을 하거나 리소스를 연결할 때 사용한다.
레이블 명령어
레이블 확인
kubectl get pods --show-labels
kubectl get pods <파드_이름> -o yaml
kubectl describe pods <파드_이름>
레이블 관리
kubectl label pods <파드_이름> Key=Value # key 추가
kubectl label pods <파드_이름> Key=Value --overwrite # value 덮어쓰기
kubectl label pods <파드_이름> Key- # key 삭제
YAML 파일에서 label
apiVersion: v1
kind: Pod
metadata:
name: myweb
namespace: dev
labels:
APP: apache
ENV: dev
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80
name: myweb
protocol: TCP
사용 동기
레이블을 이용하면 사용자가 느슨하게 결합한 방식으로 조직 구조와 시스템 오브젝트를 매핑할 수 있으며, 클라이언트에 매핑 정보를 저장할 필요가 없다.
서비스 배포와 배치 프로세싱 파이프라인은 흔히 다차원의 엔티티들이다(예: 다중 파티션 또는 배포, 다중 릴리스 트랙, 다중 계층, 계층 속 여러 마이크로 서비스들). 관리에는 크로스-커팅 작업이 필요한 경우가 많은데 이 작업은 사용자보다는 인프라에 의해 결정된 엄격한 계층 표현인 캡슐화를 깨트린다.
레이블 예시:
- "release" : "stable", "release" : "canary"
- "environment" : "dev", "environment" : "qa", "environment" : "production"
- "tier" : "frontend", "tier" : "backend", "tier" : "cache"
- "partition" : "customerA", "partition" : "customerB"
- "track" : "daily", "track" : "weekly"
이 예시는 일반적으로 사용하는 레이블이며, 사용자는 자신만의 규칙(convention)에 따라 자유롭게 개발할 수 있다. 오브젝트에 붙여진 레이블 키는 고유해야 한다는 것을 기억해야 한다.
구문과 캐릭터 셋
레이블 은 키와 값의 쌍이다. 유효한 레이블 키에는 슬래시(/)로 구분되는 선택한 접두사와 이름이라는 2개의 세그먼트가 있다. 이름 세그먼트는 63자 미만으로 시작과 끝은 알파벳과 숫자([a-z0-9A-Z])이며, 대시(-), 밑줄(_), 점(.)과 함께 사용할 수 있다. 접두사는 선택이다. 만약 접두사를 지정한 경우 접두사는 DNS의 하위 도메인으로 해야 하며, 점(.)과 전체 253자 이하, 슬래시(/)로 구분되는 DNS 레이블이다.
접두사를 생략하면 키 레이블은 개인용으로 간주한다. 최종 사용자의 오브젝트에 자동화된 시스템 컴포넌트(예: kube-scheduler, kube-controller-manager, kube-apiserver, kubectl 또는 다른 타사의 자동화 구성 요소)의 접두사를 지정해야 한다.
kubernetes.io/와 k8s.io/ 접두사는 쿠버네티스의 핵심 컴포넌트로 예약되어 있다.
kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
node-1 Ready control-plane,master 24h v1.22.8 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
node-2 Ready <none> 24h v1.22.8 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-2,kubernetes.io/os=linux
node-3 Ready <none> 24h v1.22.8 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node-3,kubernetes.io/os=linux
LabelSelector
- 검색을 담당
- 리소스 간의 연결을 담당
일치성(equality base)
- =
- ==
- !=
kubectl get pods -l APP=nginx
kubectl get pods -l APP==nginx
kubectl get pods -l 'APP!=nginx'
집합성(set base)
- in
- notin
- exists: 키만 매칭
- doesnotexists: 키 제외 매칭
kubectl get pods -l 'ENV in (dev, staging)'
kubectl get pods -l 'ENV notin (dev)'
kubectl get pods -l 'ENV'
kubectl get pods -l '!ENV'
Annotations
쿠버네티스 어노테이션을 사용하여 임의의 비-식별 메타데이터를 오브젝트에 첨부할 수 있다. 도구 및 라이브러리와 같은 클라이언트는 이 메타데이터를 검색할 수 있다.
즉, 레이블과 다르게 검색과 리소스 간 연결을 하는 특별한 기능이 없다.
오브젝트에 메타데이터 첨부
레이블이나 어노테이션을 사용하여 쿠버네티스 오브젝트에 메타데이터를 첨부할 수 있다. 레이블을 사용하여 오브젝트를 선택하고, 특정 조건을 만족하는 오브젝트 컬렉션을 찾을 수 있다. 반면에, 어노테이션은 오브젝트를 식별하고 선택하는데 사용되지 않는다. 어노테이션의 메타데이터는 작거나 크고, 구조적이거나 구조적이지 않을 수 있으며, 레이블에서 허용되지 않는 문자를 포함할 수 있다.
어노테이션은 레이블과 같이 키/값 맵이다.
"metadata": {
"annotations": {
"key1" : "value1",
"key2" : "value2"
}
}
다음은 어노테이션에 기록할 수 있는 정보의 예제이다.
- 필드는 선언적 구성 계층에 의해 관리된다. 이러한 필드를 어노테이션으로 첨부하는 것은 클라이언트 또는 서버가 설정한 기본 값, 자동 생성된 필드, 그리고 오토사이징 또는 오토스케일링 시스템에 의해 설정된 필드와 구분된다.
- 빌드, 릴리스, 또는 타임 스탬프, 릴리스 ID, git 브랜치, PR 번호, 이미지 해시 및 레지스트리 주소와 같은 이미지 정보.
- 로깅, 모니터링, 분석 또는 감사 리포지터리에 대한 포인터.
- 디버깅 목적으로 사용될 수 있는 클라이언트 라이브러리 또는 도구 정보: 예를 들면, 이름, 버전, 그리고 빌드 정보.
- 다른 생태계 구성 요소의 관련 오브젝트 URL과 같은 사용자 또는 도구/시스템 출처 정보.
- 경량 롤아웃 도구 메타데이터. 예: 구성 또는 체크포인트
- 책임자의 전화번호 또는 호출기 번호, 또는 팀 웹 사이트 같은 해당 정보를 찾을 수 있는 디렉터리 진입점.
- 행동을 수정하거나 비표준 기능을 수행하기 위한 최종 사용자의 지시 사항.
어노테이션을 사용하는 대신, 이 유형의 정보를 외부 데이터베이스 또는 디렉터리에 저장할 수 있지만, 이는 배포, 관리, 인트로스펙션(introspection) 등을 위한 공유 클라이언트 라이브러리와 도구 생성을 훨씬 더 어렵게 만들 수 있다.
명령형 커맨드
kubectl annotate pods <파드_이름> Key=Value # 어노테이션 추가
kubectl annotate pods <파드_이름> Key=Value --overwrite # 어노테이션 덮어 쓰기
kubectl annotate pods <파드_이름> Key- # 어노테이션 삭제
YAML
apiVersion: v1
kind: Pod
metadata:
name: myweb
labels:
APP: apache
ENV: dev
annotations:
Created-by: Choi
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80
name: myweb
protocol: TCP