Kubernetes 클러스터 및 Django 응용 프로그램의 빠른 설치 예
6279 단어 #DjangoKubernetes
웹 응용을 예로 들다
django 백엔드 + postgresql + redis
k8s를 사용하면 개인 거울 창고를 구축해야 한다. 일부 기초적인 응용 거울은
docker hub
에서 직접 추출할 수 있지만 코드를 포함하는 프로젝트 거울은 미리 포장해서 자신의 거울 창고에 업로드해야 한다. k8s는 docker-compose처럼 Dockerfile를 통해 직접 거울을 생성할 수 없다.마스터, node1, node2 세 노드가 당신의 개인 창고에서 거울을 가져올 수 있도록 확보해야 합니다
프로젝트 결과
├── build.sh
├── Dockerfile
├── requirements.txt
└── src
├── src django
프로젝트 대칭복사 패키지 Dockerfile 인스턴스:
FROM python:3.6
# ,apt
RUN curl -s ifconfig.co/json | grep "China" > /dev/null && \
curl -s http://mirrors.163.com/.help/sources.list.jessie > /etc/apt/sources.list || true
# ,
RUN apt-get update;\
apt-get install -y vim gettext postgresql-client;\
true
COPY . /opt/demo
WORKDIR /opt/demo/src
# , ,
RUN curl -s ifconfig.co/json | grep "China" > /dev/null && \
pip install -r /opt/demo/requirements.txt -i https://pypi.doubanio.com/simple --trusted-host pypi.doubanio.com || \
pip install -r /opt/demo/requirements.txt
RUN mkdir /opt/logging
RUN mkdir /opt/running
패키지 미러build.sh
docker build -t 127.0.0.1:5000/backend:v1.0 . && docker push 127.0.0.1:5000/backend:v1.0
k8s 프로필
backend.yaml
# backend
# dns: backend-service.demo.svc.cluster.local
---
apiVersion: v1
kind: Service
metadata:
name: backend-service
namespace: demo
spec:
ports:
- port: 80
targetPort: 8000
selector:
app: backend-pod
# ingress
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: backend-ingress
namespace: demo
spec:
rules:
paths:
- path: /
backend:
serviceName: backend-service
servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: demo-backend
namespace: demo
spec:
replicas: 1
template:
metadata:
labels:
app: backend-pod
spec:
containers:
- name: demo-backend
image: 140.xx.xx.181:5000/backend:v1.0 # ( )
imagePullPolicy: Always
ports:
- containerPort: 8000
command: ["/bin/sh"]
args: ["-c", "python manage.py runserver 0.0.0.0:8000"]
# python manage.py runserver 0.0.0.0:8000 , uwsgi
initContainers:
- name: wait-redis
image: busybox
command: ['sh', '-c', 'until nslookup redis.demo.svc.cluster.local; do echo waiting for redis service; sleep 2; done;']
- name: wait-postgresql
image: busybox
command: ['sh', '-c', 'until nslookup postgresql.demo.svc.cluster.local; do echo waiting for postgresql service; sleep 2; done;']
---
apiVersion: batch/v1
kind: Job
metadata:
name: sync-db
spec:
template:
metadata:
name: sync-db
labels:
app: backend-sync-db-job
spec:
containers:
- name: backend-db-migrate
image: 140.xx.xx.181:5000/backend:v1.0
command:
- "/bin/sh"
- "-c"
- "python manage.py makemigrations && python manage.py migrate"
restartPolicy: Never
postgres.yaml
# postgresql
# dns: postgresql.demo.svc.cluster.local
---
apiVersion: v1
kind: Service
metadata:
name: postgresql
namespace: demo
spec:
ports:
- port: 5432
targetPort: postgresql-port
selector:
app: postgresql-pod
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: demo-postgresql
namespace: demo
spec:
replicas: 1
template:
metadata:
labels:
app: postgresql-pod
spec:
nodeName: 140.xx.xx.164 # node1: 140.xx.xx.164
containers:
- name: demo-postgresql
image: postgres:9.6.3
imagePullPolicy: Always
env:
- name: POSTGRES_DB
value: demo
- name: POSTGRES_USER
value: root
- name: POSTGRES_PASSWORD
value: devpwd
ports:
- name: postgresql-port
containerPort: 5432
volumeMounts:
- name: postgresql-storage
mountPath: /var/lib/postgresql
volumes:
- name: postgresql-storage
hostPath:
path: /data/postgresql # , hostPath
redis.yaml
# redis
# dns: redis.demo.svc.cluster.local
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: demo
spec:
ports:
- port: 9200
targetPort: redis-port
selector:
app: redis-pod
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: demo-redis
namespace: demo
spec:
replicas: 1
template:
metadata:
labels:
app: redis-pod
spec:
containers:
- name: demo-redis
image: redis:3.0.7
imagePullPolicy: Always
ports:
- name: redis-port
containerPort: 6379
django 백엔드 구성
django의settings.py에서postgres와redis 설정
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'demo',
'USER': 'root',
'PASSWORD': 'devpwd',
'HOST': 'postgresql.demo.svc.cluster.local',
'PORT': '',
}
}
REDIS_HOST = "redis.demo.svc.cluster.local"
# dns , ,
# import socket
# REDIS_HOST = socket.gethostbyname("redis.demo.svc.cluster.local")
주의: dns 기반 서비스 발견은 k8s-dns 지원이 필요합니다 (rke 기본적으로 설치되어 있음)
배포
kubectl create namespace demo # create namespace
kubectl -n demo apply -f . # apply backend.yaml postgres.yaml yaml
결과 보기
kubectl -n demo get pods
액세스
140.xx.xx.181/admin/
총결산k8s는 그런 무상태 마이크로 서비스 유형의 응용, 부동하는pod에 더욱 적합하다. 서비스의 동적 신축은 용기화 응용에 있어 커다란 장점을 가진다. 데이터 중심이고 집단 개념이 없는 응용, 예를 들어 mysql 등 데이터베이스에 있어 데이터의 지속화는 비교적 번거롭다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Rails Turbolinks를 페이지 단위로 비활성화하는 방법원래 Turobolinks란? Turbolinks는 링크를 생성하는 요소인 a 요소의 클릭을 후크로 하고, 이동한 페이지를 Ajax에서 가져옵니다. 그 후, 취득 페이지의 데이터가 천이 전의 페이지와 동일한 것이 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.