Fork me on GitHub

基于k8s集群部署Django应用

一、应用部署流程

  •  通过Deployment控制器控制多个pod
  • Service与Pod之间通过标签选择器进行关联,Service可对外提供服务
  • Ingress通过域名访问,可解决Service ip变动导致服务不可访问,与Service之间通过ServiceName进行关联

二、Django项目镜像

1、项目结构

2、Dockerfile

FROM python:3.7-alpine
LABEL maintainer="iveboy"
#ENV 设置环境变量
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8

RUN mkdir -p /opt/web
ADD . /opt/web/
WORKDIR /opt/web

# 拷贝nginx配置文件
COPY ./config/web_nginx.conf /etc/nginx/

RUN mkdir -p ~/.pip

RUN mv ./pip.conf ~/.pip

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

RUN  set -x \
    && apk add --no-cache --virtual .build-deps build-base g++ gcc libxslt-dev python2-dev linux-headers \
    && apk add --no-cache pwgen git tzdata zlib-dev freetype-dev jpeg-dev  mariadb-dev postgresql-dev \
    && apk add --no-cache nginx \
    && python -m pip install --upgrade pip \
    && pip --no-cache-dir install -r requirements.txt \
    && pip --no-cache-dir install uwsgi \
    && chmod +x run.sh \
    && apk del .build-deps \
    && rm -rf /var/cache/apk/*

EXPOSE 8002

CMD ["./run.sh"]

Dockerfile文件中最后执行run.sh脚本。

3、run.sh

#!/bin/sh

uwsgi --ini /opt/web/config/uwsgi.ini && echo "uwsgi服务启动成功"
nginx -c /etc/nginx/web_nginx.conf -g 'daemon off;'

4、镜像构建

通过docker build -t 命令进行项目构建,在与Dockerfile同级目录下,执行:

docker build -t iveboy/django-web:v2.0 .

生成对应的镜像,然后将其推送到个人的docker hub仓库:

docker push iveboy/django-web:v2.0

三、k8s部署项目

1、deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  namespace: web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: django
  template:
    metadata:
      labels:
        app: django
    spec:
      containers:
      - name: django
        image: iveboy/django-web:v2.0    #拉取镜像
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8002                #容器对外端口
          name: web

生成对应的资源:

[root@master django_web]# kubectl create -f deployment.yaml 
[root@master django_web]# kubectl get pods -n web
NAME                   READY   STATUS    RESTARTS   AGE
app-64f788797b-k2wq8   1/1     Running   1          16h
app-64f788797b-mp549   1/1     Running   1          16h

2、svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: app-svc
  namespace: web
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8002
  selector:
    app: django              #此处需与deployment的标签选择器一致

生成对应的资源:

[root@master django_web]# kubectl create -f svc.yaml 
[root@master django_web]# kubectl get svc -n web
NAME       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
app-svc    ClusterIP   10.96.144.130   <none>        80/TCP         16h

3、ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-ingress
  namespace: web
spec:
  rules:
  - host: www.web.com
    http:
      paths:
      - path: /
        backend:
          serviceName: app-svc
          servicePort: 80

生成对应的资源:

[root@master django_web]# kubectl create -f ingress.yaml 
[root@master django_web]# kubectl get ingress -n web
NAME           CLASS    HOSTS          ADDRESS   PORTS   AGE
web-ingress    <none>   www.web.com              80      16h

当在主机上配置好域名后就可以通过域名进行访问了。

四、NodePort方式访问

 在上面的Service资源中,因为使用的是ClusterIP的方式,所以只有内部可以访问,我们可以采用NodePort的方式:

1、svc1.yaml

apiVersion: v1
kind: Service
metadata:
  name: app-svc1
  namespace: web
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8002
  selector:
    app: django              #此处需与deployment的标签选择器一致
  type: NodePort # NodePort方式

生成对应的资源:

[root@master django_web]# kubectl create -f svc1.yaml 
[root@master django_web]# kubectl get svc -n web
NAME       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
app-svc1   NodePort    10.96.144.203   <none>        80:31861/TCP   16h

此时可以通过端口31861进行外部访问,如:www.web.com:31861

项目参阅:https://github.com/ShenJianPing0307/k8s-django-demo

镜像参阅:https://hub.docker.com/r/iveboy/django-web/tags

 

posted @ 2022-10-27 10:30  iveBoy  阅读(1309)  评论(0编辑  收藏  举报
TOP