쿠버네티스는 기본적으로 마스터 노드와 워커 노드로 구성. 마스터 노드와 워커 노드는 최소한 1개씩 필요.
마스터 노드: 워커 노드에 Pod를 할당하고 Pod 안에 컨테이너를 띄우게 하는 역할. 쿠버네티스의 상태를 관리하고 여러 Pod 들의 스케줄링.
워커 노드: 마스터 노드와 통신하면서 Pod를 할당 받고 그 안에 컨테이너를 띄워 유지 및 관리하는 역할. 네트워크나 볼륨에 대한 기능도 컨트롤.
설치 환경
마스터 노드
OS : Ubuntu 18.04 LTS
CPU : 2 core
RAM : 2 GB
Storage : 20GB
워커 노드
OS : Ubuntu 18.04 LTS
CPU : 2 core
RAM : 1 GB
Storage : 20GB
설치 전 확인 사항
마스터 노드와 워커 노드 네트워크 연결 확인
swap 메모리 비활성화
$ swapoff -a $ vi /etc/fstab /swapfile 설정되어있는 구문 주석처리
Docker 설치 확인
Docker 데몬 드라이버설정 - kubernetes에서 권장하는 Docker 데몬의 드라이버는 systemd. kubernetes가 클러스터 노드에서 사용 가능한 자원을 쉽게 알 수 있도록 구성됨.
$ sudo cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF $ sudo mkdir -p /etc/systemd/system/docker.service.d $ sudo systemctl daemon-reload $ sudo systemctl restart docker
Kubernetes 설치
마스터, 워커 공동 설치
kubeadm : kubernetes 클러스터를 구축하기 위해 사용하는 툴.
kubelet : 클러스터의 모든 머신에서 실행되며 Pod 및 컨테이너 시작 등의 작업을 수행하는 구성 요소.
kubectl : 클러스터와 통신하는 커맨드라인 인터페이스 유틸.
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - $ cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list deb <https://apt.kubernetes.io/> kubernetes-xenial main EOF $ sudo apt-get update $ sudo apt-get install -y kubelet kubeadm kubectl # 패키지가 자동으로 설치, 업그레이드, 제거되지 않도록 hold함. $ sudo apt-mark hold kubelet kubeadm kubectl # 설치 완료 확인 $ kubeadm version $ kubelet --version $ kubectl version
마스터 노드 설정
—-pod-network-cidr
: Pod 네트워크를 설정할 때 사용--apiserver-advertise-address
: 특정 마스터 노드의 API Server 주소를 설정할 때 사용
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.146.133
Root 계정이 아닌 다른 사용자 계정에서 kubectl
커맨드 명령어를 사용하여 클러스터를 제어하도록 설정
$ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
Pod 네트워크 애드온(Flannel) 클러스터에 배포
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
마스터 노드 설정 확인 명령어
# 노드 확인 $ kubectl get nodes NAME STATUS ROLES AGE VERSION ubuntu Ready master 30s v1.18.6 # 노드 내의 kube-system 네임스페이스를 가진 컨테이너 확인(마스터 노드 관리 컨테이너) $ kubectl get pod --namespace=kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-66bff467f8-4kq4x 1/1 Running 2 30s 10.244.0.11 ubuntu <none> <none> coredns-66bff467f8-ndptp 1/1 Running 3 30s 10.244.0.10 ubuntu <none> <none> etcd-ubuntu 1/1 Running 47 30s 192.168.146.133 ubuntu <none> <none> kube-apiserver-ubuntu 1/1 Running 55 30s 192.168.146.133 ubuntu <none> <none> kube-controller-manager-ubuntu 0/1 CrashLoopBackOff 68 30s 192.168.146.133 ubuntu <none> <none> kube-flannel-ds-amd64-ss9g9 1/1 Running 2 30s 192.168.146.133 ubuntu <none> <none> kube-proxy-n6p7z 1/1 Running 2 30s 192.168.146.133 ubuntu <none> <none> kube-scheduler-ubuntu 1/1 Running 50 30s 192.168.146.133 ubuntu <none> <none>
워커 노드 설정
마스터 노드 결합 명령어
$ kubeadm join 192.168.146.133:6443 --token fnbiji.5wob1hu12wdtnmyr \ --discovery-token-ca-cert-hash sha256:701d4da5cbf67347595e0653b31a7f6625a130de72ad8881a108093afd06188b
마스터 노드의 IP:6443 (6443 포트는 kubernetes api server 프로세스의 기본 포트. 만약 마스터 노드의 api server 포트가 6443이 아니라면 해당 마스터 노드의 api server 포트 번호를 기입.)
--token
(기본적으로 24시간 뒤 만료)--discovery-token-ca-cert-hash
token 찾는 명령어
$ kubeadm token list
token 만료 시 생성 명령어
$ kubeadm token create
discovery-token-ca-cert-hash 찾는 명령어
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
마스터 노드에서 워커 노드 결합 확인
$ kubectl get nodes NAME STATUS ROLES AGE VERSION ubuntu Ready master 10m v1.18.6 ubuntu-kube-worker Ready <none> 30s v1.18.6
Kubernetes 배포 예제
구글에서 제공하는 Hello world 샘플 프로젝트를 kubectl create deployment
명령어로 배포하는 예제
$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
deployment 확인
$ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1/1 1 1 23s
pod 확인
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kubernetes-bootcamp-6f6656d949-vrsn5 1/1 Running 2 30s 10.244.1.4 ubuntu-kube-worker <none> <none>
워커 노드에서 curl
명령어를 통해 Pod 내부에 떠있는 컨테이너 확인
$ curl http://10.244.1.4:8080 Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6f6656d949-vrsn5 | v=1
Kubernetes 종료
쿠버네티스 클러스터를 삭제하는 방법
마스터 노드
$ kubectl drain {노드이름} --delete-local-data --force --ignore-daemonsets $ kubectl delete node {노드이름} $ kubeadm reset
워커 노드
$ kubeadm reset
Add Comment