1. 개념 설명
1-1. Kubespray
- Kubespray는 Kubernetes 클러스터를 배포하고 관리하기 위한 오픈 소스 도구이다.
- Ansible의 playbook과 inventory 설정을 통해서 Kubernetes 클러스터를 설정한다.
- AWS, Azure, GCP, OpenStack, VMware 등 다양한 플랫폼을 지원한다.
- Ansible은 ssh를 사용하여 개별 노드에 접속 하지 않고 원격 설치 및 클러스터 구성이 가능하다.
1-2. Ansible
- 인프라 프로비저닝, 애플리케이션 배포 및 구성 관리 등을 위한 대표적인 IaC 도구이다.
- Ansible은 YAML 형식을 사용하여 Playbook이라고 불리는 구성 파일을 작성한다.
- Inventory: Ansible은 대상 호스트 그룹을 정의하기 위해 인벤토리 파일을 사용한다. 이 파일에는 호스트 IP 주소, 호스트 이름 및 사용자 계정과 같은 정보가 포함된다.
- Playbook: Ansible이 실행해야 하는 작업을 정의하는 YAML 파일이다.
- Ansible은 SSH 프로토콜을 사용하여 원격 시스템에 연결하여 작업을 수행한다.
2. 사전 구성
2-1. Azure에서 가상머신 생성
- OS: ubuntu 22.04 LTS - x64 Gen2
- SKU: Standard_D2s_v3 (2 vcpu, 8GiB memory)
2-2. master-1 가상머신 접속 후 ssh key 생성
- master-1에서 다른 서버에 ssh 접속이 가능하기 위해서 ssh key를 생성한다.
# ssh 공개키, 비밀키 생성
$ ssh-keygen -t rsa
# 생성된 키 목록 확인
$ ls -al .ssh/
# 생성한 공개키 내용 확인 후 클립보드에 복사
$ cat .ssh/id_rsa.pub
2-3. 가상머신에 ssh 공개키 등록
- 클립보드에 복사해둔 master-1의 SSH 공개키를 ssh-copy-id 명령어로 쿠버네티스 클러스터 서버에 복사한다.
- master-1, master-2, master-3, worker-1, worker-2 모두 동일하게 진행한다.
ssh-copy-id demouser@10.0.0.4
ssh-copy-id demouser@10.0.0.5
ssh-copy-id demouser@10.0.0.6
ssh-copy-id demouser@10.0.0.7
ssh-copy-id demouser@10.0.0.8
2-4. master-1에서 다른 가상머신으로 접속 테스트
$ ssh master-2
$ ssh master-3
$ ssh worker-1
$ ssh worker-2
3. Kubespray 구성
3-1. Kubespray 에 필요한 패키지 설치
- master-1에서 진행한다.
$ sudo apt update
$ sudo apt install python3-pip
$ pip3 --version
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
$ git clone https://github.com/kubernetes-sigs/kubespray.git
$ cd kubespray/
$ git checkout -b v2.24.1
Switched to a new branch 'v2.24.1'
$ git status
On branch v2.24.1
nothing to commit, working tree clean
# pip로 설치할 파이썬 패키지 정보 확인
$ cat requirements.txt
# Kubespray에서 필요한 패키지 설치
$ sudo pip install -r requirements.txt
# ansible 설치 확인
$ ansible --version
ansible [core 2.16.6]
config file = /home/demouser/kubespray/ansible.cfg
configured module search path = ['/home/demouser/kubespray/library']
ansible python module location = /usr/local/lib/python3.10/dist-packages/ansible
ansible collection location = /home/demouser/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible
python version = 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] (/usr/bin/python3)
jinja version = 3.1.3
libyaml = True
3-2. Kubespray 설정
- master-1에서 진행한다.
- inventroy/sample 디렉터리에 있는 기본 템플릿을 복사하여 활용한다.
- group_vars: 클러스터 설치에 필요한 설정 정보 (설치 환경 및 방법)
- inventory.ini: 쿠버네티스 클러스터로 구성할 서버들의 정보
$ cp -rfp inventory/sample inventory/k8scluster
$ ls inventory/k8scluster
group_vars inventory.ini patches
$ sudo apt install tree
$ tree inventory/k8scluster/group_vars/
inventory/k8scluster/group_vars/
├── all
│ ├── all.yml # 프록시 설정이 필요할 경우 http_proxy, https_proxy 필드 수정
│ ├── aws.yml
│ ├── azure.yml
│ ├── containerd.yml
│ ├── coreos.yml
│ ├── cri-o.yml
│ ├── docker.yml
│ ├── etcd.yml
│ ├── gcp.yml
│ ├── hcloud.yml
│ ├── huaweicloud.yml
│ ├── oci.yml
│ ├── offline.yml
│ ├── openstack.yml
│ ├── upcloud.yml
│ └── vsphere.yml
├── etcd.yml
└── k8s_cluster
├── addons.yml
├── k8s-cluster.yml # IP 대역 수정이 필요한 경우 kube_service_addresses, kube_pods_subnet 필드 수정
├── k8s-net-calico.yml
├── k8s-net-cilium.yml
├── k8s-net-custom-cni.yml
├── k8s-net-flannel.yml
├── k8s-net-kube-ovn.yml
├── k8s-net-kube-router.yml
├── k8s-net-macvlan.yml
└── k8s-net-weave.yml
- inventory.ini 파일에서 쿠버네티스 클러스터로 구성할 서버들의 정보를 설정한다.
~/kubespray/inventory/k8scluster$ vi inventory.ini
# 앤서블에서 접근할 서버의 IP로 변경
[all]
master-1 ansible_host=10.0.0.4 ip=10.0.0.4 etcd_member_name=etcd1
master-2 ansible_host=10.0.0.5 ip=10.0.0.5 etcd_member_name=etcd2
master-3 ansible_host=10.0.0.6 ip=10.0.0.6 etcd_member_name=etcd3
worker-1 ansible_host=10.0.0.7 ip=10.0.0.7
worker-2 ansible_host=10.0.0.8 ip=10.0.0.8
# 마스터 노드로 사용할 서버의 호스트네임
[kube_control_plane]
master-1
master-2
master-3
# etcd를 설치할 서버의 호스트네임
[etcd]
master-1
master-2
master-3
# 워커 노드로 사용할 서버의 호스트네임
[kube_node]
worker-1
worker-2
[calico_rr]
[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr
4. 쿠버네티스 클러스터 구성
4-1. cluster.yml 스크립트 파일 실행
- 하기 명령어로 cluster.yml 스크립트 파일을 실행한다. (20분 이상 소요된다.)
- 클러스터 구성 대상은 inventory.ini의 설정에 따른다.
# master-1에서 inventory.ini에 등록한 서버에 접근이 가능한지 테스트
~/kubespray$ ansible all -i inventory/k8scluster/inventory.ini -m ping
# Ansible Playbook으로 쿠버네티스 클러스터 구성
~/kubespray$ ansible-playbook -i inventory/k8scluster/inventory.ini -v --become --become-user=root cluster.yml
4-2. 쿠버네티스 클러스터 구성 확인
- 클러스터 구성 완료 후 마스터 노드에서 root 계정으로 kubectl 명령어를 사용할 수 있다.
- 모든 노드의 STATUS가 Ready인 것을 확인한다.
demouser@master-1:~/kubespray$ sudo -i
root@master-1:~# kubectl get node
NAME STATUS ROLES AGE VERSION
master-1 Ready control-plane 7m10s v1.29.3
master-2 Ready control-plane 6m38s v1.29.3
master-3 Ready control-plane 6m17s v1.29.3
worker-1 Ready <none> 5m30s v1.29.3
worker-2 Ready <none> 5m32s v1.29.3
demouser@master-1:/etc/systemd/system$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-68485cbf9c-qqmfh 1/1 Running 0 46m
kube-system calico-node-5q57n 1/1 Running 0 46m
kube-system calico-node-nx45d 1/1 Running 0 46m
kube-system calico-node-tn574 1/1 Running 0 46m
kube-system calico-node-v99ls 1/1 Running 0 46m
kube-system calico-node-wbq7b 1/1 Running 0 46m
kube-system coredns-69db55dd76-468dz 1/1 Running 0 45m
kube-system coredns-69db55dd76-f87vr 1/1 Running 0 45m
kube-system dns-autoscaler-6f4b597d8c-cdp5r 1/1 Running 0 45m
kube-system kube-apiserver-master-1 1/1 Running 1 49m
kube-system kube-apiserver-master-2 1/1 Running 1 48m
kube-system kube-apiserver-master-3 1/1 Running 1 48m
kube-system kube-controller-manager-master-1 1/1 Running 2 49m
kube-system kube-controller-manager-master-2 1/1 Running 2 48m
kube-system kube-controller-manager-master-3 1/1 Running 2 48m
kube-system kube-proxy-47vmw 1/1 Running 0 47m
kube-system kube-proxy-8tnvw 1/1 Running 0 47m
kube-system kube-proxy-d76zk 1/1 Running 0 47m
kube-system kube-proxy-j5l7k 1/1 Running 0 47m
kube-system kube-proxy-nj89c 1/1 Running 0 47m
kube-system kube-scheduler-master-1 1/1 Running 1 49m
kube-system kube-scheduler-master-2 1/1 Running 1 48m
kube-system kube-scheduler-master-3 1/1 Running 1 48m
kube-system nginx-proxy-worker-1 1/1 Running 0 47m
kube-system nginx-proxy-worker-2 1/1 Running 0 47m
kube-system nodelocaldns-4gb9n 1/1 Running 0 45m
kube-system nodelocaldns-4sv8f 1/1 Running 0 45m
kube-system nodelocaldns-hdcwq 1/1 Running 0 45m
kube-system nodelocaldns-wbmjb 1/1 Running 0 45m
kube-system nodelocaldns-wglz5 1/1 Running 0 45m
4-3. (번외) etcd pod가 없는 이유
- kubespray를 사용하여 k8s를 설치한 경우 etcd는 pod 형태가 아닌 systemd로 실행된다.
참고
'Container > Kubernetes' 카테고리의 다른 글
[Kubernetes] Secret 생성 및 조회 (0) | 2024.05.08 |
---|---|
[Kubernetes] ConfigMap, Secret, Azure Keyvault (0) | 2024.05.07 |
[Kubernetes] ELK Stack 개념 (0) | 2024.04.29 |
[Kubernetes] Probe - Liveness, Readiness, Startup (0) | 2024.04.08 |
[Kubernetes] Istio 설치 및 BookInfo 예제 (0) | 2024.04.04 |