✔️ Kubespray
Kubespray로 쿠버네티스 설치하기 | Kubernetes
Readme (kubespray.io)
https://github.com/kubernetes-sigs/kubespray
✔️ 클러스터 구성
클러스터의 구성은 위의 그림과 비슷하다.
Control Plane 1
Work Node 3(1 Control Plan + 2 Worker Node)
CPU : 2, Memory : 3GB
Master이자 Worker Node 역할을 하는 VM(k8s-node1)을 1개 구성하고
Worker Node 역할의 VM 2대(k8s-node2, k8s-node3)를 구성한다.
✔️ 클러스터 구성 순서
- Vagrant로 VM 구축하기
- SSH 키 생성 및 복사
- kubespray 소스 다운로드
- ansible, netaddr, jinja 등 패키지 설치
- 인벤토리 구성
- 변수 설정
- 플레이북 실행
- 검증
✔️ 0. Vagrant로 VM 구축하기
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
✔️ 1. SSH 키 생성 및 복사
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
✔️ 2. kubespray 소스 다운로드
만약 git이 없다면 git 패키지를 설치한다.
apt install git
git clone -b v2.18.1 https://github.com/kubernetes-sigs/kubespray.git
-b
옵션으로 특정 버전을 받는다.
vagrant@k8s-node1:~$ git clone -b v2.18.1 https://github.com/kubernetes-sigs/kubespray.git
vagrant@k8s-node1:~$ ls
kubespray
vagrant@k8s-node1:~$ cd kubespray/
vagrant@k8s-node1:~/kubespray$ ls
CNAME SECURITY_CONTACTS extra_playbooks remove-node.yml scripts
CONTRIBUTING.md Vagrantfile facts.yml requirements-2.10.txt setup.cfg
Dockerfile _config.yml index.html requirements-2.11.txt setup.py
LICENSE ansible.cfg inventory requirements-2.9.txt test-infra
Makefile ansible_version.yml legacy_groups.yml requirements-2.9.yml tests
OWNERS cluster.yml library requirements.txt upgrade-cluster.yml
OWNERS_ALIASES code-of-conduct.md logo reset.yml
README.md contrib mitogen.yml roles
RELEASE.md docs recover-control-plane.yml scale.yml
requirements.txt
vagrant@k8s-node1:~/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
pip 명령어로 설치한다.
✔️ 3. ansible, netaddr, jinja 등 패키지 설치
sudo apt update
sudo apt install python3-pip -y
pip 패키지 설치
sudo pip3 install -r requirements.txt
가상환경이 아닌 Global하게 설치할 것이므로 sudo 권한을 사용한다.
✔️ 4. 인벤토리 구성
kubespray/inventory.ini at master · kubernetes-sigs/kubespray (github.com)
- all
- k8s_cluster
- kube_control_plane
- kube_node
- etcd
- calico_rr
- k8s_cluster
cp -rpf inventory/sample/ inventory/mycluster
vagrant@k8s-node1:~/kubespray$ ls
CNAME SECURITY_CONTACTS extra_playbooks remove-node.yml scripts
CONTRIBUTING.md Vagrantfile facts.yml requirements-2.10.txt setup.cfg
Dockerfile _config.yml index.html requirements-2.11.txt setup.py
LICENSE ansible.cfg inventory requirements-2.9.txt test-infra
Makefile ansible_version.yml legacy_groups.yml requirements-2.9.yml tests
OWNERS cluster.yml library requirements.txt upgrade-cluster.yml
OWNERS_ALIASES code-of-conduct.md logo reset.yml
README.md contrib mitogen.yml roles
RELEASE.md docs recover-control-plane.yml scale.yml
vagrant@k8s-node1:~/kubespray$ cd inventory/
vagrant@k8s-node1:~/kubespray/inventory$ ls
local sample
vagrant@k8s-node1:~/kubespray/inventory$ ls -l
total 8
drwxrwxr-x 2 vagrant vagrant 4096 May 16 06:59 local
drwxrwxr-x 3 vagrant vagrant 4096 May 16 06:59 sample
vagrant@k8s-node1:~/kubespray/inventory$ cp -rpf sample/ mycluster
vagrant@k8s-node1:~/kubespray/inventory$ ls
local mycluster sample
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
# node1 ansible_host=95.54.0.12 # ip=10.3.0.1 etcd_member_name=etcd1
# node2 ansible_host=95.54.0.13 # ip=10.3.0.2 etcd_member_name=etcd2
# node3 ansible_host=95.54.0.14 # ip=10.3.0.3 etcd_member_name=etcd3
# node4 ansible_host=95.54.0.15 # ip=10.3.0.4 etcd_member_name=etcd4
# node5 ansible_host=95.54.0.16 # ip=10.3.0.5 etcd_member_name=etcd5
# node6 ansible_host=95.54.0.17 # ip=10.3.0.6 etcd_member_name=etcd6
# ## configure a bastion host if your nodes are not directly reachable
# [bastion]
# bastion ansible_host=x.x.x.x ansible_user=some_user
[kube_control_plane]
node1
[etcd]
node1
[kube_node]
node1
node2
node3
[calico_rr]
[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr
✔️ 5. 변수 설정
inventory/mycluster/group_vars
✔️ 6. 플레이북 실행
ansible all -m ping -i inventory/mycluster/inventory.ini
플레이북 실행 전 검증 단계
vagrant@k8s-node1:~/kubespray$ ansible all -m ping -i inventory/mycluster/inventory.ini
node3 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
node2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
모든 시스템이 통신되는지 접속 테스트를 진행한다.
ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b
실제 플레이북 실행
✔️ 7. 검증
kubectl get nodes
vagrant@k8s-node1:~/kubespray$ kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
API 서버와 통신이 되지 않아 출력되는 메세지이다.
인증 정보가 없기 때문에 통신이 되지 않는다.
vagrant@k8s-node1:~/kubespray$ mkdir ~/.kube
vagrant@k8s-node1:~/kubespray$ sudo cp /etc/kubernetes/admin.conf ~/.kube/config
vagrant@k8s-node1:~/kubespray$ sudo chown vagrant:vagrant ~/.kube/config
vagrant@k8s-node1:~/kubespray$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 5m29s v1.22.8
node2 Ready <none> 4m29s v1.22.8
node3 Ready <none> 4m29s v1.22.8
calico-node
라는것이 3개가 있고 node1, 2, 3에 배치되어있다.calico-kube-controller
는 calico-node
들을 제어하는 역할을 한다.codedns
는 2개 존재한다.dns-autoscaler
는 codedns
을 스케일링한다.apiserver
, controller manager
, scheduler
각각 1개씩 존재한다.kube-proxy
도 node1, 2, 3에 하나씩 배치되어있다.nodelocaldns
도 한개씩 배치되어있다.
모든 구성들이 1/1 running 상태여야 한다.
kubectl api-resources
k8s로 생성할 수 있는 모든 리소스 리스트 확인 가능
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Object의 정의와 관리 (0) | 2022.05.17 |
---|---|
[Kubernetes] Kubernetes Objects(오브젝트) (0) | 2022.05.16 |
[Kubernetes] k8s 클러스터 업그레이드 (0) | 2022.05.16 |
[Kubernetes] Worker Node 추가 구성하기 (0) | 2022.05.16 |
[Kubernetes] kubeadm을 사용한 K8s 설치 및 K8s 클러스터 생성 (0) | 2022.05.16 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!