杯子茶室

关注有趣的事物

Kubernetes 学习日记01:创建集群、安装openebs提供持久化存储、将博客迁移到K8S中

网络 0 评

搭建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)

Kubernetes学习日记02:部署私人镜像仓库
发表评论
撰写评论