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
'Kubernates' 카테고리의 다른 글
쿠버네티스 따배씨 강의 (1) | 2024.01.24 |
---|---|
쿠버네티스 101 (1) | 2024.01.22 |
Kubernetes 쿠버네티스 CKA (Udemy 강의#04) (0) | 2023.07.26 |
Kubernetes 쿠버네티스 CKA (Udemy 강의#03) (0) | 2023.07.21 |
Kubernetes 쿠버네티스 CKA (Udemy 강의#02) (0) | 2023.07.14 |