0 . 环境准备
- Ubuntu 16.04节点两台,一个台部署master,一台部署node。如果只想all-in-one的话,一台就够,可跳过第四大步的node安装。
- Master能访问外网。如不能访问,则需要配置好ubuntu和docker的内部源。本文不讲述配制方法。
- 本文以Kubernetes 1.9.3为例。如果后续Kubeadm没有大的架构变化,本文依旧适用,修改对应版本号即可。
1. 安装docker 17.03
kubeadm要求docker的版本是17.03。使用其他版本的docker不保证能安装成功, 安装命令如下:
1 | apt-get update |
如果想在非root用户下使用docker,则需要修改权限,使用root用户的话可以跳过此步:
1 | adduser {username} docker |
安装后验证,保证版本正确,并且可执行docker命令:
1 | docker version |
下载docker镜像
1 | docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.9.3 |
修改镜像名的prefix为gcr.io
1 | docker tag mirrorgooglecontainers/kube-apiserver-amd64:v1.9.3 gcr.io/google_containers/kube-apiserver-amd64:v1.9.3 |
2. 安装kubeadm、kubelet和kubectl
先添加对应的源,由于天朝自带防火墙的原因,无法获取官网的key,我复制了一份,请先下载,下载后执行:
1 | cat kube_apt_key.gpg | apt-key add - |
安装后验证,保证都是v1.9.3:
1 | kubeadm version |
3. 使用kubeadm安装kubernetes maser节点
关闭swap。
1 | swapoff -a |
停止kubelet服务。
1 | service kubelet stop |
删除/etc/kubernetes目录。
1 | rm -rf /etc/kubernetes |
执行kubeadm初始化命令,这里必须明文指定要安装的K8S版本号,否则kubeadm会去官网查找版本号,然后你懂得。
1 | kubeadm init --kubernetes-version v1.9.3 |
执行成功后,记录下屏幕出打印出的kubeadm join命令,后面会用到。
1 | kubeadm join --token d7d192.8e9115ee698a1c0c 10.3.150.28:6443 --discovery-token-ca-cert-hash sha256:c81f7f8511adbbcf3985f0951510f115286008737ecbd2cb6472d6fe1591eb29 |
然后需要给当前用户赋予访问K8S的权限:
1 | mkdir -p $HOME/.kube |
最后,验证K8S环境:
1 | kubectl get nodes |
可以看到kube-dns和kube-proxy两个pods没有running,这是因为所需要的image在google中,天朝无法访问。解决方法和第一步一致,手动pull docker 镜像,并打上对应标签。
1 | docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.9.3 |
对于上面的dns命令,我们如何知道它版本号是1.14.7的?执行如下命令:
1 | kubectl describe pods kube-dns-6f4fd4bdf-ktz6s --namespace kube-system |
在返回信息中可以看到Image
标签,其对应的值就是我们要pull的镜像。
以上步骤全部完成后,执行kubectl get pods -n kube-system
命令,我们可以看到kube-proxy
已经running了,但kube-dns
还是有问题,为什么?因为kubernetes集群的网络组件还未安装。kubeadm支持CNI标准的网络,包括Calico
、Canal
、Flannel
、Kube-router
、Romana
和Weave Net
,不支持kubenet
。
本文以Calico
为例,命令如下:
1 | kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml |
稍等片刻,执行kubectl get pods -n kube-system
,直到所有pods都running。至此K8S master节点安装完毕。
4. 安装kubernetes nodes
在node节点上先添加K8S源。
1 | cat kube_apt_key.gpg | apt-key add - |
再安装docker,并拉取镜像,此时只需要拉取kube-proxy和pause,方法如上。
还记得在第三步中,kubeadm init执行成功后,屏幕中打印的一句:
1 | kubeadm join --token d7d192.8e9115ee698a1c0c 10.3.150.28:6443 --discovery-token-ca-cert-hash sha256:c81f7f8511adbbcf3985f0951510f115286008737ecbd2cb6472d6fe1591eb29 |
镜像准备完毕后,在node节点上执行如上命令即可。此时执行kubectl get nodes,会发现该node已经成功添加。
5. 注意事项
- kubeadm安装失败后,再次安装前需要停止kubelet服务, 并删掉/etc/kubernetes目录
- 在执行
kubeadm init
时,如果docker image的版本不对,则会无限卡在[init] This might take a minute or longer if the control plane images have to be pulled.
这一步。此时请打开/etc/kubernetes/manifests/etcd.yaml
文件核对版本号,重开一个session拉取镜像并打tag。 - 本文用的方法很土,需要手动pull镜像并打tag,高级用法是在执行
kubeadm init
时指定配置文件,让kubeadm从配置文件中指定的镜像源自动pull镜像,比如指定aliyun或ustc等等。可以免去手动tag的大量操作。但config这种方法在kubeadm中被标记为实验性方式,意味着不稳定,使用方式可能会经常改变。因此为了保证K8S的成功安装,我这里选择了土鳖的手动方式。我会在下一篇文章中详细说明kubeadm init --config
的详细用法。 - TBD…如果你在安装过程中遇到了什么其他问题,请留言。
Gitalking ...