通过k8s部署应用实践
2022-05-17 本文已影响0人
米那斯提力斯
先用fastapi写一个接口,用docker运行起来,然后再改为k8s的deployment部署,再创建service实现负载均衡。
一、使用docker运行fastapi程序
1、下载一个python3镜像
这里下载的slim版本,比普通版本小很多
docker pull python:3.8-slim
image.png
2、以交互模式运行容器
docker run -it python:3.8-slim bash
3、在容器中安装fastapi和后台服务
pip3 install fastapi
pip install uvicorn
4、写一个简单的fastapi接口
执行以下命令:
cat >> main.py << EOF
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
EOF
将接口代码写进main.py
5、执行exit退出容器
exit
6、将容器另存为新的镜像
docker commit 856dad77023b python3-fastapi-test
856dad77023b为容器id
7、启动容器
docker run -d -p 37777:8080 python3-fastapi-test uvicorn main:app --host 0.0.0.0 --port 8080 --reload
将容器的8080端口映射到宿主机的37777端口
8、访问接口,可成功返回
curl 127.0.0.1:37777
返回:{"Hello":"World"}
image.png
二、改为k8s的deployment部署应用
1、在宿主机编写deployment的yaml文件fastapi-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: fast-api
labels:
app: fast-api
spec:
selector:
matchLabels:
app: fast-api
replicas: 1
template:
metadata:
labels:
app: fast-api
spec:
nodeName: node01
containers:
- name: fast-api
image: python3-fastapi-test
imagePullPolicy: Never
ports:
- containerPort: 37777
name: fast-api
command: ["/bin/bash", "-c", "uvicorn main:app --host 0.0.0.0 --port 37777 --reload"]
这里解释一下imagePullPolicy表示k8s拉取镜像的策略:
IfNotPresent 默认值,表示宿主机上没有该镜像时才拉取。
Always 表示每次创建pod时都会重新拉取镜像。
Never 表示只使用本地镜像,从不主动拉取镜像。
nodeName: node01 表示从node01这个节点拉取镜像启动pod,因为我的镜像在node01这个节点,所以加了这个参数
2、通过deployment启动pod
执行命令:kubectl apply -f fastapi-test.yaml
查看pod,可以看到pod已经起来
[root@node01 test]# kubectl get pod
NAME READY STATUS RESTARTS AGE
fast-api-7c8d949dd9-8lztf 1/1 Running 0 40m
查看pod的ip地址
[root@node01 test]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
fast-api-7c8d949dd9-8lztf 1/1 Running 0 68m 100.117.144.148 node01 <none> <none>
调用接口,成功返回“{"Hello":"World"}”
[root@node01 test]# curl 100.117.144.148:37777
{"Hello":"World"}[root@node01 test]#
三、创建service添加负载均衡
如果我们的服务有多个pod,可以创建一个service作为访问服务的入口,自动实现负载均衡
执行命令:kubectl expose -f fastapi-test.yaml --port=36666 --target-port=37777
查看service
[root@node01 test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
fast-api ClusterIP 10.102.138.74 <none> 36666/TCP 2s
这里可以看到已经创建了service,通过curl可成功访问接口
[root@node01 test]# curl 10.102.138.74:36666
{"Hello":"World"}[root@node01 test]