-
쿠버네티스 ④ Minikube 와 Kubectl, K8s YAML configuration File네트워크 & 인프라 2022. 10. 12. 23:40
이번에는 minikube, kubectl, 쿠버네티스에서 YAML 설정 파일에 대해 알아보자.
참고한 영상 👇🏼
- 모든 내용은 윗 영상을 캡쳐 및 정리한 내용입니다! 🙌
Minikube 와 Kubectl
Minikube
- ex) Production 클러스터 셋업
- 여러개의 마스터와 워커 노드 구성
- 분리된 가상(virtual), 실체(physical) 머신 구성
- ⇒ 이를 로컬에서 테스트 하기 위해서 사용됨
- 마스터 processes 와 워커 processes 가 1개의 노드에서 수행
- 사용자 컴퓨터에 virtual box를 생성하여 그안에서 노드를 실행
- 즉, 테스트 목적으로 하나의 노드로 k8s 클러스터를 구성
Kubectl
- k8s 클러스터를 위한 커맨드 라인 툴
- 마스터 processes 가 api server를 부를때 사용됨
- 클러스터가 UI, API, CLI와 같은 가장 영향력있는 3개의 클라이언트와 소통하기 위해서 사용됨
- 워커 processes 가 pod이 노드위에서 실행되도록 함
- pod 생성
- pod 파괴
- service 생성
- 어떤 타입의 클러스터든 협업이 가능
- ex)minikube cluster, cloud cluster 등
Minikube, Kubectl 설치하고 클러스터 만들기
- 설치
- Minikube 설치 (Mac, Linux and Windows) : https://bit.ly/38bLcJy
- Kubectl 설치 : https://bit.ly/32bSI2Z
- Gitlab: https://bit.ly/3oZzuHY
- 사용자 머신에 가상화 필요
- hypervisor 설치
- brew update
- brew install hyperkit
- brew install minikube
- minikube는 kubectl를 의존관계로 가지고 있어 따로 설치가 필요하지 않음
- minikube start —vm-driver=hyperkit
- 도커는 미리 설치되어 있어야 함
- kubectl get nodes (노드 확인)
- minikube status (상태 확인)
- kubectl version (버전 확인)
- hypervisor 설치
- kubectl cli
- minikube 클러스터를 구성하기 위함
- $kubectl [command] [TYPE][NAME][flags]
- minikube cli
- 클러스터를 시작하고 삭제하기 위함
기본 kubectl 커맨드
- CRUD commands
- create deployment
- kubectl create deployment [name]
- pod은 사용자가 생성하는 가장 작은 단위로 deployment가 pod의 추상화를 담당
- ex) kubectl create deployment NAME —image=image [—dry-run] [options]
- ex ) kubectl create deployment nginx-depl —image=nginx
- nginx 최신 버전을 다운로드
- pod을 생성하기 위한 blueprint
- 이름과 사용할 이미지 : deployment의 가장 기본적인 구성이며 나머지는 디폴트로 설정됨
- kubectl create deployment [name]
- edit deployment
- kubectl edit [deployment / pod] [name]
- ex) kubectl edit deployment nginx-depl
- 기본값으로 구성 파일을 자동으로 생성
- ⇒ spec : containers : -image : nginx : 1.16
- delete deployment
- kubectl delete deployment [name]
- deployment 와 replicaset 을 모두 삭제
- —cascade = false 옵션
- 연쇄 삭제 기능을 비활성화 (default = true)
- create deployment
- status of different k8s components
- kubectl get nodes | pod | services | replicaset | deployement
- ex) kubectl get pod
- deployment 삭제시 예전 pod이 종료되고 있고 다른 pod이 시작되고 있는지 확인
- 예전 pod은 종료되고 나면 사라짐
- ex) kubectl get replicaset
- deployment 삭제시 예전 replicaset에는 pod이 없는 것을 확인 가능
- ex) kubectl get pod
- kubectl get nodes | pod | services | replicaset | deployement
- Debugging pods
- log to console
- kubectl logs [pod name]
- pod을 디버깅
- 만약 pod이나 컨테이너를 배포중이라면 container waiting to start … 구문을 확인 가능
- kubectl logs [pod name]
- get interactive terminal
- kubectl exec -it [pod name] — bin / bash
- 컨테이너 내부에 무언가가 잘 되지 않을 때 혹은 문제 생겼을 때 컨테이너 내부로 들어가 디버깅
- ‘exit’ 명령어로 다시 나올 수 있음
- kubectl exec -it [pod name] — bin / bash
- get info about pod
- kubectl describe pod [pod name]
- 이전 기록 확인하기
- kubectl rollout history
- 업데이트 과정은 — record 옵션을 주어야 기록됨
- kubectl rollout의 경우 pause / resume 옵션을 이용해 업데이트를 재시작 가능
- log to console
- Use configuration file for CRUD
- apply a configuration file
- kubectl apply -f [file name]
- ex) kubectl apply -f nginx-deployment.yaml
- execute (설정파일 적용하기)
- ⇒ k8s 는 언제 deployment를 생성하고 업데이트 할 지 알고 있음
- kubectl apply -f [file name]
- Delete with configuration file
- kubeclt delete -f [file name]
- apply a configuration file
K8s YAML configuration File
- 사람이 쉽게 읽을 수 있는 데이터 직렬화 양식
- 들여쓰기로 데이터 계층을 표현 (space bar)
- key - value
- ‘:’ 스칼라 문법 : 키에 해당하는 값이 1개 일때
- ‘-’ 배열 문법 : 키에 해당하는 값이 여러개일 때
- 구성 파일의 3 parts
- metadata
- specification
- spec의 속성을 구체적으로 설정
- status
- 사용자 작성이 아닌 쿠버네티스에 의해 자동으로 생성되고 추가됨
- 만약 spec에 정의된 요구사양과 실제 사양이 맞지 않으면 고쳐서 요구사양에 과 일치하도록 만듦
- k8s는 상태를 지속적으로 업데이트
- 그러면 k8s는 어디서 상태 정보를 얻는 것일까?
- etcd 가 모든 k8s 구성의 현재 상태를 가지고 있음!
// nginx-deployment.yaml // declaring what to deploy apiVersion: apps/v1 kind: Deployment // metadata metadata: name: nginx-deployment labels: app: nginx // specification spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.16 ports: - containerPort: 8080
// nginx-service.yaml // declaring what to deploy apiVersion: v1 kind: Service // metadata metadata: name: nginx-service // specification spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 8080
- status를 포함한 Deployment config 파일
apiVersion: apps/v1 kind: Deployment // metadata metadata: annotations: deployment.kubernetes.io/revision: "1" kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-deployment","namespace":"default"},"spec":{"replicas":2,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.16","name":"nginx","ports":[{"containerPort":8080}]}]}}}} creationTimestamp: "2020-01-24T10:54:56Z" generation: 1 labels: app: nginx name: nginx-deployment namespace: default resourceVersion: "96574" selfLink: /apis/apps/v1/namespaces/default/deployments/nginx-deployment uid: e1075fa3-6468-43d0-83c0-63fede0dae51 // specification spec: progressDeadlineSeconds: 600 replicas: 2 revisionHistoryLimit: 10 selector: matchLabels: app: nginx strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: creationTimestamp: null labels: app: nginx spec: containers: - image: nginx:1.16 imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 8080 protocol: TCP resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 // status status: availableReplicas: 2 conditions: - lastTransitionTime: "2020-01-24T10:54:59Z" lastUpdateTime: "2020-01-24T10:54:59Z" message: Deployment has minimum availability. reason: MinimumReplicasAvailable status: "True" type: Available - lastTransitionTime: "2020-01-24T10:54:56Z" lastUpdateTime: "2020-01-24T10:54:59Z" message: ReplicaSet "nginx-deployment-7d64f4b574" has successfully progressed. reason: NewReplicaSetAvailable status: "True" type: Progressing observedGeneration: 1 readyReplicas: 2 replicas: 2 updatedReplicas: 2
- deployments → service → pods 연결
- YAML configuration files
- 모든 프로그래밍 언어에 대해 사람이 읽기 쉬운 data 직렬화 기준을 가짐
- 들여쓰기에 엄격함
- config 파일은 코드와 함께 자기 자신의 git repo에 저장
- pod을 위한 blueprint
- 각계층의 추상화로 인해 deployment를 통해 pod 관리
- template은 자신의 “metadata” 와 “spec” section을 가짐
- pod 에 적용
- deployment 안에 또다른 pod을 위한 configuration
- configuration file 안에 configuration file
- labels & selectors & ports(deployment → pod 연결)
- labels & selectors
- 컴포넌트를 위한 모든 key-value pair
- pod 은 template blueprint를 통해서 label을 얻음
- 이 label은 이전의 selector 와 일치
- labels & selectors
- YAML configuration files
// nginx-deployment.yaml // declaring what to deploy apiVersion: apps/v1 kind: Deployment // metadata metadata: name: nginx-deployment labels: app: nginx // specification spec: replicas: 2 selector: matchLabels: app: nginx template: // template applies to pod metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.16 ports: - containerPort: 8080
// nginx-service.yaml // declaring what to deploy apiVersion: v1 kind: Service // metadata metadata: name: nginx-service // specification spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 8080
- 사용 예시
$ kubectl apply -f nginx-deployment.yaml $ kubectl apply -f nginx-service.yaml $ kubectl get pod $ kubectl get service $ kubectl describe service nginx-service - selector : app-nginx - targetport: 8080/tcp - endpoints : ip : 8080 ## pod 정보를 더 자세하게 확인가능 (ip 포함) $ kubectl get pod -o wide ## status 포함한 YAML 결과가 nginx-deployment-result에 저장됨 $ kubectl get deployment nginx-deployment -o yaml > nginx-deployment-result ## delete deployment & service $ kubectl delete -f nginx-service.yaml $ kubectl delete -f nginx-deployment.yaml
'네트워크 & 인프라' 카테고리의 다른 글
아파치 카프카 (0) 2022.10.26 쿠버네티스 ⑤ Namespace 와 Helm (0) 2022.10.12 쿠버네티스 ③ 기본 Architecture (0) 2022.10.12 쿠버네티스 ② 메인 K8s component (2) (0) 2022.10.12 쿠버네티스 ① 메인 K8s component (1) (1) 2022.10.08