Thứ năm, 08/10/2020 | 00:00 GMT+7

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 URLMẫ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 :

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
Output
FROM 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-polls / 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ành your_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ành polls 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ùng nyc3 .

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 makemigrationsmanage.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:

Output
No 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.

Output
121 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:

Giao diện ứng dụng thăm dò ý kiến

Để 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:

Trang xác thực  administrator  thăm dò ý kiến

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:

Giao diện chính của  administrator  thăm dò ý kiến

Lưu ý nội dung tĩnh cho ứng dụng adminpolls đ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
Output
Login 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 ConfigMapsSecrets .

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:

polls-configmap.yaml
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* để 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
Output
configmap/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--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
thăm dò-bí mật
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:

thăm dò-bí mật
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
Output
secret/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
Output
Name: 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:

thăm dò-triển khai.yaml
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 secretRefconfigMapRef , 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
Output
NAME 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
Output
NAME 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:

polls-svc.yaml
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
Output
service/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
Output
NAME 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
Output
NAME 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:

Giao diện ứng dụng thăm dò ý kiến

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:

Trang xác thực  administrator  thăm dò ý kiến

Ở 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
Output
ingress.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
Output
Name: 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
Output
ingress.networking.k8s.io/polls-ingress configured

Bạn có thể sử dụng kubectl describe certificate polls-tls kubectl describe ingress polls-ingresskubectl 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:

Giao diện ứng dụng thăm dò ý kiến

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 :

polls-svc.yaml
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
Output
service/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
Output
NAME 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 .


Tags:

Các tin liên quan