kubernetes 환경을 로컬에 구성하기 위해서 virtualbox + vagrant 조합으로 쿠버네티스 구성을 만들어 보려고 합니다. 개발환경은 맥을 사용하기 때문에 homebrew를 통해서 설치하려고 합니다.

virtualboxvagrant를 설치합니다.

vagrantvirtualbox 를 관리하고 설정을 스크립트로 저장해서 사용할 수 있게 해주는 툴입니다. 간단한 for반복문을 통해서 어려대의 서버를 한꺼번에 생성할 수 있습니다. (병렬 생성은 아니고, 한개씩한개씩 생성합니다.)

1. virtual machine 준비

1.1. virtualbox, vagrant 설치

$ brew install virtualbox vagrant

Vagrantdocker-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를 통해서 설치하면, 네트워크가 enp0s8vagrantfile에 설정되어 있는 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 설치 항목에 이어집니다.

반응형

+ Recent posts