共计 2854 个字符,预计需要花费 8 分钟才能阅读完成。
k8s 安装总结
本次安装环境是 Ubuntu16.04,其他环境下,shell 命令会有一些不同,但步骤应该大致相同,默认 docker 已经安装完成
下载
下载安装下列软件
kubelet Node 上运行的节点代理
kubeadm 用来 master 初始化集群,及 node 加入集群
kubectl 客户端,用来向 master 发送请求,进行应用的部署
由于墙的原因,获取这些软件包有些麻烦。经过上网查阅了一些资料,目前主要有两种下载安装这些软件包。
其中一种是去 k8s 的 github 仓库上下载源码,解压安装。我最开始就是用的这种方式,但是以失败告终,详情见后面的问题总结。
第二种是添加 k8s 国内软件镜像源,使用 apt 进行下载安装。主要在 /etc/apt/source.list 文件附加下面的源
# 我使用的是阿里的镜像,如果你使用的其他国内镜像,请找对应的 k8s 镜像源
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
然后执行下列命令,安装软件。
# 我使用的是 1.13.0-00 版本,如果不清楚具体的版本号,
# 可以使用 apt-cache show 命令进行查询
export K8S_VERSION=1.13.0-00
apt-get update # 更新软件源
apt-get install kubelet=${K8S_VERSION}
apt-get install kubeadm=${K8S_VERSION}
apt-get install kubectl=${K8S_VERSION}
通过这种方式下载的软件,已经被自动安装好了,所有的环境已经被设置好了,可以直接运行命令即可。如果不熟悉 kubelet 和 kubeadm 的一些启动参数,不建议下载可执行包,自己手动安装。通过 apt 进行安装,可以省下很多事情。我最终通过这种方式成功安装好了三个软件。
运行
首先需要做一些配置,以及下载必要的镜像。本来可以直接执行 kubeadm init 命令初始化 master 节点的,但是由于国内有墙,所以在执行 kubeadm init 命令前,需要做一些额外的工作,主要是下载镜像。
关闭虚拟内存
一般情况下需要执行下列命令关闭虚拟内存 [1],否则报如下错误
# 关闭 swap。
# 但是系统重启后,swap 又会被启动。
# 因此每次重启节点,都要手动执行该命令关闭 swap,否则 kubelet 会启动失败
# 可以执行 sysctl -w vm.swappiness=0 彻底关掉 swap
swapoff -a
下载镜像
由于墙的原因,在下载 ”pause” 等 docker 镜像时,会出现问题解决办法是从阿里 docker 镜像网站上下载镜像,然后修改镜像的 tag[3] 执行如下命令
# $imageName 指要下载镜像的名称,可以通过 kubeadm config images list 命令获取,但要去掉前面的 k8s.gcr.io/
docker pull registry.aliyuncs.com/google_containers/$imageName
docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.aliyuncs.com/google_containers/$imageName
执行 kube init
执行 kubeadm init 命令,结果如下:接下来配置 kubectl(如果 kubeadm init 执行成功的,会显示如何配置 kubectl),主要执行下列命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config # 将文件权限设为当前用户
然后就可以用 kubectl 执行一些命令测试是否成功运行(如 kubectl get nodes)。由于我是只有一台机器,所以只有一个 master 节点
node 加入集群
执行 kubeadm token create –print-join-command 获取加入命令,然后在节点上执行,即可加入集群
安装插件
为 k8s 安装插件,相当于在集群中创建一些资源,主要使用 kubectl apply -f config_file
网络插件
为了使 Pod 之间能够跨节点通信,因此需要按照额外的虚拟二层网络组件。由于我目前只有一台节点,无法测试,所以暂未安装
问题总结
记一次手动安装 kubeadm,kubelet 和 kubectl 失败的经历
首先需要去 github 上 k8s 的仓库下,找到 release 页面,并在该页面下寻找需要下载的版本,比如我们目前的项目需要 1.13 版,那么我就找到了 https://github.com/kubernetes… 这个页面,然后不要去下载这个页面里的压缩包,找到 CHANGELOG-1.13,点击进入真正的下载页面。如下图红圈所示:进入该页面,找到 Server 区域,下载 k8s 服务端的软件包(压缩包里包括了安装 k8s 必须的软件),这里我下载的是 kubernetes-server-linux-amd64.tar.gz 软件包。下载完成后,切换到期望安装的目录,然后解压软件包。这里我希望安装到 /usr/local 目录下,所以执行下列命令
cd /usr/local
tar zxf kubernetes-server-linux-amd64.tar.gz
然后设置 PATH,修改 /etc/profile
export K8S_HOME=/usr/local/kubernetes
export PATH=$PATH:$K8S_HOME/server/bin
然后重启,或者执行 source /etc/profile,以更新环境变量。通过这种方式下载软件包后,还需要做很多工作去安装配置 kubeadm 和 kubelet,很麻烦。经过我无数次的尝试,我最终以失败告终,没有用这种方式安装配置成功。主要的问题在于 kubeadm 和 kubelet 的启动参数有点复杂,自己配置的话,需要对 k8s 有很深入的认识,否则会按下葫芦浮起瓢。我自己在那设置的半天,systemd 都用的很熟练了,依然没有安装成功。
系统重启后,k8s 没有启动
当我把我的 ubuntu 虚拟机重启后,发现 k8s 的组件没有自动运行,然后我一个个的去启动相应的容器,但是没有用。最后我发现是因为 kubelet 没有启动成功,而没有启动的成功的原因是因为 swap 没有关闭。并且我还发现当在 master 节点上成功启动 kubelet 后,其他的组件,如 apiserver 也会随之启动。
参考资料
[1] 只要用 kubeadm 小朋友都能部署 Kubernetes[2] kubernetes 基本安装 -k8s-3[3] 基于阿里云镜像站安装 Kubernetes[4] 用 kubeadm 在 Ubuntu 上快速构建 Kubernetes 测试集群