前言
本来想记录一些我在微服务实践中的一点点经验。但是由于微服务牵扯到 devops ,一个好一点的 devops 又不得不提到 k8s 。于是最后还是打算先从 k8s 说起。
下面会记录全新安装一个 k8s 的过程。因为我本身也是丢三落四的性格,所以很容易踩坑,正好就可以借着踩坑的机会来介绍一下如何解决 k8s 的一些简单的报错。
环境
操作系统我们选择 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 | 
我们先配置第一台服务器
安装需要的包
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 默认使用的范围,如果你不知道这是什么就不要修改它。
接着我们看到了报错:

两个 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 那行。

然后重启一下。
重置一下 kubeadm ,并且重新 init 。这里注意,以后不管什么错误导致安装终止,解决问题之后都先 reset 一下,保证下次安装不会被上次的安装影响。
kubeadm reset
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
等了几分钟,程序提示我们安装成功。同时也对我们接下来的操作作了详细的说明,大佬们其实很为我们这些菜鸟着想~

信息量有点大,别怕,我分成了三个部分,我们一块一块的解决。
- 让你跟着上面的命令输,这个直接复制粘贴就好。看里面的 - config字样也就知道目的是为了对- k8s做一些初始化配置。
- 
告诉你应该安装一个网络方案的插件。我们现在可以输入 k8s命令来看看没有安装网络插件的情况下k8s的状态:kubectl --namespace kube-system get pod 可以看到有两个组件是 pending状态,在k8s中,只有所有组件都是running状态才算真正安装成功。这里我们安装流行的 flannel网络方案插件,对于k8s来说,安装一个插件其实就是应用一个插件的配置文件,kubectl apply就是应用配置文件的命令。另外这个命令还支持http协议。flannel的配置文件我们可以直接在github上flannel的官方仓库拿到url,是https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml。我们可以先在浏览器上打开看看,这里我特别截取一块出来: 还记得前面初始化 k8s时使用的--pod-network-cidr参数吗?就是对应的这里的值。flannel默认使用这个网络地址范围。如果你需要修改pod的网络地址范围,那么这里也要改成相应的值。这里我们保持默认,就直接通过url来应用配置文件,代码如下:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml安装完成以后我们等个几分钟再来看看组件的状态:  已经都 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 ,然后执行他:

得到 join 命令,将命令复制到 no2 中执行。
等待一下,看到已经部署成功。

然后还告诉你可以通过 kubectl get nodes 命令查看。我们在 no1 上输入命令看看:

最后, no3 也是同样的方法。

这样我们就搭建好了3个节点的 k8s 了。
小结
k8s 安装好了,有一些事情需要接下来做:
- 了解各种网络方案插件,可以着重了解一下 flannel
- 可以了解一下 docker的cgourp driver
- 了解一下 k8s中各个组件的作用
- 熟悉一下 k8s的常用命令
- 熟悉一下 k8s配置文件的写法
- 上面说要以后研究的两个问题
引用
下一篇:devops(2)- traefik安装










