본문 바로가기

Kubernates

Kubernetes 쿠버네티스 CKA (Udemy 강의#01)

Udemy 중 제일 유명하다는 Mumshad 의 CKA 강의를 구매하였다.

할인가에 약 2만원 정도로 구매할 수 있으며 LAB 환경 제공과 Practice Tests 제공 그리고 인증된 강의와 지속적인 Updates 를 해주어 믿고 수강할 수 있다..ㅎ!

 

섹션 1: Introduction

쿠버네티스가 얼마나 중요한지..

어떻게 강의가 구성되고 시험이 진행되는지에 대한 간단한 개요들이 짤막하게 구성되어있다.

천천히 차분하게 진행되는 영어와 한국어 자막도 바로 제공되어 듣기에 크게 불편하지 않을것같다.

주 강의에는 (초보자를 위한 쿠버네티스강의, CKA- 쿠버네티스 관리자, CKAD- 쿠버네티스 개발자) 강좌로 3가지이다.

대략적인 개념이나 운용방식은 대-충 알지만 실무경험이 전무해 초보자를 먼저 들어야하나 싶긴한데

일단 CKA 로 들어보고 많이 막막하다 싶으면 중간에 구매해서 병행 해 볼 생각이다.

 

섹션 2: Core Concepts

 

11) 클러스터 아키텍쳐

 

워커 노드 - Kubelet / Kube-proxy

마스터 노드 - Kube-apiserver --> ETCD/ 스케쥴러/컨트롤러 매니저(노드 컨트롤러/레플리케이션 컨트롤러)

hosted by rumtime engine such as Docker..

 

 

12) Docker VS Container D

 

Container Runtime Interface (CRI)

 

ctr - Debugging - Container D

nerdctl - General - Container D

crictl - Debugging - ALL

 

 

 

13) ETCD 

 

Key Value Store

(쿠버네티스의 기본 데이터 저장소)

 

./etcdctl -- version

API version 2 OR 3 

 

./etcdctl 

 

버전 변경도 가능

각버전에 따른 명령어의 차이는 다음과 같다

 

 

 

14) ETCD in Kubernetes

 

Manual setup

Kubeadm setup

 

16) Kube-API Server

17) Kube Controller Manager

18) Kube scheduler - 

Only decided which pod goes where

어떤 포드가 어디로 갈지 결정권자

19) Kubelet

각 워커노드의 결정권자로 마스터노드와 연결

20) Kube Proxy

각 노드에 새로운 서비스로 연결하게 도와주는 프록시

 

21) Pods (파드 개요)

- 각 노드에 단일적인 파드 생성이로 단일 컨테이너 - 단일 파드로 증가할 수 있음

볼륨이 가득 차면 또다른 노드를 만들어 생성 가능

Helper 라는 파드 지원 어플리케이션같은 경우 단일 컨테이너 내에 파드와 공존해서

함께 생성되거나 함께 삭제됨

 

kubectl run nginx --image nginx

kubectl get pods

 

 22) Pods with YAML

 

apiVersion:  사용처에 맞는 버전 사용 pod -> v1 / service ->v1 / RelicaSet -> apps/v1 / Deployment -> apps/v1

kind:  구성할 것 정의 Pod / service / RelicaSet / Deployment

metadata: 하위 딕셔너리 형식의 양식 필요

   name: myapp-pod

   labels:

     app: myapp

     type: front-end

 

spec:

   containers:

     - name: nginx-container

      image: nginx

 

kubectl create -f pod-definition.yml

kubectl get pods

kubectl describe pod myapp-pod

 

DEMO

apiVersion: v1
kind: Pod
metadata:
  name:
  label:
    app: nginx
    tire: front-end
spec:
  container:
  - name: nginx
    image: nginx

cat pod.yaml
kubectl apply -f pod.yaml
kubectl get pods

Practice Test - Pods

다음과 같이 3rd 파티 사이트 랩 환경으로 가서 

간단한 문제 10여개 정도 푸는데

13개중 12,13 문제는 어려워서 못 풀었다

 

28) Practice Test - Solution

다행히 설명동영상이 있어 이걸로 복습할 수 있다.

 

kubectl run --help  명령어 도움받기

kubectl get pods -o wide  describe 와 별개로 구체적인 정보 끌어오기

kubectl run redis --image=redis123 --dry-run=client -o yaml > redis.yaml  yaml 파일로 동작시키기

cat redis.yaml

kubectl create -f redis.yaml  파드 생성

kubectl apply -f redis.yaml  vi 편집기로 수정후 재 적용

 

 

29) ReplicaSet

Replication Controller - 높은 가용성/ 로드 발랜싱

Replication Controller / ReplicaSet

 

Replication Controller

apiVersion:  사용처에 맞는 버전 사용 pod -> v1 / service ->v1 / RelicaSet -> apps/v1 / Deployment -> apps/v1

kind:  구성할 것 정의 ReplicationController

metadata: 

   name: myapp-rc

   labels:

     app: myapp

     type: front-end

 

spec:

   template:

      metadata: 하위 딕셔너리 형식의 양식 필요 (메타데이터부터는 pod 에서 추출)

         name: myapp-pod

        labels:

          app: myapp

          type: front-end

 

      spec:

       containers:

         - name: nginx-container

           image: nginx

  replicase: 3

 

kubectl get replicationcontroller

 

ReplicaSet

apiVersion:  apps/v1

kind:  ReplicaSet

metadata: 

   name: myapp-replicaset

   labels:

     app: myapp

     type: front-end

 

spec:

   template:

      metadata: 하위 딕셔너리 형식의 양식 필요 (메타데이터부터는 pod 에서 추출)

         name: myapp-pod

        labels:

          app: myapp

          type: front-end

 

      spec:

       containers:

         - name: nginx-container

           image: nginx

  replicase: 3

  selector :

     matchLabels:

          type : front-end

 

kubectl create -f replicaseset-definition.yml

kubectl get replicaset

kubectl delete replicaset myapp-replicaset

 

레플리카 개수 변경

kubectl replcase -f replicaseset-definition.yml

kubectl scale --replicase=6 -f replicaset-definition.yml

kubectl scale --replicase=6 replicaset myapp-replicaset

 

30) Practice Test - ReplicaSet

연속되는 질문지의 경우 한번 실수해버리면 뒤에 문제도 계속 틀리게된다..

 

31) Practice Test - ReplicaSet (Solution)

 

ls /root

kubectl create -f /root/replicaset-definition-1.yaml

kubectl explain replicaset

kubectl scale rs new-replica-set --replicas=5

kubectl edot rs new-replica-set

 

32) Deployments

 

kubectl create -f deployment-definition.yaml 

kubectl get deployments/replicaset/pods

kubectl get all

 

apiVersion:  apps/v1

kind:  Deployment

metadata: 

   name: myapp-replicaset

   labels:

     app: myapp

     type: front-end

 

spec:

   template:

      metadata: 하위 딕셔너리 형식의 양식 필요 (메타데이터부터는 pod 에서 추출)

         name: myapp-pod

        labels:

          app: myapp

          type: front-end

 

      spec:

       containers:

         - name: nginx-container

           image: nginx

  replicase: 3

  selector :

     matchLabels:

          type : front-end

 

30) Deployments (Solution)

이건 all pass!=

 

kubectl create deployment httpd-frontend --image=httpd:2.4-alpine --replicase=3

 

36) Services

노드 ip 와 내부 파드 ip 주소가 다를때 연결하게 끔 도와주는 역할

 

Services 종료 - NodePort / ClusterIP / LoadBalancer

apiVersion:  v1

kind:  Service

metadata: 

   name: myapp-service

spec:

  type: NodePort

  ports:

  - targetPort: 80

    port: 80

    nodePort: 30008

  selector:

     app: myapp

     type: front-end

 

kubectl create -f service-definition.yaml 

kubectl get services

curl http://192.168.1.2:30008

 

37) Services Cluster IP

 

각 파트 (Front-end,back-end,redis...) 쓰임새별로 연결되어야함

하지만 유동적인 번호로 고정적이지 않음 - 스케일링되는 특성으로

 

apiVersion:  v1

kind:  Service

metadata: 

   name: back-end

spec:

  type: ClusterIP

  ports:

  - targetPort: 80

    port: 80

    

  selector:

     app: myapp

     type: back-end

 

kubectl create -f service-definition.yaml 

kubectl get services

 

38) Loadbalancer

 

복합 앱의 경우 각 앱의 ip 주소만큼 개수 생성되기때문에

로드발랜싱 프록시 사용으로 한번에 처리하게끔 도와줌

(클라우드 CSP 내재된 로드발랜싱 가능)

 

apiVersion:  v1

kind:  Service

metadata: 

   name: myapp-service

spec:

  type: LoadBalancer

  ports:

  - targetPort: 80

    port: 80

    nodePort: 30008

 

서비스 Lab 도 무사히 종료되었다

 

41) Namespaces

 

각각 다른 app 구성 시 일련의 이름을 정해주어 헷갈리지 않도록 도와줌

 

mysql.connect("db-service.dev.svc.cluster.local")

db-service = service name

dev = Namespace

svc = service

cluster.local = domain

 

kubectl create -f pod-definition.yaml 

kubectl create -f pod-definition.yaml --namespace=dev

 

apiVersion:  v1

kind:  Namespace

metadata:

  name: dev

 

kubectl create -f namespace-dev.yaml

kubectl create namespace.dev

 

kubectl get pods --namespace=dev         kubectl get pods            kubectl get pods --namespace=prod

kubectl config set-context $(kubectl config current-context) --namespace=dev

 

kubectl get pods          kubectl get pods --namespace=default           kubectl get pods --namespace=prod

 

Resource Quota (할당량 미리 지정)

 

apiVersion:  v1

kind:  ResourceQuota

metadata:

  name: compute-quota

  namespace: dev

spec:

  hard:

    pods: "10"

    requests.cpu: "4"

    requests.memry: 5Gi

    limits.cpu: "10"

    limits.memory: 10G

 

lab 

6번 7번은 잘 모르겠어서 pass

 

kubectl run redis --image=redis -n finance

kubectl get pods --all-namespaces

 

44) Imperative VS Declarative

 

 Imperative - Step by Step , 각각의 명령어로 진행 (시험에서 유용)

Declarative - 한번에 , yaml 파일로 진행 (고급설정 및 관리에 유용) - apply command

 

Demo

 

큰 개념만 일단 이해하고 바로 Demo 로 넘어갔는데 아직 각각 명령어의 차이를 모르겠다

헷갈리는 부분은 4,5,6,9 

특히 서비스를 생성하는 대신 expose 로 넘어가는것이 헷갈린다

** --help 명령어 혹은 공문 사이트 참조**

 

pod 생성 - run 명령어

labels 추가 - --labels="db"

kubectl expose pod redis --port 7839 --name redis-service

--expose=true 와 포트지정 으로 ClusterIP 추가 됨

 

48) Kubectl Apply Command

 

Local yaml file 에서 apply -f 명령어로 쿠버네티스에 심겨짐

이때 Last applied configuration 파일도 존재하는데 마지막 수정히스토리를 확인할 수 있게 도와주는듯 하다

 


약 3시간 40분 가량의 Section.2 (Core Concepts) 가 드디어 끝났다

다음은 Section.3 (Scheduling) .. To be Continued