基于 VirtualBox 与 Ubuntu 16 搭建 Kubernetes 集群

标签: virtualbox ubuntu kubernetes | 发表时间:2021-07-05 15:36 | 作者:翔宇
出处:http://weekly.dockone.io

【编者的话】这篇文章记录了我在一台机器使用 VirtualBox + Ubuntu 16 搭建 Kubernetes 的整个过程,包括其中遇到的一些问题以及解决办法。

关于 Kubernetes

下面是一段来自维基百科的关于 Kubernetes 的解释:


Kubernetes(常简称为 K8s)是用于自动部署、扩展和管理「容器化(containerized)应用程序」的开源系统。该系统由 Google 设计并捐赠给 Cloud Native Computing Foundation(今属 Linux 基金会)来使用。
它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。它支持一系列容器工具,包括 Docker 等。
Kubernetes 可以为我们提供 服务发现和负载均衡存储编排自动部署和回滚自动完成装箱计算自我修复密钥与配置管理的能力。

基础环境准备

安装 VirtualBox

VirtualBox 是一种功能强大的虚拟机软件,而且是开源免费的,下载地址: https://www.virtualbox.org/wiki/Downloads,安装 VirtualBox 非常简单,这里我就不赘述了。

下载 Ubuntu 16 系统镜像

这里我选择了 Ubuntu 16 作为系统镜像,当然你也可以使用其他系统,比如 CentOS 等,Ubuntu 16 的下载地址: https://releases.ubuntu.com/16.04/

虚拟机 x3

安装好了 VirtualBox,下载了 Ubuntu 16 的镜像后,我们首先需要搭建三台 Ubuntu 16 的虚拟机。这个新建虚拟机的过程也是比较简单的,一步一步往下走就可以了。新建完成后,我们需要对每台虚拟机进行相应的配置,配置时使用的用户应该是 root 用户。

虚拟机 IP

由于我们使用的是虚拟机,我们会给每台虚拟机配置网卡,让每台虚拟机都可以上网的,这里有两种方式:
  1. 使用 桥接网卡,每台虚拟机的 IP 将会是宿主机网段的,支持虚拟机上网
  2. 使用 NAT 网络 + 端口转发,网段自行设置,支持虚拟机上网


大家可以使用其中任意一种方式给虚拟机配置网卡,从而让虚拟机可以上网。

需要注意的是, 在集群搭建完成后,集群中的每个节点的 IP 要求保持不变,否则节点需要重新加入。

简单的方式就是让虚拟机不关机,而是进入睡眠状态,下次只需唤醒即可。

在集群中,我们使用的是内网地址,可以通过 ifconfig 或者 ip addr 找到每台虚拟机对应的内网地址:
> ifconfig  

enp0s3    Link encap:Ethernet  HWaddr 08:00:27:6f:23:2a  
      inet addr:10.0.2.4  Bcast:10.0.2.255  Mask:255.255.255.0
      inet6 addr: fe80::a00:27ff:fe6f:232a/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:3277016 errors:0 dropped:0 overruns:0 frame:0
      TX packets:3385793 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:1084480916 (1.0 GB)  TX bytes:2079122979 (2.0 GB)

这台虚拟机(master)的地址就是 10.0.2.4

配置主机名

Kubernetes 的节点名称是由主机名决定的,所以我们可以分别设置三台虚拟机的主机名为 masternode1node2,通过修改 /etc/hosts 文件来修改主机名,需要重启虚拟机:
# /etc/hosts  
10.0.2.4 master
10.0.2.5 node1
10.0.2.6 node2


SSH 无密连接

在虚拟机运行起来后,我们要做的第一件事就是要连通这三台虚拟机,即配置 SSH 无密连接。

首先在其中的一台虚拟机上生成 SSH 的公私钥:
ssh-keygen -t rsa -C '[email protected]' -f ~/.ssh/id_rsa -q -N ''  


关于 ssh-keygen 的参数说明:
  • -t rsa 指定加密算法为 RSA
  • -C '[email protected]' 用于提供一个备注,表明私钥的生成者
  • -f ~/.ssh/id_rsa 指定私钥生成的位置
  • -q -N '' 表示不对私钥加密码,以及使用静默的方式


将公私钥分发给另外两台虚拟机,并在三台虚拟机上都将公钥( ~/.ssh/id_rsa.pub)的内容写进 ~/.ssh/authorized_keys 文件中,同时设置 ~/.ssh/authorized_keys 文件的权限为 400
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys  
chmod 400 ~/.ssh/authorized_keys

配置完成后,我们将可以通过以下方式在其中一个虚拟机上连接另一台虚拟机了:
# 在 master 节点上  
ssh root@node1

Kubernetes 集群搭建

在弄好三台虚拟机后,我们便可以开始搭建一个拥有三个节点的 Kubernetes 的集群了。

安装 Docker

apt-get update -y  
apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# INSTALL DOCKER ENGINE
apt-get update -y
apt-get install -y docker-ce docker-ce-cli containerd.io

# Configure Docker to start on boot
systemctl enable docker.service
systemctl enable containerd.service

# Start Docker
systemctl start docker

安装 kubeadm、kubelet 和 kubectl

这里使用的是阿里云的镜像源:
# 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包  
apt-get update -y
apt-get install -y apt-transport-https ca-certificates curl

# 下载 Google Cloud 公开签名秘钥
# curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

# 添加 Kubernetes apt 仓库
# echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
apt-get update -y
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

关闭 SWAP

编辑 /etc/fstab 文件并注释掉 swap 分区的配置:
#/dev/mapper/master--vg-swap_1 none            swap    sw              0       0  

预先下载镜像

获取 kubeadm init 需要使用到的镜像列表:
> kubeadm config images list  

k8s.gcr.io/kube-apiserver:v1.21.1
k8s.gcr.io/kube-controller-manager:v1.21.1
k8s.gcr.io/kube-scheduler:v1.21.1
k8s.gcr.io/kube-proxy:v1.21.1
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0

Kubernetes 的镜像源对于国内用户是可望而不可即的,但我们可以先拉到国内的镜像仓或者可以使用的镜像仓,比如阿里云的容器镜像服务 ACR 和 Docker 的官方镜像仓 DockerHub。

我们可以新建一个 GitHub 代码仓,里面只有一个 Dockerfile,其内容如下:
FROM k8s.gcr.io/kube-apiserver:v1.21.0  

然后在阿里云的容器镜像服务 ACR 中新建一个镜像,并关联这个 GitHub 代码仓,构建出来的镜像就是我们要的 Kubernetes 镜像,比如上面的 k8s.gcr.io/kube-apiserver:v1.21.1,但在使用的时候需要重新给镜像打标签。

在 ACR 中构建好了所有需要的镜像后,使用下面这个脚本可以快速处理给镜像打标签的任务:
# Pull images from aliyun registry  
kubeadm config images list | sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-shenzhen.aliyuncs.com/k8scat#g' -e 's#/coredns/coredns#/coredns#g' | sh -x

# Tag images
docker images | grep k8scat | awk '{print "docker tag",$1":"$2,$1":"$2}' | sed -e 's#registry.cn-shenzhen.aliyuncs.com/k8scat#k8s.gcr.io#2' | sh -x
docker tag k8s.gcr.io/coredns:v1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0

# Remove images
docker images | grep k8scat | awk '{print "docker rmi",$1":"$2}' | sh -x

初始化 master 节点

10.0.2.4 是 master 节点的 IP 地址,设置 Pod 网段为 192.168.16.0/20
> kubeadm init --apiserver-advertise-address=10.0.2.4 --pod-network-cidr=192.168.16.0/20  

kubeadm join 10.0.2.4:6443 --token ioshf8.40n8i0rjsehpigcl \
--discovery-token-ca-cert-hash sha256:085d36848b2ee8ae9032d27a444795bc0e459f54ba043500d19d2c6fb044b065

加入 node 节点

kubeadm join 10.0.2.4:6443 --token ioshf8.40n8i0rjsehpigcl \  
--discovery-token-ca-cert-hash sha256:085d36848b2ee8ae9032d27a444795bc0e459f54ba043500d19d2c6fb044b065

分发 kubectl 配置文件

scp master:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf  
echo 'export KUBECONFIG="/etc/kubernetes/admin.conf"' >> /etc/profile
source /etc/profile

安装网络插件

这里我们使用的是 Weave Net
# curl -L "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" > weave-net.yaml  

# With IPALLOC_RANGE
kubectl apply -f https://gist.githubusercontent.com/k8scat/c6a1aa5a1bdcb8c220368dd2db69bedf/raw/da1410eea6771c56e93f191df82206be8e722112/k8s-weave-net.yaml


原文链接: https://juejin.cn/post/6970710333027516423

相关 [virtualbox ubuntu kubernetes] 推荐:

基于 VirtualBox 与 Ubuntu 16 搭建 Kubernetes 集群

- - DockOne.io
【编者的话】这篇文章记录了我在一台机器使用 VirtualBox + Ubuntu 16 搭建 Kubernetes 的整个过程,包括其中遇到的一些问题以及解决办法. 下面是一段来自维基百科的关于 Kubernetes 的解释:. Kubernetes(常简称为 K8s)是用于自动部署、扩展和管理「容器化(containerized)应用程序」的开源系统.

Ubuntu 20.04 部署kubernetes 1.22 集群

- - 鹿先森
由于众所周知的原因(F**K 红X),CentOS8的生命周期就快结束了,系统要转入Ubuntu的怀抱了,不过还好所有的应用都扔到kubernetes上了,迁移的难度大大降低. 近期在做Ubuntu的测试,正好把在ubuntu 20.04 LTS 上部署最新的kubernetes记录下来. 系统:ubuntu 20.04 LTS.

VirtualBox 4.0.0 Beta 1 发布

- Felix021 - LinuxTOY
开源虚拟化解决方案 VirtualBox 发布了下一代 4.0.0 的第一个测试版本. 该版本为重大更新版本,引入了众多新特性:. USB 2.0 EHCI 控制器和 RDP 服务器移入到 Extension Pack,不再包含在发布版本当中,保证了 VirtualBox 是完全的开源软件. USB 1.1 OHCI 控制器一直是核心部件,两者的区别在于传输速度.

Kubernetes & Microservice

- - 午夜咖啡
这是前一段时间在一个微服务的 meetup 上的分享,整理成文章发布出来. 谈微服务之前,先澄清一下概念. 微服务这个词的准确定义很难,不同的人有不同的人的看法. 比如一个朋友是『微服务原教旨主义者』,坚持微服务一定是无状态的 http API 服务,其他的都是『邪魔歪道』,它和 SOA,RPC,分布式系统之间有明显的分界.

虚拟机Oracle VM VirtualBox安装windows8

- - 牛B博客 niub.us
昨天晚上微软公布了Windows 8 Release Preview下载地址:. 中文(简体)32 位 (x86)(2.48 GB) http://iso.esd.microsoft.com/WRPDL/D29D6C5B1D8AF956B5DA9DF738CFD92DFD4F6C8FB/Windows8-ReleasePreview-32bit-ChineseSimplified.iso.

Kubernetes学习(Kubernetes踩坑记)

- - Z.S.K.'s Records
记录在使用Kubernetes中遇到的各种问题及解决方案, 好记性不如烂笔头. prometheus提示 /metrics/resource/v1alpha1 404. 原因: 这是因为[/metrics/resource/v1alpha1]是在v1.14中才新增的特性,而当前kubelet版本为1.13.

kubernetes移除Docker?

- -
两周前,Kubernetes在其最新的Changelog中宣布1.20之后将要弃用dockershime,也就说Kubernetes将不再使用Docker做为其容器运行时. 这一消息持续发酵,掀起了不小的波澜,毕竟Kubernetes+Docker的经典组合是被市场所认可的,大量企业都在使用. 看上去这个“弃用”的决定有点无厘头,那么为什么Kubernetes会做出这样的决定.

VirtualBox虚拟机上安装Mac苹果操作系统

- - BlogJava-首页技术区
     摘要: 在VirtualBox上面来安装一次Mac,并把经验分享给大家,先分享一下VirtualBox上成功安装后的Mac苹果操作系统效果. poetguo 2011-12-19 10:15 发表评论.

转换 Vmware Image to Virtualbox Image 或者 导入 Vmware Imagee into Virtu

- - 操作系统 - ITeye博客
VirtualBox can run VMs created by VMware Workstation or Server for this you need to import vmdk files using the following procedure. 来源: http://www.ubuntugeek.com/howto-convert-vmware-image-to-virtualbox-image.html.

VirtualBox文件系统已满--磁盘扩容 - CTHON - 博客园

- -
第1步:为virtualbox虚拟电脑扩容. 进入命令行,以Windows系统为例. 1.启动CMD命令行,进入VirtualBox的安装目录. 其中参数 YOUR_HARD_DISK.vdi 是您要修改的 VirtualBox 虚拟硬盘镜像文件. 而参数 SIZE_IN_MB 是指修改后的硬盘容量,单位是MB.