搭建K8S集群
我的设备都比较弱,用了两个树莓派4B(1G和2G RAM的)、一个1G内存虚拟机、一个4G内存的路由器(但不参与调度)、一个DigitalOcean的1C2G的VPS。为了节省资源,使用了K3S搭建集群。
# 在第一个控制平面服务器上运行以下命令
curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - server --node-ip <你的主机IP> --cluster-init --flannel-backend=wireguard-native K3S_DATASTORE_ENDPOINT="etcd"
# 在其他控制平面服务器上运行以下命令
curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh k3s-install.sh server --server https://<你的第一台控制平面主机IP>:6443 --node-ip <你的主机IP> --flannel-backend=wireguard-native K3S_DATASTORE_ENDPOINT="etcd"
# 在不参与控制平面的机器上运行以下命令,由于我的树莓派使用SD卡作为存储介质,etcd是存储密集型的,sd卡扛不住,就以普通的agent进行安装
curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh k3s-install.sh agent --server https://10.66.35.42:6443
# 等待集群机器上的K3S服务全部启动完成,检查集群Node运行状态
kubectl get node
安装openebs提供持久化存储
为了平滑从docker迁移到k8s,需要部署持久化存储,这里使用openebs提供包含replica的持久化存储
# Debian/Ubuntu/Raspbian 安装iscsi
sudo apt install open-iscsi
# 添加helm chart源
helm repo add openebs https://openebs.github.io/charts
helm repo update
# powershell
helm install openebs openebs/openebs --namespace openebs --create-namespace `
--set legacy.enabled=false `
--set jiva.enabled=true `
--set openebs-ndm.enabled=true `
--set localpv-provisioner.enabled=true `
--set jiva.defaultStoragePath=/var/openebs `
--set image.repository=k8s-gcr.m.daocloud.io
# bash
helm install openebs openebs/openebs --namespace openebs --create-namespace \
--set legacy.enabled=false \
--set jiva.enabled=true \
--set openebs-ndm.enabled=true \
--set localpv-provisioner.enabled=true \
--set jiva.defaultStoragePath=/var/openes \
--set image.repository=k8s-gcr.m.daocloud.io
将博客迁移到K8S中
这个博客之前是运行在我Mac Mini里面的,但我的Mac Mini至少有四十多个容器了,而且一直想做到HA。于是有迁移到K8S的想法。
部署
使用openebs的jiva作为含备份的持久化存储,我的博客是用Typecho搭建的,用的是SQLite,只需要提供存储就可以了,不需要提供SQL数据库。
保存以下Yaml文件为pvc.yaml。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: typecho-data
spec:
storageClassName: openebs-jiva-csi-default
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
然后执行kubectl apply -f pvc.yaml
即可创建pvc。
接下来创建Typecho的Deployment。
apiVersion: apps/v1
kind: Deployment
metadata:
name: typecho-blog
spec:
replicas: 1
selector:
matchLabels:
app: typecho-blog
template:
metadata:
labels:
app: typecho-blog
spec:
containers:
- name: typecho-blog
image: 80x86/typecho
ports:
- containerPort: 80
env:
- name: PHP_TZ
value: "Asia/Shanghai"
- name: PHP_MAX_EXECUTION_TIME
value: "600"
volumeMounts:
- name: typecho-data
mountPath: /data
- name: tmpfs
mountPath: /tmp
volumes:
- name: typecho-data
persistentVolumeClaim:
claimName: typecho-data
- name: tmpfs
emptyDir:
medium: Memory
---
apiVersion: v1
kind: Service
metadata:
name: typecho-blog-service
spec:
selector:
app: typecho-blog
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
ports:
- port: 80
nodePort: 30380
在应用这个Deployment之前,需要先将数据迁移到PVC里面。
数据迁移
使用临时Pod进行数据迁移,这个Pod挂载typecho-data,将typecho的数据复制到pod里面然后再copy到PVC中。
以下是这个Pod的Yaml
apiVersion: v1
kind: Pod
metadata:
name: data-copy-pod
spec:
containers:
- name: busybox
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- name: typecho-data
mountPath: /data
volumes:
- name: typecho-data
persistentVolumeClaim:
claimName: typecho-data
执行以下命令把数据拷贝到Pod中。
kubectl cp typecho/ data-copy-pod:/
然后执行以下命令将内容全部转移到PVC
kubectl exec -it data-copy-pod mv /typecho/* /data
最后应用博客的Deployment
kubectl apply -f deployment.yaml
参考
OpenEBS Jiva 复制卷部署笔记 | 翠鸟图书馆 Project Halcyon Library (pha.pub)