본문 바로가기
킷도우의 클라우드, 쿠버네티스/CKA 자격증

[CKA 자격증 준비] 쿠버네티스 핵심 개념 2탄(kubectl 명령어 위주 정리, kubectl 명령어 모음집)

by 킷도우 2023. 10. 7.
반응형

안녕하세요. IT 윈도우 킷도우입니다.

지난 번 CKA 자격증 준비 1탄 쿠버네티스 클러스터에 이어서 이번에는 쿠버네티스 핵심 개념을 주제로 글을 써 봅니다.

CKA 자격증

1탄과 마찬가지로 CKA 강의로 유명한 Udemy CKA with practice tests의 내용을 참고한 것입니다.

개념 설명이 매우 상세히 잘 돼있어 단순 자격증 취득 목적을 넘어 스킬 향상에도 많은 도움이 되는 것을 계속해서 체감하고 있습니다. 재밌네요 ㅎㅎ

 

kubectl 명령어들을 참조하실 수 있도록 정리하였습니다. 많은 도움되시길 바랍니다.

 

거두절미하고 바로 개념 정리 들어갑니다.

 

manifest file (매니페스트 파일)

kubernetes에서 매니페스트 파일이란 특정 개체의 정보를 정의한 파일로 해석됩니다.

kubernetes에서 매니페스트 파일은 yaml 형식으로 정의되고 4개의 상위 레벨을 갖습니다.

apiversion, kind, metadata, spec 이 4가지의 틀은 반드시 외워야할 것 같습니다.

  • apiVersion:  개체를 생성할 떄 사용하는 쿠버네티스 API Version으로 개체에 따라 다르게 정의합니다. Pod, Service의 경우 v1으로 정의하고 Replicaset, Deployment의 경우 apps/v1으로 정의합니다. 이 version에서 지원하지 않는 개체를 선언할 경우 개체 생성 시 오류가 납니다.
  • kind: 개체의 유형입니다. ex) Pod, Service, Replicaset, Deployment, Namespace
  • Metadata: 개체의 이름이나 라벨을 정의합니다. 단순 정보들을 기입하는 영역입니다. 정의 가능한 항목으로는 name, labels 등이 있습니다. labels 아래에는 사용자가 원하는대로 키와 쌍을 추가시킬 수 있습니다.
  • spec: 생성하는 개체의 spec 정보를 저장합니다. metadata는 단순 정보성 정보라면 spec은 생성할 개체의 리소스, 컨테이너를 어떻게 지정할지와 관련된 실질 정보들을 입력한다고 보실 수 있습니다.

POD 정의/생성/삭제

pod 정의(pod-sample.yaml)

apiVersion: v1
kind: Pod
metadata:
  name: myapp_pod
  labels:
    app: myapp
    type: front-end
spec:
  containers:
  - name: nginx-container
    image: nginx

pod 생성

kubectl create -f pod-sample.yaml
kubectl apply -f pod-sample.yaml

pod 조회

kubectl get pods
kubectl get pods -o wide # 좀 더 자세히 보는 법
kubectl describe pod myapp-pod # 매우 자세히 보는 법

pod 삭제

kubectl delete pod sample-pod

# 여러 개 파드 한 번에 죽이기
kubectl delete pod pod1 pod2 pod3 pod4

Replicaset 정의/생성/삭제

replicaset 정의(rs-sample.yaml)

※ spec 부분에 정의하는 내용은 pod-sample.yaml에서 정의한 pod에서 apiVersion, kind를 제외한 metadata, spec 부분을 그대로 copy해서 쓰는 것을 유념해서 보자.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-rc
  labels:
    app: myapp
    type: front-end
spec:
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end
      spec:
        containers:
        - name: nginx-controller
          image: nginx
  replicas: 3
  selector:
    matchLabels:
      type: front-end # 바로 이 부분을 보고 pod를 선별하여 항상성 유지를 해준다.

replicaset 생성

kubectl create -f rs-sample.yaml
kubectl apply -f rs-sample.yaml

replicaset 조회

kubectl get replicaset
kubectl get rs
kubectl get rs -o wide # 더 자세히 보는 법
kubectl describe replicaset # 매우 자세히 보는 법

replicaset 기타 명령어

#replicaset 복제본 조정
kubectl scale -f rs-sample.yaml --replicas=6
kubectl scale replicaset myapp-replicaset --replicas=6

#replicaset 삭제, 하위 모든 pod까지 다 삭제된다.
kubectl delete replicaset myapp-replicaset

#메모리에 올라가 있는 manifest file 수정하는 법
kubectl edit replicset myapp-replicaset

#개체의 kind와 version 정보 확인하는 방법
kubectl explain replicaset

Deployment 정의/생성/삭제

deployment정의(deployment-sample.yaml)

※ replicaset과 거의 차이가 없다.

apiVersion: apps/v1
kind: Deployment
metatdata:
  name: myapp-deployment
  labels:
    app: myapp
    type: front-end
spec:
  template:
    metadata:
      name: myapp-pod
      labels: front-end
    spec:
      containers:
      - name: nginx-container
        image: nginx
  replicas: 3
  selector:
    matchLabels:
      type: front-end

deployment 정의(deploy-sample.yaml)

kubectl create -f deploy-sample.yaml
kubectl apply -f deploy-sample.yaml

deployment 조회

kubectl get deployments
kubectl get deploy
kubectl get deployments -o wide # 좀 더 자세히 보는 법
kubectl describe deployment # 매우 자세히 보는 법

deployment 기타 명령어

kubectl get all # 생성된 모든 객체 pod, rs, deploy, service, namespapce 전부 볼 수 있음

 

Service(NodePort) 정의/생성/삭제

nodeport 정의(nodeport-sample.yaml)

※ nodeport의 유효 포트 범위 : 30000~32767

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: NodePort
  ports:
  - targetPort:80 # 목적지 pod의 port
    port: 80 # 서비스의 port
    nodePort: 30010 # 노드 포트를 할당하지 않은 경우 유효 범위 내 자동 할당 된다.
  selector: # 이 부분에는 연결하고자 하는 endpoint pod의  metadata를 그대로 복사한 것이다.
    app: myapp
    type: front-end

nodeport 생성

※아래와 같이 생성하면 curl http://nodeIP:nodePort로 외부에서 접근이 가능하게 된다.

kubectl create -f nodeport-sample.yaml
kubectl apply -f nodeport-sample.yaml

nodeport 조회

kubectl get service
kubectl get svc
kubectl get service -o wide # 좀 더 자세히 보는 법
kubectl describe service # 매우 자세히 보는 법

Service(ClusterIP) 정의/생성/삭제

clusterIP 정의(clusterIP-sample.yaml)

apiVersion: v1
kind: Service
metadata:
  name: back-end
spec:
  type: ClusterIP
  ports:
  - targetPort: 80 # pod의 port
    port: 80 # service의 port
  selector: # pod의 metadata 영역을 그대로 복사한다.
    app: myapp 
    type: back-end

clusterIP 생성

kubectl create -f clusterIP-sample.yaml
kubectl apply -f clusterIP-sample.yaml

clusterIP 조회

kubectl get services
kubectl get svc
kubectl get servcices -o wide # 좀 더 자세히 조회
kubectl describe services # 매우 자세히 조회

Service(LoadBalancer) 정의/생성/삭제

LoadBalancer 정의 (LoadBalancer-sample.yaml)

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: LoadBalancer
  ports:
  - targetPort: 80
    port: 80
    nodePort: 30008

NodePort를 사용할 경우 외부에서 접근할 때 IP:Port 형태로 접근을 해야한다. 노드의 IP는 여러개 일 것이고 사용자 입장에선 IP:Port 형태로 접근하기 번거롭다. 따라서 이를 연결시켜 줄 하나의 URL이 필요하다. ex) http://sample.com 

 

이렇게 하려면 VM을 하나 더 올려서 여기에 nginx와 같은 부하 분산기를 하나 만들면 된다. 그 후 아래에 LB 장비를 두고 각 노드로 부하분산을 하면 될 것이다. But GCP, AWS, Azure와 같은 클라우드 플랫폼의 k8s 클러스터를 사용할 경우 LoadBalacer Service를 정의하여 별도 VM 및 nginx와 같은 솔루션을 구축할 필요가 없어진다.

 

반응형

Namespace 정의/생성/삭제

Namespace 정의 (ns-sample.yaml)

apiVersion: v1
kind: Namespace
metadata:
  name: dev
spec:
  hard: # 리소스 할당량을 제한할 수 있다.
    pods: "10"
    reqeusts.cpu: "4"
    request.memory: 5Gi
    limits.cpu: "10"
    limits.memory: 10Gi

이렇게 만든 Namespace에 pod를 할당하고 싶은 경우 정의

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  namespace: dev # 이 위치에 추가해준다!
  labels:
    app: myapp
    type: front-end
spec
  containers:
  - name: nginx-container
    image: nginx

namespace 생성

kubectl create -f ns-sample.yaml
kubectl apply -f ns-smaple.yaml

namespace 조회

kubectl get namespace
kubectl get ns
kubectl get namespace -o wide # 좀 더 자세히 보는 법
kubectl describe namespace # 매우 자세히 보는 법

namespace 기타 명령어

#쉽게 ns 만드는 법
kubectl create namespace dev

#현재 터미널의 default namepsace 를 변경하는 방법
kubectl config set-context $(kubectl config current-context) --namespace=dev

#다른 namepsace의 pod조회
kubectl get pods --namespace=dev
kubectl get pods -n=dev

#모든 네임스페이스에 있는 pod를 조회하는 방법
kubectl get pods --all-namespaces
kubectl get pods -A

 

시험 대비 기타 Imperative Commands

kubectl run --image=nginx nginx # nginx 이미지, 컨테이너명을 가진 pod를 메모리에 올린다.

kubectl create deployment --image=nginx nginx # nginx 이미지, 컨테이너명을 배포하는 deployment를 메모리에 올린다.
kubectl expose deployment nginx --port 80 # nginx파드의 80포트를 오픈한다.

kubectl edit deployment nginx # 메모리에 올라가 있는 nginx deploy를 편집한다.
kubectl scale deployment --replicas=5 # 복제본의 수를 변경한다.
kubectl set image deployment nginx nginx=nginx:1.18 # 이미지를 변경한다.

 

이상으로 자주 쓰이는 쿠버네티스 명령어들을 정리해봤습니다.

 

감사합니다.

 

★킷도우 웹 개발 기초 강의가 오픈됐습니다!

궁금하신 분들은 아래 링크를 참고해 주세요~

https://kitdow.tistory.com/31

 

킷도우의 첫 강의! - 웹 개발 기초 (프론트엔드, 백엔드, DB까지 총 10시간에 걸쳐 주문 게시판 만

안녕하세요. IT Window 킷도우입니다. 드디어 고대하고 고대하던 웹 개발 강의를 완성했습니다. VOD(동영상)는 인프런에서만!(전자책 포함) https://inf.run/BqmE 실무 환경 그대로 주문게시판 만들기 웹

kitdow.tistory.com

감사합니다! 

반응형

댓글