【Kubernetes系列,小白必看】③部署应用到 K8s 集群:实战演练

        通过上一篇文章《搭建 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 集群中部署、更新、回滚以及资源管理和故障排查的全过程。需要根据业务需求和集群规模,合理选择部署方式和配置参数,以确保应用的高可用性和性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佳腾_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值