耗费了两周的时间,结合好多资料,终于完成了k8s 的安装部署。
k8s依赖于docker,首先要安装docker
docker安装
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
此命令可能会出现如下报错:

解决方法:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys +数字签名
成功则返回如下:

之后重新执行 # Step 3 的命令
继续安装
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
# Step 5: 查看支持安装的Docker版本
apt-cache madison docker-ce
# Step 6: 安装指定版本的docker-ce
sudo apt-get -y install docker-ce=5:19.03.13~3-0~ubuntu-bionic
本次安装的docker不是最新版本,如需要其他版本,看一下Step 5的输出中是否支持,同时也要注意k8s
的版本和docker的版本是否相匹配。
docker配置
sudo vim /etc/docker/daemon.json
打开后输入以下内容:
{
"exec-opts": [ "native.cgroupdriver=systemd" ]
}
然后:wq保存后重启 docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
然后就可以通过sudo docker info | grep Cgroup来查看修改后的 docker cgroup 状态,发现变为systemd即为修改成功。
下面开始k8s的安装部署。
k8s安装
注:之后的操作需要在root权限中操作
- 关闭防火墙和虚拟内存
ufw enable
swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab
- 安装kubelet,kubectl,kubeadm
打开apt源文件:
vim /etc/apt/sources.list
添加如下:
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
然后更新apt源:
apt-get update
这一步可能会出现报错,如下:
由于没有公钥,无法验证下列签名: NO_PUBKEY 8B57C5C2836F4BEB
解决方法:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B57C5C2836F4BEB
出现如下反馈,即可重新执行更新:
gpg: 合计被处理的数量:1
gpg: 已导入:1
安装kube:
apt-get install -y kubelet=1.18.0-00 kubeadm=1.18.0-00 kubectl=1.18.0-00
我安装的是1.18.0版本,如有其他需要,可自行更换,注意和docker-ce版本的匹配
目前已经完成了k8s的安装,下面将进行k8s的部署了,为了方便,可以把虚拟机进行克隆,当前虚拟机为master,其他为node,克隆后注意修改虚拟机的名称,防止后续和master节点出现冲突,如下:
vim /etc/hosts
修改红线位置,第几个node,就加个数字,方便确认。

vim /etc/hostname
同上

下面就开始在部署master节点了,node不需要。
部署master节点
- 查询需要的镜像:
kubeadm config images list --kubernetes-version v1.18.0

如果和图中的查询版本一样,可直接执行下面关于镜像的代码,不一样则自行更改版本。
拉取镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7
注:可执行
docker images查看是否拉取成功,后续镜像操作均可执行此代码查看。
给镜像改名:
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.0 k8s.gcr.io/kube-apiserver:v1.18.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0 k8s.gcr.io/kube-controller-manager:v1.18.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.0 k8s.gcr.io/kube-scheduler:v1.18.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0 k8s.gcr.io/kube-proxy:v1.18.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
删除不需要的镜像:
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7
注:以上三步关于镜像的操作可以直接写到一个脚本里,for循环来执行,详情可以查询脚本操作
- master初始化:
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.18.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.126.130片

当出现如下图情况的反馈,则成功。

在执行
kubeadm init时每一次出现报错,需要输入kubeadm reset重置之后再重新进行初始化。
初始化成功后保存圈中的token,其他节点加入时会用到。
若token过期,可手动申请token:
#生成token
kubeadm token generate
#根据token输出添加命令
kubeadm token create 输出的token --print-join-command --ttl=0
启动k8s
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
可以设置永久的环境变量,这样下次登陆,kubectl就能直接连上本机的server,而不用再设置一次环境变量:
vim /etc/profile
#文件末尾添加
export KUBECONFIG=/etc/kubernetes/admin.conf
- 启动kubelet
systemctl enable kubelet
systemctl start kubelet
- 查看启动状态
root@master-virtual-machine:/home/master# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-virtual-machine NotReady master 10m v1.18.0
#现在只有一个master节点。
root@master-virtual-machine:/home/master# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
部署 flannel 网络
- 生成kube-flannel.yml文件
vim kube-flannel.yml
输入下面链接中关于 kube-flannel.yml 的内容
https://blog.csdn.net/jcmj123456/article/details/127595438
- 加载配置文件
root@master:/home/master# kubectl apply -f kube-flannel.yml
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/psp.flannel.unprivileged 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
- 此时状态变为ready
root@master-virtual-machine:/home/master# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-virtual-machine Ready master 18h v1.18.0
如果还是NotReady,建议重启一下虚拟机,再次查看。
重启之后先查看一下状态,若不能查看,可运行代码启动k8s再试一下。
systemctl enable kubelet
systemctl start kubelet
配置 node节点
重新配置node虚拟机,完成docker安装、docker配置、k8s安装
把master节点中保存的命令,在node节点中执行,如下:
kubeadm join 192.168.126.130:6443 --token 1nl8ga.0cegc3ula4c4i5ki --discovery-token-ca-cert-hash sha256:9e7e4c96a2dfb1b6ca234bc3b296473b7b86f55e684ff0256ee0524aaa417927
注:每个人的token都不一样,只是举例说明,不要直接复制
若出现报错,一般为token过期,可重新申请token。
还解决不了,就在master节点试试下面的方法。

node节点别忘了启动kubelet
systemctl enable kubelet
systemctl start kubelet
要不然master节点会出现如下情况:node节点状态为NotReady

以上是我这两周部署k8s总结的方法,可能整理的不是太好,如有不同意见,可在评论区讨论