使用k8s部署Django項(xiàng)目的方法步驟
接觸了一下docker和k8s,感覺是非常不錯(cuò)的東西。能夠方便的部署線上環(huán)境,而且還能夠更好的利用機(jī)器的資源,感覺是以后的大趨勢。最近剛好有一個(gè)基于django的項(xiàng)目,所以就把這個(gè)項(xiàng)目打包到docker里面,放到k8是里面運(yùn)行,順便學(xué)習(xí)下k8s和docker的使用。
docker
為什么使用docker?
我覺得docker最大的好處是部署的時(shí)候比較方便,一個(gè)預(yù)先打包好的docker鏡像,可以在任何安裝有docker的機(jī)器上面直接運(yùn)行,不用再安裝其他任何的依賴環(huán)境。不管是在開發(fā)、測試、還是發(fā)布階段,都能節(jié)省很多安裝依賴和配置文件的時(shí)間,真正做到了Build once, Run anywhere。
docker在我的項(xiàng)目中怎么使用?
在我的項(xiàng)目中,我主要使用dockerfile來生成項(xiàng)目的鏡像。我們都知道docker是按照層的思想來構(gòu)建一個(gè)鏡像的,我的鏡像的最底層的操作系統(tǒng)使用的是centos7,再接著安裝python相關(guān)的工具和庫,然后安裝項(xiàng)目所需求的庫,最后再把項(xiàng)目拷到鏡像中。
FROM centos:7 ENV LC_ALL=en_US.utf-8 LANG=en_US.utf-8 RUN yum install -y https://centos7.iuscommunity.org/ius-release.rpm && \ yum install -y python36u python36u-libs python36u-devel python36u-pip mysql-devel gcc which && \ pip3.6 install pipenv COPY Pipfile Pipfile.lock /my_app/ WORKDIR /my_app RUN pipenv sync COPY my_app_site /my_app/my_app_site COPY gunicorn_config.py /my_app/gunicorn_config.py COPY resource/nginx.conf /my_app/resource/nginx.conf RUN mkdir /static/ && \ cd my_app_site && \ pipenv run python manage.py collectstatic && \ cd my_app_site && \ rm -f local_settings.py WORKDIR /my_app EXPOSE 8000 CMD pipenv run gunicorn my_app_site.wsgi -c gunicorn_config.py --log-file logs/gunicorn.log
在dockerfile中,每個(gè)RUN命令都會(huì)構(gòu)建新的層,我這邊之所以在dockerfile中使用三個(gè)RUN命令,是為了能夠盡量的減少重復(fù)的構(gòu)建過程。每次在構(gòu)建鏡像的時(shí)候docker都會(huì)判斷每層的內(nèi)容是否有修改,如果沒有修改的話,就不需要重復(fù)的構(gòu)建。所以在應(yīng)用開發(fā)的過程中,上面的dockerfile最多也就重新構(gòu)建最后一層和倒數(shù)第二層(在項(xiàng)目有新包加入的時(shí)候才重新構(gòu)建倒數(shù)第二層,不然正常情況下就只會(huì)重新構(gòu)建最后一層)。
k8s
為什么使用k8s?
k8s的功能非常強(qiáng)大。不過簡單的來說,k8s是用來管理容器的一個(gè)工具。有了k8s以后我們就能讓k8s自動(dòng)的去拉取docker鏡像,并且根據(jù)需要來啟動(dòng)、關(guān)閉、調(diào)度docker容器,實(shí)現(xiàn)一些自動(dòng)化運(yùn)維操作。
k8s在我的項(xiàng)目中怎么使用?
我使用了yaml文件定義了一個(gè)k8s部署,下面是具體的文件示例:
# ------------------- MyApp Deployment ------------------- #
kind: Deployment
apiVersion: apps/v1beta2
metadata:
labels:
k8s-app: my_app
name: my_app
spec:
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: my_app
template:
metadata:
labels:
k8s-app: my_app
spec:
volumes:
- name: nginx-config
emptyDir: {}
- name: static-dir
emptyDir: {}
containers:
- name: my_app-web
image: my_app:latest
ports:
- containerPort: 8000
protocol: TCP
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d/
- name: static-dir
mountPath: /usr/share/nginx/html/my_app/static
command: ["/bin/sh"]
args: ["-c", "cp resource/nginx.conf /etc/nginx/conf.d/ && \
cp /static/* /usr/share/nginx/html/my_app/static -rf && \
pipenv run gunicorn my_app.wsgi -c gunicorn_config.py"]
- name: my_app-nginx
image: nginx:1.15.8
ports:
- containerPort: 8899
protocol: TCP
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d/
- name: static-dir
mountPath: /usr/share/nginx/html/my_app/static
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 8899
initialDelaySeconds: 30
timeoutSeconds: 30
---
# ------------------- MyApp Service ------------------- #
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: my_app
name: my_app
spec:
ports:
- port: 8899
targetPort: 8899
selector:
k8s-app: my_app
type: NodePortdjango項(xiàng)目在部署的時(shí)候需要用到nginx服務(wù)器,所以在部署的時(shí)候我在同一個(gè)pod里面也加入了一個(gè)nginx鏡像,不過為了少打包一個(gè)新的nginx鏡像(帶有nginx配置文件和靜態(tài)文件的nginx鏡像),我在兩個(gè)容器之間使用volumes來共享django靜態(tài)文件和nginx配置文件。
總結(jié)
以上就是我使用docker和k8s來部署django項(xiàng)目的一個(gè)示例,文章里面沒有包含一些具體的docker和k8s的介紹,是因?yàn)檫@些內(nèi)容比較多,在這篇小文章里面放不下,感興趣的同學(xué)可以去他們官網(wǎng)詳細(xì)了解。最后我只想說,docker和k8s真是好東西,沒有用過的同學(xué)趕緊去試試吧!希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python保留小數(shù)位的三種實(shí)現(xiàn)方法
本文給大家分享python保留小數(shù)位的三種方法,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
關(guān)于Qt6中QtMultimedia多媒體模塊的重大改變分析
如果您一直在 Qt 5 中使用 Qt Multimedia,則需要對您的實(shí)現(xiàn)進(jìn)行更改。這篇博文將嘗試引導(dǎo)您完成最大的變化,同時(shí)查看 API 和內(nèi)部結(jié)構(gòu)2021-09-09
用Python寫腳本,實(shí)現(xiàn)完全備份和增量備份的示例
下面小編就為大家分享一篇用Python寫腳本,實(shí)現(xiàn)完全備份和增量備份的示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
詳解Python中的整除運(yùn)算及其應(yīng)用場景
在Python編程中,整除運(yùn)算(也稱為整商運(yùn)算)是一個(gè)常見的操作,它用于計(jì)算兩個(gè)數(shù)相除后的整數(shù)部分,下面就跟隨小編一起來了解一下它的語法,工作原理和實(shí)際應(yīng)用案例吧2024-11-11
Python中的浮點(diǎn)數(shù)原理與運(yùn)算分析
這篇文章主要介紹了Python中的浮點(diǎn)數(shù)原理與運(yùn)算分析,結(jié)合實(shí)例形式分析了Python浮點(diǎn)數(shù)操作的常見錯(cuò)誤,并簡單解釋了浮點(diǎn)數(shù)運(yùn)算的原理與比較運(yùn)算實(shí)現(xiàn)方法,需要的朋友可以參考下2017-10-10
python實(shí)現(xiàn)識(shí)別手寫數(shù)字 python圖像識(shí)別算法
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)識(shí)別手寫數(shù)字,python圖像識(shí)別算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

