K8s入门趣味练手:随机猫猫生成器

引言

写YAML太枯燥?不如让它给你带来一只可爱的猫猫吧!

写YAML配置时经常会感到很机械、无聊,如果最终效果只是“Hello World”这样的文本页面,往往会缺乏成就感。而这个项目的产出是“每次刷新都能看到不同的可爱猫咪”,这种即时的正反馈会让人觉得写YAML也能很有趣。

相比冷冰冰的命令行,猫猫的治愈力更能让人有继续探索下去的动力 ٩(。・ω・。) و

我们的目标很简单:部署一个 Web 服务,用户每次在浏览器里访问页面时,都可以看到一张新的随机猫猫图片。


把下面的内容保存为random-cat.yaml,我会在后面拆解一下这个random-cat.yaml,解释它是怎么实现的

vim random-cat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: random-cat
  labels:
    app: random-cat
spec:
  replicas: 2
  selector:
    matchLabels:
      app: random-cat
  template:
    metadata:
      labels:
        app: random-cat
    spec:
      containers:
      - name: random-cat
        image: python:3.11-slim
        ports:
        - containerPort: 8080
        # 直接运行内联 Python 小服务
        command:
        - sh
        - -c
        - |
          python -u - <<'PY'
          from http.server import BaseHTTPRequestHandler, HTTPServer
          import random, time

          class Handler(BaseHTTPRequestHandler):
              def do_GET(self):
                  # 使用 cataas 并拼上时间戳/随机数避免缓存
                  img_url = f"https://cataas.com/cat?{int(time.time()*1000)}{random.randint(0,9999)}"
                  html = f"""<!doctype html>
                  <html>
                    <head><meta charset="utf-8"><title>随机猫猫</title></head>
                    <body style="font-family:Arial, Helvetica, sans-serif; text-align:center; padding:2rem;">
                      <h1>😺 随机猫猫</h1>
                      <img src="{img_url}" alt="random cat" style="max-width:90%; height:auto; border-radius:8px; box-shadow:0 4px 12px rgba(0,0,0,0.15)"/>
                      <p><a href="/">再来一只(刷新页面也可)</a></p>
                    </body>
                  </html>"""
                  self.send_response(200)
                  self.send_header("Content-Type", "text/html; charset=utf-8")
                  self.send_header("Cache-Control", "no-store, no-cache, must-revalidate")
                  self.end_headers()
                  self.wfile.write(html.encode('utf-8'))

          def run():
              server = HTTPServer(("", 8080), Handler)
              print("Starting random-cat server on :8080")
              server.serve_forever()

          if __name__ == "__main__":
              run()
          PY
---
apiVersion: v1
kind: Service
metadata:
  name: random-cat-svc
spec:
  type: NodePort   # 如果你的集群支持 LoadBalancer 可以换成 LoadBalancer
  selector:
    app: random-cat
  ports:
  - protocol: TCP
    port: 80        # 集群内暴露端口
    targetPort: 8080
    nodePort: 30080 # 你可以改成 30000-32767 范围内的其他端口

要实现它,我们需要三个部分:

  1. Deployment:运行并管理这个应用的 Pod
  2. Python:启动一个 HTTP 服务,返回随机猫咪页面
  3. Service:把应用暴露出来,让用户能在浏览器里访问

Deployment

  • kind: Deployment声明我们要创建一个 Deployment,方便管理多个副本和自动重启
  • replicas: 2启动两个副本,提高可用性(刷新时可能命中不同 Pod,但都会返回随机猫猫)
  • selector.matchLabels + template.metadata.labels保证Deployment管理的Pod可以和Service关联

containers

  • image: python:3.11-slim使用轻量级Python镜像,不需要自己打包镜像
  • ports.containerPort: 8080Pod 内服务监听8080端口
  • command直接在容器里运行一段Python脚本,启动一个HTTPServer

Python

  • 使用http.server启动一个HTTP服务,监听8080
  • 每次GET请求都会返回一段HTML,里面嵌入一张来自 cataas.com 的猫猫图。
  • 在URL后拼上时间戳和随机数,避免浏览器缓存,保证“每次刷新都不同”

Service

  • kind: Service创建一个Service,把Pod暴露出来
  • type: NodePort通过Node节点的某个固定端口访问服务(适合测试/学习环境)
  • selector.app: random-cat把请求转发到带app=random-cat标签的Pod(即上面的 Deployment创建的Pod)

ports

  • port: 80集群内部访问时的服务端口
  • targetPort: 8080Pod内部Python服务监听的端口
  • nodePort: 30080集群外部通过节点IP + 30080端口访问

总结

  1. Pod启动后,运行Python HTTP服务,提供随机猫猫页面

  2. Deployment确保有 2 个副本,即使某个Pod挂了,还有另一个在工作

  3. Service暴露NodePort (30080) ,外部访问http://<NodeIP>:30080即可

  4. 每次刷新页面时,Python服务都会生成一个新的猫猫图片URL,于是每次看到的猫猫都不同

相关命令

  • 部署应用
kubectl apply -f random-cat.yaml
  • 查看pod运行情况
kubectl get pods -l app=random-cat
  • 查看Service信息
kubectl get svc random-cat-svc
  • 清理资源
kubectl delete -f random-cat.yaml

效果展示

结束语

这个示例超轻量,复制YAML就可以体验;技术也可以很有趣,不妨试试看,让你的集群先养猫 🐱再养业务!

部署成功了嘛?快来评论区分享你抽到的第一只猫!(=ↀωↀ=)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值