내 잡다한 노트
쿠버네티스[K8S] 오브젝트의 명세 설정 본문
쿠버네티스에서는 오브젝트의 명세(spec)을 명시해줘야 control-plane의 api server와 통신이 원활하다.
이때, yaml 파일로 명세를 작성해주고 api server와 통신을 할 때는 json 형식으로 kubectl이 변환을 해주게 된다.
적용 명령어는 kubectl apply -f "yaml 파일" 를 사용한다.
K8S YAML 파일의 기본 구조
apiVersion: <API 버전>
kind: <오브젝트 종류>
metadata:
name: <오브젝트 이름>
namespace: <네임스페이스>
spec:
<오브젝트의 spec 정의>
이와 같이 apiVersion, kind, metadata, spec 이 4가지가 기본적으로 쓰이게 된다.
apiVersion은 오브젝트가 속한 쿠버네티스 API의 버전을 지정한다.
예시 : apps/v1 , v1 , batch/v1
kind는 생성하려는 오브젝트의 종류를 지정한다.
예시 : Pod, Deployment, Service, ConfigMap, Secret
metadata는 오브젝트의 메타데이터를 포함하는 필드이다.
하위 필드로,
name: 오브젝트의 이름을 지정합니다.
namespace: 오브젝트가 속한 네임스페이스를 지정합니다 (선택 사항, 기본값은 default).
labels: 오브젝트에 적용할 레이블의 키-값 쌍을 정의합니다. 오브젝트를 선택하기 위한 Selector로 사용된다.
labels:
app: my-app
environment: production
이런식으로 추가적으로 라벨링이 가능하다.
annotations: 오브젝트에 대한 추가 정보를 제공하는 주석을 정의합니다.
spec은 오브젝트의 원하는 상태를 정의하는 필드이다. declartive 할 수 있게끔 해주는 것이다.
오브젝트의 종류에 따라 spec 필드의 내용이 달라지게 된다.
쿠버네티스는 spec에 정의된 내용을 기반으로 실제 상태를 원하는 상태로 조정한다.
오브젝트별 spec 필드 상세 설명
- Pod
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
env:
- name: ENV_VAR_NAME
value: "value"
volumeMounts:
- name: my-volume
mountPath: /data
volumes:
- name: my-volume
emptyDir: {}
spec.containers
설명: Pod에서 실행될 컨테이너들의 목록입니다.
필수 필드:
name: 컨테이너의 이름.
image: 컨테이너 이미지.
선택 필드:
ports: 컨테이너가 사용하는 포트.
env: 환경 변수.
volumeMounts: 컨테이너에 마운트할 볼륨.
spec.volumes
설명: Pod에서 사용될 볼륨을 정의합니다.
예시:
emptyDir: 빈 디렉토리 볼륨.
hostPath: 호스트의 파일 시스템에 있는 디렉토리나 파일.
- Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:latest
spec.replicas
설명: 생성할 Pod의 복제본 수를 지정합니다.
기본값: 1
spec.selector
설명: Deployment가 관리할 Pod를 선택하기 위한 레이블 셀렉터입니다.
필수 필드: matchLabels 또는 matchExpressions 중 하나를 포함해야 합니다.
spec.template
설명: Pod의 템플릿을 정의합니다.
내용: metadata와 spec 필드를 포함합니다.
중요성: Deployment가 생성하는 Pod의 스펙을 정의합니다.
- Service
yaml
코드 복사
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
- protocol: TCP
spec.selector
설명: Service가 트래픽을 라우팅할 대상 Pod를 선택하기 위한 레이블 셀렉터입니다.
spec.ports
설명: 서비스의 포트 설정을 정의합니다.
필드:
protocol: 통신 프로토콜 (기본값: TCP).
port: 서비스가 노출하는 포트.
targetPort: 백엔드 Pod에서 사용되는 포트.
spec.type
설명: 서비스의 유형을 지정합니다.
옵션:
ClusterIP: 클러스터 내부 IP로 서비스 (기본값).
NodePort: 각 노드의 특정 포트를 통해 서비스.
LoadBalancer: 클라우드 제공자의 로드 밸런서를 통해 서비스.
ExternalName: DNS 이름을 통해 외부 서비스를 나타냅니다.
- ConfigMap
yaml
코드 복사
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
config.yaml: |
key: value
another_key: another_value
data
설명: 설정 데이터를 키-값 쌍으로 저장합니다.
용도: 애플리케이션의 설정 파일이나 환경 변수를 저장하고 Pod에서 사용할 수 있습니다.
- Secret
yaml
코드 복사
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: dXNlcm5hbWU= # base64로 인코딩된 값
password: cGFzc3dvcmQ=
type
설명: 시크릿의 유형을 지정합니다.
예시:
Opaque: 일반적인 시크릿 (기본값).
kubernetes.io/tls: TLS 인증서.
data
설명: 시크릿 데이터를 base64로 인코딩하여 저장합니다.
'DevOps > 쿠버네티스' 카테고리의 다른 글
쿠버네티스 업데이트 및 배포 전략 (0) | 2024.11.16 |
---|---|
쿠버네티스에서 자주 쓰이는 명령어 정리 (0) | 2024.11.14 |
k8s helm (0) | 2024.08.12 |
Multiple Scheduler (0) | 2024.08.11 |
Static Pods (0) | 2024.08.10 |