내 잡다한 노트

쿠버네티스[K8S] 오브젝트의 명세 설정 본문

DevOps/쿠버네티스

쿠버네티스[K8S] 오브젝트의 명세 설정

peanutwalnut 2024. 11. 6. 11:30

쿠버네티스에서는 오브젝트의 명세(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 필드 상세 설명

  1. 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: 호스트의 파일 시스템에 있는 디렉토리나 파일.

  1. 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의 스펙을 정의합니다.

  1. Service
    yaml
    코드 복사
    apiVersion: v1
    kind: Service
    metadata:
    name: my-service
    spec:
    selector:
    app: my-app
    ports:
    • protocol: TCP
      port: 80
      targetPort: 8080
      type: ClusterIP

spec.selector
설명: Service가 트래픽을 라우팅할 대상 Pod를 선택하기 위한 레이블 셀렉터입니다.
spec.ports
설명: 서비스의 포트 설정을 정의합니다.
필드:
protocol: 통신 프로토콜 (기본값: TCP).
port: 서비스가 노출하는 포트.
targetPort: 백엔드 Pod에서 사용되는 포트.
spec.type
설명: 서비스의 유형을 지정합니다.
옵션:
ClusterIP: 클러스터 내부 IP로 서비스 (기본값).
NodePort: 각 노드의 특정 포트를 통해 서비스.
LoadBalancer: 클라우드 제공자의 로드 밸런서를 통해 서비스.
ExternalName: DNS 이름을 통해 외부 서비스를 나타냅니다.

  1. ConfigMap
    yaml
    코드 복사
    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: my-config
    data:
    config.yaml: |
    key: value
    another_key: another_value

data
설명: 설정 데이터를 키-값 쌍으로 저장합니다.
용도: 애플리케이션의 설정 파일이나 환경 변수를 저장하고 Pod에서 사용할 수 있습니다.

  1. 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