最近沉迷在 Kubernetes 和 ceph 部署中不能自拔,作为初学者,基本上把可能踩的坑都踩了一遍,先分享一下怎么部署 Kubernetes 集群,过段时间再把 ceph 集群部署和 ceph fs 部署的不完全指南分享一下。
首先,我们要知道 Kubernetes 是什么:
Kubernetes简称为k8s,它是 Google 开源的容器集群管理系统。在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
K8s 是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时 K8s 提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。
如果你想更加详细了解 k8s ,可以去看看IBM的视频,讲的还可以。
这个教程是对三台阿里云机器进行 k8s 部署,系统是Ubuntu 16.04.4 LTS。其中一台是 master ,其他两台是 worker。
安装 git
1 | $ sudo apt-get update |
这步主要为后面部署 ceph 服务。
安装 Docker
添加使用 HTTPS 传输的软件包以及 CA 证书
1 | $ sudo apt-get update |
添加软件源的 GPG
密钥
1 | $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
向 source.list
中添加 Docker 软件源
1 | $ sudo add-apt-repository \ |
更新 apt 软件包缓存,并安装 docker-ce
1 | $ sudo apt-get update |
在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装:
1 | $ curl -fsSL get.docker.com -o get-docker.sh |
测试是否安装正确:
1 | $ docker run hello-world |
安装 kubeadm, kubelet 和 kubectl
因为某些你懂的原因,要更换阿里源,并安装kubelet kubeadm kubectl:
1 | $ apt-get update && apt-get install -y apt-transport-https curl |
如果遇到gpg: no valid OpenPGP data found.
问题,参考这篇文章
使用kubeadm创建一个集群
使用 kubeadm 创建 k8s 集群其实还蛮简单,最大的困难是那堵墙,当我费了一整天把那堵墙问题解决后,发现 1.13.0 版本居然提供了中国特供的一个功能,所以把两种方法都写出来,供大家参考。
1.13.0 版本之前
首先查询下当前版本需要哪些docker image:
1 | $ kubeadm config images list --kubernetes-version v1.13.0 |
必须要指定版本,这样kubeadm才不会去连k8s.io。
新建一个pull_k8s_images.sh
,根据查询到需要哪些镜像填写下面内容,以1.13.0为例:
1 | K8S_VERSION=v1.13.0 |
运行脚本:
1 | $ ./pull_k8s_images.sh |
然后用 kubeadm 进行初始化:
1 | $ kubeadm init \ |
1.13.0版本之后
Kubenetes默认Registries地址是k8s.gcr.io
,很明显,在国内并不能访问gcr.io,因此在kubeadm v1.13之前的版本,安装起来非常麻烦,但是在1.13
版本中终于解决了国内的痛点,其增加了一个--image-repository
参数,默认值是k8s.gcr.io
,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
,其它的就可以完全按照官方文档来愉快的玩耍了。
运行:
1 | $ kubeadm init \ |
如果我们想使用非root用户操作kubectl
,可以使用以下命令,这也是kubeadm init
运行后输出的一部分:
1 | $ mkdir -p $HOME/.kube |
如果用kubeadm init
初始化失败了,用下面命令清理环境重新kubeadm init
:
1 | $ kubeadm reset |
使用下面命令查看当前 pods 的状态:
1 | $ kubectl get pods --all-namespaces |
如果遇到下面错误:
1 | Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes") |
运行下面命令解决证书问题后再查看:
1 | $ mv $HOME/.kube $HOME/.kube.bak |
通过上面 pods 状态可以看到CoreDND的状态是Pending
,就是因为我们还没有安装网络插件。使用下面命令安装calico
网络插件:
1 | $ kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml |
这时候再查看 pods 的状态:
1 | $ kubectl get pods --all-namespaces |
可以看到STATUS全部变为了Running
,表示安装成功,接下来就可以加入其他节点以及部署应用了。
Master 隔离
默认情况下,由于安全原因,集群并不会将pods部署在Master节点上。但是在开发环境下,我们可能就只有一个Master节点,这时可以使用下面的命令来解除这个限制:
1 | $ kubectl taint nodes --all node-role.kubernetes.io/master- |
加入工作节点
SSH到其他机器上,成为 root 用户(如:sudo su -
),安装 kubeadm, kubelet and kubectl。
然后复制上面的运行kubeadm init
命令时最后一句输出,并运行它的:
1 | $ kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash> |
这时候回到master 节点服务器,运行下面命令查看节点状态:
1 | $ kubectl get nodes |
如果我们忘记了Master节点的加入token,可以使用如下命令来查看:
1 | $ kubeadm token list |
默认情况下,token的有效期是24小时,如果我们的token已经过期的话,可以使用以下命令重新生成:
1 | $ kubeadm token create |
如果我们也没有--discovery-token-ca-cert-hash
的值,可以使用以下命令生成:
1 | $ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' |
至此一个简单的 k8s 集群部署就差不多了。
Tips
查看k8s日志:
1 | $ journalctl -f -u kubelet |
查看节点信息:
1 | $ kubectl describe node izuf6e4bl8eavupeu7q9a0z |
用kubeadm reset
重新部署 k8s 时记得把./kube
下面的文件也一起删掉:
1 | $ rm -rf $HOME/.kube |
总结
最后,k8s 部署最大的坑是墙~