iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Software Development

剛入職軟體工程師會需要知道的常見工具篇系列 第 23

[Day23] 簡單搞懂Minikube Python專案實作範例

  • 分享至 

  • xImage
  •  

今天來試試看實作範例囉~

  • Python專案資料夾結構
    • 專案是做prometheus 警報系統,有興趣再找機會跟大家分享
├── Dockerfile
├── docker-compose.yml
├── k8s.yaml
├── main.py
├── requirements.txt
└── utils
    ├── app.py
    ├── data.py

前置作業~要先在本地端有docker image 可以使用喔

  • Dockerfile
FROM python:3.8.2

RUN mkdir onlineweb
WORKDIR onlineweb

COPY . ./

RUN apt-get update -y && apt-get install cron -y \
    && apt-get install vim -y
# 下載套件
RUN pip install -r requirements.txt
# 設權限
RUN chmod -cR 700 *

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8001"]
  • Docker-Compose.yml
version: '3'
services:
  onlineweb:
    restart: always
    build: ./
    image: onlineweb
    container_name: onlineweb
    ports:
      - "8001:8001"
    volumes:  # connect at local file HOST:CONTAINER
      - ./:/onlineweb

# connect network on api-cluster
networks:
  default: 
    external:
      name: prometheus_monitoring
  • 這邊先建立docker image docker build -t onlineweb .
  • 去查看是否有建立成功 docker images

完成前置作業,來放上minikube上!
這邊新手常見問題,調用本地的image 會出現錯誤ErrImageNeverPull

參考文件一或是參考文件二

  • docker login

    ps. {"credsStore": "desktop"} 不會看到auth的項目,而是以credsStore存儲名稱

  • 將憑證放進k8s中

kubectl create secret generic regcred \
    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
    --type=kubernetes.io/dockerconfigjson
  • Kubernetes 使用在單節點集群內運行的 Docker 守護程序,而不是主機!
    eval $(minikube docker-env)

  • 執行 kubectl apply -f k8s.yaml

## k8s.yaml
---
apiVersion: v1
kind: Service # 指定類型為 Service
metadata:
  name: onlineweb-web  #Service的名稱為 web
spec: #規格描述
  selector:
    app: onlineweb
  ports:
  - protocol: "TCP" # Service 支援TCP與UDP兩種protocl,預設為TCP
    port: 8001
    targetPort: 8001
  type: LoadBalancer

--- #利用這個來區隔不同物件的設定
apiVersion: apps/v1
kind: Deployment # 指定類型為 Deployment
metadata:
  name: onlineweb
spec:
  selector:
    matchLabels:
      app: onlineweb
  replicas: 3
  template:
    metadata:
      labels:
        app: onlineweb
    spec:
      containers:
      - name: onlineweb
        image: onlineweb:latest
        imagePullPolicy: Never
        ports:
        - containerPort: 8001
  • 部署上去後~

  • 進去看看kubectl exec -ti PodName -- /bin/sh

  • 打開onlineweb網站來看看

  • 這邊為啥要有service呢?

    • 建立一個網路連線通道讓應用程式可以正確地連結到正在運行的 Pods,蛤沒懂?舉上面的範例就是host對外port: 8001對上Pod的port: 8001,因此如果你只啟動service那塊,想用本地localhost:8001打開就不行,當然還有一個方法就是用port-forward來指,不過由於每次都要下一次指令...比較麻煩,但還是介紹一下kubectl port-forward onlineweb 8001:8001
  • 補充 deployment & service的解釋,來自參考資料[1]

A deployment is responsible for keeping a set of pods running.
A service is responsible for enabling network access to a set of pods.

參考資料

  1. Service - Kubernetes Guide with Examples
  2. Kubernetes 教學 02 —來試試在本機上搭建一個 K8S 吧!
  3. Pull an Image from a Private Registry
  4. Kubernetes 那些事 — Service 篇

上一篇
[Day22] 簡單搞懂Minikube 是什麼
下一篇
[Day24] 簡單搞懂K8s & K3s 名詞解釋
系列文
剛入職軟體工程師會需要知道的常見工具篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言