一、概述
1.1 使用multipass搭建虚拟环境
我们可以使用multipass
来创建多台Ubuntu Server
虚拟环境,作为Linux集群的环境。如果你不知道multipass
这个虚拟化工具的使用方法,可以参考另一篇文章:https://blog.jkdev.cn/index.php/archives/326/。
1.2 使用vagtrant搭建虚拟环境
除了multipass,我们还可以使用vagtrant
来创建Linux虚拟环境,vagrant
的基本操作可以参考这篇文章:https://blog.jkdev.cn/index.php/archives/335/。
1.3 使用VirtualBox搭建虚拟环境
如果你不想用以上的两款工具,可以直接使用VirtualBox来创建你的虚拟环境,但直接使用VirtualBox操作会更加繁杂,所以更推荐使用multipass或者vagrant。
1.4 目标
本次我们将部署一个主(master、管理、控制)节点master1和两个工作(worker)节点worker1、worker2的集群。master1、worker1、worker2每个节点分配2个cpu、2G内存、10G硬盘。这是k8s要求的最低配置,但这些配置完全足够我们用以学习。
我们将使用multipass来搭建集群环境,下文是在虚拟环境中使用kubeadm搭建k8s集群搭建过程,在后续的文章中也会循序渐进地介绍k8s。
二、准备环境
2.1 创建Ubuntu18.04虚拟机
在撰写此文的时候,ubuntu18.04
正处于其稳定的生命周期内,本次我们选择ubuntu18.04
作为示例。分别创建2核cpu、10G硬盘、2G内存,名为master1、worker1、worker2三台虚拟机,如下命令
1
2
3
multipass launch -c 2 -d 10G -m 2G -n master1 18.04
multipass launch -c 2 -d 10G -m 2G -n worker1 18.04
multipass launch -c 2 -d 10G -m 2G -n worker2 18.04
使用multipass list
列出已创建的虚拟机列表,如下
1
2
3
4
5
pan@pandeMacBook-Pro ~ % multipass list
Name State IPv4 Image
master1 Running 192.168.64.4 Ubuntu 18.04 LTS
worker1 Running 192.168.64.5 Ubuntu 18.04 LTS
worker2 Running 192.168.64.6 Ubuntu 18.04 LTS
创建虚拟机之后,我们需要记住IP与虚拟机的对应关系,再对虚拟机进行初始化操作,以下2.2、2.3的操作过程需要在所有主机上进行。
2.2 修改root用户密码
因为后面的操作都是使用root
用户进行,下面我们先修改每一台主机的root
用户密码,以master1为例,如下操作命令
1
2
3
4
5
6
# 进入虚拟机
multipass bash master1
# 修改root密码
sudo passwd root
# 修改密码之后,使用su命令切换root用户
su
2.3 关闭防火墙和iptables
根据官方文档,防火墙和iptables可能会影响到k8s集群,所以我们都要关闭掉,如下命令
1
2
3
4
5
6
7
# 关闭防火墙
ufw disable
# 关闭iptables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
二、安装docker与kubeadm
以下3.1、3.2、3.3的操作过程需要在所有主机上进行。
3.1 安装与配置docker
安装docker
1
2
3
4
5
6
7
8
9
10
11
12
# 安装阿里云docker镜像服务的GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 写入阿里云docker镜像服务软件源
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 更新软件库
apt-get update
# 查看可以安装的docke-ce版本
apt-cache madison docker-ce
# 安装docker
apt-get -y install docker-ce=5:20.10.17~3-0~debian-bullseye
# 固定docker-ce版本
apt-mark hold docker-ce
每个人都可以使用阿里云创建自己的镜像加速仓库,比如https://g6ogy192.mirror.aliyuncs.com
就是我的个人镜像加速地址,但是你也可以使用,设置镜像仓库地址如下命令
1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建配置目录
mkdir -p /etc/docker
# 写入配置文件
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://g6ogy192.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 重新加载服务的配置文件
systemctl daemon-reload
# 重启docker服务
systemctl restart docker
3.2 安装kubeadm、kubelet、kubectl
1
2
3
4
5
6
7
8
9
10
11
12
# 安装阿里云k8s镜像服务的GPG证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 添加阿里云k8s镜像源
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# 更新软件库
apt-get update
# 安装程序
apt-get install -y kubelet=1.18.0-00 kubeadm=1.18.0-00 kubectl=1.18.0-00
# 固定版本
apt-mark hold kubelet kubeadm kubectl
需要注意的是:安装的
docker
版本要和k8s
版本匹配,否则k8s
可能出现无法驱动docker
的情况,以上安装的docker19.03
和k8s1.18.0
是存在对应关系的,你可以通过查阅k8s官方文档的方式查看更多的对应关系。
3.3 集群镜像准备
使用kubeadm config images list
命令查看当前集群基础服务所需要的镜像,镜像版本会根据当前的系统环境(当前安装kubeadm的版本)而定,返回如下内容
1
2
3
4
5
6
7
k8s.gcr.io/kube-apiserver:v1.18.20
k8s.gcr.io/kube-controller-manager:v1.18.20
k8s.gcr.io/kube-scheduler:v1.18.20
k8s.gcr.io/kube-proxy:v1.18.20
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
但是由于国内正常访问不到k8s.cgr.io
,可以替换阿里云镜像地址:registry.aliyuncs.com/google_containers
,执行如下命令
1
2
3
4
5
6
7
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.20
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.20
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.18.20
docker pull registry.aliyuncs.com/google_containers/pause:3.2
docker pull registry.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.aliyuncs.com/google_containers/coredns:1.6.7
接下来给镜像打标签,得到kubeadm需要的镜像
1
2
3
4
5
6
7
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20 k8s.gcr.io/kube-apiserver:v1.18.20
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.20 k8s.gcr.io/kube-controller-manager:v1.18.20
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.20 k8s.gcr.io/kube-scheduler:v1.18.20
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.18.20 k8s.gcr.io/kube-proxy:v1.18.20
docker tag registry.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
再删除掉从阿里云下载的镜像
1
2
3
4
5
6
7
docker rmi registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/pause:3.2
docker rmi registry.aliyuncs.com/google_containers/etcd:3.4.3-0
docker rmi registry.aliyuncs.com/google_containers/coredns:1.6.7
三、k8s集群初始化
3.1 初始化master节点
在master1节点上执行初始化命令
1
kubeadm init --apiserver-advertise-address=192.168.64.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap
参数说明
--apiserver-advertise-address
:指定apiserver的服务IP,此处填写master1的IP地址,如果系统包含多个IP,必须选择外网IP(能与其他节点进行网络通信的IP)--service-cidr
:k8s中service网络使用的网段--pod-network-cidr
:k8s中pod网络使用的网段--ignore-preflight-errors
:忽略swap报错
初始化结果如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.64.4:6443 --token wkgukj.up6d3a8rng4ytyl0 \
--discovery-token-ca-cert-hash sha256:d36346a3820781efd88ae3796a58e2fa139f411f9ddc9c1dc7c9c2add8da5cfb
如果出现类似以上的提示信息,代表master节点初始化成功。以上信息提示我们要完成三个操作,并给出了相关提示:一是拷贝配置文件、二是部署pod的网络插件、三是将工作节点加入到集群中。
3.2 拷贝配置文件
根据初始化结果提示,我们执行以下命令,拷贝k8s的相关配置文件到用户的家目录,才能使master1上当前登录的用户正常操作集群
1
2
3
4
5
# 创建配置用户的k8s文件目录
mkdir -p $HOME/.kube
# 拷贝配置和修改所有者,我们本身使用root用户操作,不需要加sudo前缀
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
3.3 配置集群网络
在拷贝好k8s的配置文件到用户家目录之后,我们需要安装网络插件。本次我们使用flannel
作为集群的网络插件,将flannel
配置文件从github下载保存到master1,文件地址为: https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml,在master1上将文件命名为kube-flannel.yml
。
需要注意的是,如果我们的(虚拟)主机里存在多个IP,我们需要指定有效IP的网卡(如我们在vagrant里创建的虚拟机,第二个网卡才是有效IP,需要指定有效IP的网卡)。修改flannel资源清单文件,在- --kube-subnet-mgr
后面加一条参数配置:- --iface=网卡名
,如下
# ...
containers:
- name: kube-flannel
#image: flannelcni/flannel:v0.16.3 for ppc64le and mips64le (dockerhub limitations may apply)
image: rancher/mirrored-flannelcni-flannel:v0.16.3
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
- --iface=enp0s8
# ...
后执行以下命令创建k8s网络插件
1
kubectl apply -f kube-flannel.yml
如看到包含created
的如下类似信息,证明网络插件安装成功
1
2
3
4
5
6
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
3.4 初始化集群工作节点
初始化集群管理节点master1之后,我们可以将工作节点worker1和wroker2加入到集群中。将工作节点的初始化命令拷贝到worker1和worker2去执行,使集群的工作节点(worker1、worker2)和管理节点(master1)关联起来,如下命令
1
2
kubeadm join 192.168.64.4:6443 --token wkgukj.up6d3a8rng4ytyl0 \
--discovery-token-ca-cert-hash sha256:d36346a3820781efd88ae3796a58e2fa139f411f9ddc9c1dc7c9c2add8da5cfb
在工作节点执行初始化命令之后,我们在管理节点master1使用kubectl get pods --all-namespaces
查看结果,可以看到类似如下信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@master1:/home/ubuntu# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-66bff467f8-pw9br 1/1 Running 0 13m
kube-system coredns-66bff467f8-wsj45 1/1 Running 0 13m
kube-system etcd-master1 1/1 Running 0 14m
kube-system kube-apiserver-master1 1/1 Running 0 14m
kube-system kube-controller-manager-master1 1/1 Running 0 14m
kube-system kube-flannel-ds-c4jnh 1/1 Running 0 3m39s
kube-system kube-flannel-ds-rg58c 1/1 Running 0 3m14s
kube-system kube-flannel-ds-sw85v 1/1 Running 0 3m15s
kube-system kube-proxy-ddk88 1/1 Running 0 3m15s
kube-system kube-proxy-dt825 1/1 Running 0 13m
kube-system kube-proxy-jgm4h 1/1 Running 0 3m14s
kube-system kube-scheduler-master1 1/1 Running 0 14m
如果需要查看更多的信息(如所运行的宿主机),只需在原命令中追加-o wide
参数即可。
需要注意的是,如果你的列表中显示的所有pod并不是处于Running状态,一般是正在从网络上下载资源,还没有完全启动服务,你需要等待一段时间。你在安装集群的过程中,最好处于一个优质的网络环境。如果你电脑配置允许,你还可以使用上文说明的操作步骤,添加更多的工作节点。
3.5 重置k8s集群
如果你在搭建过程中出现问题,如因为网络原因安装失败等,或者因为其他原因想重置k8s集群,可以使用以下的操作步骤
1
2
3
4
5
6
7
8
# 驱离工作节点的pod
kubectl drain worker1 --delete-local-data --force --ignore-daemonsets
kubectl drain worker2 --delete-local-data --force --ignore-daemonsets
# 删除工作节点
kubectl delete node worker1
kubectl delete node worker2
# 重置集群
kubeadm reset
四、总结
以上是使用kubeadm快速搭建k8s集群的完整说明,或许你的安装会失败。原因可能是你的虚拟环境问题、也可能因为网络原因,或者是你操作错误。如果出现失败,你需要根据你的操作步骤认真分析并重试。
作者wx订阅号:极客开发者,禁止转载