Index
- Docker
- Container Orchestration
- Provisioning
목표
쿠버네틱스에 대한 개념을 살펴봤습니다. 이번엔 직접 설치해서 어떻게 작동하는지 확인해 보겠습니다.
쿠버네티스 클러스터 중 가장 쉽게 접할 수 있는 건 Minikube 입니다. 하지만 Minikube 는 Master 하나로 이루어져 있어 부족한 점이 많습니다. 쿠버네티스의 다양한 기능을 살펴보려면 Master 노드와 Worker 노드 여러 개로 이루어진 실제 클러스터 환경을 구성할 필요가 있습니다.
쿠버네티스 클러스터를 구성하는 것이 간단한 일은 아닙니다. 그래서 개발자들이 처음 쿠버네티스 클러스터를 구성할 때 많은 어려움을 겪습니다. 하지만 쿠버네티스에서 제공하는 kubeadm이라는 툴을 이용하면 비교적 쉽게 설치할 수 있습니다.
앞써 쿠버네티스의 클러스터 구조를 확인했습니다.
Pod(Container)가 실행되는 Node와 Node를 제어하는 Master가 있습니다. Master 는 cpu가 최소 2core 이상이어야 합니다.
1. 준비하기
Master 1대와 Node 2대로 구성해서 설치 해보겠습니다. (테스트는 개인 GCP 를 사용했습니다.)
2. Install
2.1 사전작업
모든 설치 과정은 root 권한으로 진행합니다.
master
node-1
node-2
공통 작업입니다.
1 | sudo su - |
Swap 은 메모리가 부족하거나 절전 모드에서 디스크의 일부 공간을 메모리처럼 사용하는 기능입니다. Kubelet 이 정상 동작할 수 있도록 해당 기능을 swap 디바이스와 파일 모두 disable 합니다.
1
2
3swapoff -a # paging 과 swap 기능을 끕니다.
echo 0 > /proc/sys/vm/swappiness # 커널 속성을 변경해 swap을 disable 합니다.
sed -e '/swap/ s/^#*/#/' -i /etc/fstab # Swap을 하는 파일 시스템을 찾아 disable 합니다.각 노드의 통신을 원활하게 하기 위해 방화벽 기능을 해제합니다.
1
2systemctl disable firewalld
systemctl stop firewalldSELinux(Security-Enhanced Linux)는 리눅스 보안 모듈로 액세스 권한을 제어합니다. 쿠버네티스에서는 컨테이너가 호스트의 파일시스템에 접속할 수 있도록 해당 기능을 꺼야 합니다.
1
2setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/configRHEL 과 CentOS 7에서 iptables 관련 이슈가 있어서 커널 매개변수를 다음과 같이 수정하고 적용합니다.
1
2
3
4
5cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --systembr_netfilter 모듈이 활성화되어 있어야 합니다. modprobe br_netfilter 명령어로 해당 모듈을 명시적으로 추가하고, lsmod | grep br_netfilter 명령어로 추가 여부를 확인할 수 있습니다.
1
modprobe br_netfilter
컨테이너 실행 환경인 도커(Docker)를 설치하고 실행합니다. 쿠버네티스는 도커 외에도 여러가지 CRI(Container Runtime Interface) 구현체를 지원하기 때문에 도커에 종속적이지 않습니다
1
2
3
4
5yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl start docker.service
2.2 k8s 설치
Kubeadm은 Kubelet 과 Kubectl 을 설치하지 않기 때문에 직접 설치해야 합니다. 리파지토리를 추가하고 설치 및 실행합니다. Kubectl 은 클러스터에게 명령을 내리기 위한 CLI 유틸입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet설치 시 사용할 이미지를 먼저 다운로드 합니다.
master
에서만 진행합니다.1
kubeadm config images pull
master 초기화를 진행합니다.
1
kubeadm init
설치 완료시 다음과 같은 로그를 확인 할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.128.0.32:6443 --token l53w07.r3jv3r9z87dberca \
--discovery-token-ca-cert-hash sha256:03efcec987556feb1a7e2109e814fb4b74c5bc0ba47b20b8af8ce2c28dcd20ed해당 로그의 표시된 부분을 사용해야 하니 확인해주세요
여기서 일반 사용자가 kubectl 을 사용할 수 있도록 로그 중간에 있는 명령어를 복사해서 실행합니다
1
2
3mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config맨 마지막 라인의 명령어는 Node를 Master에 연결하는 명령어 입니다. 해당 명령어를 복사해서
node-1
node-2
에서 수행합니다.1
2kubeadm join 10.128.0.32:6443 --token l53w07.r3jv3r9z87dberca \
--discovery-token-ca-cert-hash sha256:03efcec987556feb1a7e2109e814fb4b74c5bc0ba47b20b8af8ce2c28dcd20ed
command를 복사해놓지 않고 지워진 경우에는 다음과 같이 token을 확인 할 수 있습니다.
1
kubeadm token list
해당 토큰은 24시간 동안만 사용할 수 있습니다. 새 토큰이 필요한 경우는 다음 명령어를 실행하면 됩니다.
1
kubeadm token create
2.3 Pod network add-on 설치
Pod 은 실제로 여러 노드에 걸쳐 배포되는데, Pod 끼리는 하나의 네트워크에 있는 것처럼 통신할 수 있습니다. 이를 오버레이 네트워크(Overlay Network)라고 합니다.
오버레이 네트워크를 지원하는 CNI(Container Network Interface) 플러그인을 설치해보겠습니다. CNI 에는 여러 종류가 있는데, 이번 실습에서는 Weave 를 이용합니다.
Master 노드에서 다음과 같이 설치합니다.
1
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
첨부파일 처런 각 node들의 상태가
NotReday
에서Reday
로 변경된 것을 확인 할 수 있습니다.
3. 설치 확인하기
- 쿠버네티스의 구성 요소가 모두 동작하는 것을 확인할 수 있습니다.
1
kubectl get componentstatuses
- 쿠버네티스의 구성 요소가 Pod 으로 어떤 노드에 떠있는지 확인할 수 있습니다.
- etcd, API server, Scheduler, Controller Manager, DNS Server 는 master 에서 실행됩니다.
- Kube proxy 와 Weave 는 각 worker 에서 실행됩니다.
1
kubectl get po -o custom-columns=POD:metadata.name,NODE:spec.nodeName --sort-by spec.nodeName -n kube-system