이론으로 한번 쭉 읽으세요
실습으로 또 한 번 실행합니다.
내용은 계속 업데이트됩니다.
1
그리스어로 조타수라는 뜻.
컨테이너 오케스트레이션 도구.
2
설치 툴?
Minikube - 1개 노드, 기능제한
Docker for Mac/Windows 내장 쿠버네티스- 1개 노드, 기능제한
kops - 특정 클라우드에서 쿠버네티스 설치가능
kubespray - 온프레미스, 클라우드 모두 설치가능
kubeadmin - 온프레미스, 클라우드 모두 설치가능
EKS, GKE 등 매니지드 서비스
// 제가 많아 쓰는 kops는 온프레미스 설치가 안 되는군요.
3
쿠버네티스 설치할 버전?
너무 오래된 버전이나 최신 버전은 피하자.
1.31 버전 설치한다. (2024년 12월 현재)
Amazon EKS 경우는?
aws경우 최근 5개 버전까지 지원한다.
2023년 6월 현재 1.27 버전까지 지원한다.
낮은 버전은 곧 업그레이드해야 한다.
현재 지원 버전
https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html
1.27
1.26
1.25
1.24
1.23
1.22
4
쿠버네티스 사용은 주로 YAML 파일을 사용합니다.
1
포드(POD) : 컨테이너를 다루는 기본 단위.
포드는 1개 이상의 컨테이너가 있는 컨테이너의 집합니다.
포드 안에 컨테이너들은 IP가 같다.
// 포드 단위로 IP가 할당된다.
2
kubectl create ns test
// 별도 공간 네임스페이스에서 작업을 하자.
ns는 네임 스페이스
네임 스페이스 이름은 test
3
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
kubectl apply -f nginx-deployment.yaml -n test
네임 스페이스 test에 만든다.
디플로이 먼트로 만든다.
디플로이 먼트 - 리플리카세트 - 파드 순으로 구성된다.
이경우 파드를 삭제해도 리플리카세트의 복제 기능. 항상성 유지 기능으로 파드는 다시 생성된다.
단일 파드로 만드는 경우는 삭제하면 삭제된다.
디플로이먼트는 리플리카세트를 관리하고, 배포 관리 업무를 한다.
정리
디플로이먼트는 리플리카세트를 관리하고, 배포 관리 업무를 한다.
리플리카 세트는 파드 수를 유지한다.
파드는 컨테이너를 가지고 있으며, IP를 할당받아 서비스한다.
4
확인?
네임 스페이스 test에의 디플로이먼트가 뭐가 있는지 본다.
네임 스페이스 test에 파드가 뭐가 있는지 본다.
kubectl get deploy -n test
kubectl get po -n test
5
자세히 확인, ip도 확인
kubectl describe pods xxxxxxxxxxxxxx
6
curl ip
7
kubectl exec 명령으로 포드에 컨테이버에 명형을 전달할 수 있습니다.
kubectl exec -it xxxxxxxxxxxpod bash
ls
exit -------- pod에서 빠져나옴
8
kubectl logs xxxxxxxxxx-pod
9
삭제
kubectl delete -f xxx.yaml
10
kubectl get nodes
1/1는 컨테이너가 하나이고 1개가 정상 동작이라는 뜻이다.
2/2는 컨테이너가 2개이고 2개가 정상 동작이라는 뜻이다.
1/2는 컨테이너가 2개이고 1개만 정상 동작이라는 뜻이다.
11
POD , 사이드카 ?
1개의 파드에 웹 컨테이너가 운영 중이다.
로그 수집을 위한 컨테이너를 추가한다.
이 경우 주 기능인 웹 컨테이너, 부가 기능인 로그 수집 컨테이너.
로그 수집 컨테이너를 사이드카( sidecar) 컨테이너라고 부른다.
다른 컨테이너와 네트워크 환경을 공유한다.
같은 IP를 쓴다.
1
레플리카셋으로 파드를 2개 만들었다면, 1개를 삭제하더라도 다시 1개가 새로 생성된다.
일정 개수를 유지하는 것이다.
2
YAML 파일은 --를 구분자로 여러 개의 리소스를 정의할 수 있다.
3
노드 장애로 파드를 사용할 수 없다면, 다른 노드에 파드를 다시 생성한다.
4
kubetl get po
5
라벨은 서로 다른 오브젝트를 찾을 때도 사용한다.
예를 들어 레플리카셋이 특정 라벨로 정의된 파드를 생성하는 경우
해당 파드의 개수가 리플리카 항목에 정의된 숫자와 일치하지 않으면 파트 템플릿의 내용으로 파드의 숫자를 맞춘다.
6
파드의 라벨을 1대 삭제하면?
레플리카 세트의 숫자와 일치하지 않으므로 일치하게 하기 위해 파드를 1개 추가 생성한다.
레플리카 세트를 지워도 라벨 삭제된 파드는 남아 있다. 별도로 삭제해야 한다.
1
생성과 삭제
kubectl delete deploy xxxxxxxxx-deployment
2
디플로이먼트를 이용해 애플리케이션 버전을 업데이트해보자.
--record 옵션으로 기록하자.
kubectl apply -f xxxxxxxxxx.yaml --record
3
k get pods
파드 이름 확인
kubectl set image deployment xxxxxxxx-deployment nginx:1.11 --record
k get pods
새로운 파드들 등장
4
리스트 확인
k rollout history deployment my-nginx-deploy
k rollout undo deplyment xxxxxxx-deploy --to-reviosn=1
k get replicasets
k get replicasets --show-label
k describe deploy xxxxx-deplyment
리소스 정리
k delete deployment, pod, rs --all
실습 내용 보기
링크
실습하기
1
로드밸런서라고 생각하면 될 거 같다.
2
서비스의 종류?
Cluster IP 타입의 서비스 - 쿠버네티스 내부에서만 파드에 접근하기
NodePort 타입의 서비스 - 서비스를 이용해 파드를 외부에 노출하기
LoadBalancer 타입의 서비스 - 클라우드 플랫폼의 로드밸런서 연동하기 , CLB , NLB , ALB
3
트래픽의 분배를 결정하는 서비스 속성 : externalTrafficPolicy
4
externalTrafficPolicy : Cluster (기본값)
LoadBalancer 타입을 사용하면 외부로부터 들어온 요청은 각 노드 중 하나로 보내진다.
그 노드에서 다시 파드 중 하나로 전달된다.
워커노드 a로 들어왔을 때도 파드 b로 전달한다.
불필요한 트래픽 발생.
SNAT 발생하게 되고, 이로 인해 클라이언트의 IP주소가 보존되지 않는다.
5
externalTrafficPolicy : Local
워커노드 a로 들어왔을 때도 파드 a로 전달한다.
워커노드 b로 들어왔을 때도 파드 b로 전달한다.
불필요한 트래픽은 없다.
그러나, 특정 노드에서만 특정 파드 접속이 가능하다.
Local 이 무조건 좋지는 않다.
워커노드 a로 들어왔을 때도 같은 노드에 파드가 2개 존재한다면 a, b로 전달한다. 50%
워커노드 b로 들어왔을 때도 파드 1개 존재한다면 c로 전달한다. 50%
트래픽이 골고루 분산되지 않을 수 있다.
1
서비스 만들 때 보통, 모니터링 네임스페이스, 프런트엔드 네임스페이스, 밴앤드 네임스페이스 만들어 사용한다.
2
네임스페이스 뭐가 있나 보기
kubectl get namesapce
3
default name space에 있는 pod 보기
kubectl get pods --namespace default
kubectl get pods --n default
kubectl get pods --n kube-system
kube-system 네임 스페이스에는 시스템 관리 파드들이 존재한다.
그래서, 안 건드리자.
dns서비스도 서비스로 여기에 있다.
kubectl get service --n kube-system
kubectl get svc --n kube-system
4
특정 라벨 가진 파드 보기
k get pods -l app=webserver
5
k get pods --all-namespaces
모든 네임스페이스의 파드를 볼 수 있다.
k get pods -A
k create configmap 컨피그맵이름 <각종 설정>
k get cm
컨피그맵의 값을 컨테이버의 환경 변수로 사용
컨피그맵의 값을 파드 내부의 파일로 마운트 해서 사용
컴픽스맵의 데이터를 컨테이너의 환경 변수로 가져오기
k delete deployment --all
k delete pod --all
k delete configmap --all
k delete secret --all
L7이라고 생각하면 되겠다.
유입 경로에 따라 맞는 파드로 라우팅 해준다.
인그레스 ---- 서비스 -- 디플로이먼트 구조이다.
ingress
k get ingress
k get ing
NFS를 네트워크 볼륨으로 사용하기
1
영구 저장 볼륨.
2
AWS EBS를 퍼시스텐트 볼륨으로 사용하기.
1
스토리지 클래스 미리정의
2
스토리지 클래스 명시해 PVC 생성
3
일치하는 PV가 없으므로, xxxx라는 이름의 스토리지 클래스에 정의된 속성에 기반해 다이내믹 프로비저닝 수행
4
외부 스토리지가 새롭게 생성되어 PV로서 등록되고, PVC와 바인팅 됨.
Service Account와 RBAC
프로메테우스 그라파나
감사합니다.