博客(halo)迁移到 K8s 上了

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: k8s实践

kubernetes集群信息

[root@vm-24-13-centos ~]# kubectl get nodes
NAME              STATUS   ROLES                         AGE   VERSION
vm-24-13-centos   Ready    control-plane,master,worker   14d   v1.20.4

创建halo工作目录

  1. 在系统任意位置创建一个文件夹,此文档以 ~/halo-app 为例。
mkdir ~/halo-app && cd ~/halo-app
注意:后续操作中,Halo 的所有相关数据都会保存在这个目录,请妥善保存。

创建secret配置信息

创建 generate-secret.sh 文件,生成secret字段信息

在 kubernetes 中,推荐使用 secret 存储敏感的配置信息。
#!/usr/bin/env bash
kubectl create secret generic halo-secret \
  --from-literal=data_source_url='jdbc:mysql://10.0.1.13:33306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true' \
  --from-literal=datasource_password=Dxxxxxxxxxxss= \
  --from-literal=datasource_username=halo \
  -n blogs

脚本中字段的信息释义:

  • data_source_url: 以MySQL作为数据存储,halo使用jdbc驱动连接,其中 10.0.1.13:33306 为MySQL服务的IP地址和端口号,halodb 为halo所需要的数据库。
  • datasource_username: halo连接MySQL的用户名
  • datasource_password: halo连接MySQL时 datasource_username 的密码
  • -n: 表示此secret所在命名空间

配置MySQL账号信息

  1. 在MySQL中创建以上脚本中预先定义好的用户名、密码、以及 halo 运行所需要的数据库 halodb,以下以 mysql:8.0.30 为例
CREATE USER 'halo'@'%' IDENTIFIED BY 'Dxxxxxxxxxxss=';
grant select,update,insert,delete,index on halodb.* to 'halo'@'%';
flush privileges;

配置持久化存储卷

在 k8s 中运行 halo,会涉及到主题、静态资源如上传本地图片等需要持久化到数据卷中,为了后期的数据迁移,需要配置持久卷存储这些数据,此处我们使用本地存储。

  1. 创建 halo.pv.yaml 文件
apiVersion: v1
kind: PersistentVolume
metadata:
  name: halo-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data/halo" # 此目录为halo的数据目录
  1. 创建 halo.pvc.yaml 文件
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: halo-pv-claim
  namespace: blogs
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

准备halo的部署文件

创建 halo.deployment.yaml 文件,定义 halo 服务运行状态

apiVersion: apps/v1
kind: Deployment
metadata:
  name: halo-server
  namespace: blogs
  labels:
    app: halo-server
spec:
  revisionHistoryLimit: 5 # deployment历史保留数量
  strategy:
    rollingUpdate: # 滚动升级策略
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  replicas: 1
  template:
    metadata:
      name: halo-server
      labels:
        app: halo-server
    spec:
      containers:
        - name: halo-server
          image: halohub/halo:1.5.4 # 直接修改此处。更新版本即可
          imagePullPolicy: IfNotPresent
          resources:
            limits: # 定义halo服务资源使用
              cpu: 2
              memory: 1Gi
            requests:
              cpu: 1
              memory: 500Mi
          ports:
            - containerPort: 8090 # 服务端口
              name: http
          env: # halo的配置均以环境变量的方式配置
            - name: SERVER_PORT
              value: "8090"
            - name: SPRING_DATASOURCE_DRIVER_CLASS_NAME
              value: com.mysql.cj.jdbc.Driver
            - name: SPRING_DATASOURCE_URL
              valueFrom:
                secretKeyRef:
                  key: data_source_url # 从secert中读取数据源信息
                  name: halo-secret
                  optional: false
            - name: SPRING_DATASOURCE_USERNAME # 从secert中读取halo数据用户
              valueFrom:
                secretKeyRef:
                  key: datasource_username
                  name: halo-secret
                  optional: false
            - name: SPRING_DATASOURCE_PASSWORD # 从secert中读取halo数据用户的密码
              valueFrom:
                secretKeyRef:
                  key: datasource_password
                  name: halo-secret
                  optional: false
            - name: HALO_ADMIN_PATH
              value: admin
            - name: HALO_CACHE
              value: memory
          volumeMounts:
            - mountPath: /root/.halo # 配置halo的数据目录
              name: halo-data
            - mountPath: /etc/localtime # 配置时间
              name: timezone
              readOnly: true
      restartPolicy: Always
      volumes:
        - name: halo-data
          persistentVolumeClaim:
            claimName: halo-pv-claim
        - name: timezone
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
  selector:
    matchLabels:
      app: halo-server

配置 halo 的服务

创建 halo.svc.yaml 文件,声明 halo 的暴露方式

apiVersion: v1
kind: Service
metadata:
  name: halo
  namespace: blogs
spec:
  selector:
    app: halo-server
  ports:
    - port: 8090
      name: halo-port
      targetPort: http
  type: ClusterIP

配置证书

配置证书,提供 https 访问 halo 服务

~# ls -al
drwxr-xr-x@  6 marionxue  staff   192 Jul 30 22:33 .
drwxr-xr-x  13 marionxue  staff   416 Aug  9 21:00 ..
-rw-r--r--@  1 marionxue  staff  1016 Jul 30 22:33 devopsman.cn.csr
-rw-r--r--@  1 marionxue  staff  1678 Jul 30 22:33 devopsman.cn.key
-rw-r--r--@  1 marionxue  staff  4105 Jul 30 22:33 devopsman.cn_bundle.crt
-rw-r--r--@  1 marionxue  staff  4105 Jul 30 22:33 devopsman.cn_bundle.pem
~# kubectl create secret tls devopsman-cn-ssl  --cert=./devopsman.cn.ssl/devopsman.cn_bundle.crt --key=./devopsman.cn.ssl/devopsman.cn.key --namespace blogs

配置ingress,提供外部访问方式

创建 halo.ingress.yaml 文件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: halo-ingress
  labels:
    exposed_by: ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "20M"
spec:
  ingressClassName: nginx
  rules:
    - host: devopsman.cn
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: halo
                port:
                  number: 8090
  tls:
    - hosts:
        - devopsman.cn
      secretName: devopsman-cn-ssl

完成以上资源定义之后,即可应用。

kubectl apply -f .
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
9月前
|
存储 Kubernetes 文件存储
Kubernetes跨StorageClass迁移,切换Rainbond默认SC
在原生的 Kubernetes 集群中,通过 StorageClass 创建的 PVC 是无法修改存储后端的,需要将 PV、PVC 删除后通过新的 StorageClass 创建新的 PVC,然后再将数据迁移,再重新挂载 PVC。当有很多个 PVC 时,需要多次重复的操作。 而 Rainbond 虽然也是通过 StorageClass 创建的 PVC,但相比原生 Kubernetes 省去了创建 PV、PVC 和重新挂载的步骤,以及重复性的操作。在 Rainbond 中只需要将底层存储类更换,然后迁移 Rainbond 所创建的一整个目录,最后重新在页面中修改挂载即可完成迁移。
|
9月前
|
Kubernetes 开发工具 Docker
kubernetes环境从docker迁移到containerd
kubernetes环境从docker迁移到containerd
|
存储 Kubernetes Linux
ACK下使用Velero进行备份、迁移、恢复-之安装篇
Velero 是用Go 语言 写的一款用于Kubernetes灾难恢复和迁移的工具。
975 0
|
Kubernetes 容灾 容器
《云迁移与云容灾-基于弹性裸金属(神龙)服务器K8S容器迁云最佳实践》电子版地址
云迁移与云容灾-基于弹性裸金属(神龙)服务器K8S容器迁云最佳实践
104 0
《云迁移与云容灾-基于弹性裸金属(神龙)服务器K8S容器迁云最佳实践》电子版地址
|
存储 Kubernetes JavaScript
Kubernetes Docker Compose 迁移
Kubernetes Docker Compose 迁移
388 1
|
存储 弹性计算 Kubernetes
如何在零停机的情况下迁移 Kubernetes 集群
本文将通过集群迁移的需求、场景以及实践方式,介绍如何基于阿里云容器服务 ACK,在零停机的情况下迁移 Kubernetes 集群。
如何在零停机的情况下迁移 Kubernetes 集群
|
Kubernetes 应用服务中间件 容器
SpringCloud迁移至EDAS微服务——Series3:在容器服务K8s集群中部署应用
SpringCloud迁移至EDAS微服务——Series3:在容器服务K8s集群中部署应用
SpringCloud迁移至EDAS微服务——Series3:在容器服务K8s集群中部署应用
|
弹性计算 文字识别 Kubernetes
自建K8S迁移镜像、应用至阿里云ACK最佳实践
本最佳实践构建以下场景: 1、以河源ECS构建Harbor仓库,模拟IDC的镜像仓库服务。 2、以河源ECS构建Registry仓库,模拟IDC的镜像仓库服务。 3、以河源地域模的ECS搭建K8S集群,模拟线下IDC的K8S环境。 4、使用velero对云上的K8S应用进行定期备份,并存至OSS上,确保应用数据不 丢失。
自建K8S迁移镜像、应用至阿里云ACK最佳实践
|
1月前
|
Kubernetes 微服务 容器
Aspire项目发布到远程k8s集群
Aspire项目发布到远程k8s集群
397 2
Aspire项目发布到远程k8s集群