쿠버네티스
블로그 불러오는 중...
쿠버네티스
처음 Kubernetes를 학습할 때 kubeadm을 이용하여 설치했으나, Kubespray를 알게 되어 직접 설치를 진행해 보았다.
Kubespray는 Ansible을 기반으로 Kubernetes 클러스터를 자동화하여 설치할 수 있도록 도와주는 도구로, kubeadm보다 더 유연하고 다양한 커스텀 설정이 가능하다. 원하는 수준까지 커스터 마이징하려면 기반 지식과 코드 레벨의 이해가 필요하지만, 개인적인 실습 환경에서는 큰 문제가 되지 않으므로 설치를 진행하였다.
Kubespray 공식 GitHub 링크: Kubespray GitHub
kubeadm join 명령어를 사용하여 클러스터에 추가.inventory.ini 파일을 수정하여 노드를 정의하고 해당 정보에 따라 자동으로 설치해 준다.자세한 차이점은 다른 링크들도 보이면 추가해 보겠다.
Kubespray는 SSH를 통해 각 노드에 접속하여 설치를 진행하므로, 먼저 SSH 연결이 password 없이 되게 끔 셋팅을 해 주었다.
이를 위해 설치를 실행하는 서버의 공개키(Public Key)를 각 노드의 authorized_keys 파일에 추가해야 한다.
해당 공개키는 다음으로 확인이 가능하다.
cat ~/.ssh/id_rsa.pub 공개키가 없을 시에는 공개키를 생성한다.
ssh-keygen -t rsa -b 4096
공개키 생성시 홈폴더 내의 .ssh/id_rsa.pub 에 저장이 된다.
해당 공개키를 각 노드가 될 컴퓨터들의 root 계정으로 진행하였기 때문에, /root/.ssh/authorized_keys 를 생성 하거나 수정해서 추가해 준다.
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCgbPWnKSqJ8f+6fs9TDO3hEHUuOA6jvC3N2WXxxSzqXmYScTZo16atS78Uto7iCJfv2GAhBTf4ZrD9aYxfYqgCqkQVlJ32qB729f5xUKQxkhrhRLPkfVMQCTkXHXiDYZNtWfMHp9atJ6Wybn96Ek7
XUCzk+MnYfv2GAhBTf4ZrD9aYxfYqgCqkQVlJ325l9806SW6pQzHK7FwhFb0h5Q+Wr5Ad706jQ3lvwh0U0MjELFUpK7iaEOD3s+oTkbH6/YrkRGg3FAQRuMLeNTaNeXqohbtb6D+WaVAkh47h6i7V3gFNeSBcmKJENQmG2YsD0OHXq1m8fD
xX/RBn61Kfv2GAhBTf4ZrD9aYxfYqgCqkQVlJ32fv2GAhBTf4ZrD9aYxfYqgCqkQVlJ32msBbKx5pjOkOu+pfv2GAhBTf4ZrD9aYxfYqgCqkQVlJ32Hwn95QZfIyssUHFL9C3bya9uWsEB79Af+ADpTqWwZ+YqoNMVxvjfDCAJ43pCpIEwC
qegrZUiZh3RR/w5Xf464At0r8i5GK7fE= admin@test.com나의 경우엔 서버가 5개라서, 다음과 같이 5개의 node에 public key 를 셋팅해 주었다.
또한 /etc/hosts 를 수정하여 ip 가 아닌 이름으로 들어갈 수 있게 했다.
그리고 모든 노드의 방화벽을 해제했다
sudo systemctl stop firewalld
sudo systemctl disable firewalld

Kubespray는 Ansible 기반으로 동작하기 때문에 Python이 필요하다.
나는 이미 서버에 파이썬이 깔려 있어 따로 설치는 하지 않았지만, 하기 명령어로 설치가 가능하다
sudo apt install -y python3-pipKubespray를 GitHub에서 클론한 후 필요한 의존성을 설치한다.
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
git checkout v2.28.0파이썬 가상화 환경을 생성하고 의존성을 다운 받는다
아래 명령어 실행 시 프로그램이 없다고 할 때 에러 내용을 보고 패키지를 다운 받아 준다
나의 경우엔 pip3-venv 인가 를 설치해 주었다.
VENVDIR=kubespray-venv
KUBESPRAYDIR=kubespray
python3 -m venv $VENVDIR
source $VENVDIR/bin/activate
cd $KUBESPRAYDIR
pip install -U -r requirements.txtinventory.ini 파일을 수정하자. 현재 v2.27.0, v2.28.0 tag 기준으로 inventory/sample 폴더 내에 있다.
etcd 의 경우 3개의 node 에 HA(High Availability)를 위해 3개 노드에 설치하였다.
# This inventory describe a HA typology with stacked etcd (== same nodes as control plane)
# and 3 worker nodes
# See https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html
# for tips on building your # inventory
# Configure 'ip' variable to bind kubernetes services on a different ip than the default iface
# We should set etcd_member_name for etcd cluster. The node that are not etcd members do not need to set the value,
# or can set the empty string value.
[kube_control_plane]
master1 ansible_host=master1 ip=192.168.1.100 ansible_user=root etcd_member_name=master1
master2 ansible_host=master2 ip=192.168.1.101 ansible_user=root etcd_member_name=master2
master3 ansible_host=master3 ip=192.168.1.102 ansible_user=root etcd_member_name=master3
[etcd:children]
kube_control_plane
[kube_node]
worker1 ansible_host=192.168.1.120 ip=192.168.1.120 ansible_user=root
worker2 ansible_host=192.168.1.121 ip=192.168.1.121 ansible_user=root
worker3 ansible_host=192.168.1.122 ip=192.168.1.122 ansible_user=root추가로 현재 내가 설치하는 노드는 On-Premise 기 때문에, Loadbalancer Type 을 사용하기 위해 MetalLB를 설치해야 한다.
추가로 kubernetes 에서 자주 쓰이는 MetalLB, nginx Ingress Controller, CertManager 도 지원한다고 하며. 이를 위해 inventory/sample/group_vars/addon.yml 파일을 수정하였다.
inventory/sample/group_vars/k8s_cluster/addon.yml 파일을 수정한다.
# Helm deployment
helm_enabled: true
,,,
# Nginx ingress controller deployment
ingress_nginx_enabled: true
ingress_nginx_host_network: false
ingress_nginx_namespace: "ingress-nginx"
ingress_nginx_insecure_port: 80
ingress_nginx_secure_port: 443
...
# 인증서 설정을 위한 CertManager 설정
cert_manager_enabled: true
cert_manager_namespace: "cert-manager"
cert_manager_tolerations:
- key: node-role.kubernetes.io/control-plane
effect: NoSchedule
...
# MetalLB deployment
metallb_enabled: true
metallb_protocol: "layer2"
metallb_config:
address_pools:
primary:
ip_range:
- 192.168.1.210-192.168.1.240
auto_assign: true
layer2:
- primarymetalLB 를 사용하기 위해선, 다음과 같이 설정을 변경해야 한다. 또한, Kubernetes API 서버를 외부에서 도메인으로 접근하기 위해 inventory/sample/group_vars/k8s-cluster.yml 파일 두 군데를 다음과 같이 수정하였다.
inventory/sample/group_vars/k8s_cluster/k8s-cluster.yml
# must be set to true for MetalLB, kube-vip(ARP enabled) to work
kube_proxy_strict_arp: true
...
## Supplementary addresses that can be added in kubernetes ssl keys.
## That can be useful for example to setup a keepalived virtual IP
## 외부 도메인으로 kube api 서버를 접근하려면 하기 형태로 도메인을 추가한다.
supplementary_addresses_in_ssl_keys: ['sample.dev']해당 node 설정을 끝마치고, 다음과 같은 명령어를 통해, cluster 설치를 한다.
ansible-playbook -i inventory/sample/inventory.ini cluster.yml -b -v진행 상황을 자세히 확인하려면 -v 대신 -vvv 옵션을 사용할 수 있으며, 로그를 파일로 저장하고 싶다면 &> spray.log를 추가하면 된다.
설치가 완료되면 요약 화면이 출력되며, Kubernetes 클러스터가 정상적으로 구축되었음을 확인할 수 있다.
아래는 설치 진행 중인 화면이다.

다음과 같은 화면으로 약 20~30분간 진행이 된다.
다 설치가 되면, 다음과 같은 요약 화면이 나오게 된다.

혹시 설치 시에 실패 하거나, 기존에 설치를 초기화 하고 다시 진행하고 싶으시면
ansible-playbook -i inventory/sample/inventory.ini reset.yml -b -v명령어를 입력하여 초기화 해 주도록 한다.
궁금한 사항이 있으면 댓글에 남겨주시면, 해당 내용 게시글에 추가하여 반영하도록 하겠다.