引言
写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 范围内的其他端口
要实现它,我们需要三个部分:
- Deployment:运行并管理这个应用的 Pod
- Python:启动一个 HTTP 服务,返回随机猫咪页面
- 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: 8080
Pod 内服务监听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: 8080
Pod内部Python服务监听的端口nodePort: 30080
集群外部通过节点IP + 30080端口访问
总结
-
Pod启动后,运行Python HTTP服务,提供随机猫猫页面
-
Deployment确保有 2 个副本,即使某个Pod挂了,还有另一个在工作
-
Service暴露NodePort (30080) ,外部访问
http://<NodeIP>:30080
即可 -
每次刷新页面时,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就可以体验;技术也可以很有趣,不妨试试看,让你的集群先养猫 🐱再养业务!
部署成功了嘛?快来评论区分享你抽到的第一只猫!(=ↀωↀ=)