본문으로 바로가기
반응형

Intro

  • kubnernetes는 명령형과 선언형 두가지로 오브젝트의 관리가 가능합니다.
  • 위 두가지를 모두 잘 사용해야하므로 정리해보고자합니다.
  • 해당 블로그는 kubernetes에 대해 사전 지식이 있는 분들 또는 CKA준비 하시는분들에게 추천드립니다.

Topic

  1. 선언형 관리 : pod/replicaset/deployment/servic의 manifest yaml파일 정리
    • yaml파일의 하이픈("-")은 리스트 형태를 말함 ex) <\[]Object> , <\[]String>
    • 아래 명령어로 선언형 manifest파일 구성 확인 가능
    • kubectl explain deployment --recursive | less
    • 아래 명령어 로 선언형 오브젝트 적용
    • kubectl apply -f <manifest_file_name.yml>

2. 명령형 관리: pod/deployment/servic의 kubectl 명령어 정리

Pod/Replicaset/Deployment/Service의 관계도

pod_exam.yml

  • 필수 기본 필드 4가지
    • apiVersion
    • kind
    • metadata
    • spec
apiVersion: v1
kind: pod 
metadata:
  name: myapp-pod
  labels:
    app: myapp
    type: front-end
spec:
  containers:
  - name: nginx-container
    image: nginx

pod 관련 kubectl명령어

## pod 생성
kubectl run <pod_name> --image=<image_name> --port=<port_number>
kubectl run nginx --image=nginx --port=80

## 모든 namespace의 pod확인
kubcectl get pods -A

## 모든 namespace의 pod확인 header없이 확인 하여 pod 개수 파악 하기
kubcectl get pods -A --no-headers | wc -l

## pod삭제
kubectl delete pod <pod_name> -n <namespace>

##  생성할 manifest file 추출하기
kubectl run <pod_name> --image=<image_name> --port=<port_number> --dry-run=client -o yaml > <manifest_file_name.yml>
kubectl run nginx --image=nginx --port=80 --dry-run=client -o yaml > pod_exam.yml

##  생성되어있는 manifest file 추출하기
kubectl get <pod_name> --dry-run=client -o yaml > <manifest_file_name.yml>

replicaset_exam.yaml

  • pod의 meteadata / spec 필드가 template필드로 들어감
  • spec필드의 selector.matchLabels 과 template 안에 pod의 metadata.lables과 일치해야함
apiVersion: apps/v1
kind: Replicaset        #대소문자구분 필수
metadata:
  name: myapp-replicaset
  labels:
    app: myapp        #pod의 labels과 일치
    type: front-end

spec:
  replicas: 3
  selector:
    matchLables:
      type: front-end
  template:
# --------------------- pod에 해당하는 부분
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end        #replicaset의 labels과 일치
    spec:
      containers:
      - name: nginx-container
        image: nginx
# --------------------- pod에 해당하는 부분

replicaset 관련 kubectl명령어

## replicaset manifest file추출방법 (replicaset생성 명령어는 따로 없으므로 아래와 같이 deployment를 추출하여 kind를 변경함
kubectl create deployment <deployment_name> --image=<image_name> --replicas=<number> --dry-run=client -o yaml > <manifest_file_name.yml>

## replicaset relicas개수 변경
kubectl scale deployment <deployment_name> --replica=<number>
kubectl scale deployment nginx --replica=6

deployment_exam.yaml

apiVersion: apps/v1
kind: Deployment        #대소문자구분 필수
metadata:
  name: myapp-replicaset
  labels:
    app: myapp        #pod의 labels과 일치
    type: front-end

spec:
  replicas: 3
  selector:
    matchLables:
      type: front-end
  template:
# --------------------- pod에 해당하는 부분
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end        #replicaset의 labels과 일치
    spec:
      containers:
      - name: nginx-container
        image: nginx
# --------------------- pod에 해당하는 부분

deployment 관련 kubectl명령어

## deploytment 생성
kubectl create deployment <deployment_name> --image=<image_name> --replicas=<number> 
kubectl create deployment nginx --image=nginx 

servie_exam.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: redis
  name: redis
spec:
  type: ClusterIP
  selector:
    app: redis
  ports:
  - name: http
    port: 6379
    protocol: TCP
    targetPort: 6379

Service 관련 kubectl명령어

# service 생성 default type clusterip
kubectl expose pod <pod_name> --port=<port_number> --name=<service_name>
kubectl expose pod redis --port=6379 --name=redis-service 

# --name 옵션을 따로 빼야하는 것을 주의함
kubectl expose deployment <depoyment_name> --port=<port_number> --name=<service_name> 
kubectl expose deployment redis --port=6379 --name=redis-service

# service type nodeport
kubectl expose pod <pod_name> --port=<port_name> --name=<service_name> --type=NodePort 
kubectl expose pod nginx --port=80 --name=nginx-service --type=NodePort

# 아래와 같이 service를 생성하면 lable이랑 selector가 service_name으로 알아서 맞춰짐
kubectl create service nodeport <service_name> --tcp=<port>:<target_port> --node-port=<node_port>
kubectl create service nodeport nginx --tcp=80:80 --node-port=30080 

daemonset_exam.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: myapp-replicaset
  labels:
    app: myapp
    type: front-end

spec:
  replicas: 3
  selector:
    matchLables:
      type: front-end
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end
    spec:
      containers:
      - name: nginx-container
        image: nginx

Daemonset 관련 kubectl명령어

  • deployment.yaml을 가져와서 kind를 Daemonset으로 변경하고
  • strategy와 replicas 필드를 없애야 함
# deployment.yaml가져오기
kubectl create deploy elasticsearch --image=k8s.gcr.io/fluentd-elasticsearch:1.20 --namespace=kube-system --dry-run=client  -o yaml > ds.yaml
반응형