美文网首页
通过k8s部署应用实践

通过k8s部署应用实践

作者: 米那斯提力斯 | 来源:发表于2022-05-17 17:22 被阅读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]
    

    相关文章

      网友评论

          本文标题:通过k8s部署应用实践

          本文链接:https://www.haomeiwen.com/subject/kprwurtx.html