共计 3168 个字符,预计需要花费 8 分钟才能阅读完成。
K3s 是一个轻量级的 Kubernetes 发行版(小于 40MB),并且非常易于安装,仅需要 512MB 的 RAM。它能够完美满足 IoT 设备以及边缘计算的需求。在本文中,我们将创建一个 k3s 集群并且展示如何将其集成到一个 Gitlab 的项目中。
关于 k3s
K3s 是由 Rancher Labs 发布的一个轻量级 Kubernetes 发行版,这款产品专为在资源有限的环境中运行 Kubernetes 的研发和运维人员设计。
它是经过认证的 Kubernetes 发行版,其最低的系统要求为:
- 系统内核版本:Linux 3.10+
- 每个 Server 最低 RAM 要求:512 MB
- 每个节点 RAM 最低要求:75MB
- 磁盘空间最低要求:200 MB
- 支持的硬件架构:x86_64、ARMv7、ARM64
这些低配置的要求使得 k3s 非常适用于 IoT 相关的场景。
在 GitLab 中创建项目
在安装 k3s 之前,我们先在 Gitlab 上创建一个新的项目,称为 api。
创建完成之后,我们点击侧边菜单栏里的 Operations,并在下级菜单中选择 Kubernetes。
我们现在有两个选项:
- 在 GKE 上创建一个新的 Kubernetes 集群
- 导入现有 Kubernetes 集群的配置(无论这一集群在何处创建均可导入)
注意:在当前版本的 GitLab 中,新集群的创建仅限于 GKE。
我们选择【Add existing cluster】这一选项卡。
在这一步中,我们需要填写几个字段来提供我们需要集成的集群配置。一直打开这个选项卡,暂时无需理会。现在,我们先去创建一个全新的 Kubernetes 集群。
创建一个 k3s 集群
我们现在将基于 k3s 启动一个 Kubernetes 集群。为什么是 k3s 呢?因为我想要表明设置它是多么容易。为了让步骤一目了然,我们仅仅设置一个节点的集群。
我已经配置了名为 node1 的 Ubuntu 18.04 服务器,我们在该主机上获得了一个 shell 之后,只需要运行以下命令来安装 k3s,这是一个经过认证的 Kubernetes 集群。
root@node1:~ $ curl -sfL https://get.k3s.io | sh -
上面的命令类似于用于快速 Docker 安装的命令:
curl https://get.docker.com | sh
安装完毕之后,可以在 /etc/rancher/k3s/k3s.yaml 中找到连接到集群的配置文件。
root@node1:~ $ cat /etc/rancher/k3s/k3s.yaml
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tL...tCg==
server: https://localhost:6443
name: default
contexts:
- context:
cluster: default
user: default
name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
user:
password: 48f4b...4b4e7
username: admin
本地 kubectl 将自动使用此配置。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 3m v1.14.5-k3s.1
注意:正如我们看到的 Quick Start 那样(https://k3s.io/),添加额外的节点并不复杂,它基本上只需要从主服务器上的 /var/lib/rancher/k3s/server/node-token 获取一个令牌,并使用以下命令即可连接其他一些节点:
$ curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=XXX sh -
在 Gitlab 中集成
现在让我们获取在 Gitlab 项目中集成全新的 k3s 集群所需的所有信息。
- 集群名字:k3s
- API Server 的 URL:在配置文件中,API Server 指定为:https://localhost:6443。为了从外部访问,我们需要提供 node1 外部的 IP 地址。
- 集群的 CA 证书:要向 Gitlab 提供集群 CA 证书,我们需要解码配置中指定的那个文件(就像它在 base 64 中一样)。
$ kubectl config view --raw \
-o=jsonpath='{.clusters[0].cluster.certificate-authority-data}' \
| base64 --decode
- Service token: 获取一个识别令牌的过程牵涉到几个步骤。我们首先需要创建一个 ServiceAccount 并且向它提供一个 cluster-admin 角色。以下命令可以完成这些步骤:
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: gitlab-admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: gitlab-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: gitlab-admin
namespace: kube-system
EOF
当 service account 创建完毕之后,我们检索关联的类型 secret 的资源:
$ SECRET=$(kubectl -n kube-system get secret | grep gitlab-admin | awk '{print $1}')
下一步是提取与 secret 关联的 JWT 令牌:
$ TOKEN=$(kubectl -n kube-system get secret $SECRET -o jsonpath='{.data.token}' | base64 --decode)
$ echo $TOKEN
我们已经完成了所有设置,现在回到之前打开的选项卡中,开始使用所有信息并填写 Gitlab【Add existing cluster】表单的字段:
集群集成之后,我们可以直接从 web 界面安装 helm(Kubernetes 包管理器)。
现在,我们可以从命令行检查 tiller 守护程序(helm 的服务器端组件)是否运行。
$ kubectl get deploy --all-namespaces | grep tiller
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
gitlab-managed-apps tiller-deploy 1/1 1 1 67s
集群现在已经可以使用了。除此之外,GitLab 的 Web 界面允许一键安装其他组件:
- Ingress Controller,暴露集群中运行的服务
- Cert-Manager,使用 Let’s Encrypt 管理 TLS 证书
- Prometheus,监控运行在集群中 的应用程序
- Knative,部署 Serverless 工作负载
总 结
在本文中,我们了解如何创建一个 k3s 集群并且将其集成到一个 Gitlab 项目中。当然,任何 Kubernetes 集群都可以使用相同的过程。
我们现在可以添加各种资源到项目中:
- 源代码
- Dockerfile,指定如何从代码中创建 Docker 镜像
- Kubernetes 资源,如部署、服务……
- .gitlab-ci.yaml 文件,定义 CI 流水线以及如何部署应用程序并且针对相关 Kubernetes 集群进行测试