본문 바로가기

Kubernetes

Kubespray 쿠버네티스 클러스터 구성

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파일을 찾는 순서입니다.

  1. 전역 설정 파일: /etc/ansible/ansible.cfg
  2. 사용자 설정 파일: $HOME/.ansible.cfg 또는 $HOME/.ansible/ansible.cfg
  3. 현재 작업 디렉토리의 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파일이 존재하는 디렉토리로 이동해야 합니다.