为什么要在K8s中“注册”应用?
在云原生时代,Kubernetes(简称K8s)已成为容器编排的事实标准,所谓“K8注册app”,本质上是将应用程序容器化后,通过K8s的声明式API资源(如Deployment、Service等)部署到集群中,并使其具备高可用、弹性伸缩、自动化运维等能力,无论是Web服务、微服务还是后台任务,通过K8s“注册”后,都能实现从“手动运维”到“自动化管理”的跨越,本文将以实战为核心,带你从零开始掌握在K8s中注册应用的全流程。
准备工作:环境与工具
在开始之前,需确保以下环境就绪:
K8s集群环境
- 本地测试:可使用Minikube、Kind(Kubernetes in Docker)快速搭建单节点集群。
- 云服务:阿里云ACK、腾讯云TKE、AWS EKS等托管集群(推荐生产环境使用)。
- 集群组件:确保apiserver、kubelet、kubectl等核心组件正常运行,可通过
kubectl cluster-info验证集群状态。
必要工具
- kubectl:K8s命令行工具,用于与集群交互(安装后通过
kubectl version --client检查版本)。 - Docker:用于构建容器镜像(也可使用containerd、Podman等)。
- 应用代码:以一个简单的Nginx Web应用为例(代码示例见下文)。
第一步:应用容器化——将代码打包成镜像
K8s通过容器运行应用,因此需先将应用代码打包成标准容器镜像。
准备应用代码
创建一个简单的静态网站index.html如下:
<!DOCTYPE html> <html> <head><title>K8s实战应用</title></head> <body> <h1>欢迎来到K8s部署的Web应用!</h1> <p>当前时间:$(date)</p> </body> </html>
将文件保存到/app目录下,并创建一个简单的HTTP服务器(如用Python的http.server):
# app.py
from http.server import HTTPServer, SimpleHTTPRequestHandler
import os
if __name__ == "__main__":
os.chdir("/app") # 切换到网站根目录
server = HTTPServer(("0.0.0.0", 8080), SimpleHTTPRequestHandler)
print("Server running on port 8080...")
server.serve_forever()
编写Dockerfile
在/app目录下创建Dockerfile,定义镜像构建步骤:
# 基础镜像:Python 3.9 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制代码到容器 COPY index.html ./ COPY app.py ./ # 安装依赖(Python http.server无需额外包,此处仅为示例) RUN pip install --no-cache-dir -q flask # 暴露容器端口 EXPOSE 8080 # 启动命令 CMD ["python", "app.py"]
构建并推送镜像
执行以下命令构建镜像(your-registry替换为你的镜像仓库地址,如Docker Hub、阿里云镜像仓库等):
# 构建镜像(镜像名:k8s-demo-app,标签:v1.0) docker build -t your-registry/k8s-demo-app:v1.0 . # 推送镜像到仓库(需先登录:docker login your-registry) docker push your-registry/k8s-demo-app:v1.0
第二步:创建K8s资源——将应用“注册”到集群
K8s通过“资源对象”管理应用,核心资源包括:
- Deployment:管理Pod的副本(确保应用始终运行)
- Service:为Pod提供稳定的网络访问入口
- Ingress:基于域名的路由(可选,用于外部访问)
创建Deployment——定义应用运行方式
在集群中创建deployment.yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-demo-app # Deployment名称
labels:
app: k8s-demo # 标签,用于关联Service
spec:
replicas: 2 # Pod副本数(可扩展)
selector:
matchLabels:
app: k8s-demo # 匹配具有此标签的Pod
template:
metadata:
labels:
app: k8s-demo # Pod的标签
spec:
containers:
- name: app-container # 容器名称
image: your-registry/k8s-demo-app:v1.0 # 镜像地址(需提前推送)
ports:
- containerPort: 8080 # 容器暴露的端口
resources:
limits:
memory: "128Mi" # 内存限制
cpu: "100m" # CPU限制(0.1核)
关键字段说明:
replicas:副本数,K8s会自动维护指定数量的Pod运行。selector:用于关联Deployment管理的Pod(需与Pod模板的labels一致)。template:Pod的定义模板,包括容器镜像、端口、资源限制等。
应用Deployment:
kubectl apply -f deployment.yaml
检查Pod状态:
kubectl get pods -l app=k8s-demo # -l用于按标签过滤
预期输出:
NAME READY STATUS RESTARTS AGE
k8s-demo-app-5f7d7d8f9b-abcde 1/1 Running 0 30s
k8s-demo-app-5f7d7d8f9b-fghij 1/1 Running 0 30s
创建Service——暴露应用访问
Pod的IP是动态变化的