写一个k8s加docker的项目案例
时间: 2023-11-17 11:47:19 浏览: 141
以下是一个k8s加docker的项目案例:
假设我们有一个简单的Web应用程序,它使用Python Flask框架编写,并使用MySQL作为数据库。
我们将使用Docker容器化应用程序和数据库,并使用Kubernetes进行部署和管理。
1. Docker容器化应用程序和数据库
首先,我们将使用Docker容器化我们的应用程序和数据库。
对于应用程序,我们需要创建一个Dockerfile,其中包含以下内容:
```
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
```
这个Dockerfile使用Python 3.8作为基本映像,并将应用程序代码复制到容器中。它还将requirements.txt文件复制到容器中,并使用pip安装所有必需的依赖项。最后,它设置了一个CMD指令,该指令在容器启动时运行应用程序。
对于数据库,我们将使用MySQL,并使用以下Docker Compose文件将其容器化:
```
version: '3'
services:
db:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: myapp
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "3306:3306"
volumes:
- data:/var/lib/mysql
volumes:
data:
```
这个Docker Compose文件将创建一个MySQL 5.7容器,并设置它的根密码,数据库名称和用户凭据。它还将将容器的3306端口映射到主机的3306端口,并使用卷将数据保存在本地。
2. 部署到Kubernetes
现在我们将使用Kubernetes将我们的应用程序和数据库部署到集群中。
对于应用程序,我们需要创建一个Deployment和一个Service。Deployment将使用我们之前创建的应用程序Docker映像,并定义一个Pod模板,该模板将运行一个容器并暴露端口5000。Service将使用该Deployment,并将其暴露到集群中的其他Pod和外部客户端。
以下是我们的应用程序Deployment和Service的YAML定义:
```
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: 5000
type: LoadBalancer
```
对于数据库,我们将使用一个单独的Deployment和Service。Deployment将使用我们之前创建的MySQL Docker映像,并定义一个Pod模板,该模板将运行一个容器并暴露端口3306。Service将使用该Deployment,并将其暴露到集群中的其他Pod和外部客户端。
以下是我们的数据库Deployment和Service的YAML定义:
```
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: example
- name: MYSQL_DATABASE
value: myapp
- name: MYSQL_USER
value: user
- name: MYSQL_PASSWORD
value: password
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumes:
- name: data
persistentVolumeClaim:
claimName: mysql-data
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
selector:
app: mysql
ports:
- name: mysql
port: 3306
targetPort: 3306
clusterIP: None
```
这个Deployment将创建一个MySQL容器,并设置其根密码,数据库名称和用户凭据。它还将将容器的3306端口暴露给其他Pod,但不向外部客户端暴露。Service将在Pod之间创建一个DNS条目,使它们可以相互访问。
3. 部署应用程序
现在我们可以使用kubectl命令将应用程序和数据库部署到集群中:
```
kubectl apply -f app-deployment.yaml
kubectl apply -f db-deployment.yaml
```
这将创建Deployment和Service对象,并在集群中启动Pod。
4. 测试应用程序
最后,我们可以使用kubectl port-forward命令将应用程序的Service暴露到本地主机的端口,并使用Web浏览器访问该端口以测试应用程序:
```
kubectl port-forward svc/myapp 8080:80
```
这将将Service的80端口映射到本地主机的8080端口。现在,我们可以使用Web浏览器访问http://localhost:8080,以查看我们的应用程序是否正常工作。
这就是一个简单的k8s加docker的项目案例。
阅读全文