引子
这几年,各大云厂商为了争夺用户可谓是“大打出手”,时不时就能够以几十块钱的价格买上一年的服务器,其中腾讯云更是良心,不仅低价卖服务器,还能免费升配老套餐的轻量应用服务器。虽然经常能薅到低价的服务器,但是服务器后期的续费也是个大问题,所以很多个人开发者通常选择低价时购入一些服务器,到期后再将服务迁移到新的服务器上。迁移过程中,我们不仅要减少对已有服务的影响,而且还得在新的服务器上搭建各种环境,十分繁琐。
有没有一种办法,能够实现服务器的“无感”迁移呢?这就是今天要为大家介绍的,利用腾讯云轻量应用服务器搭建K3s集群。
前提条件:
- 腾讯云轻量应用服务器一台或多台 (建议2H4G及以上机型作为主节点)
- 了解Kubernetes或容器的基本知识
服务器镜像选择
轻量应用服务器相较于CVM,提供了定制化的应用镜像,帮助用户实现“开箱即用”,其中就包含了K3s镜像,并且集成了Kubernetes-dashboard,方便用户可视化的对集群进行管理。
如果是想要快速体验K3s的用户,建议直接使用这款镜像。这里我们选用腾讯云的系统镜像 TencentOS Server 3.1,从零开始搭建K3s集群,享受更多“自定义”的乐趣。本次我们准备了三台位于同一可用区的轻量服务器(其中一台是3月份疫情期间免费领取的),外加一块额外的云硬盘。其中一台服务器作为Master节点,另外两台作为Worker节点。
初始化三台服务器
首先登陆三台服务器,然后对系统组件进行更新:
代码语言:shell复制dnf update -y
更新完成之后,因为腾讯的软件仓库中container-selinux版本过低的原因,我们还需要手动更新这一组件。我们可以从https://pkgs.org/download/container-selinux找到该组件的最新版本。到这里,三台服务器的初始化工作就结束了。
代码语言:shell复制wget https://vault.centos.org/centos/8/AppStream/x86_64/os/Packages/container-selinux-2.167.0-1.module_el8.5.0 1006 8d0e68a2.noarch.rpm
rpm -Uvh container-selinux-2.167.0-1.module_el8.5.0 1006 8d0e68a2.noarch.rpm
部署K3s的Master节点
根据K3s的官方文档,安装K3s的最低硬件要求是1H512MB。但因为我们还需要部署其他服务,所以建议Master节点选用2H4G及以上的配置。
安装K3s十分简单,只需要一行代码:
代码语言:shell复制curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
通过以上指令,服务器将自动拉取并部署K3s的最新版本。更多关于安装的说明,请参考K3s官方文档:https://docs.rancher.cn/docs/k3s/installation/install-options/_index
如果后期需要在集群外通过kubectl管理集群,建议在安装脚本后增加一个安装选项:
代码语言:shell复制curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server --tls-san <Master节点 IP>
到此Master节点就安装完成了,可以通过以下命令来验证:
代码语言:shell复制kubectl get all
部署K3s的Worker节点(如果只有一台服务器部署单节点K3s的话可跳过此章节)
刚刚我们在一台服务器上成功部署了K3s的Master节点。如果手中只有一台服务器的话,其实K3s的部署基本上就已经完成了,Master节点将同时扮演控制调度,计算的角色。如果我们有多余的服务器,就可以通过K3s agent的方式加入集群,由agent担任计算的角色。在安装Worker节点之前,请在轻量应用服务器防火墙控制面板中放开全部服务器内网的所有流量。
在从节点上执行以下指令完成K3s agent的部署:
代码语言:shell复制curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://<Master IP>:6443 K3S_TOKEN=xxxxxxxx sh -
其中我们需要设置K3S_URL和K3S_TOKEN两个选项。K3S_URL为https://<Master节点内网或公网IP>:6443,K3S_TOKEN通过在Master节点中执行以下指令得到:
代码语言:shell复制cat /var/lib/rancher/k3s/server/node-token
至此K3s agent部署完成。
部署Rancher(可选的)
Rancher是一个开源的企业级多集群Kubernetes管理平台,实现了Kubernetes集群在混合云 本地数据中心的集中部署与管理,以确保集群的安全性,加速企业数字化转型。
如果我们需要可视化的管理K3s集群,推荐安装Rancher。Rancher的安装部署也非常简单,可以参考官方文档https://docs.rancher.cn/docs/rancher2/installation/install-rancher-on-k8s/_index#安装-rancher-helm-chart
部署Longhorn
Longhorn是一个轻量级且功能强大的云原生Kubernetes分布式存储平台,可以在任意基础设施上运行。Longhorn与Rancher结合使用,将帮助您在Kubernetes环境中轻松、快速和可靠地部署高可用性持久化块存储。
前面提到我们希望在服务器之间实现业务的“无感”迁移,因此一个分布式的存储平台是必备的。如果你已经在上一步部署了Rancher,那么你可以在Rancher的应用市场中一键安装Longhorn。
如果你没有部署Rancher,同样可以参考官方文档非常简单的安装Longhorn:https://longhorn.io/docs/1.2.4/deploy/install/
部署完成之后,我们可以通过Longhorn的管理平台管理我们的存储。
开启Traefik Web-UI
Traefik是一个现代的 HTTP 反向代理和负载均衡器,它是为了轻松部署微服务而生的。在设计,部署和运行应用程序时,它简化了网络复杂性。 K3s默认集成了Traefik作为Ingress Controller。如果需要直观的了解Traefik上代理了什么服务,我们可以对外暴露它的Web UI。
在Master节点上新建文件traefik-ui.yaml。
代码语言:shell复制vi traefik-ui.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: dashboard
namespace: kube-system
spec:
entryPoints:
- web
routes:
- match: Host(`请输入你的域名`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
kind: Rule
services:
- name: api@internal
kind: TraefikService
通过以上配置文件,我们将新建一个IngressRoute,并且在80端口监听入站请求。接下来我们要部署这个IngressRoute。
代码语言:shell复制kubectl apply -f traefik-ui.yaml
部署完成之后,我们就可以通过http://<你的域名>/dashboard/ 来访问Traefik的Web UI。
部署第一个K3s应用
接下来我们将以Typecho为例子来讲解如何部署一个K3s应用。
首先创建一个命名空间:
代码语言:shell复制kubectl create ns external
然后创建一个文件typecho.yaml,注意替换里面的域名。
代码语言:shell复制vi typecho.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: typecho-pvc
namespace: external
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: typecho-deployment
namespace: external
spec:
selector:
matchLabels:
app: typecho
replicas: 1
template:
metadata:
labels:
app: typecho
spec:
containers:
- name: typecho
image: joyqi/typecho:nightly-php7.4-apache
imagePullPolicy: IfNotPresent
args:
- -c
- chmod 777 /app/usr && init_typecho apache
command:
- /bin/sh
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/app/usr"
name: pv-typecho
volumes:
- name: pv-typecho
persistentVolumeClaim:
claimName: typecho-pvc
---
apiVersion: v1
kind: Service
metadata:
name: typecho-service
namespace: external
spec:
selector:
app: typecho
ports:
- name: typecho
port: 8080
targetPort: 80
clusterIP: None
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: typecho-ingress
namespace: external
spec:
entryPoints:
- web
routes:
- match: Host(`你的域名`) && PathPrefix(`/`)
kind: Rule
services:
- name: typecho-service
port: typecho
然后使用以下指令部署Typecho:
代码语言:shell复制kubectl apply -f typecho.yaml
我们可以通过Rancher查看部署状态,也可以通过CLI查看:
代码语言:shell复制kubectl describe deploy typecho-deployment -n external
部署完成之后,我们就可以访问域名对Typecho进行配置。
在这个例子中,我们为容器创建了一个PVC(持久卷声明),而这个声明依赖于Longhorn提供的Storage Class。我们可以访问Longhorn的控制面板查看这个持久卷。
可以看到,我们挂载到容器里面的持久卷实际上有两个Replicate,分别分布在两个节点上,这也就保证了即使任意一台服务器宕机,也不会影响我们的存储。同时我们在上面的typecho.yaml文件中声明了Deployment类型的对象,该对象的Replicate为1,也就意味着K3s始终会维系一个Typecho运行,如果Typecho所属的节点宕机,那么K3s会自动迁移Typecho到可用的节点。
总结
通过Typecho的例子我们可以看到,借助K3s,我们可以比较容易的分布式部署我们的应用;我们可以增加或减少Worker节点的数量而不影响部署的应用与存储。Kubernetes是云原生时代的“操作系统”,复杂而又强大,感兴趣的朋友可以查看官方文档以了解更多。