原文链接:https://blog.scorpii.net/2019/11/04/k8s/
前言
本来想记录一些我在微服务实践中的一点点经验。但是由于微服务牵扯到 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 </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 <
然后重启 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
以上的问题解决过程在之后我们在其他服务器上安装
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
。我们也是以后再来研究。最后,倒数第二行应该都能看懂了吧?
等了几分钟,程序提示我们安装成功。同时也对我们接下来的操作作了详细的说明,大佬们其实很为我们这些菜鸟着想~
信息量有点大,别怕,我分成了三个部分,我们一块一块的解决。
让你跟着上面的命令输,这个直接复制粘贴就好。看里面的
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
配置文件的写法 - 上面说要以后研究的两个问题
引用
- 自动生成join命令:https://blog.csdn.net/jinguangliu/article/details/89185573
下一篇:devops(2)- traefik安装