在实践Kubernetes(K8S)相关开发工作时,经常会遇到一个问题:是先将应用容器化为Docker镜像,再部署到K8S集群,还是直接在K8S集群中部署应用?下面我将分享一下这两种方法的流程和具体步骤。

### 步骤表格

| 步骤 | 应用先Docker | 直接通过K8S部署 |
| ---- | ------------ | --------------- |
| 1 | 编写应用代码 | 编写应用代码 |
| 2 | Dockerfile中定义镜像构建规则 | 创建K8S Deployment文件 |
| 3 | 构建Docker镜像 | 在K8S集群中创建Pod |
| 4 | 将镜像推送至仓库 | 创建Service暴露应用访问 |
| 5 | 部署镜像至K8S集群 | 部署应用至K8S集群 |

### 具体步骤及代码示例

#### 应用先Docker

1. 编写应用代码

```python
# 示例:一个简单的Python Flask应用
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

if __name__ == '__main__':
app.run()
```

2. Dockerfile中定义镜像构建规则

```Dockerfile
# 基于Python镜像构建
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 将应用依赖安装至镜像
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 将应用代码复制至镜像
COPY . .

# 暴露应用端口
EXPOSE 5000

# 启动应用
CMD ["python", "app.py"]
```

3. 构建Docker镜像

```bash
docker build -t my-flask-app .
```

4. 将镜像推送至仓库(可选)

```bash
docker tag my-flask-app username/my-flask-app
docker push username/my-flask-app
```

5. 部署镜像至K8S集群

```bash
kubectl create deployment my-flask-app --image=username/my-flask-app
```

#### 直接通过K8S部署

1. 编写应用代码(同上)

2. 创建K8S Deployment文件

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-flask-app
spec:
replicas: 1
selector:
matchLabels:
app: my-flask-app
template:
metadata:
labels:
app: my-flask-app
spec:
containers:
- name: my-flask-app
image: username/my-flask-app
ports:
- containerPort: 5000
```

3. 在K8S集群中创建Pod

```bash
kubectl apply -f deployment.yaml
```

4. 创建Service暴露应用访问

```yaml
apiVersion: v1
kind: Service
metadata:
name: my-flask-app
spec:
selector:
app: my-flask-app
ports:
- protocol: TCP
port: 80
targetPort: 5000
type: LoadBalancer
```

```bash
kubectl apply -f service.yaml
```

5. 部署应用至K8S集群

以上就是应用先Docker和直接通过K8S部署的具体步骤及代码示例。在实践过程中,可以根据具体场景选择合适的方式,辅以持续集成和持续部署(CI/CD)实践,以实现应用的快速部署和扩展。祝你在K8S的学习和应用中取得更进一步的进展!