kubernetes 환경을 로컬에 구성하기 위해서 virtualbox
+ vagrant
조합으로 쿠버네티스 구성을 만들어 보려고 합니다. 개발환경은 맥을 사용하기 때문에 homebrew
를 통해서 설치하려고 합니다.
virtualbox 와 vagrant를 설치합니다.
vagrant 는 virtualbox 를 관리하고 설정을 스크립트로 저장해서 사용할 수 있게 해주는 툴입니다. 간단한 for반복문을 통해서 어려대의 서버를 한꺼번에 생성할 수 있습니다. (병렬 생성은 아니고, 한개씩한개씩 생성합니다.)
1. virtual machine 준비
1.1. virtualbox, vagrant 설치
$ brew install virtualbox vagrant
Vagrant는 docker-compose와 같이 폴더 안에 vagrantfile
파일을 통해서 virtualBox
를 제어합니다.
1.1. OS 준비
이번에는 우분투를 사용해서 구성해 보려고 합니다. 지속적으로 업데이트되고있는 ubuntu 이미지를 사용했습니다. (개인적으로 레드햇계열을 사용하는데, 이미지가 안보여서 Debian 계열로 설치해 봤습니다.)
https://app.vagrantup.com/ubuntu/boxes/focal64 에 들어가면 vagrantfile에 들어가는 설정을 확인할 수 있습니다.
1.1.1. vagrantfile 생성
vagrant init 명령어를 통해서 vagrantfile파일을 생성합니다.
$ vagrant init ubuntu/focal64
$ vagrant up
아래는 vmware 기본설정안에 들어가는 내용입니다.
file ... vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64"
end
1.1.2. 쿠터네티스 구성
쿠터네티스는 아래와 같이 구성하려고 합니다.
설정을 할 때에 network 옵션을 추가해서 노드간 네트워크를 구성합니다.
- master x1
- node x2
가상머신을 구성할 때 node.vm.provision
옵션을 통해서 docker
를 기본 설치하도록 설정할 수 있습니다.
vagrantfile
을 통해서 n개의 node를 만들 수 있습니다.for
문을 사용할 수 있습니다.
서버의 cpu, memory 제한에 대해서 설정을 할 수 있지만, 테스트로 사용하는 것이기 때문에 디테일한 설정을 사용하지 않겠습니다.
file ... vagrantfile
Vagrant.configure("2") do |config|
config.vm.define "master" do |master|
master.vm.box = "ubuntu/focal64"
master.vm.network "private_network", ip: "192.168.56.100"
master.vm.hostname = "master"
master.vm.provision "docker"
end
config.vm.define "node1" do |node1|
node1.vm.box = "ubuntu/focal64"
node1.vm.network "private_network", ip: "192.168.56.101"
node1.vm.hostname = "node1"
node1.vm.provision "docker"
end
config.vm.define "node2" do |node2|
node2.vm.box = "ubuntu/focal64"
node2.vm.network "private_network", ip: "192.168.56.102"
node2.vm.hostname = "node2"
node2.vm.provision "docker"
end
1.1.3. virtualbox 실행
$ vagrant up
1.1.4. ssh 접속
config.vm.define
되어 있는 정보를 통해서 ssh접속을 할 수 있습니다.
$ vagrant ssh master
1.1.5. 쿠버네티스 설치를 위한 자동 구성
쿠버네티스 설치를 위한 bash 항목 입니다. 해당 내용은 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ 에서 확인할 수 있습니다. 저는 그 내용을 모았습니다.
# /bin/bash
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
sudo apt-get update
sleep 1
sudo apt-get install -y ca-certificates apt-transport-https curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sleep 1
sudo apt-get install -y docker-ce=$docker_ver docker-ce-cli=$docker_ver containerd.io
sudo systemctl enable docker
sudo systemctl start docker
# First Permission
sudo mkdir /etc/docker
# sudo chown $USER:docker /etc/docker
# Setup daemon.
sudo cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sleep 1
sudo apt-get install -y kubelet=$k8s_ver kubeadm=$k8s_ver kubectl=$k8s_ver
sudo apt-mark hold kubelet kubeadm kubectl
network 설정
vagrant 로 kubernetes설정 시 네트워크 문제가 발생합니다.
아래 명령을통해서 network 설정을 등록한다.
--node-ip
에 등록되는 IP는 해당 node의 IP 를 말합니다. vagrant
를 통해서 설치하면, 네트워크가 enp0s8
로 vagrantfile에 설정되어 있는 IP로 할당되어있는 것을 확인할 수 있습니다.
$ echo "Environment=\"KUBELET_EXTRA_ARGS=--node-ip=192.168.56.101\"" >> /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
$ systemctl daemon-reload
$ systemctl restart kubelet
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
Environment="KUBELET_EXTRA_ARGS=--node-ip=192.168.56.101"
docker ps 가 아무것도 안 나올때
쿠버네티스 구성을 끝냈지만, docker ps
에서는 아무런 정보도 확인할 수 없을 때, 아래 명령어를 통해서 돌아가고 있는 것을 확인할 수 있습니다.
crictl는 디버깅 툴이지만, docker의 상태를 확인할 때도 유용합니다.
$ sudo crictl pods
본 글은 kubernetes 설치 항목에 이어집니다.
'개발 > 가상화' 카테고리의 다른 글
Apache Mesos, Kubernetes 비교 (0) | 2022.09.15 |
---|---|
docker | error : Failed to get D-Bus connection: Operation not permitted (0) | 2022.07.14 |
kubernetes | 우분투 kubernetes 설치 (0) | 2022.07.06 |
kubernetes | command (0) | 2022.07.05 |
XCP-ng Tools 설치 (0) | 2018.11.29 |