前言
本来想记录一些我在微服务实践中的一点点经验。但是由于微服务牵扯到 devops ,一个好一点的 devops 又不得不提到 k8s 。于是最后还是打算先从 k8s 说起。
下面会记录全新安装一个 k8s 的过程。因为我本身也是丢三落四的性格,所以很容易踩坑,正好就可以借着踩坑的机会来介绍一下如何解决 k8s 的一些简单的报错。
环境
我们使用vbox虚拟三个服务器,开一个网卡,设置成桥接,这样虚拟机之间既可以互通也能够访问外网(不管你怎么设置只要能达到这个目的就行)。之后的文章中可能ip会有变化,这个不用放在心上。
操作系统我们选择 ubuntu server 18.04 。这三个服务器都固定 ip 地址,并且都安装 docker 。
| hostname | cpu | mem | ip |
|---|---|---|---|
| no1 | 2 | 2G | 10.3.11.117 |
| no2 | 2 | 2G | 10.3.11.118 |
| no3 | 2 | 2G | 10.3.11.119 |
我们先配置第一台服务器
说明一下:之后的操作都是直接使用
root操作
安装需要的包
apt update
apt install -y apt-transport-https ca-certificates curl software-properties-common
#docker源
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
#kubeadm源
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
#安装docker、kubeadm以及k8s中不会通过docker容器部署的组件
apt update
apt install -y docker-ce kubeadm kubelet kubectl
- 1,2行:我们安装
apt的一些包。这些包大多数已经安装了,我在安装的时候只有apt-transport-https是新安装的。 - 4,5行:我们添加
docker官方源的阿里云镜像,这样能获得最新版本的docker。 - 8-11行:添加
k8s官方源的阿里云镜像,这样安装k8s的时候能快一点,并且也不用翻墙了。 - 最后就是安装
docker、kubeadm和kubelet、kubectl这两个不会通过docker容器部署的组件。实际上当你执行apt install kubeadm的时候apt会把kubelet和kubectl作为依赖包一同安装,不过这里我们还是详细一点。
初始化
开始初始化k8s
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
初始化时 --image-repository 参数设置为阿里云的镜像。 --pod-network-cidr 参数设置 pod 网络范围为 10.244.0.0/16 这个范围是流行的网络方案插件 flannel 默认使用的范围,如果你不知道这是什么就不要修改它。
接着我们看到了报错:
kubeadm init 报错
两个 warning ,和一个 error。通常 warning 是不会停下来的,这里是因为出现 error 导致安装终止。虽然 warning 不致命,不过既然都停下来了,那就看看能解决就一起解决了吧。
第一个 warning 的意思是, kubeadm 检测到当前 docker 的 cgroup driver 是 cgroupfs ,而建议的 cgroup driver 是 systemd 。后面给了个文档链接让你去看。文档里提到需要对 docker 进行配置,代码如下:
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
然后重启 docker:
systemctl daemon-reload
systemctl restart docker
这样第一个 warning 解决了。
第二个 warning 说的是新版本的 docker 还没有经过 k8s 的兼容性测试,这个一般生产环境遇到了最好就降 docker 的级,我这里是演示安装就不降级了。
我们看看最后一个 error。就是叫你关闭 swap 。我们直接永久关闭 swap ,修改 /etc/fstab 文件,注释掉 swap 那行。
注释swap
然后重启一下。
重置一下 kubeadm ,并且重新 init 。这里注意,以后不管什么错误导致安装终止,解决问题之后都先 reset 一下,保证下次安装不会被上次的安装影响。
kubeadm reset
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
以上的问题解决过程在之后我们在其他服务器上安装
k8s时就可以直接放到搭建环境那一块去。从这个过程也可以看出,其实报错信息是比较详细的,所以当我们在k8s中遇到问题时,还是需要多静下心来仔细看报错信息。问题解决完了,我们来看看其他东西。首先最上面的两条日志could not fetch a Kubernetes version.....和falling back to the local client.....就是说kubeadm最开始是打算获取https://dl.k8s.io/release/stable-1.txt这个文件看看当前最新稳定版是多少,奈何这个url被墙了,于是就用了kubeadm本身的版本号。从这里能看出来,kubeadm的版本号是与k8s的版本号同步的。同时,这也说明kubeadm是有可能可以指定版本号安装k8s的。真的可不可能呢?我们以后再来研究。其次,倒数第三行的If you know what you are doing...,是说如果你知道你在做什么,那么你可以通过--ignore-preflight-errors=...这个参数来跳过error。我们也是以后再来研究。最后,倒数第二行应该都能看懂了吧?
等了几分钟,程序提示我们安装成功。同时也对我们接下来的操作作了详细的说明,大佬们其实很为我们这些菜鸟着想~
success
信息量有点大,别怕,我分成了三个部分,我们一块一块的解决。
-
让你跟着上面的命令输,这个直接复制粘贴就好。看里面的
config字样也就知道目的是为了对k8s做一些初始化配置。 -
告诉你应该安装一个网络方案的插件。我们现在可以输入
k8s命令来看看没有安装网络插件的情况下k8s的状态:kubectl --namespace kube-system get pod
k8s system status
可以看到有两个组件是
pending状态,在k8s中,只有所有组件都是running状态才算真正安装成功。这里我们安装流行的
flannel网络方案插件,对于k8s来说,安装一个插件其实就是应用一个插件的配置文件,kubectl apply就是应用配置文件的命令。另外这个命令还支持http协议。flannel的配置文件我们可以直接在github上flannel的官方仓库拿到url,是https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml。我们可以先在浏览器上打开看看,这里我特别截取一块出来:
part of yml
还记得前面初始化
k8s时使用的--pod-network-cidr参数吗?就是对应的这里的值。flannel默认使用这个网络地址范围。如果你需要修改pod的网络地址范围,那么这里也要改成相应的值。这里我们保持默认,就直接通过url来应用配置文件,代码如下:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml安装完成以后我们等个几分钟再来看看组件的状态:
apply flannel
已经都
running了。 -
告诉你之后如果要将其他服务器加入到
k8s中,就在环境装好以后输入它上面的那条join命令。这条命令你不用记下来,因为之后可以通过kubeadm命令再次获取它。
另外两个服务器
我们来部署第二台服务器,根据上面的流程搭建和配置环境:
- 安装包
- 配置
docker - 永久关闭
swap
当我们部署 no1 后,因为只有一个节点,所以 no1 默认自己就是 master 。之后我们再部署其他服务器时只需要通过 kubeadm join 命令加入到这个 master 上即可。还记得部署好 no1 时得到的 join 命令吗?没记住没关系,反正24小时之后 token 就过期了。 join 命令有三个参数,第一个是 master 的 ip 和端口,第二个是 token ,第三个是证书的 hash 值。重新生成这么一条命令不是不可能,就是有点麻烦,而在日常工作中我们可能经常需要生成这条命令,所以我们把生成这条命令的过程做成一个脚本。正好已经有大佬写了这个脚本,我们就直接拿来用。代码如下:
#!/bin/bash
if [ $EUID -ne 0 ];then
echo "You must be root (or sudo) to run this script"
exit 1
fi
if [ $# != 1 ] ; then
echo "Usage: $0 [master-hostname | master-ip-address]"
echo " e.g.: $0 api.k8s.hiko.im"
exit 1;
fi
token=`kubeadm token create`
cert_hash=`openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'`
echo "Refer the following command to join kubernetes cluster:"
echo "kubeadm join $1:6443 --token ${token} --discovery-token-ca-cert-hash sha256:${cert_hash}"
把上面的代码复制到 no1 的新文件中,命名 join.sh ,然后执行他:
generate join
得到 join 命令,将命令复制到 no2 中执行。
等待一下,看到已经部署成功。
join success
然后还告诉你可以通过 kubectl get nodes 命令查看。我们在 no1 上输入命令看看:
get nodes
最后, no3 也是同样的方法。
get nodes
这样我们就搭建好了3个节点的 k8s 了。
小结
k8s 安装好了,有一些事情需要接下来做:
- 了解各种网络方案插件,可以着重了解一下
flannel - 可以了解一下
docker的cgourp driver - 了解一下
k8s中各个组件的作用 - 熟悉一下
k8s的常用命令 - 熟悉一下
k8s配置文件的写法 - 上面说要以后研究的两个问题












网友评论