[kubernetes] kubespray 로 쿠버네티스 설치

728x90

Kubespray 로 쿠버네티스 설치하기

프로덕션 레벨에서 배포 가능한 쿠버네티스이다.

ansible 플레이북을 사용해서 쉽게 관리할 수 있다.

Kubespray 공식 문서: https://kubespray.io/#/

Kubespray 깃허브: https://github.com/kubernetes-sigs/kubespray

Kubernetes 공식 문서: https://kubernetes.io/ko/docs/setup/production-environment/tools/kubespray/

(1/5) 아래의 요건 충족하기

언더레이(underlay) 요건을 만족하는 프로비전 한다.

  • Ansible의 명령어를 실행하기 위해 Ansible v 2.9와 Python netaddr 라이브러리가 머신에 설치되어 있어야 한다
  • Ansible 플레이북을 실행하기 위해 2.11 (혹은 그 이상) 버전의 Jinja가 필요하다
  • 타겟 서버들은 docker 이미지를 풀(pull) 하기 위해 반드시 인터넷에 접속할 수 있어야 한다. 아니라면, 추가적인 설정을 해야 한다 (오프라인 환경 확인하기)
  • 타겟 서버들의 IPv4 포워딩이 활성화되어야 한다
  • SSH 키가 인벤토리의 모든 서버들에 복사되어야 한다
  • 방화벽은 kubespray에 의해 관리되지 않는다. 사용자는 필요에 따라 적절한 규칙을 구현해야 한다. 디플로이먼트 과정에서의 문제를 방지하려면 방화벽을 비활성화해야 한다
  • 만약 kubespray가 루트가 아닌 사용자 계정에서 실행되었다면, 타겟 서버에서 알맞은 권한 확대 방법이 설정되어야 하며, ansible_become 플래그나 커맨드 파라미터들, -become 또는 b 가 명시되어야 한다

Kubespray는 환경에 맞는 프로비저닝을 돕기 위해 아래와 같은 서비스를 제공한다:

  • 아래 클라우드 제공 업체를 위한 Terraform 스크립트:
    • AWS
    • OpenStack
    • Packet

(2/5) 인벤토리 파일 구성하기

서버들을 프로비저닝 한 후, Ansible의 인벤토리 파일을 만들어야 한다. 수동으로 만들 수도 있고, 동적인 인벤토리 스크립트를 통해 만들 수도 있다. 더 많이 알고싶다면 " 나만의 인벤토리 만들기" 글을 확인하자.

(3/5) 클러스터 디플로이먼트 계획하기

Kubespray에서는 디플로이먼트의 많은 속성들을 사용자가 정의(customize)할 수 있다:

  • 디플로이먼트 모드의 선택: kubeadm 또는 그 외
  • CNI(네트워킹) 플러그인
  • DNS 설정
  • 컨트롤 플레인 선택: 네이티브/바이너리 또는 컨테이너화 된 것
  • 컴포넌트 버전
  • Calico 라우터 리플렉터
  • 컴포넌트 런타임 옵션
    • 도커(Docker)
    • containerd
    • CRI-O
  • 인증서 생성 방법

Kubespray의 변수 파일들을 사용자가 정의할 수 있다. 만약 Kubespray를 처음 접하는 경우, kubespray의 기본 설정값을 이용해 클러스터를 배포하고 Kubernetes를 탐색하는 것이 좋다.

(4/5) 클러스터 배포하기

다음으로, 클러스터를 배포한다.

Ansible-플레이북을 이용한 클러스터 디플로이먼트

ansible-playbook -i your/inventory/inventory.ini cluster.yml -b -v **\\**
  --private-key=~/.ssh/private_key

규모가 큰 디플로이먼트는 (100개 이상의 노드) 최적의 결과를 얻기 위해 특정한 조정을 필요로 할 수도 있다.

(5/5) 디플로이먼트 검증하기

Kubespray는 Netchecker를 사용하여 파드 사이의 연결성과 DNS 해석을 검증할 방법을 제공한다. Netchecker는 netchecker-agents 파드들이 DNS 요청을 해석하고 기본(default) 네임스페이스 내부에서 서로에게 ping을 보낼 수 있도록 보장한다. 그 파드들은 나머지 워크로드의 유사한 동작을 모방하고 클러스터의 상태 표시기 역할을 한다.

클러스터 생성하기

구성

Control Plane 1대

Work Node 3대 (Control Plane 1 + Worker Node 2)

1. Vagrantfile 셋팅

Vagrant.configure("2") do |config|
	# Define VM
  # Control Plane
	config.vm.define "node-1" do |centos|
		centos.vm.box = "ubuntu/focal64"
		centos.vm.hostname = "node-1"
		centos.vm.network "private_network", ip: "192.168.100.103"
		centos.vm.provider "virtualbox" do |vb|
			vb.name = "node-1"
			vb.cpus = 2
			vb.memory = 2048
		end
	end

	# Define VM
	config.vm.define "node-2" do |centos|
		centos.vm.box = "ubuntu/focal64"
		centos.vm.hostname = "node-2" 
		centos.vm.network "private_network", ip: "192.168.100.104"
		centos.vm.provider "virtualbox" do |vb|
			vb.name = "node-2"
			vb.cpus = 2
			vb.memory = 2048
		end
	end

	# Define VM
	config.vm.define "node-3" do |centos|
		centos.vm.box = "ubuntu/focal64"
		centos.vm.hostname = "node-3"
		centos.vm.network "private_network", ip: "192.168.100.105"
		centos.vm.provider "virtualbox" do |vb|
			vb.name = "node-3"
			vb.cpus = 2
			vb.memory = 2048
		end
	end

	config.vm.provision "shell", inline: <<-SHELL
	  sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
	  sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
	  sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
	  systemctl restart ssh
    SHELL

end

2. SSH 키 생성 및 복사

vagrant ssh node1

Control Plane 에서 ssh 키를 생성, ssh-copy-id 명령어로 이 키의 공개키를 자기 자신을 포함한 node-1, node-2, node-3 의 authorized_keys 파일에 등록시킨다. 

Vagrantfile 에서 가상 머신을 프로비전할 때 PasswordAuthentication yes 로 설정했기 때문에 비밀번호를 입력해서 각각의 노드들에 접속이 가능하다.

ssh-keygen
# password 는 vagrant
ssh-copy-id vagrant@192.168.100.103
ssh-copy-id vagrant@192.168.100.104
ssh-copy-id vagrant@192.168.100.105

3. kubesparay 소스 다운로드

깃 허브에서 kubespray 2.18.1 버전을 클론해서 다운 받는다.

cd ~
git clone -b v2.18.1 <https://github.com/kubernetes-sigs/kubespray.git>
cd kubespray

4. ansible, netaddr, jinja 등 패키지 설치

requirements.txt 를 사용해서 패키지를 설치한다.

즉, pip3 를 사용해서 패키지를 설치하기 위해 python3-pip 패키지를 다운받는다.

cd kubespray

cat requirements.txt
ansible==3.4.0
ansible-base==2.10.15
cryptography==2.8
jinja2==2.11.3
netaddr==0.7.19
pbr==5.4.4
jmespath==0.9.5
ruamel.yaml==0.16.10
ruamel.yaml.clib==0.2.6
MarkupSafe==1.1.1

sudo apt update
sudo apt install -y python3-pip 

sudo pip3 install -r requirements

5. 인벤토리 구성

inventory 폴더 밑에 local 과 sample 폴더가 존재한다. local 은 VM 한대에서 사용할 때, sample 은 실제 여러 노드를 관리할 때 사용할 예제 파일들이 존재한다.

깃허브 코드: https://github.com/kubernetes-sigs/kubespray/tree/master/inventory

실제 sample 폴더의 인벤토리 구조는 다음과 같다.

sample 폴더를 복사하여 mycluster 폴더를 생성한다.

mycluster 디렉토리의 inventory.ini 파일에 각각의 노드들을 그룹에 맞게 세팅한다.

cp -rpf inventory/sample/ inventory/mycluster

inventory/mycluster/inventory.ini, all 그룹에서 ip 는 etcd 의 주소이다.

[all]
node-1 ansible_host=192.168.100.103 ip=192.168.100.103
node-2 ansible_host=192.168.100.104 ip=192.168.100.104
node-3 ansible_host=192.168.100.105 ip=192.168.100.105

[kube_control_plane]
node-1

[etcd]
node-1

[kube_node]
node-1
node-2
node-3

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

6. 변수 설정

깃허브 코드: https://github.com/kubernetes-sigs/kubespray/tree/master/inventory/sample/group_vars

yml 파일에서 변수를 설정할 수 있고, inventory/mycluster/group_vars 디렉토리 안에서 변경할 수 있다.

필요한 애드온이나 변수를 해당 폴더에서 알맞게 수정하면 된다.

7. playbook 실행

ping 모듈을 사용해서 all 그룹의 모든 노드들과 통신이 되는지 확인한 후 cluster.yml 파일을 실행하여 클러스터를 생성한다.

cd ~/kubespray

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

ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b

8. 검증

kubectl 을 실행하기 위해서는 ~/.kube 디렉토리가 있어야 한다. 

/etc/kubernetes/admin.conf 파일을 복사하여 ~/.kube/config 파일로 만들어준다. 

소유자와 그룹을 변경하고 nodes 가 만들어졌는지 확인한다.

mkdir ~/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/config
sudo chown vagrant:vagrant ~/.kube/config
kubectl get nodes
kubectl get pods -A -o wide
728x90