基于 VirtualBox 与 Ubuntu 16 搭建 Kubernetes 集群
- - DockOne.io【编者的话】这篇文章记录了我在一台机器使用 VirtualBox + Ubuntu 16 搭建 Kubernetes 的整个过程,包括其中遇到的一些问题以及解决办法. 下面是一段来自维基百科的关于 Kubernetes 的解释:. Kubernetes(常简称为 K8s)是用于自动部署、扩展和管理「容器化(containerized)应用程序」的开源系统.
Kubernetes 可以为我们提供
Kubernetes(常简称为 K8s)是用于自动部署、扩展和管理「容器化(containerized)应用程序」的开源系统。该系统由 Google 设计并捐赠给 Cloud Native Computing Foundation(今属 Linux 基金会)来使用。
它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。它支持一系列容器工具,包括 Docker 等。
服务发现和负载均衡
、 存储编排
、 自动部署和回滚
、 自动完成装箱计算
、 自我修复
和 密钥与配置管理
的能力。 root
用户。 桥接网卡
,每台虚拟机的 IP 将会是宿主机网段的,支持虚拟机上网NAT 网络
+ 端口转发,网段自行设置,支持虚拟机上网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)
10.0.2.4
。 master
、 node1
和 node2
,通过修改 /etc/hosts
文件来修改主机名,需要重启虚拟机: # /etc/hosts
10.0.2.4 master
10.0.2.5 node1
10.0.2.6 node2
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
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
# 更新 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
/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
FROM k8s.gcr.io/kube-apiserver:v1.21.0
k8s.gcr.io/kube-apiserver:v1.21.1
,但在使用的时候需要重新给镜像打标签。 # 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
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
kubeadm join 10.0.2.4:6443 --token ioshf8.40n8i0rjsehpigcl \
--discovery-token-ca-cert-hash sha256:085d36848b2ee8ae9032d27a444795bc0e459f54ba043500d19d2c6fb044b065
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