Halo-K8S
用以保存 mysql 数据库密码的 Secret
apiVersion: v1 kind: Secret metadata: name: halo-mysql-secret data: MYSQL_ROOT_PASSWORD: bGl0QFBhc3N3b3Jk # 必须是 base64 编码,在 Linux 可以通过 “echo -n "123456" | base64”命令获取 type: Opaque
用以保存 halo 连接 mysql 数据库密码和 redis 缓存密码的 Secret
apiVersion: v1 kind: Secret metadata: name: halo-secret data: SPRING_DATASOURCE_PASSWORD: bGl0QFBhc3N3b3Jk # 必须是 base64 编码,在 Linux 可以通过 “echo -n "123456" | base64”命令获取 SPRING_REDIS_PASSWORD: bGl0QFBhc3N3b3Jk type: Opaque
用以保存 mysql 配置文件的 ConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: halo-mysql-config data: my.cnf: |- [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] default_authentication_plugin=mysql_native_password character-set-server=utf8mb4 collation-server=utf8mb4_general_ci explicit_defaults_for_timestamp=true
用以保存 redis 配置文件的 ConfigMap,requirepass 的值为 redis 的连接密码
apiVersion: v1 kind: ConfigMap metadata: name: halo-redis-config data: redis.conf: |- port 6379 bind 0.0.0.0 appendonly yes protected-mode no requirepass YourPassword
halo 需要的存储空间,用以持久化 /root/.halo 里的数据
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: halo-data-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: alicloud-nas # storageClass 可根据您本地集群拥有的类型进行选择,这里采用的是 nfs-client
将 mysql 数据库以 StatefulSet 工作负载形式创建出来
apiVersion: apps/v1 kind: StatefulSet metadata: name: halo-mysql labels: app: halo-mysql spec: replicas: 1 selector: matchLabels: app: halo-mysql template: metadata: labels: app: halo-mysql spec: volumes: # 将前面创建的 ConfigMap 定义出来,方便后面调用 - name: halo-mysql-config configMap: name: halo-mysql-config defaultMode: 420 containers: - name: mysql image: 'mysql:8.0.27' # mysql 数据库的镜像版本,这里选择 mysql 8.0 ports: - name: tcp-3306 containerPort: 3306 # 将容器的 3306 端口暴露出来 protocol: TCP env: # 配置 mysql 数据库环境变量 - name: MYSQL_ROOT_PASSWORD # 数据库 root 账户的密码,这里采用 Secret方式初始化连接密码,下面填写最开始创建的名称为“halo-mysql-secret”的 Secret valueFrom: secretKeyRef: name: halo-mysql-secret key: MYSQL_ROOT_PASSWORD - name: MYSQL_DATABASE # 启动后创建一个名为 halodb 的库 value: halodb volumeMounts: - name: halo-mysql-pvc # 将 mysql 数据库的 “/var/lib/mysql” 进行持久化,数据库落盘到名称为 “halo-mysql-pvc” 的持久化数据卷 mountPath: /var/lib/mysql - name: halo-mysql-config # 将 my.cnf 配置文件以 ConfigMap 的形式进行外部挂载 readOnly: true mountPath: /etc/mysql/conf.d/my.cnf subPath: my.cnf serviceName: halo-mysql-service volumeClaimTemplates: # 创建 mysql 数据库需要的持久化卷 - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: halo-mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: alicloud-nas # storageClass 可根据您本地集群拥有的类型进行选择,这里采用的是 nfs-client
为 mysql 工作负载创建 service
apiVersion: v1 kind: Service metadata: name: halo-mysql-service spec: ports:
- name: tcp-3306 protocol: TCP port: 3306 targetPort: 3306 selector: app: halo-mysql clusterIP: None
将 redis 缓存以 StatefulSet 工作负载形式创建出来
apiVersion: apps/v1 kind: StatefulSet metadata: name: halo-redis labels: app: halo-redis spec: replicas: 1 selector: matchLabels: app: halo-redis template: metadata: labels: app: halo-redis spec: containers: - name: halo-redis image: 'redis:7.0.9' ports: - name: tcp-6379 # 将容器的 6379 端口暴露出来 protocol: TCP containerPort: 6379 livenessProbe: # 健康检查配置,添加探针以定时检查容器健康状态 initialDelaySeconds: 300 timeoutSeconds: 1 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 tcpSocket: port: 6379 readinessProbe: initialDelaySeconds: 5 timeoutSeconds: 1 periodSeconds: 10 successThreshold: 1 failureThreshold: 3 tcpSocket: port: 6379 command: - sh - '-c' - redis-server /usr/local/etc/redis/redis.conf volumeMounts: - readOnly: false mountPath: /data # 将 redis 缓存的 “/data” 进行持久化,数据库落盘到名称为 “halo-redis-pvc” 的持久化数据卷 name: redis-pvc - name: halo-redis-config # 将 redis.conf 配置文件以 ConfigMap 的形式进行外部挂载 readOnly: true mountPath: /usr/local/etc/redis/redis.conf subPath: redis.conf initContainers: # 初始化容器定义,使用启动脚本通过初始化容器对 redis 进行初始化操作 - name: system-init image: 'busybox:1.32' command: - sh - '-c' - >- echo 2048 > /proc/sys/net/core/somaxconn && echo never > /sys/kernel/mm/transparent_hugepage/enabled securityContext: # 启用容器安全上下文权限为特权模式,以主机上的 root 用户运行容器进程 privileged: true volumes: # 将前面创建的 ConfigMap 定义出来,方便后面调用 - name: halo-redis-config configMap: name: halo-redis-config serviceName: halo-redis-service volumeClaimTemplates: # 创建 redis 缓存需要的持久化卷 - spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: alicloud-nas # storageClass 可根据您本地集群拥有的类型进行选择,这里采用的是 nfs-client metadata: name: redis-pvc
为 redis 工作负载创建 service
apiVersion: v1 kind: Service metadata: name: halo-redis-service spec: selector: app: halo-redis ports: - name: tcp-6379 protocol: TCP port: 6379 targetPort: 6379 clusterIP: None
将 halo 前端服务以 Deployment 工作负载的方式创建出来
apiVersion: apps/v1
kind: Deployment
metadata:
name: halo-front
labels:
app: halo-front
spec:
replicas: 1
selector:
matchLabels:
app: halo-front
template:
metadata:
labels:
app: halo-front
spec:
volumes: # 将前面创建的 ConfigMap 定义出来,方便后面调用
- name: halo-data-pvc
persistentVolumeClaim:
claimName: halo-data-pvc
containers:
- name: halo
image: 'halohub/halo:2.3.1' # halo 的镜像版本,后续修改这里的版本号可以实现 halo 的滚动升级
ports:
- name: http-8090
containerPort: 8090
protocol: TCP
env:
- name: SERVER_PORT
value: '8090'
- name: SPRING_DATASOURCE_DRIVER_CLASS_NAME
value: com.mysql.cj.jdbc.Driver
- name: SPRING_DATASOURCE_URL # 注意下面 3306 前面的 halo-mysql-service 为 mysql 数据库的 service 名称,如果前面 mysql 数据库的 service 做了修改,这里也要修改
value: jdbc:mysql://halo-mysql-service:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- name: SPRING_DATASOURCE_USERNAME
value: root
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: halo-secret # halo 连接数据库的密码,这里采用 Secret 方式初始化连接密码,下面填写最开始创建的名称为“halo-secret”的 Secret
key: SPRING_DATASOURCE_PASSWORD
- name: HALO_ADMIN_PATH
value: admin
- name: HALO_CACHE
value: redis
- name: SPRING_REDIS_PORT
value: '6379'
- name: SPRING_REDIS_DATABASE
value: '0'
- name: SPRING_REDIS_HOST
value: halo-redis-service
- name: SPRING_REDIS_PASSWORD # halo 连接缓存的密码,这里采用 Secret 方式初始化连接密码,下面填写最开始创建的名称为“halo-secret”的 Secret
valueFrom:
secretKeyRef:
name: halo-secret
key: SPRING_REDIS_PASSWORD
volumeMounts: # 将 halo 的 “/root/.halo” 进行持久化,数据库落盘到名称为 “halo-front-pvc” 的持久化数据卷
- name: halo-data-pvc
mountPath: /root/.halo
为 halo 工作负载创建 service,并通过 nodePort 的方式暴露出来
apiVersion: v1 kind: Service metadata: name: halo-web-service spec: type: NodePort ports:
- name: tcp-8090 protocol: TCP port: 8090 targetPort: 8090 nodePort: 30890 selector: app: halo-front
评论区