Kubespray
Kubespray - ansible을 활용하여 쿠버네티스 클러스터를 직접 구축해보겠습니다.
시스템 정보
- OS : Ubuntu 22.04 LTS
- Kubernetes v1.27.5
- Master Node 3개
- Worker Node 1개
- Kubespray release-2.23
- node : GCP Instance
요구 사항
- 기본적으로 'ubuntu' 계정 접속을 전제로 작성하였습니다.
- 방화벽의 포트 허용은 다음과 같이 진행합니다.
- tcp:22
- tcp:2379-2380
- tcp:6443
- tcp:10250-15202
- tcp:30000-32767
1. SSH 대칭키 생성 및 등록
Master node에서 다른 worker node에 접속하기 위한 ssh 키페어를 발급합니다.
ssh-keygen -t rsa -b 4096
해당 명령어를 통해 생성되는 ssh 키 페어의 경로는 다음과 같습니다.
/home/ubuntu/.ssh/id_rsa
/home/ubuntu/.ssh/id_rsa.pub
다음 작업은 Master Node을 포함한 모든 Node에서 수행합니다.
해당 명령어 수행 후, 내용을 복사
cat ~/.ssh/id_rsa.pub
모든 노드(Master Node 포함)에서 복사한 내용을 추가합니다.
vi ~/.ssh/authorized_keys
2. Kubespray 설치
sudo를 사용하여 파일이나 폴더 생성을 하면 권한이 root가 되므로 "permission denied error"가 발생할 수 있습니다.
# 커맨드 간소화를 위한 환경변수 설정
export CLUSTER_WORKSPACE=/home/ubuntu/workspace
# 작업공간 생성
mkdir -p ${CLUSTER_WORKSPACE}
# Kubespray 설치
git clone https://github.com/kubernetes-sigs/kubespray.git -b v2.23.0 ${CLUSTER_WORKSPACE}/kubespray
Kubespray 동작에 필요한 패키지들을 설치합니다.
sudo apt update
sudo apt install -y python3-pip
# pip3를 이용하여 자동적으로 의존성을 고려한 패키지 설치를 진행한다.
pip3 install -r ${CLUSTER_WORKSPACE}/kubespray/requirements.txt
# 실제 작업을 진행할 작업공간으로 필요한 파일들을 복사한다.
cp -r ${CLUSTER_WORKSPACE}/kubespray/inventory/sample ${CLUSTER_WORKSPACE}/kubespray/inventory/cluster
3. 클러스터 구축을 위한 Kubespray inventory.ini 설정
사용자는 클러스터 변경 사항에 따른 Kubespray inventory.ini 파일 프로비저닝을 진행해야 합니다.
클러스터 구성 정보
- Master Node 3개
- Worker Node 1개
위치 : ${CLUSTER_WORKSPACE}/kubespray/inventory/cluster/inventory.ini
# ## 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 is not a etcd member do not need to set the value, or can set the empty string value.
[all]
node1 ansible_host=${public IP} ip=${private IP} etcd_member_name=etcd1
node2 ansible_host=${public IP} ip=${private IP} etcd_member_name=etcd2
node3 ansible_host=${public IP} ip=${private IP} etcd_member_name=etcd3
node4 ansible_host=${public IP} ip=${private IP}
# ## configure a bastion host if your nodes are not directly reachable
# [bastion]
# bastion ansible_host=x.x.x.x ansible_user=some_user
[kube_control_plane]
node1
node2
node3
[etcd]
node1
node2
node3
[kube_node]
node4
[calico_rr]
[all:vars]
# inventory.ini 파일 수정 혹은 ${CLUSTER_WORKSPACE}/kubespray/inventory/cluster/group_vars/all/all.yml 파일에 해당 내용을 추가합니다.
ansible_user=ubuntu
ansible_ssh_private_key_file=/home/ubuntu/.ssh/id_rsa
[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr
- [kube_control_plane]과 [kube_node] 그룹은 기본적으로 독립적입니다.
- 부득이하게 마스터 노드가 컨테이너 워크로드를 수행하는 것이 필요한 경우에는 kube_node그룹에 추가할 수도 있습니다.
추가 설명
- kube_control_plane 에는 기본적으로 pod가 배치되지 않으며, 마스터노드(kube_control_plane)의 안정성을 유지하기 위함의 목적이 있습니다.
- [kube_node] 그룹에 [kube_control_plane]의 요소(마스터노드)가 배치되는 경우에는 마스터 노드에 컨테이너 워크로드를 스케줄링 하기 때문에, 마스터 노드의 안정성이 떨어지게 됩니다.
- 부득이하게 마스터 노드가 컨테이너 워크로드를 수행하는 것이 필요한 경우에는 kube_node그룹에 추가할 수 있습니다.
- ansible은 이러한 설정 (taint)를 자동으로 설정하고 제거해주는 작업을 합니다.
다음은 ${CLUSTER_WORKSPACE}/kubespray/inventory/cluster/group_vars/all/all.yml 파일에 ssh private key를 등록하는 명령어 입니다.
echo -e "\nansible_user: ubuntu\nansible_ssh_private_key_file: /home/ubuntu/.ssh/id_rsa" >> ${CLUSTER_WORKSPACE}/kubespray/inventory/cluster/group_vars/all/all.yml
4. Kubespray를 이용한 클러스터 구축
원활한 설치를 위해 root 권한으로 명령어를 실행시킵니다.
inventory.ini를 통해 hosts.yaml을 생성하는 과정에서 hosts.yaml이 제대로 생성되지 않아, inventory.ini를 이용하여 바로 클러스터 구축을 진행하겠습니다.
ansible-playbook -i ${CLUSTER_WORKSPACE}/kubespray/inventory/cluster/inventory.ini --become --become-user=root ${CLUSTER_WORKSPACE}/kubespray/cluster.yml
다음과 같은 오류가 발생하면 ansible-core version을 변경합니다.
fatal: [node1]: FAILED! => {"msg": "The conditional check 'groups.get('kube_control_plane')' failed. The error was: Conditional is marked as unsafe, and cannot be evaluated."}
solution
pip3 install ansible-core==2.14.11
이후, ansible-playbook 명령어에 --flush-cache 옵션을 추가하여 다시 실행합니다.
클러스터 구축 후에 worker node에 Role이 부여되지 않았으면 다음 명령어로 역할을 부여할 수 있습니다.
kubectl label node ${Node NAME} node-role.kubernetes.io/worker=
5. 클러스터 구축 후 노드 변경사항 적용하기
kubespray를 이용하여 클러스터를 구축한 후에 노드에 변경사항이 생겼을 경우, 오래된 쿠버네티스 클러스터를 제거 후, 다시 배포합니다.
1. 기존 클러스터 제거
ansible-playbook -i ${CLUSTER_WORKSPACE}/kubespray/inventory/cluster/inventory.ini --become --become-user=root reset.yml
2. inventory.ini 파일 수정
3. ansible-playbook으로 클러스터 배포
ansible-playbook -i ${CLUSTER_WORKSPACE}/kubespray/inventory/cluster/inventory.ini --become --become-user=root ${CLUSTER_WORKSPACE}/kubespray/cluster.yml
Troubleshooting
pip3로 ansible을 설치한 경우에는 ansible.cfg파일은 kubespray/ 에 위치하게 됩니다.
다음은 시스템에서 ansible.cfg파일을 찾는 순서입니다.
- 전역 설정 파일: /etc/ansible/ansible.cfg
- 사용자 설정 파일: $HOME/.ansible.cfg 또는 $HOME/.ansible/ansible.cfg
- 현재 작업 디렉토리의 ansible.cfg: ./ansible.cfg
pip3로 ansible을 설치한 경우에는 cfg파일은 1,2 에 생성되지 않고,
workspace/kubespray에 기본적으로 ansible.cfg 파일이 존재합니다.
다음과 같은 에러상황에서 활용할 수 있습니다.
ERROR! the role 'kubespray-defaults' was not found in /home/ubuntu/workspace/kubespray/playbooks/roles:/home/ubuntu/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles:/home/ubuntu/workspace/kubespray/playbooks
The error appears to be in '/home/ubuntu/workspace/kubespray/playbooks/cluster.yml': line 13, column 7, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
roles:
- { role: kubespray-defaults }
^ here
원인
ansible.cfg 파일을 찾을 수 없습니다.
해결법
클러스터링을 위한 ansible-playbook을 실행하기 전에 ansible.cfg파일이 존재하는 디렉토리로 이동해야 합니다.
'Kubernetes' 카테고리의 다른 글
쿠버네티스 + wsl2 (하지마세요...) (1) | 2024.08.25 |
---|---|
EFK 구축 후기 - 2편 (1) | 2024.03.12 |
EFK 구축 후기 - 1편 (0) | 2024.03.11 |
헷갈리는 Grafana Alert 설정 옵션 정리 (0) | 2024.03.03 |
Airflow DAG와 Kubeflow Pipeline에 대한 오해(kfp pipeline 파헤쳐보기) (2) | 2024.02.11 |