ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 ④ 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 설치하고 클러스터 만들기

    • 설치
    • 사용자 머신에 가상화 필요
      • hypervisor 설치
        • brew update
        • brew install hyperkit
        • brew install minikube
          • minikube는 kubectl를 의존관계로 가지고 있어 따로 설치가 필요하지 않음
        • minikube start —vm-driver=hyperkit
          • 도커는 미리 설치되어 있어야 함
        • kubectl get nodes (노드 확인)
        • minikube status (상태 확인)
        • kubectl version (버전 확인)
    • 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의 가장 기본적인 구성이며 나머지는 디폴트로 설정됨
      • 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)
    • 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이 없는 것을 확인 가능
    • Debugging pods
      • log to console
        • kubectl logs [pod name]
          • pod을 디버깅
          • 만약 pod이나 컨테이너를 배포중이라면 container waiting to start … 구문을 확인 가능
      • get interactive terminal
        • kubectl exec -it [pod name] — bin / bash
          • 컨테이너 내부에 무언가가 잘 되지 않을 때 혹은 문제 생겼을 때 컨테이너 내부로 들어가 디버깅
          • ‘exit’ 명령어로 다시 나올 수 있음
      • get info about pod
        • kubectl describe pod [pod name]
      • 이전 기록 확인하기
        • kubectl rollout history
        • 업데이트 과정은 — record 옵션을 주어야 기록됨
        • kubectl rollout의 경우 pause / resume 옵션을 이용해 업데이트를 재시작 가능
    • Use configuration file for CRUD
      • apply a configuration file
        • kubectl apply -f [file name]
          • ex) kubectl apply -f nginx-deployment.yaml
          • execute (설정파일 적용하기)
          • ⇒ k8s 는 언제 deployment를 생성하고 업데이트 할 지 알고 있음
      • Delete with configuration file
        • kubeclt delete -f [file name]

     

     

     

     

     

     

     

     

     

     

    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 와 일치
    // 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

     

Designed by Tistory.