컨테이너
프로세스를 가상화를 이용하여 격리 상태로 실행해줌
이미지
실제 컨테이너를 만들 었을 때 실행파일
실행에 필요한 라이브러리 파일
컨테이너 런타임
컨테이너를 만들고 관리해주는 s/w
도커
격리 기술 - 리눅스 커널 기능
-> namespace
프로세스의 정보를 따로 저장하는 기술을 쉽게 이용할 수 있게 하는게 도커
쿠버네티스에서 도커를 사용하지 않는 이유 -> 도커를 사용하기 위해 설치할 것이 많음, 쿠버네티스를 사용하는데 또 도커 명령어를 사용하는 것이 편리하지는 않음
도커 vs k8s
도커는 호스트 1개에 컨테이너 운영, 호스트에 문제가 발생하면 전체 시스템 장애
k8s 호스트를 멀티 노드로 사용함
+) 복잡한 어플리케이션일 수록 MSA 사용
kubeadm
쿠버네티스 클러스터 생성을 위한 kubeadm init 및 kubeadm join 을 제공
kubespray
ansible 의 플레이북 양식으로 설정하여 설치하는 도구
vagrant init #가상머신 배포 파일 생성을 위한 샘플 생성
-> Vagrantfile
vagrant box add [image_name] # vagrant cloud 에서 가상머신 이미지 다운로드
vagrant plugin install [plugin_name] #추가기능 설치
vargrant up #가상머신 배포 / 부팅 (만들어져 있던 가상머신)
vargrant halt #가상머신 종료
vagrant destory #가상머신 삭제
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 box add ubuntu/jammy64
+) 이미지 이름이 같더라도 버전이 다르면 여러 이미지가 존재할 수 있음
vagrant box list
vagrant plugin install vagrant-hostmanager
vagrant up
+) 파일이름 형식은 Vagrantfile
이어야 하고, 해당 명령어를 실행한 디렉토리에 존재해야 함
가상머신 계정
사용자:vagrant
패스워드:vagrant
sudo 권한 사용 가능
vagrant status
로 확인 또는 Virtul box에서 생성 확인
가상머신 생성 시 ssh 키도 생성하고 삽입하므로,
vagrant ssh [virtualbox_name]
으로 ssh 접속이 바로 가능함
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
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
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 를 위한 설정
pip3 로 패키지 설치한 경로의 명령어 파일을 찾지 못해서 오류 발생
쉘 재접속 또는 . profile
로 PATH 환경변수 적용 시켜주면 해결됨
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