Cách triển khai ứng dụng Django có thể mở rộng và bảo mật với Kubernetes
Trong hướng dẫn này, bạn sẽ triển khai ứng dụng thăm dò Django được chứa trong một cụm Kubernetes.Django là một khung công tác web mạnh mẽ có thể giúp bạn khởi động ứng dụng Python của bạn một cách nhanh chóng. Nó bao gồm một số tính năng tiện lợi như trình ánh xạ quan hệ đối tượng , xác thực user và giao diện quản trị có thể tùy chỉnh cho ứng dụng của bạn. Nó cũng bao gồm một khuôn khổ bộ nhớ đệm và khuyến khích thiết kế ứng dụng sạch sẽ thông qua Hệ thống điều phối URL và Mẫu của nó .
Trong Cách tạo ứng dụng Django và Gunicorn với Docker , ứng dụng Django Tutorial Polls đã được sửa đổi theo phương pháp Mười hai nhân tố để xây dựng các ứng dụng web root cloud , có thể mở rộng. Cài đặt containers này đã được mở rộng và bảo mật bằng Reverse Proxy Nginx và certificate TLS có chữ ký Let's Encrypt trong Cách mở rộng và bảo mật ứng dụng Django với Docker, Nginx và Let's Encrypt . Trong hướng dẫn cuối cùng này trong loạt bài Từ containers đến Kubernetes với Django , ứng dụng thăm dò Django hiện đại hóa sẽ được triển khai thành một cụm Kubernetes.
Kubernetes là một trình điều phối containers open-souce mạnh mẽ, tự động hóa việc triển khai, mở rộng quy mô và quản lý các ứng dụng được chứa trong containers . Các đối tượng Kubernetes như ConfigMaps và Secrets cho phép bạn tập trung và tách cấu hình khỏi các containers của bạn , trong khi các bộ điều khiển như Triển khai tự động khởi động lại các containers bị lỗi và cho phép mở rộng nhanh các bản sao containers . Mã hóa TLS được bật với đối tượng Ingress và Bộ điều khiển Ingress nguồn mở ingress-nginx . Tiện ích bổ sung Kubernetes cert-manager sẽ gia hạn và cấp certificate bằng cách sử dụng cơ quan cấp certificate Let's Encrypt miễn phí.
Yêu cầu
Để làm theo hướng dẫn này, bạn cần :
- Một cụm Kubernetes 1.15+ có bật kiểm soát truy cập dựa trên role (RBAC). Cài đặt này sẽ sử dụng một cụm DigitalOcean Kubernetes , nhưng bạn có thể tự do tạo một cụm bằng phương pháp khác .
- Công cụ dòng lệnh
kubectl
được cài đặt trên máy local của bạn và được cấu hình để kết nối với cụm của bạn. Bạn có thể đọc thêm về cách cài đặtkubectl
trong tài liệu chính thức . Nếu bạn đang sử dụng cụm DigitalOcean Kubernetes, vui lòng tham khảo Cách kết nối với Cụm Kubernetes DigitalOcean để tìm hiểu cách kết nối với cụm của bạn bằngkubectl
. - Tên domain đã đăng ký. Hướng dẫn này sẽ sử dụng
your_domain.com
xuyên suốt. Bạn có thể nhận một miễn phí tại Freenom hoặc sử dụng công ty đăng ký domain mà bạn chọn. - Bộ điều khiển Ingress -nginx ingress-nginx và trình quản lý certificate TLS cert- manager đã được cài đặt vào cụm của bạn và được cấu hình để cấp certificate TLS. Để tìm hiểu cách cài đặt và cấu hình Ingress với cert-manager, vui lòng tham khảo Cách cài đặt Nginx Ingress với Cert-Manager trên DigitalOcean Kubernetes .
-
A
bản ghi DNS vớiyour_domain.com
trỏ đến địa chỉ IP công khai của Ingress Load Balancer. Nếu bạn đang sử dụng DigitalOcean để quản lý bản ghi DNS trong domain của bạn , hãy tham khảo Cách quản lý bản ghi DNS để tìm hiểu cách tạo bản ghiA
- Một group lưu trữ đối tượng S3 chẳng hạn như DigitalOcean để lưu trữ các file tĩnh của dự án Django của bạn và một bộ Khóa truy cập cho Không gian này. Để tìm hiểu cách tạo Không gian, hãy tham khảo tài liệu sản phẩm Cách tạo Không gian .Để tìm hiểu cách tạo Khóa truy cập cho Không gian, hãy tham khảo Chia sẻ quyền truy cập vào Không gian bằng Khóa truy cập . Với những thay đổi nhỏ, bạn có thể sử dụng bất kỳ dịch vụ lưu trữ đối tượng nào mà plugin django-storages hỗ trợ.
- Một version server PostgreSQL, database và user cho ứng dụng Django của bạn. Với những thay đổi nhỏ, bạn có thể sử dụng bất kỳ database nào mà Django hỗ trợ .
- Database PostgreSQL nên được gọi là thăm dò (hoặc một tên dễ nhớ khác để nhập vào các file cấu hình của bạn bên dưới) và trong hướng dẫn này, user database Django sẽ được đặt tên là sammy . Để được hướng dẫn về cách tạo các ứng dụng này, hãy làm theo Bước 1 của Cách tạo Ứng dụng Django và Gunicorn bằng Docker . Bạn nên thực hiện các bước này từ máy local của bạn .
- Một cụm PostgreSQL được quản lý DigitalOcean được sử dụng trong hướng dẫn này. Để tìm hiểu cách tạo một cụm, hãy tham khảo tài liệu sản phẩm Dịch vụ database DigitalOcean.
- Bạn cũng có thể cài đặt và chạy version PostgreSQL của riêng mình. Để được hướng dẫn cài đặt và quản trị PostgreSQL trên server Ubuntu, vui lòng xem Cách cài đặt và sử dụng PostgreSQL trên Ubuntu 18.04 .
- Một account Docker Hub và repository công khai. Để biết thêm thông tin về cách tạo các file này, vui lòng xem Kho lưu trữ từ tài liệu Docker.
- Công cụ Docker được cài đặt trên máy local của bạn. Vui lòng xem Cách cài đặt và sử dụng Docker trên Ubuntu 18.04 để tìm hiểu thêm.
Khi bạn đã cài đặt các thành phần này, bạn đã sẵn sàng để bắt đầu với hướng dẫn này.
Bước 1 - Sao chép và cấu hình ứng dụng
Trong bước này, ta sẽ sao chép mã ứng dụng từ GitHub và cấu hình các cài đặt như thông tin xác thực database và khóa lưu trữ đối tượng.
Bạn có thể tìm thấy mã ứng dụng và Dockerfile trong nhánh polls-docker
của kho lưu trữ Django Tutorial Polls App GitHub . Kho này chứa mã cho ứng dụng Cuộc thăm dò mẫu của tài liệu Django, hướng dẫn bạn cách tạo một ứng dụng bỏ phiếu từ đầu.
Nhánh polls-docker
có chứa version Tài liệu hóa của ứng dụng Cuộc thăm dò ý kiến này. Để tìm hiểu cách ứng dụng Polls đã được sửa đổi để hoạt động hiệu quả trong môi trường chứa đựng, vui lòng xem Cách tạo ứng dụng Django và Gunicorn bằng Docker .
Bắt đầu bằng cách sử dụng git
để sao chép nhánh polls-docker
của kho lưu trữ Django Tutorial Polls App GitHub vào máy local của bạn:
- git clone --single-branch --branch polls-docker https://github.com/do-community/django-polls.git
Điều hướng vào folder django-polls
:
- cd django-polls
Thư mục này chứa mã Python của ứng dụng Django, Dockerfile
Docker mà Docker sẽ sử dụng để tạo containers images , cũng như file env
chứa danh sách các biến môi trường sẽ được chuyển vào môi trường đang chạy của containers . Kiểm tra Dockerfile
:
- cat Dockerfile
OutputFROM python:3.7.4-alpine3.10 ADD django-polls/requirements.txt /app/requirements.txt RUN set -ex \ && apk add --no-cache --virtual .build-deps postgresql-dev build-base \ && python -m venv /env \ && /env/bin/pip install --upgrade pip \ && /env/bin/pip install --no-cache-dir -r /app/requirements.txt \ && runDeps="$(scanelf --needed --nobanner --recursive /env \ | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \ | sort -u \ | xargs -r apk info --installed \ | sort -u)" \ && apk add --virtual rundeps $runDeps \ && apk del .build-deps ADD django-polls /app WORKDIR /app ENV VIRTUAL_ENV /env ENV PATH /env/bin:$PATH EXPOSE 8000 CMD ["gunicorn", "--bind", ":8000", "--workers", "3", "mysite.wsgi"]
Dockerfile này sử dụng Docker image Python 3.7.4 chính thức làm cơ sở và cài đặt các yêu cầu gói Python của Django và Gunicorn, như được định nghĩa trong file django-polls/requirements.txt
Request.txt. Sau đó, nó loại bỏ một số file xây dựng không cần thiết, sao chép mã ứng dụng vào hình ảnh và đặt PATH
thực thi. Cuối cùng, nó tuyên bố rằng cổng 8000
sẽ được sử dụng để chấp nhận các kết nối container đến và chạy gunicorn
với 3 công nhân, lắng nghe trên cổng 8000
.
Để tìm hiểu thêm về từng bước trong Dockerfile này, vui lòng xem Bước 6 của Cách tạo Ứng dụng Django và Gunicorn bằng Docker .
Bây giờ, xây dựng hình ảnh bằng cách sử dụng bản docker build
:
- docker build -t polls .
Ta đặt tên các polls
hình ảnh bằng cách sử dụng cờ -t
và chuyển vào folder hiện tại làm bối cảnh xây dựng , tập hợp các file để tham chiếu khi xây dựng hình ảnh.
Sau khi Docker xây dựng và gắn thẻ hình ảnh, hãy liệt kê các hình ảnh có sẵn bằng cách sử dụng docker images
:
- docker images
Bạn sẽ thấy hình ảnh polls
được liệt kê:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE polls latest 80ec4f33aae1 2 weeks ago 197MB python 3.7.4-alpine3.10 f309434dea3a 8 months ago 98.7MB
Trước khi chạy containers Django, ta cần cấu hình môi trường chạy của nó bằng cách sử dụng file env
có trong folder hiện tại. Tệp này sẽ được chuyển vào lệnh docker run
được sử dụng để chạy containers và Docker sẽ đưa các biến môi trường đã cấu hình vào môi trường đang chạy của containers .
Mở file env
bằng nano
hoặc editor bạn quen dùng :
- nano env
DJANGO_SECRET_KEY= DEBUG=True DJANGO_ALLOWED_HOSTS= DATABASE_ENGINE=postgresql_psycopg2 DATABASE_NAME=polls DATABASE_USERNAME= DATABASE_PASSWORD= DATABASE_HOST= DATABASE_PORT= STATIC_ACCESS_KEY_ID= STATIC_SECRET_KEY= STATIC_BUCKET_NAME= STATIC_ENDPOINT_URL= DJANGO_LOGLEVEL=info
Điền vào các giá trị còn thiếu cho các khóa sau:
-
DJANGO_SECRET_KEY
: Đặt giá trị này thành một giá trị duy nhất, không thể đoán trước, như được nêu chi tiết trong tài liệu Django . Một phương pháp tạo khóa này được cung cấp trong Điều chỉnh cài đặt ứng dụng của hướng dẫn Ứng dụng Django có thể mở rộng . -
DJANGO_ALLOWED_HOSTS
: Biến này bảo mật ứng dụng và ngăn chặn các cuộc tấn công tiêu đề Server HTTP. Đối với mục đích thử nghiệm, hãy đặt giá trị này thành*
, một ký tự đại diện sẽ trùng với tất cả các server . Trong quá trình production , bạn nên đặt mục này thànhyour_domain.com
. Để tìm hiểu thêm về cài đặt Django này, hãy tham khảo Cài đặt cốt lõi từ tài liệu Django. -
DATABASE_USERNAME
: Đặt cài đặt này cho user database PostgreSQL được tạo trong các bước yêu cầu . -
DATABASE_NAME
: Đặt giá trị này thànhpolls
hoặc tên của database PostgreSQL được tạo trong các bước yêu cầu . -
DATABASE_PASSWORD
: Đặt password này thành password user PostgreSQL được tạo trong các bước yêu cầu . -
DATABASE_HOST
: Đặt giá trị này thành tên server database của bạn. -
DATABASE_PORT
: Đặt cái này thành cổng database của bạn. -
STATIC_ACCESS_KEY_ID
: Đặt cái này thành không gian hoặc khóa truy cập của bộ nhớ đối tượng của bạn. -
STATIC_SECRET_KEY
: Đặt cái này thành Bí mật khóa truy cập của bộ nhớ Không gian hoặc đối tượng của bạn. -
STATIC_BUCKET_NAME
: Đặt mục này thành tên Không gian hoặc group lưu trữ đối tượng của bạn. -
STATIC_ENDPOINT_URL
: Đặt mục này thành URL điểm cuối lưu trữ đối tượng hoặc Spaces thích hợp, ví dụhttps:// your_space_name .nyc3.digitaloceanspaces.com
nếu Không gian của bạn nằm ở vùngnyc3
.
Khi bạn đã chỉnh sửa xong, hãy lưu file .
Trong bước tiếp theo, ta sẽ chạy local containers đã cấu hình và tạo schemas database . Ta cũng sẽ tải các nội dung tĩnh như biểu định kiểu và hình ảnh lên bộ nhớ đối tượng.
Bước 2 - Tạo schemas database và tải nội dung lên lưu trữ đối tượng
Với containers được tạo và cấu hình , hãy sử dụng docker run
để overrides bộ CMD
trong Dockerfile và tạo schemas database bằng cách sử dụng các manage.py makemigrations
và manage.py makemigrations
manage.py migrate
:
- docker run --env-file env polls sh -c "python manage.py makemigrations && python manage.py migrate"
Ta chạy các polls:latest
containers images polls:latest
, chuyển vào file biến môi trường mà ta vừa sửa đổi và overrides lệnh Dockerfile bằng sh -c "python manage.py makemigrations && python manage.py migrate"
, sẽ tạo schemas database được xác định bởi mã ứng dụng.
Nếu bạn đang chạy điều này lần đầu tiên, bạn sẽ thấy:
OutputNo changes detected Operations to perform: Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying polls.0001_initial... OK Applying sessions.0001_initial... OK
Điều này cho biết schemas database đã được tạo thành công.
Nếu bạn đang chạy migrate
lần tiếp theo, Django sẽ thực hiện không chọn trừ khi schemas database đã thay đổi.
Tiếp theo, ta sẽ chạy một version khác của containers ứng dụng và sử dụng một shell tương tác bên trong nó để tạo admin-user cho dự án Django.
- docker run -i -t --env-file env polls sh
Điều này sẽ cung cấp cho bạn dấu nhắc shell bên trong containers đang chạy mà bạn có thể sử dụng để tạo user Django:
- python manage.py createsuperuser
Nhập tên user , địa chỉ email và password cho user của bạn và sau khi tạo user , nhấn CTRL+D
để thoát khỏi containers và hủy nó.
Cuối cùng, ta sẽ tạo các file tĩnh cho ứng dụng và tải chúng lên DigitalOcean bằng cách sử dụng collectstatic
. Lưu ý điều này có thể mất một chút thời gian để hoàn thành.
- docker run --env-file env polls sh -c "python manage.py collectstatic --noinput"
Sau khi các file này được tạo và tải lên, bạn sẽ nhận được kết quả sau.
Output121 static files copied.
Bây giờ ta có thể chạy ứng dụng:
- docker run --env-file env -p 80:8000 polls
Output[2019-10-17 21:23:36 +0000] [1] [INFO] Starting gunicorn 19.9.0 [2019-10-17 21:23:36 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1) [2019-10-17 21:23:36 +0000] [1] [INFO] Using worker: sync [2019-10-17 21:23:36 +0000] [7] [INFO] Booting worker with pid: 7 [2019-10-17 21:23:36 +0000] [8] [INFO] Booting worker with pid: 8 [2019-10-17 21:23:36 +0000] [9] [INFO] Booting worker with pid: 9
Ở đây, ta chạy lệnh mặc định được xác định trong Dockerfile, gunicorn --bind :8000 --workers 3 mysite.wsgi:application
và hiển thị cổng containers 8000
để cổng 80
trên máy local của bạn được ánh xạ tới cổng 8000
của containers polls
.
Như vậy, bạn có thể chuyển đến ứng dụng polls
bằng trình duyệt web của bạn bằng lệnh http://localhost
vào thanh URL. Vì không có tuyến đường nào được xác định cho /
path, bạn có thể sẽ nhận được lỗi 404 Page Not Found
, điều này được mong đợi.
Điều hướng đến http://localhost/polls
để xem giao diện ứng dụng Polls:
Để xem giao diện quản trị, hãy truy cập http://localhost/admin
. Bạn sẽ thấy cửa sổ xác thực quản trị ứng dụng Polls:
Nhập tên user và password quản trị mà bạn đã tạo bằng lệnh createsuperuser
.
Sau khi xác thực, bạn có thể truy cập vào giao diện quản trị của ứng dụng Polls:
Lưu ý nội dung tĩnh cho ứng dụng admin
và polls
đang được phân phối trực tiếp từ bộ nhớ đối tượng. Để xác nhận điều này, hãy tham khảo Kiểm tra phân phối file tĩnh trong Spaces .
Khi bạn khám phá xong, nhấn CTRL+C
trong cửa sổ dòng lệnh chạy containers Docker để hủy containers .
Với Docker image của ứng dụng Django đã được thử nghiệm, nội dung tĩnh được tải lên bộ lưu trữ đối tượng và schemas database được cấu hình và sẵn sàng sử dụng với ứng dụng của bạn, bạn đã sẵn sàng tải hình ảnh ứng dụng Django của bạn lên register hình ảnh như Docker Hub.
Bước 3 - Đẩy Hình ảnh ứng dụng Django vào Docker Hub
Để triển khai ứng dụng của bạn trên Kubernetes, hình ảnh ứng dụng của bạn phải được tải lên cơ quan đăng ký như Docker Hub . Kubernetes sẽ kéo hình ảnh ứng dụng từ repository của nó và sau đó triển khai nó vào cụm của bạn.
Bạn có thể sử dụng register Docker riêng, như Register containers DigitalOcean , hiện miễn phí trong Quyền truy cập sớm hoặc đăng ký Docker công khai như Docker Hub. Docker Hub cũng cho phép bạn tạo các repository Docker riêng. Một repository công khai cho phép mọi người xem và kéo các containers images , trong khi một repository riêng tư cho phép bạn hạn chế quyền truy cập vào bạn và các thành viên trong group của bạn.
Trong hướng dẫn này, ta sẽ đẩy hình ảnh Django vào repository Docker Hub công khai được tạo trong yêu cầu . Bạn cũng có thể đẩy hình ảnh của bạn đến một repository riêng tư, nhưng việc kéo hình ảnh từ một repository riêng tư nằm ngoài phạm vi của bài viết này. Để tìm hiểu thêm về cách xác thực Kubernetes bằng Docker Hub và kéo hình ảnh riêng tư, vui lòng xem Kéo hình ảnh từ Register riêng tư từ tài liệu Kubernetes.
Bắt đầu bằng cách đăng nhập vào Docker Hub trên máy local của bạn:
- docker login
OutputLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username:
Nhập tên user và password Docker Hub của bạn để đăng nhập.
Hình ảnh Django hiện có thẻ polls:latest
. Để đẩy nó vào repository Docker Hub của bạn, hãy gắn thẻ lại hình ảnh bằng tên user và tên repo Docker Hub của bạn:
- docker tag polls:latest your_dockerhub_username/your_dockerhub_repo_name:latest
Đẩy hình ảnh vào repo:
- docker push sammy/sammy-django:latest
Trong hướng dẫn này, tên user Docker Hub là sammy và tên repo là sammy-django . Bạn nên thay thế các giá trị này bằng tên user Docker Hub và tên repo của bạn .
Bạn sẽ thấy một số kết quả cập nhật khi các lớp hình ảnh được đẩy đến Docker Hub.
Như vậy, hình ảnh của bạn đã có sẵn cho Kubernetes trên Docker Hub, bạn có thể bắt đầu triển khai nó trong cụm của bạn .
Bước 4 - Cài đặt Bản đồ cấu hình
Khi ta chạy containers Django local , ta đã chuyển file env
vào docker run
để đưa các biến cấu hình vào môi trường thời gian chạy. Trên Kubernetes, các biến cấu hình có thể được đưa vào bằng ConfigMaps và Secrets .
Bản đồ cấu hình nên được sử dụng để lưu trữ thông tin cấu hình không bảo mật như cài đặt ứng dụng và Bí mật sẽ được sử dụng cho thông tin nhạy cảm như khóa API và thông tin đăng nhập database . Cả hai đều được đưa vào các container theo cách tương tự, nhưng Secrets có thêm các tính năng kiểm soát truy cập và bảo mật như mã hóa . Secrets cũng lưu trữ dữ liệu trong base64, trong khi ConfigMaps lưu trữ dữ liệu ở dạng văn bản thuần túy.
Để bắt đầu, hãy tạo một folder có tên là yaml
trong đó ta sẽ lưu trữ các bản kê khai Kubernetes của bạn . Điều hướng vào folder .
- mkdir yaml
- cd
Mở một file có tên polls-configmap.yaml
trong nano
hoặc editor bạn muốn :
- nano polls-configmap.yaml
Dán vào file kê khai Bản đồ cấu hình sau:
apiVersion: v1 kind: ConfigMap metadata: name: polls-config data: DJANGO_ALLOWED_HOSTS: "*" STATIC_ENDPOINT_URL: "https://your_space_name.space_region.digitaloceanspaces.com" STATIC_BUCKET_NAME: "your_space_name" DJANGO_LOGLEVEL: "info" DEBUG: "True" DATABASE_ENGINE: "postgresql_psycopg2"
Ta đã extract cấu hình không nhạy cảm từ file env
được sửa đổi ở Bước 1 và dán nó vào file kê khai ConfigMap. Đối tượng ConfigMap được gọi là polls-config
. Sao chép các giá trị tương tự đã nhập vào file env
ở bước trước.
Vì mục đích thử nghiệm, hãy để DJANGO_ALLOWED_HOSTS
là *
để tắt tính năng lọc dựa trên tiêu đề Server . Trong môi trường production , bạn nên đặt điều này thành domain ứng dụng của bạn .
Khi bạn chỉnh sửa xong file , hãy lưu file đó.
Tạo Bản đồ cấu hình trong cụm của bạn bằng cách sử dụng kubectl apply
:
- kubectl apply -f polls-configmap.yaml
Outputconfigmap/polls-config created
Với Bản đồ cấu hình được tạo, ta sẽ tạo Bí mật được ứng dụng của ta sử dụng trong bước tiếp theo.
Bước 5 - Cài đặt bí mật
Giá trị bí mật phải được mã hóa base64 , nghĩa là việc tạo các đối tượng Bí mật trong cụm của bạn liên quan nhiều hơn một chút so với việc tạo Bản đồ cấu hình. Bạn có thể lặp lại quy trình từ bước trước, mã hóa thủ công các giá trị Bí mật theo cơ sở base64 và dán chúng vào file kê khai. Bạn cũng có thể tạo chúng bằng cách sử dụng file biến môi trường, kubectl create
và --from-env-file
, ta sẽ thực hiện trong bước này.
ta sẽ sử dụng file env
từ Bước 1 , xóa các biến được chèn vào Bản đồ cấu hình. Tạo một bản sao của file env
tên là polls-secrets
yaml
folder yaml
:
- cp ../env ./polls-secrets
Chỉnh sửa file trong editor bạn muốn :
- nano polls-secrets
DJANGO_SECRET_KEY= DEBUG=True DJANGO_ALLOWED_HOSTS= DATABASE_ENGINE=postgresql_psycopg2 DATABASE_NAME=polls DATABASE_USERNAME= DATABASE_PASSWORD= DATABASE_HOST= DATABASE_PORT= STATIC_ACCESS_KEY_ID= STATIC_SECRET_KEY= STATIC_BUCKET_NAME= STATIC_ENDPOINT_URL= DJANGO_LOGLEVEL=info
Xóa tất cả các biến được chèn vào file kê khai Bản đồ cấu hình. Khi bạn hoàn thành, nó sẽ giống như sau:
DJANGO_SECRET_KEY=your_secret_key DATABASE_NAME=polls DATABASE_USERNAME=your_django_db_user DATABASE_PASSWORD=your_django_db_user_password DATABASE_HOST=your_db_host DATABASE_PORT=your_db_port STATIC_ACCESS_KEY_ID=your_space_access_key STATIC_SECRET_KEY=your_space_access_key_secret
Đảm bảo sử dụng cùng các giá trị được sử dụng trong Bước 1 . Khi bạn hoàn tất, hãy lưu file .
Tạo Bí mật trong cụm của bạn bằng cách sử dụng kubectl create secret
:
- kubectl create secret generic polls-secret --from-env-file=poll-secrets
Outputsecret/polls-secret created
Ở đây ta tạo một đối tượng Bí mật có tên là polls-secret
và chuyển vào file bí mật mà ta vừa tạo.
Bạn có thể kiểm tra Bí mật bằng cách sử dụng kubectl describe
:
- kubectl describe secret polls-secret
OutputName: polls-secret Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== DATABASE_PASSWORD: 8 bytes DATABASE_PORT: 5 bytes DATABASE_USERNAME: 5 bytes DJANGO_SECRET_KEY: 14 bytes STATIC_ACCESS_KEY_ID: 20 bytes STATIC_SECRET_KEY: 43 bytes DATABASE_HOST: 47 bytes DATABASE_NAME: 5 bytes
Đến đây, bạn đã lưu trữ cấu hình ứng dụng của bạn trong cụm Kubernetes bằng cách sử dụng các loại đối tượng Bản đồ bí mật và Bản đồ cấu hình. Bây giờ ta đã sẵn sàng triển khai ứng dụng vào cụm.
Bước 6 - Giới thiệu ứng dụng Django bằng cách sử dụng triển khai
Trong bước này, bạn sẽ tạo một Triển khai cho ứng dụng Django của bạn . Triển khai Kubernetes là một bộ điều khiển được dùng để quản lý các ứng dụng không trạng thái trong cụm của bạn. Bộ điều khiển là một vòng điều khiển điều chỉnh dung lượng công việc bằng cách tăng hoặc giảm quy mô chúng. Bộ điều khiển cũng khởi động lại và xóa các containers bị lỗi.
Việc triển khai kiểm soát một hoặc nhiều Pod, đơn vị nhỏ nhất có thể triển khai trong một cụm Kubernetes. Vỏ bao quanh một hoặc nhiều container . Để tìm hiểu thêm về các loại dung lượng công việc khác nhau mà bạn có thể chạy , vui lòng xem lại Giới thiệu về Kubernetes .
Bắt đầu bằng cách mở một file có tên polls-deployment.yaml
trong trình soạn thảo yêu thích của bạn:
- nano polls-deployment.yaml
Dán vào file kê khai Triển khai sau:
apiVersion: apps/v1 kind: Deployment metadata: name: polls-app labels: app: polls spec: replicas: 2 selector: matchLabels: app: polls template: metadata: labels: app: polls spec: containers: - image: your_dockerhub_username/app_repo_name:latest name: polls envFrom: - secretRef: name: polls-secret - configMapRef: name: polls-config ports: - containerPort: 8000 name: gunicorn
Điền vào tên containers images thích hợp, tham chiếu đến hình ảnh Django Polls mà bạn đã đẩy vào Docker Hub ở Bước 2 .
Ở đây, ta xác định Triển khai Kubernetes được gọi là polls-app
và gắn nhãn polls-app
này bằng cặp key-value app: polls
. Ta chỉ định rằng ta muốn chạy hai bản sao của Pod được xác định bên dưới trường template
.
Sử dụng envFrom
với secretRef
và configMapRef
, ta chỉ định rằng tất cả dữ liệu từ Polls polls-secret
Bí mật và Polls polls-config
ConfigMap phải được đưa vào containers dưới dạng các biến môi trường. Các khóa ConfigMap và Secret trở thành tên biến môi trường.
Cuối cùng, ta hiển thị containerPort
8000
và đặt tên là gunicorn
.
Để tìm hiểu thêm về cách cấu hình Kubernetes Deployments, vui lòng tham khảo Deployments từ tài liệu Kubernetes.
Khi bạn chỉnh sửa xong file , hãy lưu file đó.
Tạo Triển khai trong cụm của bạn bằng cách sử dụng kubectl apply -f
:
- kubectl apply -f polls-deployment.yaml
- deployment.apps/polls-app created
Kiểm tra đảm bảo rằng Triển khai được triển khai chính xác bằng cách sử dụng kubectl get
:
- kubectl get deploy polls-app
OutputNAME READY UP-TO-DATE AVAILABLE AGE polls-app 2/2 2 2 6m38s
Nếu bạn gặp lỗi hoặc một cái gì đó không hoạt động tốt, bạn có thể sử dụng kubectl describe
để kiểm tra Triển khai không thành công:
- kubectl describe deploy
Bạn có thể kiểm tra hai Pod bằng cách sử dụng kubectl get pod
:
- kubectl get pod
OutputNAME READY STATUS RESTARTS AGE polls-app-847f8ccbf4-2stf7 1/1 Running 0 6m42s polls-app-847f8ccbf4-tqpwm 1/1 Running 0 6m57s
Hai bản sao của ứng dụng Django của bạn hiện đã được cài đặt và đang chạy trong cụm. Để truy cập ứng dụng, bạn cần tạo một Dịch vụ Kubernetes, mà ta sẽ thực hiện tiếp theo.
Bước 7 - Cho phép truy cập bên ngoài bằng Dịch vụ
Trong bước này, bạn sẽ tạo một Dịch vụ cho ứng dụng Django của bạn . Dịch vụ Kubernetes là một bản tóm tắt cho phép bạn hiển thị một tập hợp các Pod đang chạy như một dịch vụ mạng. Sử dụng Dịch vụ, bạn có thể tạo một điểm cuối ổn định cho ứng dụng của bạn mà không thay đổi khi các Group chết và được tạo lại.
Có nhiều loại Dịch vụ, bao gồm Dịch vụ ClusterIP, hiển thị Dịch vụ trên IP nội bộ cụm, Dịch vụ NodePort, hiển thị Dịch vụ trên mỗi Node tại một cổng tĩnh được gọi là NodePort và Dịch vụ LoadBalancer, cung cấp bộ cân bằng tải cloud cho hướng lưu lượng truy cập bên ngoài đến các Pod trong cụm của bạn (thông qua NodePorts, được tạo tự động). Để tìm hiểu thêm về những điều này, vui lòng xem Dịch vụ từ tài liệu Kubernetes.
Trong cài đặt cuối cùng của ta , ta sẽ sử dụng Dịch vụ ClusterIP được hiển thị bằng cách sử dụng Ingress và Bộ điều khiển Ingress được cài đặt trong yêu cầu cho hướng dẫn này. Hiện tại, để kiểm tra xem mọi thứ có hoạt động bình thường không, ta sẽ tạo một Dịch vụ NodePort tạm thời để truy cập ứng dụng Django.
Bắt đầu bằng cách tạo một file có tên polls-svc.yaml
bằng editor yêu thích của bạn:
- nano polls-svc.yaml
Dán vào file kê khai Dịch vụ sau:
apiVersion: v1 kind: Service metadata: name: polls labels: app: polls spec: type: NodePort selector: app: polls ports: - port: 8000 targetPort: 8000
Ở đây, ta tạo một Dịch vụ NodePort được gọi là polls
và đặt cho nó nhãn app: polls
. Sau đó, ta chọn các Pod backend với nhãn app: polls
và nhắm đến 8000
cổng của chúng.
Khi bạn chỉnh sửa xong file , hãy lưu file đó.
Triển khai Dịch vụ bằng cách sử dụng kubectl apply
:
- kubectl apply -f polls-svc.yaml
Outputservice/polls created
Xác nhận Dịch vụ của bạn đã được tạo bằng kubectl get svc
:
- kubectl get svc polls
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE polls NodePort 10.245.197.189 <none> 8000:32654/TCP 59s
Đầu ra này hiển thị IP nội bộ và NodePort của Dịch vụ ( 32654
). Để kết nối với dịch vụ, ta cần các địa chỉ IP bên ngoài cho các node cụm của ta :
- kubectl get node -o wide
OutputNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME pool-7no0qd9e0-364fd Ready <none> 27h v1.18.8 10.118.0.5 203.0.113.1 Debian GNU/Linux 10 (buster) 4.19.0-10-cloud-amd64 docker://18.9.9 pool-7no0qd9e0-364fi Ready <none> 27h v1.18.8 10.118.0.4 203.0.113.2 Debian GNU/Linux 10 (buster) 4.19.0-10-cloud-amd64 docker://18.9.9 pool-7no0qd9e0-364fv Ready <none> 27h v1.18.8 10.118.0.3 203.0.113.3 Debian GNU/Linux 10 (buster) 4.19.0-10-cloud-amd64 docker://18.9.9
Trong trình duyệt web , hãy truy cập ứng dụng Thăm dò ý kiến của bạn bằng bất kỳ địa chỉ IP bên ngoài nào của Node và NodePort. Với kết quả ở trên, URL của ứng dụng sẽ là: http:// 203.0.113.1 :32654/polls
.
Bạn sẽ thấy cùng một giao diện ứng dụng Polls mà bạn đã truy cập local ở Bước 1:
Bạn có thể lặp lại kiểm tra tương tự bằng cách sử dụng đường dẫn /admin
: http:// 203.0.113.1 :32654/admin
. Bạn sẽ thấy giao diện Quản trị giống như trước đây:
Ở giai đoạn này, bạn đã triển khai hai bản sao của containers ứng dụng Django Polls bằng cách sử dụng Triển khai. Bạn cũng đã tạo một điểm cuối mạng ổn định cho hai bản sao này và làm cho nó có thể truy cập bên ngoài bằng Dịch vụ NodePort.
Bước cuối cùng trong hướng dẫn này là đảm bảo lưu lượng truy cập bên ngoài vào ứng dụng của bạn bằng HTTPS. Để thực hiện việc này, ta sẽ sử dụng Bộ điều khiển Ingress ingress-nginx
được cài đặt trong yêu cầu và tạo một đối tượng Ingress để định tuyến lưu lượng truy cập bên ngoài đến Dịch vụ Kubernetes polls
.
Bước 8 - Cấu hình HTTPS bằng Nginx Ingress và trình quản lý certificate
Kubernetes Ingresses cho phép bạn định tuyến lưu lượng truy cập linh hoạt từ bên ngoài cụm Kubernetes đến Dịch vụ bên trong cụm của bạn. Điều này được thực hiện bằng cách sử dụng các đối tượng Ingress, các đối tượng này xác định các luật để định tuyến truy cập HTTP và HTTPS đến Dịch vụ Kubernetes và Bộ điều khiển Ingress, thực hiện các luật bằng cách cân bằng tải lưu lượng và định tuyến nó đến các Dịch vụ backend thích hợp.
Trong yêu cầu bạn cài đặt nguồn-nginx Ingress điều khiển và cert-manager TLS giấy chứng nhận tự động add-on. Bạn cũng cài đặt ClusterIssuers dàn dựng và production cho domain của bạn bằng cách sử dụng tổ chức phát hành certificate Let's Encrypt, đồng thời tạo Ingress để kiểm tra việc cấp certificate và mã hóa TLS cho hai Dịch vụ backend giả. Trước khi tiếp tục với bước này, bạn nên xóa Ingress tạo echo-ingress
được tạo trong hướng dẫn yêu cầu :
- kubectl delete ingress echo-ingress
- nano polls-ingress.yaml
Dán vào file kê khai Ingress sau:
[polls-ingress.yaml] apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: polls-ingress annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-staging" spec: tls: - hosts: - your_domain.com secretName: polls-tls rules: - host: your_domain.com http: paths: - backend: serviceName: polls servicePort: 8000
Ta tạo một đối tượng Ingress được gọi là polls-ingress
và chú thích nó để hướng dẫn mặt phẳng điều khiển sử dụng Bộ điều khiển Ingress-nginx và dàn ClusterIssuer. Ta cũng bật TLS cho your_domain.com
và lưu trữ certificate và private key trong một bí mật được gọi là polls-tls
. Cuối cùng, ta xác định một luật để định tuyến lưu lượng truy cập cho server your_domain.com
tới Dịch vụ polls
trên cổng 8000
.
Khi bạn chỉnh sửa xong file , hãy lưu file đó.
Tạo Ingress trong cụm của bạn bằng cách sử dụng kubectl apply
:
- kubectl apply -f polls-ingress.yaml
Outputingress.networking.k8s.io/polls-ingress created
Bạn có thể sử dụng kubectl describe
để theo dõi trạng thái của Ingress mà bạn vừa tạo:
- kubectl describe ingress polls-ingress
OutputName: polls-ingress Namespace: default Address: workaround.your_domain.com Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>) TLS: polls-tls terminates your_domain.com Rules: Host Path Backends ---- ---- -------- your_domain.com polls:8000 (10.244.0.207:8000,10.244.0.53:8000) Annotations: cert-manager.io/cluster-issuer: letsencrypt-staging kubernetes.io/ingress.class: nginx Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal CREATE 51s nginx-ingress-controller Ingress default/polls-ingress Normal CreateCertificate 51s cert-manager Successfully created Certificate "polls-tls" Normal UPDATE 25s nginx-ingress-controller Ingress default/polls-ingress
Bạn cũng có thể chạy describe
trên Chứng chỉ polls-tls
để xác nhận thêm việc tạo thành công:
- kubectl describe certificate polls-tls
Output. . . Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Issuing 3m33s cert-manager Issuing certificate as Secret does not exist Normal Generated 3m32s cert-manager Stored new private key in temporary Secret resource "polls-tls-v9lv9" Normal Requested 3m32s cert-manager Created new CertificateRequest resource "polls-tls-drx9c" Normal Issuing 2m58s cert-manager The certificate has been successfully issued
Điều này xác nhận certificate TLS đã được cấp thành công và mã hóa HTTPS hiện đang hoạt động cho your_domain.com
.
Vì ta đã sử dụng staging ClusterIssuer, hầu hết các trình duyệt web sẽ không tin tưởng certificate Let's Encrypt giả mà nó đã cấp, vì vậy chuyển đến your_domain.com
sẽ đưa bạn đến trang lỗi.
Để gửi một yêu cầu kiểm tra, ta sẽ sử dụng wget
từ dòng lệnh:
- wget -O - http://your_domain.com/polls
Output. . . ERROR: cannot verify your_domain.com's certificate, issued by ‘CN=Fake LE Intermediate X1’: Unable to locally verify the issuer's authority. To connect to your_domain.com insecurely, use `--no-check-certificate'.
Ta sẽ sử dụng cờ --no-check-certificate
đề xuất để bỏ qua xác thực certificate :
- wget --no-check-certificate -q -O - http://your_domain.com/polls
Output <link rel="stylesheet" type="text/css" href="https://your_space.nyc3.digitaloceanspaces.com/django-polls/static/polls/style.css"> <p>No polls are available.</p>
Đầu ra này hiển thị HTML cho trang giao diện /polls
, cũng xác nhận biểu định kiểu đang được cung cấp từ bộ nhớ đối tượng.
Đến đây bạn đã kiểm tra thành công việc cấp certificate bằng cách sử dụng Staging ClusterIssuer, bạn có thể sửa đổi Ingress để sử dụng ClusterIssuer production .
Mở polls-ingress.yaml
để chỉnh sửa :
- nano polls-ingress.yaml
Sửa đổi chú thích của cluster-issuer
:
[polls-ingress.yaml] apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: polls-ingress annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - your_domain.com secretName: polls-tls rules: - host: your_domain.com http: paths: - backend: serviceName: polls servicePort: 8000
Khi bạn hoàn tất, hãy lưu file . Cập nhật Ingress bằng kubectl apply
:
- kubectl apply -f polls-ingress.yaml
Outputingress.networking.k8s.io/polls-ingress configured
Bạn có thể sử dụng kubectl describe certificate polls-tls
kubectl describe ingress polls-ingress
và kubectl describe ingress polls-ingress
để theo dõi trạng thái cấp certificate :
- kubectl describe ingress polls-ingress
Output. . . Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal CREATE 23m nginx-ingress-controller Ingress default/polls-ingress Normal CreateCertificate 23m cert-manager Successfully created Certificate "polls-tls" Normal UPDATE 76s (x2 over 22m) nginx-ingress-controller Ingress default/polls-ingress Normal UpdateCertificate 76s cert-manager Successfully updated Certificate "polls-tls"
Kết quả trên xác nhận giấy chứng nhận production mới đã được cấp thành công và được lưu trữ trong Bí mật polls-tls
.
Điều hướng đến your_domain.com/polls
trong trình duyệt web để xác nhận mã hóa HTTPS đã được bật và mọi thứ đang hoạt động như mong đợi. Bạn sẽ thấy giao diện ứng dụng Polls:
Xác minh mã hóa HTTPS đang hoạt động trong trình duyệt web . Nếu bạn đang sử dụng Google Chrome, việc truy cập trang trên mà không gặp bất kỳ lỗi nào xác nhận mọi thứ đang hoạt động bình thường. Ngoài ra, bạn sẽ thấy một ổ khóa trên thanh URL. Nhấp vào ổ khóa sẽ cho phép bạn kiểm tra chi tiết certificate Let's Encrypt.
Là tác vụ dọn dẹp cuối cùng, bạn có thể tùy chọn chuyển loại Dịch vụ polls
từ NodePort sang loại ClusterIP chỉ nội bộ.
Sửa đổi polls-svc.yaml
bằng editor :
- nano polls-svc.yaml
Thay đổi type
từ NodePort
để ClusterIP
:
apiVersion: v1 kind: Service metadata: name: polls labels: app: polls spec: type: ClusterIP selector: app: polls ports: - port: 8000 targetPort: 8000
Khi bạn chỉnh sửa xong file , hãy lưu file đó.
áp dụng các thay đổi bằng cách sử dụng kubectl apply
:
- kubectl apply -f polls-svc.yaml --force
Outputservice/polls configured
Xác nhận Dịch vụ của bạn đã được sửa đổi bằng cách sử dụng kubectl get svc
:
- kubectl get svc polls
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE polls ClusterIP 10.245.203.186 <none> 8000/TCP 22s
Kết quả này cho thấy rằng loại Dịch vụ bây giờ là ClusterIP. Cách duy nhất để truy cập nó là thông qua domain của bạn và Ingress được tạo ở bước này.
Kết luận
Trong hướng dẫn này, bạn đã triển khai ứng dụng Django có thể mở rộng, được bảo mật bằng HTTPS vào một cụm Kubernetes. Nội dung tĩnh được phân phối trực tiếp từ bộ nhớ đối tượng và số lượng Group đang chạy có thể được tăng hoặc giảm nhanh chóng bằng cách sử dụng trường replicas
trong file kê khai Triển khai polls-app
.
Nếu bạn đang sử dụng DigitalOcean , bạn cũng có thể cho phép phân phối nội dung tĩnh qua mạng phân phối nội dung và tạo domain phụ tùy chỉnh cho Không gian của bạn . Vui lòng tham khảo cách Bật CDN từ Cách cài đặt ứng dụng Django có thể mở rộng với Database và không gian được quản lý DigitalOcean để tìm hiểu thêm.
Để xem lại phần còn lại của loạt phim, vui lòng truy cập trang From Containers to Kubernetes with Django series của ta .
Các tin liên quan