在过去的几年中,我经常遇到Kubernetes,但这通常是从开发人员的角度来看发生的。查看窗格列表,它们的状态,日志等。通常,没有什么复杂的。
最近,我决定对Kubernetes进行更深入的研究,以更好地了解它的工作原理和功能。但是随后出现了一个明显的问题:我们需要某种沙箱,可以在其中进行试验而不必担心会破坏某些东西,甚至更好的是可以随时回滚。
通常,您应该使用minikube开始学习Kubernetes,minikube是一个控制台实用程序,可以使用VirtualBox从一个节点快速创建集群。这是快速入门的最佳选择。
但是还有另一种选择。您可以使用VirtualBox,例如使用Ubuntu Server创建多个虚拟机,并在您的家用计算机上设置一个小的Kubernetes集群。
我决定采用第二种方法,但是在设置过程中,我开始遇到各种问题,但对我来说,解决方案并不像我所希望的那么明显。通常,在Internet上可以找到许多用英语描述安装过程的文章,但是不幸的是,对于我来说,这些文章都不完整。我不得不从各种来源逐条收集信息。
在这里,我决定将所有内容放在一起,并详细描述使用VirtualBox建立小型Kubernetes集群的过程,就像我自己想看到的那样。希望这些信息可以帮助其他开发人员进行实验。
当心交通!文章中有很多屏幕截图。
训练
因此,在本文中,我们将使用VirtualBox逐步设置一个由三个虚拟机组成的Kubernetes集群,并使用Ubuntu Server 20.04。我使用Windows 10家用计算机作为主机。在设置过程中,我们需要:
VirtualBox 6.1.16和VirtualBox 6.1.16扩展包。您可以在此处下载它们。
Ubuntu Server 20.04安装映像。您可以在此处下载。
用于集群管理的kubectl实用程序。可以在此处找到安装说明。
免责声明
通常,我通常使用.NET编写并且不进行此类设置,因此,我不排除下述所有步骤(尽管它们可以工作)可能无法正确完成。如果我在某个地方犯了错误,甚至写了很多废话,请随时在评论中写上它=)
Hyper-V
, Docker Windows Subsystem for Linux (WLS), Hyper-V. VirtualBox , :
Hyper-V . :
bcdedit /set hypervisorlaunchtype off
:
bcdedit /set hypervisorlaunchtype auto
, .
VirtualBox
VirtualBox VirtualBox Extension Pack. , . File → Preferences → Extensions , Extension Pack :
VirtualBox , , NAT, NAT Network, Bridged, Host-only .. , , . , ( , ).
NAT Host-only.
NAT , ( NAT Network). , IP , .
Host-only , IP , . . VirtualBox , File → Host Network Manager...:
DHCP Server, IP , NAT.
IPv4 Address IP . , IPv4 Network Mask. , IP 192.168.92.1, 255.255.255.0, 192.168.92.2, 192.168.92.10, 192.168.92.42 ..
, VirtualBox . , - , 192.168.10.1:
( , 192.168.1.1 , .. Wi-Fi )
, .. .
, , . , .
Kube Template:
2:
. VDI (VirtualBox Disk Image), 10:
:
. . Machine → Settings... → System → Processor 2, Kubernetes :
Network , NAT:
( ), Host-only , ( ):
, . Ubuntu Server.
Ubuntu Server
. VirtualBox . iso Ubuntu Server 20.04 :
, , . :
:
, , IP , - . :
IP . , IP 192.168.10.1. .
IP :
, . kube-template, username/password test/test:
OpenSSH server. , SSH PuTTY Multi PuTTY Manager. , :
( .)
. , .. :
, , ( cdrom, ):
, , :
IP :
:
, :
curl https://ya.ru
, . snapshot, .
mc
, - . mc:
sudo apt-get update
sudo apt-get install -y mc
sudo mc
mc, , .
F3 -
F4 - . , mcedit (3).
F2 - C .
F5 - .
F8 - .
CTRL+O - .
swap
Kubernetes , swap, .
, swap :
cat /proc/swaps
, swap , /etc
, fstab
. :
( ) ( /swap.img
), :
shutdown -r now
/swap.img
:
Docker Kubernetes, . , . , .. .
, , , , .
( ) :
shutdown now
Shared Folders. , :
.
CD VirtualBox Guest Additions, , VirtualBox Extension Pack. Devices → Insert Guest Additions CD image:
. CD:
sudo mkdir /media/cdrom
sudo mount -t iso9660 /dev/cdrom /media/cdrom
, :
sudo apt-get update
sudo apt-get install -y build-essential linux-headers-`uname -r`
:
sudo /media/cdrom/VBoxLinuxAdditions.run
:
shutdown -r now
:
mkdir ~/shared
test, /home/test/shared
.
mc /etc/fstab
. ( <username> , test):
shared /home/<username>/shared vboxsf defaults 0 0
:
/etc/modules
, :
vboxsf
:
:
shutdown -r now
, . :
, ~/shared
, :
Docker Kubernetes
#!/usr/bin/env bash
sudo apt-get update
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
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
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
#!/usr/bin/env bash
sudo apt-get update
sudo apt-get install -y \
apt-transport-https \
curl
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
sudo apt-get install -y kubelet kubeadm kubectl
, , . : install-docker.sh
install-kubernetes.sh
, .
, LF, CRLF.
, , Docker, Kubernetes:
cgroup driver Docker Kubernetes systemd
Linux , Control Groups ( cgroups), , . Docker Kubernetes cgroups, : cgroupfs systemd. , Docker Kubernetes .
systemd, . , Kubernetes .
Docker. /etc/docker
daemon.json
:
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
:
Kubernetes /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
. :
ExecStart=/usr/bin/kubelet < >
--cgroup-driver=systemd
. :
, :
shutdown now
. . Clone...:
: Kube Master, Kube Node1 Kube Node2.
MAC AddressPolicy Generate new MAC address for all network adapters.
:
hostname IP
, hostname IP .
Kube Master .
hostname. :
sudo hostnamectl set-hostname kube-master
IP Ubuntu Server 20.04 /etc/netplan/00-installer-config.yaml
. IP 192.198.10.10:
:
sudo netplan apply
, hostname IP :
hostname && hostname -I
. Kubernetes ( , kubelet) , IP IP , NAT , .
IP , , /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
. , --cgroup-driver=systemd
. : --node-ip=192.168.10.10
:
, .
Kube Node1 kube-node1 IP 192.168.10.11.
Kube Node2 kube-node2 IP 192.168.10.12.
.
master :
sudo kubeadm init \
--apiserver-advertise-address=192.168.10.10 \
--pod-network-cidr=10.10.0.0/16 > ~/shared/kubeadm-join.sh
.
--apiserver-advertise-address
, IP apiserver. IP , NAT, master . 192.168.10.10.
--pod-network-cidr
, IP . , , . 10.10.0.0/16.
master , output kubeadm join ...
. , .
, , kubeadm-join.sh
:
. :
Kube Node1 Kube Node2, kubeadm-join.sh
:
Kubernetes . - . admin.conf
/etc/kubernetes
, master .
admin.conf
config
:
sudo cp /etc/kubernetes/admin.conf ~/shared/config
config
%UserProfile%/.kube
.
:
kubectl get nodes -o wide
, , NotReady.
, , , , Pending:
kubectl get pods -A
, Kubernetes , , Flannel Calico. .
Flannel (.. ).
GitHub , :
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
, .. . kube-flannel.yml .
:
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
10.244.0.0 10.10.0.0. , kubectl init
.
Flannel :
kubectl apply -f .\Desktop\kube-flannel.yml
, , , Flannel. Running .
Ready:
.
. , , .
我希望本文对希望建立测试集群以学习Kubernetes的开发人员有用。