通过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]
上一篇下一篇

猜你喜欢

热点阅读