Production Ready
: 실제 서버에서 사용 가능한
프로덕션 서버 == 서비스를 하는 실제 서버
🎈 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
: 버전 업그레이드
➕ @
🎈 구성
16G 이상의 메모리를 가진 컴퓨터에
Control Plane 1개 + Woker Node 2개
(Work Node 총 3개)
~/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를 국내 서버로 변경
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
홈 디렉토리에서 진행
$ cd ~
원격의 Kubespray Git 저장소를 로컬에 복제
$ git clone -b v2.18.1 https://github.com/kubernetes-sigs/kubespray.git
kubespray 디렉토리 생성 확인
$ ls kubespray
kubespray 디렉토리로 이동
$ cd kubespray
패키지 목록 업데이트 및 pip 설치
$ sudo apt update
$ sudo apt install python3-pip -y
requirements.txt
파일에 정의 된 버전의 패키지 설치
$ sudo pip3 install -r requirements.txt
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
: 실제로 통신하기 위한 ipip
: etcd가 사용하는 ipinventory/mycluster/group_vars
디렉토리에 존재
(현재는 따로 설정 x)
모든 노드가 통신이 되는지 접속 확인
$ ansible all -m ping -i inventory/mycluster/inventory.ini
플레이북으로 k8s 설치 (평균 45분가량 소요,,)
$ ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b
➕ 인벤토리 파일로 노드 업데이트 / 추가 / 및 제거
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
로 변경하여 진행