V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cclt
V2EX  ›  Kubernetes

Kubernetes(K8S)快速搭建 typecho 个人博客

  •  
  •   cclt · 2023-10-25 22:58:01 +08:00 · 2400 次点击
    这是一个创建于 394 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Kubernetes ( K8S )快速搭建 typecho 个人博客

    1 、准备工作

    K8S 集群环境,搭建教程参考腾讯云 Lighthouse 组建跨地域 Kubernetes 集群 K8S 集群面板,搭建教程参考Kubernetes 集群管理面板的安装及使用 - 青阳のblog-一个计算机爱好者的个人博客 (hipyt.cn)

    注意

    如果没有集群或者服务器不够可以通过官网新购。

    购买并配置 Lighthouse 服务器 Lighthouse 是腾讯云推出的一款轻量应用服务器产品,它提供了高性价比、高可用性、高安全性和高灵活性的云端计算服务。具体信息参阅官方文档: https://cloud.tencent.com/document/product/1207/44361

    2 、部署说明

    说明:本文的教程是基于 Kubernetes 集群的,搭建了 kuboard 管理面板,之后在进行搭建 typecho 博客的教程。

    本文使用的对应 docker 镜像的地址如下: MySQL:mysql - Official Image | Docker Hub typecho:rehiy/typecho - Docker Image | Docker Hub

    3 、创建 mysql 数据库

    3.1 mysql 配置文件

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: &name mysql   # Deployment 的标签,用于标识资源为 mysql 应用程序
      name: *name  # Deployment 的名称为 mysql
      namespace: default  # Deployment 所在的命名空间为 default
    spec:
      replicas: 1  # Deployment 副本数量为 1
      selector:  # 标签选择器,选择包含标签 app:mysql 的资源
        matchLabels:
          app: *name
      template:  # Pod 的模板,用于选择或创建 Pod
        metadata:  # Pod 的元数据
          labels:
            app: *name
        spec:
          affinity:  # Pod 亲和性设置
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchFields:
                      - key: metadata.name
                        operator: In
                        values:
                          - vm-4-13-ubuntu  # 选择节点名称为 vm-4-13-ubuntu 的节点作为部署目标
          containers:  # 容器定义
          - name: *name  # 容器的名称为 mysql
            image: mysql:latest  # 使用最新版的 MySQL 镜像
            ports:  # 容器端口映射
            - containerPort: 3306  # 将容器的 3306 端口暴露出来
            env:  # 环境变量设置
            - name: MYSQL_ROOT_PASSWORD  # MySQL 的 root 用户密码
              value: typecho@123
            - name: MYSQL_DATABASE  # MySQL 数据库名称
              value: typecho
            - name: MYSQL_USER  # MySQL 用户名
              value: typecho
            - name: MYSQL_PASSWORD  # MySQL 用户密码
              value: typecho@123
            volumeMounts:  # 容器的卷挂载设置
            - name: db  # 指定卷的名称为 db
              mountPath: /var/lib/mysql  # 将卷挂载到容器的/var/lib/mysql 路径下
          volumes:  # 卷定义
          - name: db  # 卷的名称为 db
            hostPath:
              path: /var/lib/mysql  # 指定主机上的路径/var/lib/mysql 作为卷的路径
    
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql  # Service 的名称为 mysql
      namespace: default  # Service 所在的命名空间为 default
    spec:
      type: ClusterIP  # Service 类型为 ClusterIP ,内部集群使用
      selector:
        app: mysql
      ports:
      - name: db-port
        protocol: TCP
        port: 3306  # Service 的端口号为 3306
        targetPort: 3306  # Service 转发流量到 Pod 的 3306 端口
    
    
    

    3.2 使用配置文件创建 mysql 服务

    输入图片说明 输入图片说明 输入图片说明 把上面的 yaml 配置修改之后复制粘贴到这里直接提交确定。 输入图片说明 这样就是成功搭建了 mysql 服务,点击进去可以看到具体信息。

    4 、创建 typecho

    4.1 mysql 配置文件

    kind: Deployment  # 创建 Deployment 资源
    apiVersion: apps/v1
    metadata:
      name: &name myblog  # 定义名为 myblog 的标量锚点,值为"myblog"。并将锚点引用到 name 字段中
      namespace: default
      labels:
        app: *name  # 将锚点引用到 app 标签的值上
    spec:
      selector:
        matchLabels:
          app: *name  # 根据 app 标签选择匹配的 Pod
      template:
        metadata:
          labels:
            app: *name  # 在 Pod 模板中使用 app 标签,并引用锚点
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchFields:
                      - key: metadata.name
                        operator: In
                        values:
                          - vm-4-13-ubuntu  # 选择节点名称为 vm-4-13-ubuntu 的节点作为部署目标
          containers:
            - name: typecho  # 定义一个名为 typecho 的容器
              image: rehiy/typecho  # 使用 rehiy/typecho 镜像
              ports:
                - containerPort: 80  # 容器暴露的端口号为 80
                - containerPort: 443  # 容器暴露的端口号为 443
              volumeMounts:
                - name: *name  # 引用锚点指定的卷名
                  subPath: usr  # 指定挂载到容器的子路径为 usr
                  mountPath: /var/www/default/usr  # 将卷挂载到容器的/var/www/default/usr 路径下
          volumes:
            - name: *name  # 引用锚点指定的卷名
              hostPath:
                path: /srv/myblog  # 指定主机上的路径/srv/myblog 作为卷的路径
                type: DirectoryOrCreate  # 如果路径不存在,则创建目录
    
    ---
    
    kind: Service  # 创建 Service 资源
    apiVersion: v1
    metadata:
      name: &name myblog  # 引用锚点指定的名称
      namespace: default
      labels:
        app: *name  # 引用锚点指定的标签值
    spec:
      selector:
        app: *name  # 根据 app 标签选择匹配的 Pod
      ports:
        - name: http  # 定义名为 http 的端口
          port: 80  # Service 监听的端口号为 80
          targetPort: 80  # Service 转发流量到 Pod 的端口号为 80
        - name: https  # 定义名为 https 的端口
          port: 443  # Service 监听的端口号为 443
          targetPort: 443  # Service 转发流量到 Pod 的端口号为 443
    
    ---
    
    kind: Ingress  # 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    metadata:
      name: &name myblog  # 引用锚点指定的名称
      namespace: default
      annotations:
        traefik.ingress.kubernetes.io/router.entrypoints: web,websecure  # Traefik 路由入口配置
    spec:
      rules:
        - host: blog.eg.cn  # 定义访问 Ingress 的域名
          http:
            paths:
              - path: /  # 匹配路径为/
                pathType: Prefix  # 路径类型为前缀匹配
                backend:
                  service:
                    name: *name  # 引用锚点指定的 Service 名称
                    port:
                      name: http  # 引用锚点指定的端口名称
      tls:
        - secretName: default  # 使用名为 default 的 TLS 证书密钥对,用于 HTTPS 访问
    
    

    4.2 使用配置文件创建 typecho 博客

    输入图片说明 输入图片说明 和创建 mysql 一样的方式复制修改配置文件即可成功搭建。

    4 、测试使用

    首先把域名解析到对应的 pod 的 ip 之后,直接用域名访问。访问成功即创建博客成功,然后根据提示进行下一步安装。 提示 输入图片说明 这里建议选择我标注出来的这个。 输入图片说明

    5 、总结

    Kubernetes 提供了强大的高可用性特性,它可以自动管理和调度容器实例,确保应用程序在集群中始终可用。还可以监控和自动修复故障的容器实例,提高博客的稳定性和可靠性。它的弹性伸缩的特性,可以根据负载变化自动调整程序。当博客访问量增加时,Kubernetes 可以自动扩展应用程序的实例数以满足需求,并在访问量下降时自动缩减资源的使用。大家如果发现它别的特点功能可以和我讨论!或者还有什么类似的程序大家也可以分享一下!

    26 条回复    2023-12-05 03:16:17 +08:00
    baiduyixia
        1
    baiduyixia  
       2023-10-25 23:37:29 +08:00   ❤️ 2
    你这叫快速?????购买个虚拟主机,这才是快速:下载上传安装,搞定!
    rus4db
        2
    rus4db  
       2023-10-25 23:46:24 +08:00   ❤️ 2
    想到了那个 meme:巨大的平板拖车上放着一个小小的纸盒
    jackgoudan
        3
    jackgoudan  
       2023-10-25 23:47:46 +08:00   ❤️ 4
    高射炮打蚊子
    shuxhan
        4
    shuxhan  
       2023-10-26 00:28:56 +08:00
    你这也太复杂了吧
    xiaoranj
        5
    xiaoranj  
       2023-10-26 00:35:21 +08:00
    @rus4db 我想到了另一个 meme:巨大的平板拖车上放着一大摞东西,前面是个小三轮车头,上面写着 “J1900”
    stinkytofu
        6
    stinkytofu  
       2023-10-26 01:53:59 +08:00
    核弹炸小强
    fox0001
        7
    fox0001  
       2023-10-26 07:50:22 +08:00 via Android
    up 主只是想分享知识的吧?买的 VPS ,才 512MB 内存,不敢上 K8S
    bigha
        8
    bigha  
       2023-10-26 08:47:37 +08:00
    说实话 搭建 k3s 集群的脚本写的不错 但漏掉了很多细节 对小白还是很致命啊 比如

    1 、可能要升级系统内核
    2 、得自己配置镜像加速
    coolcoffee
        9
    coolcoffee  
       2023-10-26 09:47:10 +08:00
    OP 这个快速搭建教程,小白两三天能学会都算厉害的了。

    Kubernetes 的高可用仅限于云厂商全托管的集群,否则网络、存储、节点扩容以及自愈都会是问题。 当然,Kubernetes 专家除外。
    luomao
        10
    luomao  
       2023-10-26 10:35:26 +08:00
    🤣航空母舰载 mini 无人机?
    mightybruce
        11
    mightybruce  
       2023-10-26 10:55:47 +08:00
    建议楼主 至少建个 helm 模板,对于这种个人博客来说,很多小白不愿意钻研技术的。
    mightybruce
        12
    mightybruce  
       2023-10-26 10:57:35 +08:00
    另外这样的个人博客,在很多云平台上是有运开定制好的应用模板,有的还有 servereless 博客服务,点击几下,几十秒就自动创建了, 你这个倒是很像自学 kubernetes 的新手。
    BaseException
        13
    BaseException  
       2023-10-26 10:58:50 +08:00   ❤️ 1
    docker 或者 docker-compose 部署 typecho 是个不错的折衷方案。。
    zhonj
        14
    zhonj  
       2023-10-26 11:07:43 +08:00
    核弹打细菌
    klo424
        15
    klo424  
       2023-10-26 11:14:22 +08:00
    腾讯云的软广是吧
    anubu
        16
    anubu  
       2023-10-26 11:22:00 +08:00
    搭建个人博客前要先部署一个 k8s 集群,感谢你对 yaml 工程师的认可,如果不是有意揭露我们工作本质的话。
    szdev
        17
    szdev  
       2023-10-26 11:34:40 +08:00
    这软广不错
    dif
        18
    dif  
       2023-10-26 11:48:48 +08:00
    想起一张图,一个半挂拉着一个小盒子。
    imes
        19
    imes  
       2023-10-26 11:53:53 +08:00   ❤️ 4
    帮楼上补一张图

    blackmirror
        20
    blackmirror  
       2023-10-26 17:21:06 +08:00
    嗯,下次 PHP 面试就用这题目了
    cclt
        21
    cclt  
    OP
       2023-10-31 22:03:38 +08:00
    @BaseException 道理是一样的
    cclt
        22
    cclt  
    OP
       2023-10-31 22:04:18 +08:00
    @mightybruce 我也是在别人的指导下,慢慢的入门的,我就吧自己摸索过程分享出来
    cclt
        23
    cclt  
    OP
       2023-10-31 22:04:47 +08:00
    @fox0001 是的呢
    cclt
        24
    cclt  
    OP
       2023-10-31 22:06:03 +08:00
    @coolcoffee 安装我写的教程,一步步的来应该很好完成的
    cclt
        25
    cclt  
    OP
       2023-10-31 22:06:57 +08:00
    @rus4db 恰如其分,我只是刚学习这个集群,还不知道怎么玩好,就弄这么个玩意
    johnzr
        26
    johnzr  
       354 天前
    你这 typecho 如何与 mysql 数据库连接的?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2173 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:51 · PVG 08:51 · LAX 16:51 · JFK 19:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.