0%

k8s单机部署

背景

需要一个方便部署应用的平台,搜索了以后选择主流的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
2
3
4
5
6
7
8
9
10
kubeadm config images list

# 例如这些
# k8s.gcr.io/kube-apiserver:v1.19.4
# k8s.gcr.io/kube-controller-manager:v1.19.4
# k8s.gcr.io/kube-scheduler:v1.19.4
# k8s.gcr.io/kube-proxy:v1.19.4
# k8s.gcr.io/pause:3.2
# k8s.gcr.io/etcd:3.4.13-0
# k8s.gcr.io/coredns:1.7.0

然后把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
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

按照提示操作,然后运行一下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
2
--allocate-node-cidrs=true
--cluster-cidr=10.244.0.0/16

重启kubelet

然后重新部署flannel,过一会儿flannel起来,再查看kubectl get pods --all-namespaces,发现所有的pod都起来了。

安装kubernetes-dashboard

kubenetes-dashboard和上面差不多的安装方式,不多讲了。

安装完之后,利用default命名空间下的default账户的token访问网页会有问题,默认的default用户是没有权限查看整个集群的状态的。需要添加权限。

创建default-clusteradmin.yaml。

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: bind-default-to-cluster-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: default
namespace: default

部署kubectl apply -f default-clusteradmin.yaml

单节点,设置master节点也可以运行Pod

1
kubectl taint nodes --all node-role.kubernetes.io/master-

至此,全部完成。

docker代理问题

docker如何走代理拉镜像?首先docker是不会走系统代理信息的,也就是在环境变量中设置http(s)_proxy是无效的,需要按照以下步骤操作。

  1. 创建systemd内的文件夹
1
sudo mkdir -p /etc/systemd/system/docker.service.d
  1. 用以下的格式,创建一个文件/etc/systemd/system/docker.service.d/http-proxy.conf
1
2
3
4
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
  1. 重启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 这两是兄弟。