Ubuntu 18.04 에서 Kubernetes 설치하기
우분투 서버에 Kubernetes 클러스터를 구성합니다. 클러스터는 1개의 마스터 노드와 1개의 워커 노드로 구성합니다.
실제 운영을 위한 Kubernetes 는 AWS
또는 GCP
에서 구축해 놓은 서비스를 이용하는 것이 바람직합니다. 아래의 내용은 Kubernetes 를 실제로 구축해 보면서 어떻게 작동하는지를 확인하기 위한 용도로만 이용하시기 바랍니다.
마스터 노드의 최소 스펙은 아래와 같습니다.
CPU : 2 core
RAM : 3 GB
워커 노드의 최소 스펙은 아래와 같습니다.
CPU : 2 core
RAM : 2 GB
사전준비
아래의 내용들이 준비되어 있어야 합니다.
체크 리스트
-
CPU 2개 이상
각 노드는 2개 이상의 CPU (코어) 가 있어야 합니다.
-
스왑 메모리 비활성화
Kubernetes 는 Swap Memory 를 고려하지 않고 개발되었습니다. Swap Memory 가 활성화되어 있으면 여러 문제가 발생할 수 있습니다.
-
각 노드간 원활한 네트워크
방화벽 등 각 노드간의 네트워크를 방해하는것을 제거하는 것이 좋습니다.
-
Docker 설치
도커는 최신 버전이 아니라, Kubernetes 에서 권장하는 버전을 설치합니다.
컨테이너 런타임 설치
컨테이너 런타임(사실상 Docker) 를 설치합니다.
sudo apt update
sudo apt-get update
# Docker CE 설치
## 리포지터리 설정
### apt가 HTTPS 리포지터리를 사용할 수 있도록 해주는 패키지 설치
sudo apt-get install -y \
apt-transport-https ca-certificates curl software-properties-common gnupg2
### Docker의 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
### Docker apt 리포지터리 추가.
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
## Docker CE 설치.
sudo apt-get update && sudo apt-get install -y \
containerd.io=1.2.13-1 \
docker-ce=5:19.03.8~3-0~ubuntu-$(lsb_release -cs) \
docker-ce-cli=5:19.03.8~3-0~ubuntu-$(lsb_release -cs)
# 데몬 설정.
sudo su -
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
exit
sudo mkdir -p /etc/systemd/system/docker.service.d
# Docker 재시작.
sudo systemctl daemon-reload
sudo systemctl restart docker
마스터 노드, 워커 노드 공통사항
sudo apt-get update
sudo apt-get upgrade
kubeadm
, kubelet
, kubectl
을 설치합니다.
sudo apt-get install -y apt-transport-https curl
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
# 자동업데이트 방지
sudo apt-mark hold kubelet kubeadm kubectl
kubeadm version
kubelet --version
kubectl version
마스터 노드
kubeadm init
ifconfig
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=<EC2 인스턴스 내부아이피>
1 ~ 5 분의 시간이 소요됩니다.
kubectl
을 root
계정없이 실행하려면 아래 명령을 실행합니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
부연 설명을 하면, admin.conf
이 인증서 파일이고 이 인증서로 kubernetes 에 권한을 부여받아 실행이 가능하게 됩니다.
kubeadm help
kubeadm reset
은 꼭 알아놓도록 합시다.
네트워크 애드온 설치
네트워크 애드온에는 여러가지가 있지만, 여기서는 Flannel 을 설치합니다.
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
설치상태 확인
kubectl get nodes
kubectl get pod --namespace=kube-system -o wide
워커 노드
인증키 확인 및 관리
마스터 노드 접근을 위해서는 토큰이 필요합니다.
kubeadm init
실행시 토큰이 자동으로 발급되어 있습니다.
토큰은 아래 명령으로 확인 가능합니다.
kubeadm token list
디스커버리 토큰은 아래 명령으로 확인 가능합니다.
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
토큰은 24시간의 유효기간 후 만료됩니다. 아래 명령을 이용해 토큰을 추가로 생성할 수 있습니다.
kubeadm token create
보안그룹 설정
AWS
또는 클라우드 제공업체를 이용하는 경우 보안그룹을 설정해 주어야 합니다.
아래는 AWS
를 이용하는 경우의 보안그룹 설정입니다.
allow-kubernetes
라는 이름의 보안그룹을 생성합니다.
다음은 protect-kubernetes
라는 이름의 보안그룹을 생성하고, 모든 inbound tcp 트래픽의 소스가 allow-kubernetes
인 경우 허용하도록 설정합니다.
allow-kubernetes
, protect-kubernetes
를 모든 노드에 할당해 줍니다.
워커 노드 생성
위에 마스터 노드에서 했던 명령중 kubeadm init
이전까지의 명령을 동일하게 진행합니다.
sudo kubeadm join <마스터노드 프라이빗 아이피>:6443 \
--token <토큰> \
--discovery-token-ca-cert-hash sha256:<디스커버리 토큰>
마스터 노드에서 아래명령을 실행하여 노드가 접속된것을 확인할 수 있습니다.
kubectl get nodes
Hello, World! 배포하기
구글이 만들어 놓은 Hello, World!
이미지를 이용해 배포를 합니다.
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
아래 명령으로 배포되었는지 확인할 수 있습니다.
kubectl get deployments
포드가 할당되었는지 아래 명령으로 확인할 수 있습니다. 할당받은 아이피를 확인하시기 바랍니다. 10.244.X.X
형태로 할당됩니다.
kubectl get pods -o wide
워커 노드에서 아래 명령을 실행하면 배포가 정상적으로 된것을 확인할 수 있습니다.
curl http://<할당받은 아이피>:8080