惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
WordPress大学
WordPress大学
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
I
InfoQ
小众软件
小众软件
Recent Announcements
Recent Announcements
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
大猫的无限游戏
大猫的无限游戏
美团技术团队
T
The Blog of Author Tim Ferriss
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog
V
V2EX
J
Java Code Geeks
有赞技术团队
有赞技术团队
博客园 - 聂微东
B
Blog RSS Feed
博客园 - 司徒正美

Dosk 技术站

华为荣耀电视盒子刷 Armbian - Dosk 技术站 记录一个没意义的 usb wifi 驱动编译 - Dosk 技术站 我的 2024 - Dosk 技术站 unRAID 7.0.0-beta.1 - Dosk 技术站 关于 unraider 的开心版 - Dosk 技术站 unRAID 6.12.7-rc2 进展 - Dosk 技术站 每年问自己 40 个问题 - Dosk 技术站 2023 年度总结 - Dosk 技术站 N100 万兆软路由最终形态 - Dosk 技术站 N100 软路由改造下散热 - Dosk 技术站 N100 万兆软路由测测速 - Dosk 技术站 整活新玩具,半 DIY 一个万兆软路由 - Dosk 技术站 玩玩 WebAuthn:RP2040 One - Dosk 技术站 关于最近以及后续要做什么 - Dosk 技术站 unRAID 6.12.0-rc7/6.12.0-rc6.13 - Dosk 技术站 unRAID 6.12.0-beta18 试用 - Dosk 技术站 unRAID 6.11.4 如何继续开心 - Dosk 技术站 cert-manager 基于 acme.sh 的 webhook - Dosk 技术站 unRAID 虚拟机运行 unRAID 简单步骤 - Dosk 技术站 解决 Chrome 原生谷歌翻译功能的一个思路:3/3 - Dosk 技术站 解决 Chrome 原生谷歌翻译功能的一个思路:1/3 - Dosk 技术站 unraid 命令行包管理器 - Dosk 技术站 继续,unraid 6.11 happy 的方法 - Dosk 技术站 适用于 k8s 的 frpc ingress 实现 - Dosk 技术站 实现了一个简单的通配 DNS 服务 - Dosk 技术站 代码更新,happy unraid 懒人版 - Dosk 技术站 复盘一次群晖的 btrfs + docker:dind 引发的灾难 - Dosk 技术站 unraid 官方版不修改不用 keymaker 可持续 happy 的方法 - Dosk 技术站 unraid 实现完美硬盘启动 - Dosk 技术站 rpi3b+ 跑 pi-kvm 项目记录 - Dosk 技术站
Kubernetes 集群导航页 - Dosk 技术站
2023-12-29 · via Dosk 技术站

  • 我在家里的服务,都是基于 k8s 来部署的,抛开复杂度看,能够以统一的方式控制所有机器并灵活调度的特性深得我心。
  • 不过,像所有人一样,我也希望能让所有的入口统一起来,也就是各个玩家都会搭建的导航页;鉴于 k8s 具备了很强大的 api-server 所以我决定基于其上搞个简单的导航页。

组件

简单介绍下我用到的组件,如果觉得还行的话,其实可以拉代码简单适配自己的设施

  1. ingress 我选择的是 traefik,这部分其实只要你喜欢,可以随便换
  2. 我所有的服务,都具备独立的子域名,用 cert-manager 管理证书,所以我新增服务只要按照模板写一下配置就轻松跑起来
  3. 导航页是域名根域

玩法

  1. 现在已经整理成一个镜像,最初是直接跑了一个 kubectl 来作为 api-serverproxy,配合 caddy 来做反向代理
  2. caddy 还负责作为静态资源服务器,我的所有逻辑都是前端完成,frontend -> caddy -> kubectl -> api-server
  3. 所有的 ingress 资源我都使用 annotations 来添加自定义字段,字段都以 homelab 开头,以 jellyfin 举例:
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: jellyfin
  annotations:
    kubernetes.io/ingress.class: traefik
    homelab/name: Jellyfin # 导航页上显示的名字
    homelab/host: jellyfin # 子域名前缀
    homelab/order: "33"    # 顺序,就是个排序的作用
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`jellyfin.dosk.host`)
      kind: Rule
      services:
        - name: jellyfin
          port: 8096

代码

这部分相对就复杂些了,不过,可以直接参考我封装好的代码 Infinity-Server/dockerset 或镜像 docker.io/springhack/aura

  • caddy 的代码,反向代理了 kubectl proxy 并提供 file-server
:8000 {
  handle_path /services {
    rewrite * "/apis/{env.API_GROUP}/{env.API_VERSION}/{env.API_CRD}"
    reverse_proxy 127.0.0.1:6000 {
      header_up Host {upstream_hostport}
    }
  }
  file_server * {
    root /etc/caddy
  }
}
  • 其他部分的代码,其实就相对简单了,可以直接参考仓库

那么我的镜像如何使用呢

简单,如下:

  • 首先配置一个 ServiceAccount,我都放在了独立的 aura namespace 下面:
---
apiVersion: v1
kind: Namespace
metadata:
  name: aura
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: aura-role
  namespace: aura
rules:
  - apiGroups:
      - ""
      - "traefik.io"
      - "metrics.k8s.io"  # 这部分,是因为镜像添加了 metrics 信息显示
    resources:
      - "pods"            # 同上
      - "nodes"           # 同上
      - "ingressroutes"
    verbs:
      - "get"
      - "list"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: aura-binding
  namespace: aura
subjects:
  - kind: ServiceAccount
    name: aura-account
    namespace: aura
roleRef:
  kind: ClusterRole
  name: aura-role
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: aura-account
  namespace: aura
  • 然后,部署一个 Deployment,配合这个 ServiceAccount
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: aura
  namespace: aura
  labels:
    app: aura
spec:
  revisionHistoryLimit: 0
  selector:
    matchLabels:
      app: aura
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: aura
    spec:
      serviceAccountName: aura-account
      containers:
        - image: springhack/aura:latest
          imagePullPolicy: IfNotPresent
          name: aura
          ports:
            - containerPort: 8000
              name: aura
  • 其余部分按照喜好补全就好之后,只要你部署的 ingress 带有相应 annotations 就会被自动显示到首页上并按照 order 排序

还有么

  • 提一嘴,镜像代码配置了环境变量,如果只是更换 ingress controller 几乎可以不用改代码
  • 最后放个图吧,我知道我的代码,现在还较为简单,毕竟只是我个人在用,放出来更多的是为大家提供一个思路