- (생략) 수업 강의자료 참조
- 또는 공식 홈페이지 참조
- Kubernetes (K8s) Original
- Minikube : Single node K8s cluster inside a VM (or docker or host)
- MicroK8s : Low-ops, light-weight, minimal production K8s (single/multi nodes)
- (생략)
- 공식가이드
- 수동설치 (바이너리)
- 주의 : PC환경에 따라 아키텍처 다른 것 받아야 함
- x86-64 기준
1.18.0 특정 버전 > curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.18.0/minikube-linux-amd64 최신 버전 (v1.22.0 등) > curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube > sudo mkdir -p /usr/local/bin/ > sudo install minikube /usr/local/bin/
- MAC 기준
> curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && chmod +x minikube
- 실행
- 시작 (도커 설치 시, 기본 드라이버 = docker, 그 외 none, qemu, ssh 등)
minikube start --driver=<driver_name>
- 고급 옵션
- 메모리 증설 후 시작
minikube stop minikube start --cpus 2 --memory 4096 (또는 시작 전 설정파일 생성) minikube config set memory 4096
- 멀티 노트로 시작
minikube start --nodes 2 -p multinode minikube status -p multinode (-p 옵션은 프로파일 신규 생성으로 옵셔널 필드임)
- 다른 사용자 계정으로부터 현재 노드에 접속
minikube kubectl -- config view --flatten > minikube-config # 클라이언트 노드 mkdir -p /home/$USER/.kube cp minikube-config /home/$USER/.kube/config
- 메모리 증설 후 시작
- 상태
minikube status
- 중지(종료)
minikube stop
- 삭제
minikube delete
- 시작 (도커 설치 시, 기본 드라이버 = docker, 그 외 none, qemu, ssh 등)
- 내부 설정 확인 (minikube 컨테이너)
> minikube kubectl get nodes > docker ps > minikube ssh > docker ps
- 설치환경 참고사항
- 리눅스에 설치 시 : 호스트와 동일한 레벨
- MAC에 설치 시 : HyperKit 아래 FreeBSD 에 설치
- 윈도우에 설치 시 : HyperV 아래 Ubuntu 에 설치 (WSL의 경우) - 또는 VirtualBox 아래 우분투
- Addons 를 통한 추가 기능 활성화
- 목록 확인 :
minikube addons list
- 추가 활성화1 :
minikube addons enable dashboard
- 추가 활성화2 :
minikube addons enable metrics-server
- 비활성화 :
minikube addons disable metrics-server
- 대시보드 접속 :
minikube dashboard --url
- 목록 확인 :
- 공식가이드
- 설치 명령어
snap install kubectl
- 공식 사이트
- 패키지 관리자를 통한 설치
- apt 패키지 색인을 업데이트하고 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지들을 설치한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
- 구글 클라우드 공개 사이닝 키를 다운로드한다.
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
- 쿠버네티스 apt 리포지터리를 추가한다.
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
- 새 리포지터리의 apt 패키지 색인을 업데이트하고 kubectl을 설치한다.
sudo apt-get update
sudo apt-get install -y kubectl
- 설치 명령어 (최신버전)
-
> curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" > curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256" > echo "$(<kubectl.sha256) kubectl" | sha256sum --check > sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
-
- 설치 명령어 (특정버전 - OLD)
-
> curl -LO https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectl > curl -LO https://dl.k8s.io/release/v1.22.0/bin/linux/amd64/kubectl > curl -LO https://dl.k8s.io/release/v1.26.0/bin/linux/amd64/kubectl > sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
-
- 쿠버네티스 (및 minikube) 는 지속적으로 버전이 올라가고 있으며, 다양한 이슈들이 해결되고는 있음. 매우 빠르게 변화하는 소프트웨어 중 하나임.
- 따라서, 버전에 따른 다양한 동작 차이가 발생 할 수 있으며, 커널 버전 (리눅스/우분투) 등과도 미스매치가 있으면 이슈가 발생 할 수 있으며, minikube 버전과 kubectl 버전이 너무 차이가 많이 있을 경우에도 각종 문제가 발생 할 수 있음. (따라서 실습 환경을 해당 시점에서 잘 맞추어야 함)
- kubectl get pods -A 통해서 모든 서비스 데몬 정상인지 확인 (crashLoopBackOff 없어야 함)
- 예) Minikube v1.18 과 Ubuntu 16.04 는 큰 이슈가 없었으나, Ubuntu 20.04 에서는 kernel 버전이 올라가며 nf_conntrack_max 설정 관련 이슈가 있음.
- 임시 방편으로는 sudo sysctl net/netfilter/nf_conntrack_max=131072 로 설정해두고 minikube 를 실행하여 해결 (부팅시 자동 적용은 /etc/sysctl.conf),
- 또는 kubectl edit configmap kube-proxy --namespace=kube-system 를 통해 maxPerCore 를 null -> 0 으로 변경해서 해결,
- 또는 최신 버전의 minikube 로 업그레이드 해야 한다.
- 명령어(command) 유형
- 정보 조회 :
kubectl get
- 생성 :
kubectl create
- 생성(pod) :
kubectl run
- 생성(service) :
kubectl expose
- 로그 :
kubectl logs
- 삭제 :
kubectl delete
- 정보 조회 :
- 컨트롤러 유형
- 파드(pod) :
pods = po
kubectl get pods
kubectl get po
- 리플리카셋(replicaset) :
replicatsets = rs
kubectl get replicasets
kubectl get rs
- 디플로이먼트(deployment) :
deployment = deploy
kubectl get deployments
kubectl get deploy
- 파드(pod) :
- 서비스 유형
- 서비스(service) :
service = svc
kubectl get services
kubectl get svc
- 서비스(service) :
- 네임스페이스
- 네임스페이스(namespace) :
namespace = ns
- 네임스페이스(namespace) :
- 다수의 서비스 조회
kubectl get deploy,rc,pods
- 컨트롤러 유형
- 스테이트풀셋(statefulset) :
statefulset = sts
- 데몬셋(daemonset) :
daemonset = ds
- 잡(job) :
job
- 크론(cronjab) :
cronjob
- 스테이트풀셋(statefulset) :
- 서비스 유형
- 엔드포인트(endpoint) :
endpoint = ep
- 인그레스(ingress) :
ingress
- 엔드포인트(endpoint) :
- 볼륨 유형
- 볼륨(persistentvolume) :
persistentvolume = pv
- 볼륨요청(persistentvolumeclaim) :
pesistentvolumeclaim = pvc
- 스토리지(storageclass) :
storageclass
- 볼륨(persistentvolume) :
- 설정
- 설정(configmap) :
configmap = cm
- 시크릿(secret) :
secret
- 설정(configmap) :
- 이벤트 상태 로그 :
kubectl get events
- 클러스터 확인
kubectl cluster-info
- 설정 확인 (멀티 클러스터 사용 시)
-
기본 서버 배포 (맥북 M1에서는 해당 컨테이너 이미지가 실행되지 않음 - 이미지 빌드 아키텍처 차이)
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10
kubectl expose deployment hello-minikube --type=NodePort --port=8080
-
배포된 내용 확인
- 기본 배포 컨테이너 확인
kubectl get pod
- 컨테이너 내에서 직접 접속 확인
kubectl exec hello-minikube-xxxxxxxx -- curl localhost:8080
- 서비스 확인
kubectl get svc
- 기본 배포 컨테이너 전체 확인
kubectl get all
- 기본 배포 컨테이너 확인
-
서비스 접속을 위한 다양한 인터페이스
- 서비스 접속하기 (맥북에서는 특히 유용함 - 노드의 IP가 외부에 노출되지 않음으로)
minikube service hello-minikube --url
- 호스트 포트 포워딩 (pod)
kubectl port-forward hello-minikube-64b64df8c9-4rpfp 8080:8080
- 호스트 포트 포워딩 (svc)
kubectl port-forward svc/hello-minikube 8080:8080
- 서비스 접속하기 (맥북에서는 특히 유용함 - 노드의 IP가 외부에 노출되지 않음으로)
-
배포한 서비스 모두 삭제
kubectl delete deploy,svc hello-minikube
- 컨테이너 pod 형태로 배포 및 서비스 확인
> kubectl run nodejs --image=lovehyun/express-app:1.0 --port=8000 pod/nodejs created > kubectl get pods NAME READY STATUS RESTARTS AGE nodejs 1/1 Running 0 24s > kubectl logs nodejs Express is ready at localhost:8000 > kubectl exec nodejs -- curl 127.0.0.1:8000 --silent Hello Express > kubectl expose pod/nodejs --type=NodePort --name nodejs-svc service/nodejs-svc exposed > kubectl get svc nodejs-svcc NodePort 10.103.4.59 <none> 8080:32681/TCP 4s > minikube service nodejs-svc --url http://192.168.49.2:32681 > curl 192.168.49.2:32681 Hello Express > VSCode 사용 시 포트포워딩 추가 (192.168.49.2:32681 <- localhost:32681) 후 웹브라우저에서 확인
-
컨테이너 deployment 형태로 배포 및 서비스 확인
> kubectl create deployment nodejs --image=lovehyun/express-app:1.1 --port=8000 deployment.apps/nodejs created > kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE nodejs 1/1 1 1 7s > kubectl get replicasets NAME DESIRED CURRENT READY AGE nodejs-775cf96dc5 1 1 1 59s > kubectl get pods NAME READY STATUS RESTARTS AGE nodejs-775cf96dc5-6qp5k 1/1 Running 0 2m30s > kubectl expose deployment/nodejs --type=NodePort --name nodejs-svc service/nodejs-svc exposed > kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-svc NodePort 10.97.135.189 <none> 8080:30518/TCP 4s > kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME minikube Ready control-plane,master 5d v1.21.2 192.168.49.2 <none> Ubuntu 20.04.2 LTS 5.11.0-25-generic docker://20.10.7 > minikube service nodejs-svc --url http://192.168.49.2:30518 > curl 192.168.49.2:30518 <h2>Welcome to nodejs-775cf96dc5-6qp5k</h2> > kubectl scale deployment/nodejs --replicas=2 deployment.apps/nodejs scaled > kubectl get replicasets NAME DESIRED CURRENT READY AGE nodejs-775cf96dc5 2 2 2 4m9s > kubectl get pods NAME READY STATUS RESTARTS AGE nodejs-775cf96dc5-6qp5k 1/1 Running 0 4m13s nodejs-775cf96dc5-f6nwl 1/1 Running 0 14s > curl 192.168.49.2:30518 <h2>Welcome to nodejs-775cf96dc5-6qp5k</h2> > curl 192.168.49.2:30518 <h2>Welcome to nodejs-775cf96dc5-f6nwl</h2> > VSCode 사용 시 포트포워딩 추가 (192.168.49.2:30518 <- localhost:30518) 후 웹브라우저에서 확인
-
확인사항 (self-healing)
> kubectl get po -w (watch) > kubectl delete po nodejs-xxxx > kubectl get rs -w (watch) > kubectl delete rs nodejs-xxxx
- 버전 변경 배포 (1.1 -> 1.2)
> kubectl describe deployment/nodejs | grep Image > kubectl set image deployment/nodejs express-app=lovehyun/express-app:1.2 # 현 리비전을 포함한 디플로이먼트 이력 출력 > kubectl rollout history deployment/nodejs deployment.apps/nodejs REVISION CHANGE-CAUSE 1 <none> 2 <none> # 이전 디플로이먼트로 롤백 (1.2 -> 1.1) > kubectl rollout undo deployment/nodejs deployment.apps/nodejs rolled back > kubectl rollout history deployment/nodejs deployment.apps/nodejs REVISION CHANGE-CAUSE 2 <none> 3 <none> # 특정 리비전으로 롤백 (1.1 -> 1.2) > kubectl rollout undo deployment/nodejs --to-revision=2 deployment.apps/nodejs rolled back > kubectl rollout history deployment/nodejs deployment.apps/nodejs REVISION CHANGE-CAUSE 3 <none> 4 <none # 삭제 > kubectl delete deployment/nodejs
-
HPA (HorizontalPodAutoscaler) 사용해서 확장 metric-server 동작하지 않을 경우 (kubectl top pods)
> minikube start --extra-config=kubelet.housekeeping-interval=10s
> minikube addons enable metrics-server > kubectl -n kube-system rollout status deployment metrics-server deployment "metrics-server" successfully rolled out > kubectl create deployment nodejs --image=lovehyun/express-app:latest --port=8000 deployment.apps/nodejs created > kubectl expose deployment/nodejs --type=NodePort --name nodejs-svc service/nodejs-svc exposed > kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nodejs-svc NodePort 10.97.135.189 <none> 8080:30518/TCP 4s > kubectl top pods NAME CPU(cores) MEMORY(bytes) nodejs-66c754554d-bc7vz 0m 1Mi > kubectl autoscale deployment/nodejs --cpu-percent=70 --min=1 --max=5 horizontalpodautoscaler.autoscaling/nodejs autoscaled > kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nodejs Deployment/nodejs <unknown>/70% 1 5 0 7s > kubectl top pods error: Metrics not available for pod default/nodejs-66c754554d-bc7vz, age: 2m12.737349993s # 1 core = 1000m, 2 core = 2000m, recommand <100m > kubectl set resources deployment/nodejs --requests=cpu=50m --limits=cpu=50m,memory=64Mi deployment.apps/nodejs resource requirements updated # Jobs 1~3 > while true; do curl 192.168.49.2:31410 --silent >/dev/null; done & # 확인 및 중지 > jobs > kill %1 %2 %3 > kubectl get hpa -w NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nodejs Deployment/nodejs 0%/70% 1 10 1 19h nodejs Deployment/nodejs 14%/70% 1 10 1 19h nodejs Deployment/nodejs 85%/70% 1 10 1 19h nodejs Deployment/nodejs 92%/70% 1 10 1 19h nodejs Deployment/nodejs 61%/70% 1 10 2 19h nodejs Deployment/nodejs 45%/70% 1 10 2 19h # Clean-up (모두 삭제) > kubectl delete hpa nodejs > kubectl delete deploy/nodejs > kubectl delete svc/nodejs-svc
-
kubeconfig 란?
$HOME/.kube/config
파일을 통해 클러스터, 인증, 컨텍스트 정보 확인
-
클러스터 내 사용 가능한 자원의 목록
kubectl api-resources
-
접속 가능한 컨텍스트 정보 확인
kubectl config get-contexts
-
CURRENT NAME CLUSTER AUTHINFO NAMESPACE * minikube minikube minikube default
-
원하는 컨텍스트로 변경
kubectl config use-context minikube
kubectl config current-context
kubectl config set-context minikube --namespace=my-namespace
- or (버전에따라)
kubectl config set-context --current --namespace=my-nsmeapce
-
현재 컨텍스트 보기
kubectl config view
-
K8s 클라우드 서비스 접속하기
- Amazon EKS (AWS K8s 서비스) 접속하기 : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/create-kubeconfig.html
- Google GKE (GCP K8s 서비스) 접속하기 : https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl
- Azure AKS (Azure K8s 서비스) 접속하기 : https://docs.microsoft.com/ko-kr/azure/aks/control-kubeconfig-access
-
명령어 실행 시 한시적으로 다른 컨텍스트에 명령어 요청
kubectl --kubeconfig=<config> get pods
-
bash 쉘 자동완성
echo 'source <(kubectl completion bash)' >> ~/.bashrc
-
클러스터 노드들의 IP 주소 확인
kubectl get nodes -o wide
kubectl get nodes -o json | jq -r '.items[].status.addresses[] | select(.type=="InternalIP") | .address'
- https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/kubernetes-objects/
- YAML 의 자료형
- 주석 : #
- 여러파일 구분자 : ---
- 기본 템플릿
-
apiVersion: v1 kind: Pod metadata: spec:
-
- Scalars(strings/numbers)
-
Name: shpark Year: 2021
-
- Sequence(arrays/lists)
-
MySpecs: - item1 - item2 - item3
-
- Mappings(hashes/dictionaries)
-
Score: Math: 100 Eng: 90
-
- 로그레벨 변경을 통한 상세 로그 확인
kubectl get pods --v=7
- v=3 : 변경 사항에 대한 확장 정보
- v=4 : 디버그 수준 상세화
- v=5 : 트레이스 수준 상세화
- v=6 : 요청한 리소스 표시
- v=7 : HTTP 요청 헤더를 표시
- v=8 : HTTP 요청 내용을 표시
- v=9 : HTTP 요청 내용을 생략 없이 모두 표시
- examples 디렉토리의, 아래 개별 디렉토리 내의 README.txt 참고
- 파드 생성 (실제로는 이렇게 배포하지 않음(개념 학습용), 실제로는 deployment 를 사용함)
README.txt
참고
- 리플리카셋 생성 (상동)
- 서비스 컨트롤러
- imperative 명렁어 (deploy/rs/pod 등 다양하게 expose 가능)
-
kubectl expose deployment nginx-app --type=NodePort kubectl get service kubectl describe service nginx-app curl localhost:31000
-
- 서비스 포트 타입
- ClusterIP : 기본 타입이며 클러스터 내에서만 사용 가능 (외부 접속 불가)
- NodePort : 모든 노드의 지정된 포트 할당 (외부에서 클러스터 안으로 접속 가능)
- LoadBalancer : 퍼블릭 클라우드 또는 로드밸런서 장비가 있는 경우 사용 가능 (External-IP 로 표시)
- ExternalName : 클러스터 안에서 외부로 접근할 때 사용 (도메인 주소로 응답)
- 디프로이먼트 컨트롤러
- imperative 명령어
-
kubectl run nginx-app --image nginx --port=80 kubectl get pods kubectl get deployments kubectl scale deploy nginx-app --replicas=3 kubectl get pods kubectl get deployments kubectl edit deployments nginx-app kubectl delete pod nginx-app-xxxxxxxx kubectl delete deployments nginx-app kubectl set image deploy/nginx-app nginx-app=nginx:1.11 kubectl rollout history deploy nginx-app kubectl rollout history deploy nginx-app --revision=3 kubectl rollout undo deploy nginx-app kubectl rollout undo deploy nginx-app --to-revision=3 kubectl rollout pause deploy/nginx-app kubectl rollout resume deploy/nginx-app
-
- declarative 명령어
-
kubectl create -f 1.nginx-deployment.yml or kubectl apply -f 1.nginx-deployment.yml
-
- 인그레스 서비스
- 상태관리 서비스
- 상태가 있는 파드들의 관리 (볼륨을 사용해서 특정 데이터를 저장)
- 노드별 서비스
- 클러스터 내 모든 노드에 파드 배포 (예, 모니터링 / 로그 수집 등)
- job 및 cronob
- 다중 작업 실행 또는 정해진 날자/시간에 정기적으로 수행하는 파드들의 생성
- 볼륨
- 컨피그맵
- 시크릿
- 작업공간 관리 보안에 관심이 있는 학생들은 20.namespace 부터 시작, 그렇지 않으면 1.pod 부터 시작
- 사용자 계정 확인
cat ~/.kube/config
- 서비스 계정 확인
kubectl get serviceaccount
kubectl get serviceaccount default -o yaml
kubectl describe secret default-token-xxxxx
- 네트워크
- 헬름 차트를 통한 쿠버네티스 패키지 설치
- wordpress 배포 예제
- mongodb 배포 예제