본문 바로가기

Cloud Study/k8s

[k8s] Kubespray로 Kubernetes 설치하기

Kubespray는 쿠버네티스를 쉽게 설치하는 자동화 도구입니다. Ansible의 playbook과 inventory 설정을 통해서
Kubernetes 클러스터를 설정해 보고자 합니다.
Kubernetes는 최소 1개의 Mater Node와 1개의 Worker Node 1개가 필요합니다.

하지만, 1개의 Master Node와 3개의 Worker Node 클러스터로 구성해 보고자 합니다.

 

Requirements (요구 사항)


  • Ansible Playbook을 실행하려면 Jinja 2.9 이상이 필요합니다.
  • Docker 이미지를 가져 오려면 대상 서버가 인터넷에 액세스 할 수 있어야합니다.
  • 인벤토리의 모든 서버 부분에 SSH 키를 복사해야합니다.
  • 배포 중 문제를 방지하려면 방화벽을 비활성화해야합니다.

Configuration (구성)


Node HostName IP DNS
Master Node controller 192.168.122.10 8.8.8.8

Worker Node

node1 192.168.122.21 8.8.8.8
node2 192.168.122.22 8.8.8.8
node3 192.168.122.23 8.8.8.8

 

요구사항 해결하기


1. Ansible을 사용하기 위해 인벤토리의 모든 서버에 SSH 키를 복사해야합니다. Master Node에서 키를 생성하고
    각 노드에 복사해야합니다.

- Key 기반 인증을 사용할 수 있도록 SSH

 

ssh-keygen
... 기본값으로 설정하여 skygen을 생성합니다.

- Master Node와 Worker Node에 모두 키를 복사합니다.

 

ssh-copy-id 192.168.122.10
ssh-copy-id 192.168.122.21
ssh-copy-id 192.168.122.22
ssh-copy-id 192.168.122.23

 

2. 배포 중 문제를 방지하려면 방화벽을 비활성화하거나 정책에 맞게 설정해야합니다.

배포 중 문제를 방지하려면 방화벽을 비활성화해야합니다.

Control-node

TCP Inbound 6443* Kubernetes API server All
TCP Inbound 2379-2380 etcd server client API kube-apiserver, etcd
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 10251 kube-scheduler Self
TCP Inbound 10252 kube-controller-manager Self

Worker node

TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 30000-32767 NodePort Services† All

 

case 1) 방화벽을 끄는방법

sudo systemctl stop firewalled
sudo systemctl disabled firewalled

 

case 2) 노드의 정책에 맞는 포트를 추가 하는방법

참고 : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

 

 

Control-node

sudo firewall-cmd --add-port=6443/tcp --permanent 
sudo firewall-cmd --add-port=2379-2380/tcp --permanent 
sudo firewall-cmd --add-port=10250/tcp --permanent 
sudo firewall-cmd --add-port=10251/tcp --permanent 
sudo firewall-cmd --add-port=10252/tcp --permanent 
sudo firewall-cmd --reload  

 

 worker node 

sudo firewall-cmd --add-port=10250/tcp --permanent 
sudo firewall-cmd --add-port=30000-32767/tcp --permanent 
sudo firewall-cmd --reload 

 

3. 루트가 아닌 사용자 계정에서 kubespray를 실행하는 경우 대상 서버에서 올바른 권한방법을 구성해야합니다.

각 노드들에게 패스워드 없이 sudo를 사용하도록 설정해 줍니다.

echo 'kim ALL=NOPASSWD: ALL' >> /etc/sudoers

deployment (배포하기)


배포는 kubespray git 저장소 사이트를 참조해서 설치해 보겠습니다. 아래 패키지를 먼저 설치해 주세요. 참고: https://github.com/kubernetes-sigs/kubespray

 

kubernetes-sigs/kubespray

Deploy a Production Ready Kubernetes Cluster. Contribute to kubernetes-sigs/kubespray development by creating an account on GitHub.

github.com

0. 설치에 필요한 패키지들을 설치해 줍니다.

sudo yum install -y git 
sudo yum install -y python3

 

1. git clone 를 통해 코드를 가져옵니다.

git clone https://github.com/kubernetes-sigs/kubespray.git

2. requirements.txt 의 종속파일을 설치합니다.

sudo pip3 install -r requirements.txt

3. sample 파일을 mycluster 폴더에 복사하여 이용해 보겠습니다.

cp -rfp inventory/sample inventory/mycluster

4. inventory 파일을 통해 배포하기 위해 inventory/mycluster/inventory.ini 의 내용을 적절히 수정해 줍니다.

 

인벤토리 파일 작성

# inventory/mycluster/inventory.ini 
[all]
master ansible_host=192.168.122.10 ip=192.168.122.10 etcd_member_name=etcd1
node1 ansible_host=192.168.122.21  ip=192.168.122.21
node2 ansible_host=192.168.122.22  ip=192.168.122.22
node3 ansible_host=192.168.122.23  ip=192.168.122.23
# node4 ansible_host=95.54.0.15  # ip=10.3.0.4 etcd_member_name=etcd4
# node5 ansible_host=95.54.0.16  # ip=10.3.0.5 etcd_member_name=etcd5
# node6 ansible_host=95.54.0.17  # ip=10.3.0.6 etcd_member_name=etcd6

# ## configure a bastion host if your nodes are not directly reachable
# bastion ansible_host=x.x.x.x ansible_user=some_user

[kube-master]
master
# node1
# node2

[etcd]
master
# node2
# node3

[kube-node]
node1
node2
node3
# node4
# node5
# node6

[calico-rr]

[k8s-cluster:children]
kube-master
kube-node
calico-rr

 

5. ping 모듈을 통해서 노드간 통신이 이루어 지는지 확인합니다.

 ansible all -i inventory/mycluster/inventory.ini -m ping

 

6. cluster.yaml 파일을 통해 배포해 보겠습니다

ansible-playbook -i inventory/mycluster/inventory.ini -become --become-user=root cluster.yml 

 

배포 완료 후의 이미지

 

7. kubectl 명령어를 일반계정에서 사용하기 위해 config파일을 복사했습니다.

sudo cp -r /root/.kube ~/.kube
sudo chown -R $USER:$USER ~/.kube

kubectl 명령어를 통해 설치된 노드들을 확인할 수 있습니다.

$ kubectl get no
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   42h     v1.18.8
node1    Ready    <none>   6h8m    v1.18.8
node2    Ready    <none>   4h46m   v1.18.8
node3    Ready    <none>   4h46m   v1.18.8

 

참고자료


- https://kubernetes.io/docs/setup/production-environment/tools/kubespray/

- https://github.com/kubernetes-sigs/kubespray

- https://kubespray.io/

 

'Cloud Study > k8s' 카테고리의 다른 글

[K8S] 구성요소 및 API  (0) 2021.02.08