背景
需要一个方便部署应用的平台,搜索了以后选择主流的k8s。
k8s有很多安装方式,原生官方网站的安装方式很麻烦,组件众多,大多需要科学上网。于是开始寻找一种方便的安装方式,而且需要支持单机部署(master和worker节点在一个机器上),找到几个靠谱的方案。
minikube:它的好处是安装足够方便,指定docker国内镜像即可一路绿灯,安装完成。但是缺点是基本只能单机学习用,其master是安装在docker中的,对外发布的时候,不能像原生安装那样,设定一个port就能让集群外的人访问,只能本机访问,要对外发布的话,就有很大的成本,比较适合个人学习使用。
microk8s&k3s:这两个都是轻量级的k8s方案,安装较方便,内置了很多常用的插件和服务。但是同样的会遇到很多问题,不少问题都是他们自己封装的时候特有的,不方便排查。同时这两个都强制使用containerd作为驱动,作为容器标准化的产物,containerd相比少了一层交互,但是命令行完全没有docker用的舒服,同时令人费解的toml配置,很令人劝退。
部署工具安装:这是最终使用的方案,kubeadm部署工具,因为microk8s和k3s也无法摆脱科学上网,同时还增加了更多的问题。那为什么不使用官网的方式安装呢?事实证明按照官网安装是坑最少的,官网中文教程非常详细,而且有各种国内源加速,问题解决方法容易搜索到。
安装过程
官网:部署工具安装
官网教程非常详细,以下步骤中的几点需要注意:
准备开始
这部分最后一项
禁用交换分区。为了保证 kubelet 正常工作,您 必须 禁用交换分区。
编辑/etc/fstab
文件,在swap那行前面加#号注释掉,操作完最好重启。
确保每个节点上 MAC 地址和 product_uuid 的唯一性
一般无问题
检查网络适配器
一般无问题
确保 iptables 工具不使用 nftables 后端
一般无问题
检查所需端口
如果有端口占用的,需要kill掉进程。一般新机器部署的话,都是正常的。
安装 runtime
如果机器已经安装了docker,那么也必须看”CRI 安装指南”这个连接里面的内容。
安装docker-ce使用国内云厂商的镜像可以快速安装。
配置docker的daemon.json文件非常重要,否则会导致后面kubelet服务挂掉。
安装 kubeadm、kubelet 和 kubectl
这几个工具国内云厂商有镜像可以直接用,可以去开源镜像站搜索kubernetes镜像,如果不行就换一个,有的厂商可能更新不及时。同时不要忘记这个步骤中设置的参数。
在控制平面节点上配置 kubelet 使用的 cgroup 驱动程序
使用docker的话可以跳过。马上尝试kubeadm部署。
运行kubeadm
先不要运行kubeadm init,因为直接运行等了很久会报错,显示无法pull一些docker镜像。这些镜像来自k8s.gcr.io
,我们用阿里云的镜像地址registry.aliyuncs.com/google_containers
。
首先列出kubeadm需要的镜像列表
1 | kubeadm config images list |
然后把k8s.gcr.io
替换成registry.aliyuncs.com/google_containers
后统统pull到本地,接着通过docker tag命令一个一个再改成原来的名字,即k8s.gcr.io/xxx:xxx
这样的形式。这样就可以直接跳过kubeadm自己下载镜像的过程了。同理,后面遇到的镜像问题也可以用同样的方式解决,先下载好国内镜像,然后改名。docker拉取镜像走代理的话,#docker代理问题
这里需要我们预先启用kubelet服务systemctl enable kubelet
。
然后就可以运行kubeadm init了,不出意外的话,可以直接走到底完成安装。完成安装后注意显示出来的信息,这里面会包含一些设置
1 | mkdir -p $HOME/.kube |
按照提示操作,然后运行一下kubectl get pods --all-namespaces
命令,看看是否大部分都启动了(running状态),除了dns相关的pod,应该都跑起来了,意味着kubeadm init成功。
dns相关的pod需要网络插件安装后才能启动。
那么如果中途失败了怎么办,很简单,运行kubeadm reset,手动删除$HOME/.kube/
文件夹(重要,reset后会提示你删除),然后重启机器,按照流程重新来一遍,直到完全成功。
安装网络插件flannel
flannel可以直接这样安装。
1 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
网络不行无法直接访问的话,先浏览器访问https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
复制文本内容到本地,然后运行kubectl apply -f kube-flannel.yml
安装。
利用kubectl get pods --all-namespaces
查看pod状态,发现flannel的pod起不来。需要修改/etc/kubernetes/manifests/kube-controller-manager.yaml
,在command中添加
1 | --allocate-node-cidrs=true |
重启kubelet
然后重新部署flannel,过一会儿flannel起来,再查看kubectl get pods --all-namespaces
,发现所有的pod都起来了。
安装kubernetes-dashboard
kubenetes-dashboard和上面差不多的安装方式,不多讲了。
安装完之后,利用default命名空间下的default账户的token访问网页会有问题,默认的default用户是没有权限查看整个集群的状态的。需要添加权限。
创建default-clusteradmin.yaml。
1 | apiVersion: rbac.authorization.k8s.io/v1 |
部署kubectl apply -f default-clusteradmin.yaml
。
单节点,设置master节点也可以运行Pod
1 | kubectl taint nodes --all node-role.kubernetes.io/master- |
至此,全部完成。
docker代理问题
docker如何走代理拉镜像?首先docker是不会走系统代理信息的,也就是在环境变量中设置http(s)_proxy是无效的,需要按照以下步骤操作。
- 创建systemd内的文件夹
1 | sudo mkdir -p /etc/systemd/system/docker.service.d |
- 用以下的格式,创建一个文件
/etc/systemd/system/docker.service.d/http-proxy.conf
1 | [Service] |
- 重启docker服务,即可应用代理。
k8s的镜像
- k8s.gcr.io: registry.aliyuncs.com/google_containers
- gcr.io: registry.aliyuncs.com/google_containers
- dockerhub: 去阿里云注册一个。
- quray.io(安装flannel要用):国内可以直接访问。
gcr.io/k8s.gcr.io 这两是兄弟。