基于华为云的私有Kubernetes高可用性集群解决方案

目标

实现了一个高可用,低成本的私有Kubernetes私有集群,拥有Kubernetes基本功能特性,适用于开发测试环境。在这里选择了Ranches公司的K3s-轻量级Kubernetes套件

k3s的优势特性:

  • 采用二进制文件在systemd管理下运行,资源消耗量少
  • 使用二进制文件直接运行,没有封装技术(如:Docker,snap),减少兼容性问题

更多关于k3s的介绍请参见官方中文文档K3s - 轻量级 Kubernetes

准备

  • 华为云VPC网络可访问互联网
  • 3台云主机,配置为2U4G,带10GB云硬盘
  • Ubuntu20.04Lts
  • k3s
  • Rook v1.7

Kubernetes集群

安装集群

主机列表:

主机名 配置 数据盘
k3s-master-1 2U4GB 10GB
k3s-master-2 2U4GB 10GB
k3s-master-3 2U4GB 10GB

启动k3s集群化安装

在第一台主机 k3s-master-1 上运行

curl -sfL https://get.k3s.io|sh -s - --cluster-init --disable servicelb --disable traefik --disable local-storage

增加--disable参数禁止安装servicelb traefik local-storage组件

安装输出结果

[INFO]  Finding release for channel stable
[INFO]  Using v1.21.4+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.21.4+k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.21.4+k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

验证状态

systemctl status k3s

输出结果如下

k3s.service - Lightweight Kubernetes
     Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-09-24 15:36:48 CST; 4 days ago
       Docs: https://k3s.io
    Process: 793 ExecStartPre=/bin/sh -xc ! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service (code=exited,>
    Process: 813 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS)
    Process: 854 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
   Main PID: 872 (k3s-server)
      Tasks: 133
     Memory: 1.1G
     CGroup: /system.slice/k3s.service
             ├─    872 /usr/local/bin/k3s server
             ├─   1084 containerd
             ......

~/.bash_aliases 文件中增加如下别名设置

alias k='kubectl'

用于K3S_TOKEN的值存储在服务器节点上的/var/lib/rancher/k3s/server/node-token文件中

其它master主机上运行

curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - --server https://:6443

验证集群状态,三主节点使用嵌入式etcd分布式数据库

# kubectl get node
NAME           STATUS   ROLES                       AGE     VERSION
k3s-master-1   Ready    control-plane,etcd,master   9m20s   v1.21.4+k3s1
k3s-master-2   Ready    control-plane,etcd,master   6m22s   v1.21.4+k3s1
k3s-master-3   Ready    control-plane,etcd,master   5m24s   v1.21.4+k3s1

连接华为云镜像服务(私有镜像仓库)

创建 /etc/rancher/k3s/registries.yaml 文件,示例内容如下

mirrors:
  docker.io:
    endpoint:
      - "http://mycustomreg.com:5000"
configs:
  "mycustomreg:5000":
    auth:
      username: xxxxxx # this is the registry username
      password: xxxxxx # this is the registry password

需要在集群内每个节点上部署建该私有仓库注册配置文件,重启k3s服务生效

systemctl restart k3s

如何获取访问华为云容器镜像服务的登录账号,请参见华为云文档 获取长期有效登录指令

卸载k3s

要从一个服务器节点上卸载K3s,请运行:

/usr/local/bin/k3s-uninstall.sh

Kubernetes网络

Kubernetes内网

  • Kubernetes 的 Service 对象资源类型选择为 ClusterIP

Kubernetes外网

Nodeport方案

  • 网络Service对象使用NodePort在主机上暴露服务端口
  • 使用华为云的ELB对象资源将外界访问请求映射到该主机上已暴露的端口上

Kubernetes存储

Rook ceph存储

Rook将分布式存储系统变成自我管理、自我扩展、自我修复的存储服务。它将存储管理员的任务自动化:部署、启动、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理。

Rook利用Kubernetes平台的力量,通过每个存储供应商的Kubernetes运营商来提供其服务。

准备条件

为了确保你有一个为Rook准备好的Kubernetes集群,你可以遵循这些说明。

为了配置Ceph存储集群,至少需要这些本地存储选项中的一个。

  • 原始设备(没有分区或格式化的文件系统这需要在主机上安装 lvm2。为了避免这种依赖性,你可以在磁盘上创建一个单一的全磁盘分区(见下文)
  • 原始分区(没有格式化的文件系统)

安装rook ceph

# git clone --single-branch --branch release-1.7 https://github.com/rook/rook.git
cd rook/cluster/examples/kubernetes/ceph

修改 operator.yaml 文件中的 ROOK_ENABLE_DISCOVERY_DAEMON 参数为true 令其自动发现新增原始设备【暂不启用减少资源消耗量】

kubectl apply -f crds.yaml -f common.yaml -f operator.yaml
# verify the rook-ceph-operator is in the `Running` state before proceeding
kubectl -n rook-ceph get pod

等 operator pod 稳定运行之后,创建rook集群

kubectl apply -f cluster.yaml

命令行方式

安装命令行工具

kubectl apply -f toolbox.yaml

一旦 rook-ceph-tools pod 开始运行,你可以使用如下指令连接进入

kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash

常用指令如下

  • ceph status
  • ceph osd status
  • ceph df
  • rados df

扩容Ceph集群存储

ceph集群扩容不是通过扩容云硬盘的方式,是通过在云主机上加挂云硬盘,新增加ceph集群OSD对象的方式实现

创建Kubernetes Ceph块存储对象

存储驱动为CSI,执行如下指令创建 storageclass 资源

cd rook/cluster/examples/kubernetes/ceph/csi/rbd/
kubectl apply -f storageclass.yaml

验证存储对象

$ kubectl get sc
NAME              PROVISIONER                  RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
rook-ceph-block   rook-ceph.rbd.csi.ceph.com   Delete          Immediate           true                   2d1h

附录

  • k3s项目主页
  • 华为云容器镜像服务
  • Rook项目主页
  • 阳明的博客
  • Drone项目主页

你可能感兴趣的:(基于华为云的私有Kubernetes高可用性集群解决方案)