🗓?實驗環境
OS名稱 | Microsoft Windows 11 家庭中文版 |
---|---|
系統類型 | x64-based PC |
Docker版本 | Docker version 24.0.6, build ed223bc |
minikube版本 | v1.32.0 |
🤓FastAPI 構建應用
#基于fastapi快速創建一個項目
rkun1@LAPTOP-TUS5FU0D MINGW64 /
$ mkdir k8s-apprkun1@LAPTOP-TUS5FU0D MINGW64 /
$ cd k8s-app/#創建虛擬環境
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ python -m venv ./venv#激活
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ source ./venv/Scripts/Activate#安裝庫
(venv)
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ pip install fastapi(venv)
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ pip install uvicorn #web服務器#記錄依賴庫
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ pip freeze >> requirements.txt
https://fastapi.tiangolo.com/#create-it
參考官方文檔:
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ vim main.py
main.py
from typing import Unionfrom fastapi import FastAPIapp = FastAPI()@app.get("/")
def read_root():return {"Hello": "World"}@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):return {"item_id": item_id, "q": q}
啟動應用:
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ uvicorn main:app --reload
INFO: Will watch for changes in these directories: ['C:\\Serve\\Git\\k8s-app']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [10408] using StatReload
INFO: Started server process [7256]
INFO: Waiting for application startup.
INFO: Application startup complete.
訪問:
🤡容器化應用
k8s可以運行容器,所以我們要將應用容器化
Dockerfile文件
# python基礎鏡像
FROM python:3.9# 設置當前工作目錄到/code 我們將requirements.txt和app目錄放置在這
WORKDIR /codeCOPY ./requirements.txt /code/requirements.txt# 安裝依賴
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt# 復制
COPY ./app /code/app# 運行
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
查看下目錄結構:
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ tree -L 1
.
|-- Dockerfile
|-- app
|-- requirements.txt
`-- venv
制作docker image:
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ docker build -t k8s-fast-api .
測試運行一下:
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ docker run -p 8000:80 k8s-fast-api
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
再次訪問:
👾推送到DockerHub
https://hub.docker.com/
創建一個倉庫:
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app #打標簽
$ docker build -t rkun422/k8s-images-repo:0.0.1 .#推送
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ docker push rkun422/k8s-images-repo:0.0.1
🤖創建Kubernetes集群
https://dashboard.civo.com/login
可以在云上部署Kubernetes集群,也可以在本地操作
這里我使用Windows本地搭建的minikube
https://minikube.sigs.k8s.io/docs/
👽定義你的集群資源
#創建目錄 定義k8s集群資源在這個目錄下
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app
$ mkdir kubernetes
https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
在部署之前首先要創建集群拉取鏡像時的Secret
具體請參考:
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-by-providing-credentials-on-the-command-line
😎Deployment
deployment.yml
注意鏡像倉庫是你自己指定的
apiVersion: apps/v1
kind: Deployment
metadata:name: fast-apilabels:app: fast-api
spec:replicas: 3selector:matchLabels:app: fast-apitemplate:metadata:labels:app: fast-apispec:containers:- name: fast-apiimage: rkun422/k8s-images-repo:0.0.1ports:- containerPort: 80imagePullSecrets:- name: repo-key #你創建的secret
🧐Service
Servcie可以提供一個固定的地址讓我們去訪問Pod
https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/
service.yml
apiVersion: v1
kind: Service
metadata:name: fast-api
spec:selector:app: fast-apiports:- protocol: TCPport: 80targetPort: 80
👻部署資源進入集群
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app/kubernetes
$ pwd
/k8s-app/kubernetes
(venv)
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app/kubernetes
$ kubectl apply -f ./
查看Pod:
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
fast-api-5cbcbcfc56-b9whd 1/1 Running 0 6m19s
fast-api-5cbcbcfc56-bwf7v 1/1 Running 0 6m19s
fast-api-5cbcbcfc56-j9zw5 1/1 Running 0 6m19s
查看Service:
rkun1@LAPTOP-TUS5FU0D MINGW64 /k8s-app/kubernetes
$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
fast-api ClusterIP 10.108.66.181 <none> 80/TCP 7m8s app=fast-api
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10d <none>
對一個Pod進行端口轉發:
$ kubectl port-forward pods/fast-api-5cbcbcfc56-b9whd 80:80
Forwarding from 127.0.0.1:80 -> 80
Forwarding from [::1]:80 -> 80
Handling connection for 80
Handling connection for 80
瀏覽器訪問:
通過Service訪問:
rkun1@LAPTOP-TUS5FU0D MINGW64 ~
$ minikube service fast-api --url
W1121 22:07:50.931444 22028 main.go:291] Unable to resolve the current Docker CLI context "default": context "default": context not found: open C:\Users\rkun1\.docker\contexts\meta\37a8eec1ce19687d132fe29051dca629d164e2c4958ba141d5f4133a33f0688f\meta.json: The system cannot find the path specified.
😿 service default/fast-api 沒有 NodePort
http://127.0.0.1:55001
? 因為你正在使用 windows 上的 Docker 驅動程序,所以需要打開終端才能運行它。
說明Service配置正確,后續可以配置Ingress對進入的流量進行路由