카테고리 없음

Kubernetes 간단한 명령어 알아보기

미니대왕님 2023. 4. 25. 11:17
 

Kubernetes 아키텍처 구성요소

마스터 노드 : 클러스터의 상태 관리, 워크로드 예약 및 관리, 중앙 집중식 구성 제공을 담당하는 클러스터의 컨트롤 플레인입니다.

작업자 노드 : 애플리케이션과 서비스를 실행하는 머신(물리적 또는 가상)입니다. 포드는 작업자 노드에서 예약되며 해당 포드 내의 컨테이너는 작업자 노드에서 실행됩니다.

etcd : 클러스터 상태 및 구성에 대한 신뢰 소스를 제공하는 분산 키-값 저장소입니다. 마스터 노드는 클러스터의 원하는 상태가 유지되도록 etcd와 통신합니다.

API 서버 : 클러스터와 상호 작용하기 위해 다른 모든 구성 요소에서 사용하는 RESTful API를 제공하는 마스터 노드의 프런트 엔드입니다.

컨트롤러 관리자 : 클러스터의 상태를 모니터링하고 원하는 상태를 유지하기 위해 필요에 따라 변경합니다.

스케줄러 : 사용 가능한 리소스 및 제약 조건에 따라 작업자 노드에 포드를 할당하는 일을 담당합니다.

Kubelet : 마스터 노드와 통신하고 컨테이너가 예상대로 실행되는지 확인하는 역할을 하는 각 작업자 노드에서 실행되는 에이전트입니다.

컨테이너 런타임 : 컨테이너 시작, 중지 및 관리를 담당하는 소프트웨어입니다. Kubernetes에서 가장 일반적으로 사용되는 컨테이너 런타임은 Docker입니다.

이미지 출처: https://k21academy.com/docker-kubernetes/kubernetes-architecture-components-overview-for-beginners/

포드

Kubernetes 클러스터에서 애플리케이션을 배포하고 관리하기 위한 가장 작은 빌딩 블록입니다. 포드는 하나 이상의 컨테이너를 포함할 수 있으며 포드의 모든 컨테이너는 동일한 네트워크 네임스페이스를 공유합니다.

클러스터의 포드 목록을 표시합니다.

kubectl get pods

특정 포드에 대한 자세한 정보를 표시합니다.

kubectl describe pod pod_name

특정 Pod의 로그를 출력합니다.

kubectl logs pod_name

특정 포드 삭제

kubectl delete pod pod_name

nginx 이미지로 팟(Pod) 시작

kubectl run nginx --image=nginx

배포

배포를 통해 애플리케이션의 복제본 그룹(복제본 세트)에 대해 원하는 상태를 정의할 수 있으며 배포 컨트롤러는 복제본의 실제 상태가 원하는 상태와 일치하는지 확인합니다. 배포는 확장, 롤링 업데이트 및 롤백과 같은 여러 목표를 달성하는 방법입니다.

Nginx 샘플 배포

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

서비스

서비스는 마이크로서비스 기반 애플리케이션의 구성 요소 간 또는 여러 애플리케이션 간 통신을 가능하게 합니다. ClusterIP, NodePort, LoadBalancer, ExternalName 및 Headless 서비스를 비롯한 여러 유형의 Kubernetes 서비스가 있습니다.

ClusterIP 서비스를 명령적으로 생성

서비스는 배포에 속하는 포드를 선택 my-deployment하고 포트 80에 노출하여 트래픽을 대상 포트 8080으로 전달합니다.

kubectl expose deployment my-deployment --port=80 --target-port=8080 --name=my-service --type=ClusterIP

NodePort 서비스를 명령적으로 생성

서비스는 배포에 속하는 포드를 선택 another-deployment하고 포트 80에 노출하여 트래픽을 대상 포트 8080으로 전달합니다.

kubectl expose deployment another-deployment --port=80 --target-port=8080 --name=my-service --type=NodePort

클러스터 IP 서비스를 선언적으로 생성

이 서비스는 레이블이 지정된 포드를 선택 app: my-app하고 포트 80에 노출하여 대상 포트 8080으로 트래픽을 전달합니다.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    port: 80
    targetPort: 8080
  type: ClusterIP

스테이트풀셋

StatefulSet는 상태 저장 애플리케이션을 관리하는 데 사용되는 Kubernetes 리소스 유형입니다. 포드의 상태 비저장 복제본을 생성하는 배포와 달리 StatefulSet는 안정적인 네트워크 ID와 영구 스토리지를 포드에 제공합니다.

StatefulSet의 각 포드는 패턴을 따르는 고유하고 영구적인 호스트 이름으로 생성됩니다 <statefulset-name>-<ordinal>. 서수는 0부터 시작하여 생성된 순서대로 각 포드에 할당되는 인덱스입니다.

StatefulSet 예제 매니페스트

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: example-statefulset
spec:
  selector:
    matchLabels:
      app: example-statefulset
  serviceName: example-service
  replicas: 3
  template:
    metadata:
      labels:
        app: example-statefulset
    spec:
      containers:
      - name: example-container
        image: example-image
        ports:
        - containerPort: 80
        volumeMounts:
        - name: example-volume
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: example-volume
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

데몬셋

DaemonSet은 클러스터의 각 노드에서 정확히 하나의 포드가 실행되도록 하는 Kubernetes 리소스 유형입니다. 이는 모든 노드에서 실행해야 하는 로깅 에이전트 또는 클러스터 수준 저장소 데몬과 같은 백그라운드 작업을 실행하는 데 유용합니다.

DaemonSet 예제 매니페스트

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: example-daemonset
spec:
  selector:
    matchLabels:
      app: example-daemonset
  template:
    metadata:
      labels:
        app: example-daemonset
    spec:
      containers:
      - name: example-container
        image: example-image
        ports:
        - containerPort: 80

레플리카셋

ReplicaSet은 지정된 시간에 지정된 수의 Pod 복제본이 클러스터에서 실행되도록 하는 Kubernetes 리소스 유형입니다. ReplicaSet는 원하는 수의 복제본을 유지하기 위해 필요에 따라 포드를 자동으로 생성하거나 삭제합니다.

ReplicaSet 예제 매니페스트

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: example-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example-replicaset
  template:
    metadata:
      labels:
        app: example-replicaset
    spec:
      containers:
      - name: example-container
        image: example-image
        ports:
        - containerPort: 80

비밀

Kubernetes Secrets는 암호, 토큰 및 인증서와 같은 중요한 정보를 Kubernetes 클러스터에 안전하게 저장하는 방법입니다. 비밀은 base64로 인코딩된 문자열로 저장되며 etcd에서 암호화됩니다.

비밀 매니페스트 예

apiVersion: v1
kind: Secret
metadata:
  name: example-secret
type: Opaque
data:
  example-username: YWRtaW4=
  example-password: cGFzc3dvcmQ=

포드 매니페스트에서 비밀 값 사용

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: example-image
    env:
    - name: EXAMPLE_USERNAME
      valueFrom:
        secretKeyRef:
          name: example-secret
          key: example-username
    - name: EXAMPLE_PASSWORD
      valueFrom:
        secretKeyRef:
          name: example-secret
          key: example-password

컨피그맵

ConfigMap은 애플리케이션의 구성 데이터를 관리할 수 있는 Kubernetes 리소스입니다. 구성 데이터를 ConfigMap에 키-값 쌍으로 저장한 다음 포드 또는 클러스터의 다른 리소스에서 참조할 수 있습니다.

컨피그맵 매니페스트

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-configmap
data:
  example-key: example-value

포드 매니페스트에서 ConfigMap 값 사용

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: example-image
    env:
    - name: EXAMPLE_ENV_VAR
      valueFrom:
        configMapKeyRef:
          name: example-configmap
          key: example-key

예제가 포함된 Kubectl 명령

하나 이상의 리소스에 대한 정보를 검색합니다.

kubectl get pods

리소스에 대한 자세한 정보 얻기

kubectl describe pod pod_name

팟(Pod)에 있는 컨테이너의 로그 검색

kubectl logs pod_name

특정 리소스 삭제

kubectl delete pod pod_name

리소스 만들기

kubectl create -f pod.yaml

기존 리소스에 변경 사항을 적용하거나 존재하지 않는 경우 새 리소스를 생성합니다.

kubectl apply -f pod.yaml

컨테이너에서 명령 실행

kubectl exec pod-name -- command

배포 복제본 수 확장

kubectl scale deployment deployment_name --replicas=5

로컬 포트를 포드의 포트로 전달합니다.

kubectl port-forward pod_name 8080:80

현재 위치에서 리소스 편집

kubectl edit pods pod_name

하나 이상의 리소스에 대한 리소스 사용량 표시

kubectl top node

새 포드를 생성할 수 없도록 노드를 예약 불가로 표시합니다.

kubectl cordon node_name

노드를 예약 가능으로 표시하여 새 포드를 생성할 수 있도록 합니다.

kubectl uncordon node_name

노드에서 모든 포드를 안전하게 제거하고 예약 불가로 표시

kubectl drain node_name

쿠버네티스 버전 보기

kubectl version
 

참조 URL : https://techblog.flaviusdinu.com/kubernetes-basics-cheatsheet-f3b723e4661