0516_Kubernetes_Kubespray로 k8s 설치

HYOJU DO·2022년 5월 16일
0

Kubernetes

목록 보기
3/13
post-thumbnail

Kubespray : Deploy a Production Ready Kubernetes Cluster


k8s 생성 전 확인 사항

설치하는 법 1
설치하는 법 2

Production Ready : 실제 서버에서 사용 가능한
프로덕션 서버 == 서비스를 하는 실제 서버

  • 설치형 : 복잡
    ex. kubeadm / kubespray
  • 관리형 : Control Plane / Worker Node 둘 다 관리형으로 만드는 것이 트렌드
    ex. Fargate

🎈 Kubespray 로 클러스터 생성 시 충족 요건

  • Ansible v 2.9 / Python netaddr 라이브러리
  • 2.11 이상 버전 Jinja
  • 타겟 서버 인터넷에 접속
    ➜ Docker 이미지 pull 하기 위함
  • 타겟 서버 IPv4 포워딩 활성화 (자동)
  • SSH 키가 인벤토리의 모든 서버들에 복사되어있어야 함
  • 디플로이먼트 과정에서의 문제를 방지하기 위해 방화벽을 비활성화
    ➜ 방화벽은 kubespray에 의해 관리되지 않음 ➜ 사용자는 필요에 따라 적절한 규칙을 구현
  • 사용자 계정에서 실행 시, 타겟 서버에서 알맞은 권한 확대 방법이 설정
    ➜ Ansible도 become 으로 수행

🎈 인벤토리 파일 구성
기본 뼈대 존재 (role과 그룹)
➜ 수정해서 사용

🎈 클러스터 디플로이먼트(배포) 계획
➜ 변수 파일 정의하여 변경

🎈 Kubespray 파일
cluster.yml : 클러스터 설치
remove-node.yml : 쿠버네티스 클러스터에서 노드 제외
reset.yml : 기존 정보 삭제하고 새로 구성 시 사용
scale.yml : 복제시 사용
upgrade-cluster.yml : 버전 업그레이드
➕ @


Node로 사용할 VM 생성

🎈 구성
16G 이상의 메모리를 가진 컴퓨터에
Control Plane 1개 + Woker Node 2개
(Work Node 총 3개)

  • OS : Ubuntu focal64
  • CPU 2, Memory 3GB

~/vagrant/k8s/Vagrantfile

Vagrant.configure("2") do |config|
	# Define VM
	config.vm.define "k8s-node1" do |ubuntu|
		ubuntu.vm.box = "ubuntu/focal64"
		ubuntu.vm.hostname = "k8s-node1"
		ubuntu.vm.network "private_network", ip: "192.168.100.100"
		ubuntu.vm.provider "virtualbox" do |vb|
			vb.name = "k8s-node1"
			vb.cpus = 2
			vb.memory = 3000
		end
	end
	config.vm.define "k8s-node2" do |ubuntu|
		ubuntu.vm.box = "ubuntu/focal64"
		ubuntu.vm.hostname = "k8s-node2"
		ubuntu.vm.network "private_network", ip: "192.168.100.101"
		ubuntu.vm.provider "virtualbox" do |vb|
			vb.name = "k8s-node2"
			vb.cpus = 2
			vb.memory = 3000
		end
	end
	config.vm.define "k8s-node3" do |ubuntu|
		ubuntu.vm.box = "ubuntu/focal64"
		ubuntu.vm.hostname = "k8s-node3"
		ubuntu.vm.network "private_network", ip: "192.168.100.102"
		ubuntu.vm.provider "virtualbox" do |vb|
			vb.name = "k8s-node3"
			vb.cpus = 2
			vb.memory = 3000
		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

sed 명령어를 사용하여
VM 간 Password 인증이 가능하도록 sshd_config 파일을 수정하고,
패키지 다운로드 속도를 높이기 위하여 apt mirrorlist를 국내 서버로 변경

1. SSH 키 생성 및 복사

k8s-node1 에서 진행

접속 시 사용할 키 생성

$ ssh-keygen

각 노드로 키 복사

$ ssh-copy-id vagrant@192.168.100.100
$ ssh-copy-id vagrant@192.168.100.101
$ ssh-copy-id vagrant@192.168.100.102

pw : vagrant

2. kubespray 소스 다운로드

홈 디렉토리에서 진행

$ cd ~

원격의 Kubespray Git 저장소를 로컬에 복제

$ git clone -b v2.18.1 https://github.com/kubernetes-sigs/kubespray.git

kubespray 디렉토리 생성 확인

$ ls kubespray

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

kubespray 디렉토리로 이동

$ cd kubespray

패키지 목록 업데이트 및 pip 설치

$ sudo apt update
$ sudo apt install python3-pip -y

requirements.txt 파일에 정의 된 버전의 패키지 설치

$ sudo pip3 install -r requirements.txt

4. 인벤토리 구성

mycluster라는 이름의 디렉토리를 생성하고, inventory 디렉토리 아래의 sample 디렉토리를 mycluster 디렉토리에 복사

$ cp -rpf inventory/sample/ inventory/mycluster

인벤토리 파일 수정
inventory/mycluster/inventory.ini

[all]
node1 ansible_host=192.168.100.100 ip=192.168.100.100
node2 ansible_host=192.168.100.101 ip=192.168.100.101
node3 ansible_host=192.168.100.102 ip=192.168.100.102

[kube_control_plane]
node1

[etcd]
node1

[kube_node]
node1
node2
node3

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr
  • ansible_host : 실제로 통신하기 위한 ip
  • ip : etcd가 사용하는 ip

5. 변수 설정

inventory/mycluster/group_vars 디렉토리에 존재
(현재는 따로 설정 x)

6. 플레이북 실행

모든 노드가 통신이 되는지 접속 확인

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

플레이북으로 k8s 설치 (평균 45분가량 소요,,)

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

인벤토리 파일로 노드 업데이트 / 추가 / 및 제거

  • remove nodes
  • unsafe upgrade ➜ 한 번에 업그레이드
  • graceful upgrade ➜ 순차적 업그레이드

7. 검증

kubectl 명령어를 사용하기 위해
홈 디렉토리 밑에 .kube 디렉토리 만들고
인증파일 복사 및 권한 변경

$ mkdir ~/.kube
$ sudo cp /etc/kubernetes/admin.conf ~/.kube/config
$ sudo chown vagrant:vagrant ~/.kube/config

설치 확인 (노드)

$ kubectl get nodes

설치 확인 (모든 파드)

$ kubectl get pods -A
$ kubectl get pods -A -o wide

-o wide : 어떤 노드에 배치되어있는지 상세하게 확인 가능

생성 된 파드

  • coredns ➜ 기본 2개
  • calico kube controller ➜ calico node 제어
  • calico node ➜ 네트워크 서비스 주체?
  • 📌 녹화본 보고 추가 필기

➜ 모든 구성요소가 1/1 Running 상태 되어야 함

🌟 kubespray 디렉토리 절대 지우면 안됨!!!



➕ 기존 노드 및 네트워크 문제로 인하여

  • k8s-node1 192.168.100.100 ➜ kube-node1 192.168.100.110
  • k8s-node2 192.168.100.101 ➜ kube-node2 192.168.100.111
    로 변경하여 진행



profile
Be on CLOUD nine! ☁️ ( 수정 예정 == 📌)

0개의 댓글