前段时间注册了一个 vultr 的账号,还参与了一个充10美元送100美元的活动。不过这100美元有一个30天的使用时限,马上就要到期了,就想着在到期之前用 vultr 来搭建一个 k8s 集群。 虽然 docker 的桌面客户端已经集成了单节点的 k8s,但是从头开始搭建一个高可用的集群还是有一些难度的,于是便有了这篇博客。使用国外的 vps 的好处,我们不需要担心网络环境的问题,如果没有条件可以借助 Kubeasz 这个工具在国内部署很方便。另外,本篇内容只适用 Vultr,因为利用了 Vultr 的一些特性,其他云服务器厂商也有类似的工具。
这个搭建的方式仅使用实验目的,不可作为生产环境。生产环境还需要避免如下几点:
- 为了简化操作,各个节点使用公网IP,并且关闭了防火墙
- kubeapi server 负载均衡器使用了固定IP,官方教程推荐使用 DNS
准备工作
集群拓扑
搭建之前,首先规划一下集群最终的拓扑结构。共6个节点( 1个load balancer 节点 + 3个 controll plane 节点 + 2 worker 节点)
节点初始化
添加集群节点
为了简化操作,把安装容器运行时(docker)和 kubeadm,kubectl,kubelet 的安装都放到了一个脚本里,节点初始化完成自动执行。
1 | # (Install Docker CE) |
详细步骤如下:
在 Vultr 控制面板点击 “+”,Deploy New Server
Choose Server: 选择默认 Cloud Compute
Server Location: 选择日本或者韩国(注意要和 load balance 节点选择同一个区域)
Server Type: 选择 CentOS 7 x86 Without SELinux
Server Size: 选择至少”2 CPU/4G Memory”
Start Script: 选择添加新的脚本,把上面的脚本粘贴进去。然后选择新添加的脚本,这里脚本命名为 k8s-node-init
SSH Keys: 选择自己的公钥方便登录
Server Hostname & Label: 如下,名称随意。点击左下角的 + 号可以增加节点数量
点击部署
添加负载均衡器
- 选择 Load Balance 标签,点击 + 号添加负载均衡器
- 选择与上面的节点相同的地域
- 配置负载均衡,设置转发规则和健康检测,如下所示
- 记录下来负载均衡器的 ip 和 设置的端口,例如:141.164.49.152:43
使用kubeadm 部署集群
初始化主节点
1.在负载均衡器面板,点击 Attach,选择 k8s-master-01 节点,使负载均衡器的可以代理这个节点(目前还不可以代理其他 master 节点)
2.登录到 k8s-master-01
1 | [root@k8s-master-01 ~]# kubeadm init --control-plane-endpoint "141.164.49.152:43" --upload-certs |
把其他节点加入到集群
1.分别登录 k8s-master-02 和 k8s-master-03,执行
1 | kubeadm join 141.164.49.152:43 --token 3il8rw.12u0wd0gdalsw3g3 --discovery-token-ca-cert-hash sha256:aae75ca90283a58164e05e1625716b272c4a6ecb16a32ce9cf65a5175861e25d --control-plane --certificate-key fc3ddd0dd2b92f692fdc0b11a00930c32bab0c91bcf1fa277f52f9e7c2f5f590 |
2.分别登录 k8s-worker-01 和 k8s-worker-02,执行
1 | kubeadm join 141.164.49.152:43 --token 3il8rw.12u0wd0gdalsw3g3 --discovery-token-ca-cert-hash sha256:aae75ca90283a58164e05e1625716b272c4a6ecb16a32ce9cf65a5175861e25d |
3.修改负载均衡配置,把 k8s-master-02 和 k8s-master-03 也加入到代理中
添加使用用户
1.登录到任意 master 节点,添加 kube 用户并赋予 sudo 权限
1 | useradd kube |
2.切换到 kube 用户,初始化 k8s 配置
1 | mkdir -p $HOME/.kube |
3.添加 CNI 插件
1 | kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" |
4.执行 kubectl get nodes
查看节点信息
1 | [kube@k8s-master-01 root]$ kubectl get nodes |
执行 kubectl get nodes -A
查看 Pod 信息
1 | [kube@k8s-master-01 root]$ kubectl get pods -A |
安装 Dashboard
1.在 kube 用户下执行
1 | kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml |
2.添加 SA 账户,绑定角色
1 | cat > ~/sample-user.yaml <<EOF |
3.生成 token
1 | kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}') |
4.配置服务,这里直接修改 type: ClusterIP
为 type:NodePort
后保存。
1 | kubectl -n kubernetes-dashboard edit service kubernetes-dashboard |
5.查看端口并访问https://your-ip:your-port
, 输入第3步生成的 token
1 | kubectl -n kubernetes-dashboard get service kubernetes-dashboard |
6.给 dashboard 组件分配权限,刚进入 dashboard 发现右上角有通知警告 serviceaccounts is forbidden: User "system:serviceaccount:kubernetes-dashboard:kubernetes-dashboard" cannot list resource "serviceaccounts" in API group "" in the namespace "default"
。应该是从 dashboard-2.0 开始需在外部给 dashboard 进行授权才可以
1 | cat > ~/dashboard-auth.yaml <<EOF |
7.最终看到的 dashboard 界面