이 글은 Udemy의 "【한글자막】 Docker & Kubernetes : 실전 가이드" 강의의 학습 노트입니다.
https://www.udemy.com/course/docker-kubernetes-2022/
관리자가 해야 하는 작업을 구분하는 것이 중요하다.
kubermatic 과 같은 추가 도구를 이용하여 인프라 구성을 더 쉽게 할 수 있다. AWS의 경우에는 EKS(Elastic Kubernetes Service) 를 통해 쉽게 구성 가능하다.
클러스터 외부에서 클러스터에게 명령을 실행하게 해주는 툴이다.
ex) deployment 생성, 삭제, 변경 등을 할 수 있다.
설치방법(mac)
brew install kubectl
쿠버네티스를 테스트하기 위해 실제 클러스트 구성은 어렵기 때문에, 로컬에서 데모 클러스터를 구성해준다.
설치방법(mac)
brew install minikube
실행방법
minikube start --driver=<drivername>
minikube가 돌아갈 가상환경을 따로 설정을 해야 한다.
virtualbox 등이 가능하지만 간편한 방법은 docker를 이용하는 것이다.
해당 방법으로 테스트 후 설정파일을 이용해 바로 AWS와 같은 곳에 적용가능하다.
minikube status
: 미니큐브 상태를 조회한다.
minikube dashboard
: 클러스터 상태를 자세하게 웹사이트를 통해 조회한다.
마치 docker run ... 처럼 deployment 객체에 대한 설정을 명령어로 직접 다 입력하는 것이다.
docker-compose 와 비슷하게 yaml파일에 작성하여 파일을 통해 실행한다.
minikube가 먼저 실행되는 중인지 확인하자!
kubectl create deployment <deployment 이름> --image=<실행할 도커 이미지>
참고로 도커 이미지에는 dockerhub에 올라가 있는 이미지만 가능하다. (로컬에 존재하는 이미지 X)
kubectl get deployments // 조회
kubectl get pods //조회
kubectl delete deployment <deployment 이름>
하지만 이렇게만 해서는 접속할 수 없다. pod이 외부로 노출이 되어있지 않기 때문에
기본적으로 pod는 kubernetes에 의해 생성, 삭제, 변경 되므로 ip가 계속 변한다.
그래서 service를 이용하여 pod를 그룹화하여 공유 ip 주소를 제공한다.(동일한 파드가 여러 개 생성되어 로드밸런싱이 되는 상황에서 하나의 ip로 접속)
이를 이용하여 외부로 노출한다.
kubectl expose deployment <deployment name> --type=LoadBalancer --port=8080
type 종류
service 조회
kubectl get services
조회시 EXTERNAL-IP가 pending 상태임. 클라우드 프로바이더로 배포되면 실제 외부 ip를 조회하고 접속할 수 있음. 하지만 여기서는 내부 가상머신 ip 이기에 접속 불가
minikube service <service-name>
을 통해 minikube에서 외부와 매핑해서 연결해줌.
에러발생해서 서버가 죽으면 자동으로 재실행 해준다. 하지만 에러를 반복할 수록 재실행되는 시간이 느려진다. 실제로 서버가 문제가 있어 무한루프 도는 것을 방지하기 위함이다.
kubectl scale deployment/first-app --replicas=3
해당 명령어를 통해 동일한 파드를 3개를 만들 수 있다. 에러가 발생하면 자동으로 에러나지 않은 파드로 연결된다. 다시 1로 설정해서 실행하면 나머지 2개는 자동 종료된다.
kubectl set image deployment/first-app kub-first-app=<image name>
해당 코드를 실행하면 자동으로 새로운 이미지가 변경되어 실행된다.
잘못된 이미지를 업로드하면 기존의 정상적인 파드가 유지된 상태로 새로운 파드는 에러상태를 유지한다.
kubectl rollout status deployment/first-app
kubectl rollout undo deployment/first-app
kubectl rollout history deployment/first-app
--revison=<num>
를 이용해 구체적인 history조회가능
kubectl rollout undo deployment/first-app --to-revision=1
apiVersion: apps/v1 # version 설정
kind: Deployment # Deployment, Service, Job 등 지정
metadata:
name: second-app-deployment # 이름 지정
spec: # 여기가 핵심. pod 사양을 설정
replicas: 1 # 동일한 pod 개수 설정, 기본은 1, 0으로 설정해서 처음에 시작안하게 할 수도 있음.
selector: # 관리할 pod를 매칭해줌.
matchLabels:
app: second-app
tier: backend
template: #pod에 대한 설정
metadata: #pod에 대한 metadata
labels: #key-value로 원하는 거 설정가능
app: second-app
tier: backend
spec: # pod에 대한 spec
containers:
- name: second-node # 컨테이너 이름 지정
image: <image name> # 이미지 지정
# - name: second-node # 이런 식으로 여러개 실행 가능.
# image:
kubectl apply -f=deployment.yaml
기본적으로 deployment 는 동적 객체이고 pod도 개별적인 객체이다. 그래서 해당 deployment가 특정 pod를 제어하려면 selector를 통해 Label을 통해 지정한다.
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector: # Service는 matchLabels이 없음.
app: second-app
tier: backend
ports:
- protocol: "TCP"
port: 80
targetPort: 8080
# - protocol: 'TCP' # 여러개 노출 가능.
# port: 443
# targetPort: 443
type: LoadBalancer # ClusterIP - default 내부적으로 노출, NodePort - 클러스터 내부에서 액세스 가능, 외부는 LoadBalancer
kubectl apply -f=service.yaml
kubectl delete -f=deployment.yaml,service.yaml
deployment.yaml과 service.yaml을 한 파일로 관리할 수 있음.
---
를 이용해 내용을 분리하면 된다. service를 먼저 작성하는 것이 권고 (service가 먼저 생성됨)
matchExpressions : matchLabels 대신 사용할 수 있다. 수식이 포함.
matchExpressions:
- {key:app, operator: In, values: [second-app, first-app]
operator : In, NotIn, Exists, DoNotExist
주로 쓰이지는 않지만 유연한 상황에 사용
기본적으로 상태 확인 시 root path를 통해 확인. 하지만 이를 통해 시간이나 경로 수정 가능
livenessProbe:
httpGet:
path: /
port: 8080
periodSeconds: 3
initialDelaySeconds: 5