kubernetes cluster, 구성해보자.

노지환·2021년 8월 24일
0
post-thumbnail

📖 읽는 방법

선 코드.

후 설명.

🖥 필요 자원

  • CPU : core 개수가 2개 이상이여야 함.
  • memory : 2GB 이상.
  • OS : Centos 7
tip - Centos가 ubuntu보다 설정이 편하다!(내 기준..)
	->이번 기회에는 ubuntu로 진행하고 싶지만, 내가 원하는대로 동작하지 않아서 Centos7을 선택했다.
tip2 - aws 프리티어에서는 kubernetes를 사용할 수 없다. 
	-> CPU 2개 이상을 선택하면 과금이 되기 때문. 따라서 kubernetes를 공부하고 싶다면, GCP를 이용하는 게 훨 낫다.

1️⃣ 쿠버네티스 설치 전, 사전 세팅

사용할 모든 노드(master, worker) 에 공통적으로 필요한 것들을 설치하고, 설정한다.

sudo su -

설치과정은 root 권한으로 진행된다!

swapoff -a
echo 0 > /proc/sys/vm/swappiness
sed -e '/swap/ s/^#*/#/' -i /etc/fstab
  • swapoff -a : paging과 swap의 기능을 끈다.
  • /proc/sys/vm/swappiness : 커널의 속성을 변경하여, swap을 disable한다.
  • /etc/fstab : Swap을 하는 모든 파일을 찾아서, disable로 설정한다.
systemctl disable firewalld
systemctl stop firewalld

각 노드와의 통신을 원활하게 하기 위하여 방화벽을 멈춘다.

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

쿠버네티스에서 컨테이너가 호스트의 파일시스템에 접근할 수 있도록 SELinux라는 기능을 끈다.

  • SELinux(Security-Enhanced Linux) : 리눅스의 보안 모듈, 엑세스 권한 제어.
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

RHEL 과 CentOS 7에서 iptables 관련 이슈가 있어, 커널 매개변수를 다음과 같이 적용한다.

  • RHEL : Red Hat Enterprise Linux(레드헷이 개발한 리눅스.)
modprobe br_netfilter

br_netfilter 모듈이 활성화되어 있어야 한다.
위의 명령어를 통해 해당 모듈을 명시적으로 추가.
lsmod | grep br_netfilter 명령어로 추가 여부를 확인 가능.

  • br_netfilter : Kubernetes 포드 간 통신을 위한 virtual LAN 트래픽을 사용하는데 필요한 모듈.
yum install docker -y
systemctl start docker.service

kubernetes의 컨테이너 실행환경 중 하나인 docker를 설치하고 실행한다.

  • docker만 가능한 것이 아닌, 다른 CRI를 사용해도 된다.
  • CRI : Container Runtime Interface
  • 하지만 docker가 쿠버네티스의 표준이 되었다. 사용하길 권장함.

2️⃣ 쿠버네티스 설치

쿠버네티스를 설치할 때 master노드와 worker노드의 설치과정이 조금 다르다. 어떤 노드든 공통 설치를 진행한 후에 노드에 맞는 설치를 진행해주면 되겠다. 이를 숙지하고 설치하기 바란다.

node 공통 설치

cat <<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

우리는 kubeadm을 설치한다. 하지만 이 친구는 kubectl과 kubelet을 설치하지 않기 때문에 따로 설치를 해줘야한다.

  • kubectl : 클러스터에 명령을 내리기 위한 CLI 도구.
  • kubeadm : 클러스터 생성을 위한 도구.
  • kubelet : 클러스터의 각 노드에서 실행되는 에이전트이다. 파드에서 컨테이너가 확실하게 동작하도록 관리.

master node 설치

kubeadm config images pull

설치 시 사용할 이미지 다운로드.

kubeadm init

마스터 노드를 초기화한다.

Your Kubernetes master 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/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 10.146.0.25:6443 --token yuaea3.d7m8hkpvazrbv5yw --discovery-token-ca-cert-hash sha256:c6a7121c5d5207179f67d913fa654441137f76027ad0f4e23724f0202b280eec

설치 후에는 이런식으로 로그를 출력한다.

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

여기서, 일반 사용자가 kubectl을 사용할 수 있도록 하게 해주는 명령어 라인이 있다. 이를 복사해서 실행해주자.

kubeadm join 10.146.0.25:6443 --token yuaea3.d7m8hkpvazrbv5yw --discovery-token-ca-cert-hash sha256:c6a7121c5d5207179f67d913fa654441137f76027ad0f4e23724f0202b280eec

맨 마지막 라인의 kubeadm join은 클러스터에 worker노드를 추가하는 명령어 라인이다. 복사해두자!

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

오버레이 네트워크 구성을 위하여 이를 지원하는 CNI 플러그인인, Weave를 다운로드 해주자.

  • CNI : Container Network Interface
  • 오버레이 네트워크 : Pod은 여러 노드에 배포가 된다. Pod끼리 하나의 네트워크처럼 통신할 수 있게 하는 것이 오버레이 네트워크 이다.

worker node 설치

kubeadm join 10.146.0.25:6443 --token yuaea3.d7m8hkpvazrbv5yw --discovery-token-ca-cert-hash sha256:c6a7121c5d5207179f67d913fa654441137f76027ad0f4e23724f0202b280eec

아까 저장해두었던 kubeadm join을 worker 노드에서 실행시켜주자.
그러면 클러스터 구성이 완성된다.

3️⃣ 설치 확인

설치가 잘 되었는지 확인해보자!

kubectl get no

쿠버네티스 클러스터에 있는 모든 노드들의 상태가 나온다.
NotReady인 경우는 노드가 켜질 때 까지 시간이 필요한 경우일 수도 있다.
어느정도 시간이 지난 후에 다시 상태를 확인해보자.

kubectl get componentstatuses

쿠버네티스의 모든 구성요소가 잘 동작하는지 확인하는 것이다.
STATUS가 Healthy하고, MESSAGE가 ok라고 뜨면 정상이다.

4️⃣ 클러스터 종료 후, 재시작할 때

systemctl start docker.service
systemctl enable kubelet && systemctl start kubelet

클라우드같은 경우는 클러스터를 종료할 때가 있다.
이럴 때는 docker와 쿠버네티스를 다시 시작해주면 된다.

profile
기초가 단단한 프로그래머 -ing

0개의 댓글