k8s - kubespray 로 배포

AeZan·2023년 11월 13일
0

컨테이너
프로세스를 가상화를 이용하여 격리 상태로 실행해줌

이미지
실제 컨테이너를 만들 었을 때 실행파일
실행에 필요한 라이브러리 파일

컨테이너 런타임
컨테이너를 만들고 관리해주는 s/w

도커
격리 기술 - 리눅스 커널 기능
-> namespace

프로세스의 정보를 따로 저장하는 기술을 쉽게 이용할 수 있게 하는게 도커

쿠버네티스에서 도커를 사용하지 않는 이유 -> 도커를 사용하기 위해 설치할 것이 많음, 쿠버네티스를 사용하는데 또 도커 명령어를 사용하는 것이 편리하지는 않음

도커 vs k8s

도커는 호스트 1개에 컨테이너 운영, 호스트에 문제가 발생하면 전체 시스템 장애
k8s 호스트를 멀티 노드로 사용함

+) 복잡한 어플리케이션일 수록 MSA 사용

k8s 설치 방식

배포도구 활용

  • kubeadm
    쿠버네티스 클러스터 생성을 위한 kubeadm init 및 kubeadm join 을 제공

  • kubespray
    ansible 의 플레이북 양식으로 설정하여 설치하는 도구


k8s 설치


vagrant 로 가상머신 배포

vagrant 설치

vagrant 다운

vagrant 다운로드 페이지

vagrant 명령어

vagrant init #가상머신 배포 파일 생성을 위한 샘플 생성
-> Vagrantfile

vagrant box add [image_name] # vagrant cloud 에서 가상머신 이미지 다운로드

vagrant plugin install [plugin_name] #추가기능 설치

vargrant up #가상머신 배포 / 부팅 (만들어져 있던 가상머신)

vargrant halt #가상머신 종료

vagrant destory #가상머신 삭제

Vagrantfile 작성

powershell 에서 디렉터리 생성 후 vargrant init 후 Vagrantfile 샘플 생성

mkdir [directory_name]
cd [directory_name]
vargrant init

+) Vagrantfile 은 Ruby 구문으로 작성되어 있음

Vagrant.configure("2") do |config|

  config.vm.box = "base" #가상머신 base 이미지

end

2 라는 숫자 = config 오브젝트의 버전
|config| = config.[ ].[ ] 과 같은 구문을 사용하겠다.

1 은 Vagrant 1.0.x 이전 버전
2 는 Vagrant 1.1+ 버전

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  $vm_provider = "virtualbox"
  $box_image = "ubuntu/jammy64"
  $vm_name_prefix = "kube"
  $number_of_control_planes = 1
  $number_of_nodes = 3
  $vm_subnet = "192.168.56"
  $vm_control_plane_cpus = 2
  $vm_control_plane_memory = 3072
  $vm_node_cpus = 2
  $vm_node_memory = 2560
  # Kubernetes Control Planes
  (1..$number_of_control_planes).each do |i|
    config.vm.define "#{$vm_name_prefix}-control#{i}" do |node|
      node.vm.box = $box_image
      node.vm.provider $vm_provider do |vm|
        vm.name = "#{$vm_name_prefix}-control#{i}"
        vm.cpus = $vm_control_plane_cpus
        vm.memory = $vm_control_plane_memory
      end
      node.vm.hostname = "#{$vm_name_prefix}-control#{i}"
      node.vm.network "private_network", ip: "#{$vm_subnet}.1#{i}", nic_type: "virtio"
    end
  end
  # Kubernetes Nodes
  (1..$number_of_nodes).each do |i|
    config.vm.define "#{$vm_name_prefix}-node#{i}" do |node|
      node.vm.box = $box_image
      node.vm.provider $vm_provider do |vm|
        vm.name = "#{$vm_name_prefix}-node#{i}"
        vm.cpus = $vm_node_cpus
        vm.memory = $vm_node_memory
      end
      node.vm.hostname = "#{$vm_name_prefix}-node#{i}"
      node.vm.network "private_network", ip: "#{$vm_subnet}.2#{i}", nic_type: "virtio"
    end
  end
  # Change APT Repository & Enable SSH Password Authentication
  config.vm.provision "shell", inline: <<-SHELL
    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
    sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
    systemctl restart ssh
  SHELL
end

vagrant image 다운

vagrant box add ubuntu/jammy64

+) 이미지 이름이 같더라도 버전이 다르면 여러 이미지가 존재할 수 있음

vagrant box list

vagrant plugin 다운

vagrant plugin install vagrant-hostmanager

vagrant 가상머신 배포

vagrant up

+) 파일이름 형식은 Vagrantfile 이어야 하고, 해당 명령어를 실행한 디렉토리에 존재해야 함

가상머신 계정
사용자: vagrant
패스워드: vagrant
sudo 권한 사용 가능

vagrant status 로 확인 또는 Virtul box에서 생성 확인

가상머신 생성 시 ssh 키도 생성하고 삽입하므로,
vagrant ssh [virtualbox_name] 으로 ssh 접속이 바로 가능함

kubespray 로 k8s 배포

kubespray 및 필요 패키지 설치

kubespray 다운로드를 위한 패키지 설치

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

kubespray 다운로드

git clone --single-branch --branch release-2.22 https://github.com/kubernetes-sigs/kubespray.git

cd kubespray
kubespray > requirements.txt 에 필요한 패키지 정보 포함

pip3 install -r requirements.txt

Ansible 설정

control plane 에서 key 생성 후 각 노드에 전달

+) ansible 용 control node 에서 따로 해도 됨

vim /etc/hosts

192.168.56.21 kube-node1
192.168.56.22 kube-node2
192.168.56.23 kube-node3

ssh-keygen
ssh-copy-id vagrant@kube-node1
ssh-copy-id vagrant@kube-node2
ssh-copy-id vagrant@kube-node3

kubespray > inventory > sample 에서 파일 수정

cp -rfp inventory/sample inventory/mycluster
-rfp 덮어쓰기 허락 후 명령어 실행

vim inventory/mycluster/inventory.ini

inventory.ini

[all]
kube-control1 ansible_host=192.168.56.11 ip=192.168.56.11 ansible_connection=local
kube-node1 ansible_host=192.168.56.21 ip=192.168.56.21
kube-node2 ansible_host=192.168.56.22 ip=192.168.56.22
kube-node3 ansible_host=192.168.56.23 ip=192.168.56.23
#kube-node1 에서 작업할 때 쓰는 변수 선언 (ansible_host, ip ...)

[kube_control_plane]
kube-control1

[etcd]
kube-control1

[kube_node]
kube-node1
kube-node2
kube-node3

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

k8s cluster 설정

필요한 애드온 포함

vim inventory/mycluster/group_vars/k8s_cluster/addons.yml

helm_enabled: true
metrics_server_enabled: true
ingress_nginx_enabled: true
metallb_enabled: true
metallb_protocol: "layer2"
metallb_config:
  address_pools:
    primary:
      ip_range:
        - 192.168.56.128/25 #네트워크 대역 변경
      auto_assign: true
  layer2:
    - primary

위 내용은 주석 해제 or false -> true 로 변경

grep -v -e ^$ -e ^# inventory/mycluster/group_vars/k8s_cluster/addons.yml
-v 제외
-e 여러 정규 표현식 사용
^$ 엔터 기호 제외(공백 줄 제외)
^# # 으로 시작하는 문장 제외


vim inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml

# configure arp_ignore and arp_announce to avoid answering ARP queries from kube-ipvs0 interface
# must be set to true for MetalLB, kube-vip(ARP enabled) to work

kube_proxy_strict_arp: true # MetalLB 를 위한 설정

Ansible 동작 확인

pip3 로 패키지 설치한 경로의 명령어 파일을 찾지 못해서 오류 발생

쉘 재접속 또는 . profilePATH 환경변수 적용 시켜주면 해결됨

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

워커노드의 유저 id 확인 테스트 (안해도 됨)
ansible -m command -a id -i inventory/mycluster/inventory.ini all -b

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

0개의 댓글

관련 채용 정보