通过上一篇文章《搭建 K8s 环境:从 0 到 1 的实践之路》中掌握了 Kubernetes 环境搭建后,将应用部署到 Kubernetes 集群中是迈向云原生应用开发与运维的关键一步。本实战演练将以一个简单的 Web 应用为例,系统展示从容器化应用到在 Kubernetes 集群内进行部署、管理的全过程,让你深入理解 Kubernetes 的工作机制,并能应对实际场景中的部署挑战。
一、应用容器化
1. 选择示例应用
本次选用一个基于 Node.js 的简单 Web 应用,其代码如下:
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, Kubernetes!');
});
const port = 3000;
server.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
将上述代码保存为app.js,并在同一目录下创建package.json文件,内容如下:
{
"name": "k8s-demo",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"keywords": [],
"author": "",
"license": "ISC"
}
2. 创建 Dockerfile
为了将该应用容器化,需要创建一个 Dockerfile。Dockerfile 是一个文本文件,包含了一系列用于构建 Docker 镜像的指令。在应用目录下创建Dockerfile,内容如下:
# 使用官方Node.js运行时作为基础镜像
FROM node:14
# 设置工作目录
WORKDIR /app
# 将package.json和package - lock.json复制到工作目录
COPY package*.json ./
# 安装应用依赖
RUN npm install
# 将整个应用目录复制到工作目录
COPY. .
# 暴露3000端口
EXPOSE 3000
# 定义容器启动时执行的命令
CMD ["npm", "start"]
上述 Dockerfile 首先指定了基础镜像为 Node.js 14,接着设置了容器内的工作目录,复制并安装应用依赖,然后将整个应用代码复制到容器中,最后暴露 3000 端口并定义了容器启动命令。
3. 构建 Docker 镜像
在包含Dockerfile的目录下,执行以下命令构建 Docker 镜像:
docker build -t k8s - demo:v1.0.0. .
命令中的-t参数用于为镜像指定名称和标签,最后的.表示当前目录,作为构建上下文。构建完成后,可以通过docker images命令查看已构建的镜像。
4. 推送镜像到仓库
为了能在 Kubernetes 集群中使用该镜像,需要将其推送到镜像仓库。这里以 Docker Hub 为例,首先登录 Docker Hub:
docker login
然后执行推送命令:
docker push your - username/k8s - demo:v1.0.0
二、在 Kubernetes 中部署应用
1. 创建 Namespace
Namespace 为 Kubernetes 集群提供了一种虚拟隔离机制,允许在同一集群中运行多个相互隔离的环境。创建一个名为demo的 Namespace,定义文件demo - namespace.yaml如下:
apiVersion: v1
kind: Namespace
metadata:
name: demo
执行以下命令创建 Namespace:
kubectl apply -f demo - namespace.yaml
2. 使用 Deployment 部署应用
Deployment 是 Kubernetes 中用于管理 Pod 和 ReplicaSet 的主要资源对象,通过它可以实现应用的声明式部署、更新和回滚。创建k8s - demo - deployment.yaml文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s - demo - deployment
namespace: demo
spec:
replicas: 3
selector:
matchLabels:
app: k8s - demo
template:
metadata:
labels:
app: k8s - demo
spec:
containers:
- name: k8s - demo
image: your - username/k8s - demo:v1.0.0
ports:
- containerPort: 3000
上述配置文件定义了一个包含 3 个副本的 Deployment,每个 Pod 运行指定的镜像,并暴露 3000 端口。执行以下命令创建 Deployment:
kubectl apply -f k8s - demo - deployment.yaml
可以通过kubectl get deployments -n demo命令查看 Deployment 的状态,通过kubectl get pods -n demo命令查看 Pod 的运行情况。
3. 暴露服务
为了让外部能够访问到部署在 Kubernetes 集群中的应用,需要创建一个 Service。这里创建一个 NodePort 类型的 Service,定义文件k8s - demo - service.yaml如下:
apiVersion: v1
kind: Service
metadata:
name: k8s - demo - service
namespace: demo
spec:
selector:
app: k8s - demo
ports:
- protocol: TCP
port: 80
targetPort: 3000
nodePort: 30080
type: NodePort
该配置文件将 Service 的 80 端口映射到 Pod 的 3000 端口,并在每个节点上暴露 30080 端口。执行以下命令创建 Service:
kubectl apply -f k8s - demo - service.yaml
通过kubectl get services -n demo命令可以查看 Service 的详细信息,此时可以通过<节点IP>:30080访问应用。
三、应用的更新与回滚
1. 应用更新
假设我们对应用进行了修改,例如将返回的信息改为 “Hello, Updated Kubernetes!”,并重新构建、推送了新的镜像your - username/k8s - demo:v2.0.0。为了将应用更新到新版本,只需修改 Deployment 的镜像版本。编辑k8s - demo - deployment.yaml,将image字段的值改为your - username/k8s - demo:v2.0.0,然后执行:
kubectl apply -f k8s - demo - deployment.yaml
Kubernetes 会自动进行滚动更新,逐步将旧版本的 Pod 替换为新版本的 Pod。可以通过kubectl rollout status deployment/k8s - demo - deployment -n demo命令查看更新状态。
2. 回滚操作
如果在更新过程中发现问题,需要回滚到旧版本。可以通过以下命令进行回滚:
kubectl rollout undo deployment/k8s - demo - deployment -n demo
Kubernetes 会将 Deployment 回滚到上一个版本,并更新 Pod。同样,可以使用kubectl rollout status命令查看回滚状态。
四、资源限制与请求
为了合理利用集群资源,避免资源竞争,我们可以为 Pod 中的容器设置资源限制和请求。在k8s - demo - deployment.yaml中,为容器添加resources字段:
spec:
containers:
- name: k8s - demo
image: your - username/k8s - demo:v1.0.0
ports:
- containerPort: 3000
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
上述配置为容器设置了 CPU 和内存的请求与限制,100m表示 0.1 个 CPU 核心,128Mi表示 128MiB 内存。执行kubectl apply -f k8s - demo - deployment.yaml使配置生效。
五、故障排查与监控
1. 日志查看
当 Pod 出现问题时,首先可以通过查看日志来定位问题。使用以下命令查看指定 Pod 的日志:
kubectl logs pod - name -n demo
如果 Pod 包含多个容器,需要使用-c参数指定容器名称。
2. 事件查看
Kubernetes 会记录集群中的各种事件,通过查看事件可以了解到资源的创建、更新、删除等操作的详细信息。使用以下命令查看 Namespace 中的事件:
kubectl get events -n demo
3. 监控工具
为了实时监控应用的运行状态和集群资源使用情况,可以使用 Prometheus 和 Grafana 等工具。这些工具可以帮助我们收集和可视化各种指标,如 CPU 使用率、内存使用率、请求响应时间等。
通过上述操作实现了从应用容器化到在 Kubernetes 集群中部署、更新、回滚以及资源管理和故障排查的全过程。需要根据业务需求和集群规模,合理选择部署方式和配置参数,以确保应用的高可用性和性能。