# Kubernetes Django 部署筆記 ###### tags: `k8s` ## Docker Toolbox 安裝 首先要下載Docker,因為我的作業系統是 window 10 家用版,不能直接用Docker Desktop,所以要下載 Docker Toolbox ,可以參考這篇:[ Windows 7 安裝Docker Toolbox - 菜鳥工程師肉豬](https://matthung0807.blogspot.com/2020/05/windows-7-install-docker-toolbox.html) > 注意事項:要記得把 VirtualBox 重新安裝過,Docker Toolbox內含的 VirtualBox 是舊版的,執行的時候會有問題。 安裝完成應該就可以看到下面這個畫面: ![](https://i.imgur.com/qwPwFSA.png) ## 建立 Docker Image 詳細內容可以參考這篇: [Django-Docker容器化部署:Django-Docker本地部署](https://juejin.im/post/6844903959056891912) ### Dockerfile 在建立好 Django 的專案之後,就可以開始寫 Dockerfile ,在Django專案的根目錄新增 Dockerfile 檔案,並填入: ``` # 从仓库拉取 带有 python 3.7 的 Linux 环境 FROM python:3.7 # 设置 python 环境变量 ENV PYTHONUNBUFFERED 1 # 创建 code 文件夹并将其设置为工作目录 RUN mkdir /code WORKDIR /code # 更新 pip RUN pip install pip -U # 将 requirements.txt 复制到容器的 code 目录 ADD requirements.txt /code/ # 安装库 RUN pip install -r requirements.txt # 将当前目录复制到容器的 code 目录 ADD . /code/ CMD [ "python3", "manage.py", "runserver", "0.0.0.0:8000" ] ``` 然後目前專案用到的套件只有 Django,所以在專案根目錄新增 requirements.txt 並寫入Django的版本: ``` Django==3.1.1 ``` * 可以用指令:django-admin version 取得Django 版本 所以目前的文件结构如下: ![](https://i.imgur.com/iOQFnMv.png) ``` django_app - Dockerfile - requirements.txt - manage.py - django_app - db.sqlite3 ``` 在專案根目錄下指令:(可以參考這篇:[Docker 基礎教學與介紹 101](https://medium.com/unorthodox-paranoid/docker-tutorial-101-c3808b899ac6)) `docker build . -t docker-demo-app` 去建立 Docker Image 並為這個 Image 加上 tag docker-demo-app。 然後我們可以再透過指令:`docker images` 列出我們全部的 Docker Image 如下: ``` REPOSITORY TAG IMAGE ID CREATED SIZE docker-demo-app latest 1733ea45fffc 3 seconds ago 916MB ``` 現在我們就打包好了我們的第一個 Docker Image 囉! ## 把 Docker Image Push 到 Docker Hub 詳細內容可以參考這篇:[Day6:把 Docker Image Push 到 Docker Hub](https://ithelp.ithome.com.tw/articles/10191139) 要把 Docker Image Push 到 Docker Hub 上,需要把 Docker Image 加上 tag,指令如下: `docker tag docker-demo-app eternalesser/docker-demo-app` 使用的Docker tag格式如下: docker tag ${Image Name} DockerHub帳號/Image Name 執行結果的畫面如下: ![](https://i.imgur.com/IWEtPms.png) 輸入 docker login 指令登入到 Docker Hub,畫面如下: ![](https://i.imgur.com/eE2c5fg.png) 使用 docker push 指令把 Docker Image Push 到 Docker Hub 裡,指令如下 ``` docker push eternalesser/docker-demo-app ``` 成功之後的畫面如下: ![](https://i.imgur.com/c7yxxG6.png) 在 Docker Hub 網站裡,登入帳號進去可以看到 Repositories 已經有 eternalesser/docker-demo-app 的 Docker Image 如下圖: ![](https://i.imgur.com/D6nbPkr.png) ## kubernetes 安裝 詳細內容可以參考這篇:[Day 11 Kubernetes 閃電戰-kubernetes 安裝與基礎操作篇](https://ithelp.ithome.com.tw/articles/10244493) 指令照貼到如下位置就可以了: ![](https://i.imgur.com/NbhKCeN.png) ## 設定 Pod 詳細內容可以參考這篇:[Kubernetes 基礎教學(二)](https://medium.com/@C.W.Hu/kubernetes-implement-ingress-deployment-tutorial-7431c5f96c3e) `kubernetes-demo.yaml` ``` apiVersion: v1 kind: Pod metadata: name: django-demo-pod labels: app: demoApp spec: containers: - image: eternalesser/docker-demo-app name: django-container ports: - containerPort: 8000 ``` 透過 kubectl 建立 Pod,指令如下: ``` kubectl apply -f kubernetes-demo.yaml ``` 查看運行中的 Pod ,指令如下: ``` kubectl get pod -o wide ``` 畫面如下: ![](https://i.imgur.com/RugCFQa.png) ## 設定 NodePort 詳細內容可以參考這篇:[Kubernetes 基礎教學(二)](https://medium.com/@C.W.Hu/kubernetes-implement-ingress-deployment-tutorial-7431c5f96c3e) `kubernetes-nodeport-demo.yaml` ``` apiVersion: v1 kind: Service metadata: name: django-demo-nodeport-service spec: type: NodePort selector: app: demoApp ports: - name: http protocol: TCP port: 8000 ``` 透過 kubectl 建立 Service,指令如下: ``` kubectl apply -f kubernetes-nodeport-demo.yaml ``` 查看運行中的 Service ,指令如下: ``` kubectl get service -o wide ``` 畫面如下: ![](https://i.imgur.com/GbvKDrk.png) ## 測試運行中的 Service 用瀏覽器測試運行中的 Service,網址如下: ``` http://10.0.0.128:31715/ ``` 網址格式參考如下: ``` http://"機房主機的網址":"用指令查到的port號碼"/ ``` 畫面如下: ![](https://i.imgur.com/1FJIgUO.png) ## 查看 Pod 內部的 Container 訊息 如果想查看 Pod 內部的 Container正在執行中的 Django Server 的狀態,指令如下: ``` kubectl logs -f django-demo-pod ``` 指令說明: -f 參數是持續輸出 logs 指令格式參考如下: ``` kubectl logs -f "Pod 名稱" ``` 畫面如下: ![](https://i.imgur.com/hg4ZuNO.png) ## Enter Pod:(進Pod裡面) 指令如下: ``` kubectl exec --stdin --tty nginx-pod -- /bin/bash ``` 2020/10/23 21:32 紀錄