---
# System prepended metadata

title: Kubernetes Django 部署筆記
tags: [k8s]

---

# 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 紀錄