Thứ tư, 03/04/2019 | 00:00 GMT+7

Cách di chuyển Docker compose workflow sang Kubernetes

Khi xây dựng các ứng dụng hiện đại, không trạng thái, việc chứa đựng các thành phần của ứng dụng là bước đầu tiên trong việc triển khai và mở rộng quy mô trên các nền tảng phân tán. Nếu bạn đã sử dụng Docker Compose trong quá trình phát triển, bạn sẽ hiện đại hóa và chứa ứng dụng của bạn bằng cách:

  • Extract thông tin cấu hình cần thiết từ mã của bạn.
  • Đang download trạng thái ứng dụng của bạn.
  • Đóng gói ứng dụng của bạn để sử dụng nhiều lần.

Bạn cũng sẽ có các định nghĩa dịch vụ bằng text chỉ định cách các containers images của bạn sẽ chạy.

Để chạy các dịch vụ của bạn trên một nền tảng phân tán như Kubernetes , bạn cần phải dịch các định nghĩa dịch vụ Soạn của bạn sang các đối tượng Kubernetes. Điều này sẽ cho phép bạn mở rộng ứng dụng của bạn với khả năng phục hồi . Một công cụ có thể tăng tốc quá trình dịch sang Kubernetes là kompose , một công cụ chuyển đổi giúp các nhà phát triển chuyển stream công việc Soạn sang các trình điều phối containers như Kubernetes hoặc OpenShift .

Trong hướng dẫn này, bạn sẽ dịch các dịch vụ Soạn thư sang các đối tượng Kubernetes bằng cách sử dụng kompose. Bạn sẽ sử dụng các định nghĩa đối tượng mà kompose cung cấp như một bắt đầu điều chỉnh điểm và làm đảm bảo rằng cài đặt của bạn sẽ sử dụng bí mật , dịch vụ , và PersistentVolumeClaims trong cách mà hy vọng Kubernetes. Đến cuối hướng dẫn, bạn sẽ có một ứng dụng Node.js đơn lẻ với database MongoDB chạy trên một cụm Kubernetes. Cài đặt này sẽ phản ánh chức năng của mã được mô tả trong Chứa ứng dụng Node.js với Docker Compose và sẽ là điểm khởi đầu tốt để xây dựng giải pháp sẵn sàng production phù hợp với nhu cầu của bạn.

Yêu cầu

  • Một cụm Kubernetes 1.10+ đượ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 hoặc server phát triển 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 đặt kubectl trong tài liệu chính thức .
  • Docker được cài đặt trên máy local hoặc server phát triển của bạn. Nếu bạn đang làm việc với Ubuntu 18.04, hãy làm theo Bước 1 và 2 của Cách cài đặt và sử dụng Docker trên Ubuntu 18.04 ; nếu không, hãy làm theo tài liệu chính thức để biết thông tin về cách cài đặt trên các hệ điều hành khác. Đảm bảo thêm user không phải root của bạn vào group docker , như được mô tả trong Bước 2 của hướng dẫn được liên kết.
  • Một account Docker Hub . Để biết tổng quan về cách cài đặt , hãy tham khảo phần giới thiệu về Docker Hub này.

Bước 1 - Cài đặt kompose

Để bắt đầu sử dụng kompose, hãy chuyển đến trang Bản phát hành GitHub của dự án và sao chép liên kết đến bản phát hành hiện tại (phiên bản 1.18.0 tính đến thời điểm viết bài này). Dán liên kết này vào lệnh curl sau để download version kompose mới nhất:

  • curl -L https://github.com/kubernetes/kompose/releases/download/v1.18.0/kompose-linux-amd64 -o kompose

Để biết chi tiết về cài đặt trên các hệ thống không phải Linux, vui lòng tham khảo hướng dẫn cài đặt .

Làm cho file binary có thể thực thi:

  • chmod +x kompose

Di chuyển nó đến PATH của bạn:

  • sudo mv ./kompose /usr/local/bin/kompose

Để xác minh nó đã được cài đặt đúng cách, bạn có thể kiểm tra version :

  • kompose version

Nếu cài đặt thành công, bạn sẽ thấy kết quả như sau:

Output
1.18.0 (06a2e56)

Với kompose đã được cài đặt và sẵn sàng sử dụng, bây giờ bạn có thể sao chép mã dự án Node.js mà bạn sẽ dịch sang Kubernetes.

Bước 2 - Nhân bản và đóng gói ứng dụng

Để sử dụng ứng dụng của ta với Kubernetes, ta cần sao chép mã dự án và đóng gói ứng dụng để dịch vụ kubelet có thể kéo hình ảnh.

Bước đầu tiên của ta sẽ là sao chép kho lưu trữ node-mongo-docker-dev từ tài khoản GitHub của Cộng đồng DigitalOcean . Kho lưu trữ này bao gồm mã từ cài đặt được mô tả trong Kho chứa ứng dụng Node.js để phát triển với Docker Compose , sử dụng ứng dụng Node.js demo để trình bày cách cài đặt môi trường phát triển bằng Docker Compose. Bạn có thể tìm thêm thông tin về chính ứng dụng trong loạt bài Từ containers đến Kubernetes với Node.js.

Sao node_project repository vào một folder có tên là node_project :

  • git clone https://github.com/do-community/node-mongo-docker-dev.git node_project

Điều hướng đến folder node_project :

  • cd node_project

Thư mục node_project chứa các file và folder cho một ứng dụng thông tin cá mập hoạt động với đầu vào của user . Nó đã được hiện đại hóa để hoạt động với các containers : thông tin cấu hình nhạy cảm và cụ thể đã được xóa khỏi mã ứng dụng và được cấu trúc lại để đưa vào trong thời gian chạy và trạng thái của ứng dụng đã được download database MongoDB.

Để biết thêm thông tin về việc thiết kế các ứng dụng hiện đại, không trạng thái, vui lòng xemỨng dụng lưu trữ cho KubernetesỨng dụng hiện đại hóa cho Kubernetes .

Thư mục dự án bao gồm một Dockerfile với các hướng dẫn để xây dựng hình ảnh ứng dụng. Hãy xây dựng hình ảnh ngay bây giờ để bạn có thể đẩy nó vào account Docker Hub và sử dụng nó trong cài đặt Kubernetes của bạn.

Sử dụng lệnh docker build , xây dựng hình ảnh bằng cờ -t , cho phép bạn gắn thẻ nó bằng một cái tên dễ nhớ. Trong trường hợp này, hãy gắn thẻ hình ảnh bằng tên user Docker Hub của bạn và đặt tên cho nó là node-kubernetes hoặc tên bạn chọn:

  • docker build -t your_dockerhub_username/node-kubernetes .

Các . trong lệnh chỉ định rằng ngữ cảnh xây dựng là folder hiện tại.

Sẽ mất một hoặc hai phút để xây dựng hình ảnh. Sau khi hoàn tất, hãy kiểm tra hình ảnh của bạn:

  • docker images

Bạn sẽ thấy kết quả sau:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE your_dockerhub_username/node-kubernetes latest 9c6f897e1fbc 3 seconds ago 90MB node 10-alpine 94f3c8956482 12 days ago 71MB

Tiếp theo, đăng nhập vào account Docker Hub bạn đã tạo trong yêu cầu :

  • docker login -u your_dockerhub_username

Khi được yêu cầu , hãy nhập password account Docker Hub của bạn. Đăng nhập theo cách này sẽ tạo file ~/.docker/config.json trong folder chính của user bằng thông tin đăng nhập Docker Hub của bạn.

Đẩy hình ảnh ứng dụng vào Docker Hub bằng lệnh docker push . Hãy nhớ thay your_dockerhub_username bằng tên user Docker Hub của bạn :

  • docker push your_dockerhub_username/node-kubernetes

Đến đây bạn có một hình ảnh ứng dụng mà bạn có thể kéo để chạy ứng dụng của bạn với Kubernetes. Bước tiếp theo sẽ là dịch các định nghĩa dịch vụ ứng dụng của bạn sang các đối tượng Kubernetes.

Bước 3 - Dịch các Dịch vụ Soạn thư sang Đối tượng Kubernetes bằng kompose

Tệp Docker Compose của ta , ở đây được gọi là docker-compose.yaml , đưa ra các định nghĩa sẽ chạy các dịch vụ của ta với Compose. Dịch vụ trong Soạn là một containers đang chạy và các định nghĩa dịch vụ chứa thông tin về cách mỗi containers images sẽ chạy. Trong bước này, ta sẽ dịch các định nghĩa này sang các đối tượng Kubernetes bằng cách sử dụng kompose để tạo các file yaml . Các file này sẽ chứa thông số kỹ thuật cho các đối tượng Kubernetes mô tả trạng thái mong muốn của chúng.

Ta sẽ sử dụng những file này để tạo ra các loại khác nhau của các đối tượng: Dịch vụ này sẽ đảm bảo các Pods chạy container của ta vẫn truy cập được; Các triển khai , sẽ chứa thông tin về trạng thái mong muốn của các Pod của ta ; một PersentlyVolumeClaim để cung cấp lưu trữ cho dữ liệu database của ta ; một ConfigMap cho các biến môi trường được đưa vào trong thời gian chạy; và một Bí mật cho user và password database của ứng dụng của ta . Một số định nghĩa này sẽ nằm trong các file mà kompose sẽ tạo cho ta và những định nghĩa khác ta cần phải tự tạo.

Thứ nhất, ta cần phải sửa đổi một số các định nghĩa trong ta docker-compose.yaml file để làm việc với Kubernetes. Ta sẽ bao gồm một tham chiếu đến hình ảnh ứng dụng mới được xây dựng của ta trong định nghĩa dịch vụ nodejs của ta và xóa các liên kết ràng buộc , dung lượng và các lệnh bổ sung mà ta đã sử dụng để chạy containers ứng dụng đang được phát triển với Soạn. Ngoài ra, ta sẽ xác định lại policy khởi động lại của cả hai containers để phù hợp với hành vi mà Kubernetes mong đợi .

Mở file bằng nano hoặc editor bạn quen dùng :

  • nano docker-compose.yaml

Định nghĩa hiện tại cho dịch vụ ứng dụng nodejs trông giống như sau:

~ / node_project / docker-compo.yaml
... services:   nodejs:     build:       context: .       dockerfile: Dockerfile     image: nodejs     container_name: nodejs     restart: unless-stopped     env_file: .env     environment:       - MONGO_USERNAME=$MONGO_USERNAME       - MONGO_PASSWORD=$MONGO_PASSWORD       - MONGO_HOSTNAME=db       - MONGO_PORT=$MONGO_PORT       - MONGO_DB=$MONGO_DB      ports:       - "80:8080"     volumes:       - .:/home/node/app       - node_modules:/home/node/app/node_modules     networks:       - app-network     command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js ... 

Thực hiện các chỉnh sửa sau đối với định nghĩa dịch vụ của bạn:

  • Sử dụng hình ảnh node-kubernetes của bạn thay vì Dockerfile local .
  • Thay đổi policy restart containers từ unless-stopped thành always .
  • Xóa danh sách volumescommand .

Định nghĩa dịch vụ đã hoàn thành bây giờ sẽ giống như sau:

~ / node_project / docker-compo.yaml
... services:   nodejs:     image: your_dockerhub_username/node-kubernetes     container_name: nodejs     restart: always     env_file: .env     environment:       - MONGO_USERNAME=$MONGO_USERNAME       - MONGO_PASSWORD=$MONGO_PASSWORD       - MONGO_HOSTNAME=db       - MONGO_PORT=$MONGO_PORT       - MONGO_DB=$MONGO_DB      ports:       - "80:8080"     networks:       - app-network ... 

Tiếp theo, cuộn xuống định nghĩa dịch vụ db . Tại đây, hãy thực hiện các chỉnh sửa sau:

  • Thay đổi policy restart dịch vụ thành always .
  • Xóa file .env . Thay vì sử dụng giá trị từ .env file , ta sẽ vượt qua các giá trị cho ta MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD để container database bằng cách sử dụng bí mật, ta sẽ tạo ra trong Bước 4 .

Định nghĩa dịch vụ db bây giờ sẽ giống như sau:

~ / node_project / docker-compo.yaml
...   db:     image: mongo:4.1.8-xenial     container_name: db     restart: always     environment:       - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME       - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD     volumes:         - dbdata:/data/db        networks:       - app-network ...   

Cuối cùng, ở cuối file , hãy xóa các node_modules khỏi khóa volumes cấp cao nhất. Khóa bây giờ sẽ giống như sau:

~ / node_project / docker-compo.yaml
... volumes:   dbdata: 

Lưu file khi bạn hoàn tất chỉnh sửa.

Trước khi dịch định nghĩa dịch vụ của ta , ta cần phải viết các .env file đó kompose sẽ sử dụng để tạo ra các configMap với thông tin không nhạy cảm của ta . Vui lòng xem Bước 2 của Lưu trữ Đơn đăng ký Node.js để Phát triển Với Docker Compose để có giải thích dài hơn về file này.

Trong hướng dẫn đó, ta đã thêm .env vào file .gitignore mình đảm bảo rằng nó sẽ không sao chép vào kiểm soát version . Điều này nghĩa là nó không sao chép khi ta sao chép kho lưu trữ node-mongo-docker-dev trong Bước 2 của hướng dẫn này . Do đó, ta cần phải tạo lại nó ngay bây giờ.

Tạo file :

  • nano .env

kompose sẽ sử dụng file này để tạo Bản đồ cấu hình cho ứng dụng của ta . Tuy nhiên, thay vì gán tất cả các biến từ định nghĩa dịch vụ nodejs trong file Soạn của ta , ta sẽ chỉ thêm tên database MONGO_DBMONGO_PORT . Ta sẽ chỉ định tên user và password database riêng biệt khi ta tạo thủ công đối tượng Bí mật trong Bước 4 .

Thêm thông tin tên cổng và database sau vào file .env . Hãy đổi tên database của bạn nếu bạn muốn:

~ / node_project / .env
MONGO_PORT=27017 MONGO_DB=sharkinfo 

Lưu file khi bạn hoàn tất chỉnh sửa.

Đến đây bạn đã sẵn sàng để tạo các file với thông số kỹ thuật đối tượng của bạn . kompose cung cấp nhiều tùy chọn để dịch tài nguyên của bạn. Bạn có thể:

  • Tạo yaml file dựa trên định nghĩa dịch vụ trong bạn docker-compose.yaml file với kompose convert .
  • Tạo các đối tượng Kubernetes trực tiếp với kompose up .
  • Tạo biểu đồ Helm với kompose convert -c .

Hiện tại, ta sẽ chuyển đổi các định nghĩa dịch vụ của bạn thành các file yaml , sau đó thêm vào và sửa đổi các file mà kompose tạo ra.

Chuyển đổi định nghĩa dịch vụ của bạn thành file yaml bằng lệnh sau:

  • kompose convert

Bạn cũng có thể đặt tên cụ thể hoặc nhiều file Soạn bằng cờ -f .

Sau khi bạn chạy lệnh này, kompose sẽ xuất ra thông tin về các file mà nó đã tạo:

Output
INFO Kubernetes file "nodejs-service.yaml" created INFO Kubernetes file "db-deployment.yaml" created INFO Kubernetes file "dbdata-persistentvolumeclaim.yaml" created INFO Kubernetes file "nodejs-deployment.yaml" created INFO Kubernetes file "nodejs-env-configmap.yaml" created

Chúng bao gồm yaml file với thông số kỹ thuật cho ứng dụng Node dịch vụ, triển khai, và configMap, cũng như cho dbdata PersistentVolumeClaim và database MongoDB triển khai.

Những file này là một điểm khởi đầu tốt, nhưng để chức năng của ứng dụng của ta phù hợp với cài đặt được mô tả trong Chứa ứng dụng Node.js để phát triển với Docker Compose, ta cần thực hiện một số bổ sung và thay đổi đối với file mà kompose đã tạo.

Bước 4 - Tạo bí mật Kubernetes

Để ứng dụng của ta hoạt động theo cách ta mong đợi, ta cần thực hiện một số sửa đổi đối với các file mà kompose đã tạo. Thay đổi đầu tiên trong số những thay đổi này sẽ tạo ra một Bí mật cho user và password database của ta và thêm nó vào Triển khai ứng dụng và database của ta . Kubernetes đưa ra hai cách làm việc với các biến môi trường: Bản đồ cấu hình và Bản đồ bí mật. kompose đã tạo Bản đồ cấu hình với thông tin không bảo mật mà ta đưa vào file .env của .env , vì vậy bây giờ ta sẽ tạo Bản đồ bí mật với thông tin bí mật của bạn : tên user và password database của ta .

Bước đầu tiên trong việc tạo Bí mật theo cách thủ công sẽ là chuyển đổi tên user và password của bạn thành base64 , một schemas mã hóa cho phép bạn truyền dữ liệu một cách đồng nhất, bao gồm cả dữ liệu binary .

Chuyển đổi tên user database của bạn:

  • echo -n 'your_database_username' | base64

Ghi lại giá trị bạn thấy trong kết quả .

Tiếp theo, chuyển đổi password của bạn:

  • echo -n 'your_database_password' | base64

Lưu ý về giá trị trong kết quả ở đây.

Mở file cho Bí mật:

  • nano secret.yaml

Lưu ý: Các đối tượng Kubernetesthường được xác định bằng YAML , điều này nghiêm cấm các tab và yêu cầu hai khoảng trắng để thụt lề. Nếu bạn muốn kiểm tra định dạng của các file yaml nào của bạn , bạn có thể sử dụng linter hoặc kiểm tra tính hợp lệ của cú pháp bằng cách sử dụng kubectl create với cờ --dry-run--validate :

  • kubectl create -f your_yaml_file.yaml --dry-run --validate=true

Nói chung, bạn nên xác thực cú pháp của bạn trước khi tạo tài nguyên bằng kubectl .

Thêm mã sau vào file để tạo ra một bí mật mà sẽ xác định bạn MONGO_USERNAMEMONGO_PASSWORD sử dụng các giá trị mã hóa mà bạn vừa tạo. Đảm bảo thay thế các giá trị giả tại đây bằng tên user và password được mã hóa của bạn:

~ / node_project / secret.yaml
apiVersion: v1 kind: Secret metadata:   name: mongo-secret data:   MONGO_USERNAME: your_encoded_username   MONGO_PASSWORD: your_encoded_password 

Ta đã đặt tên cho đối tượng Bí mật là mongo-secret , nhưng bạn có thể tự do đặt tên cho nó bạn muốn .

Lưu file này khi bạn hoàn tất chỉnh sửa. Như bạn đã làm với file .env của bạn , hãy đảm bảo thêm secret.yaml vào file .gitignore của bạn để không kiểm soát version .

Với secret.yaml được viết, bước tiếp theo của ta sẽ là đảm bảo các Pod ứng dụng và database của ta đều sử dụng các giá trị mà ta đã thêm vào file . Hãy bắt đầu bằng cách thêm các tham chiếu đến Bí mật để Triển khai ứng dụng của ta .

Mở file có tên nodejs-deployment.yaml :

  • nano nodejs-deployment.yaml

Đặc tả containers của file bao gồm các biến môi trường sau được xác định trong khóa env :

~ / node_project / nodejs-deploy.yaml
apiVersion: extensions/v1beta1 kind: Deployment ...     spec:       containers:       - env:         - name: MONGO_DB           valueFrom:             configMapKeyRef:               key: MONGO_DB               name: nodejs-env         - name: MONGO_HOSTNAME           value: db         - name: MONGO_PASSWORD         - name: MONGO_PORT           valueFrom:             configMapKeyRef:               key: MONGO_PORT               name: nodejs-env         - name: MONGO_USERNAME 

Ta cần thêm các tham chiếu vào Bí mật của ta vào các MONGO_USERNAMEMONGO_PASSWORD được liệt kê ở đây, để ứng dụng của ta có quyền truy cập vào các giá trị đó. Thay vì bao gồm khóa configMapKeyRef để trỏ đến Bản đồ cấu hình nodejs-env của ta , như trường hợp với các giá trị cho MONGO_DBMONGO_PORT , ta sẽ bao gồm khóa secretKeyRef để trỏ đến các giá trị trong mongo-secret mật mongo-secret của ta .

Thêm các tham chiếu Bí mật sau vào biến MONGO_USERNAMEMONGO_PASSWORD :

~ / node_project / nodejs-deploy.yaml
apiVersion: extensions/v1beta1 kind: Deployment ...     spec:       containers:       - env:         - name: MONGO_DB           valueFrom:             configMapKeyRef:               key: MONGO_DB               name: nodejs-env         - name: MONGO_HOSTNAME           value: db         - name: MONGO_PASSWORD           valueFrom:             secretKeyRef:               name: mongo-secret               key: MONGO_PASSWORD         - name: MONGO_PORT           valueFrom:             configMapKeyRef:               key: MONGO_PORT               name: nodejs-env         - name: MONGO_USERNAME           valueFrom:             secretKeyRef:               name: mongo-secret               key: MONGO_USERNAME 

Lưu file khi bạn hoàn tất chỉnh sửa.

Tiếp theo, ta sẽ thêm các giá trị tương tự vào file db-deployment.yaml .

Mở file để chỉnh sửa:

  • nano db-deployment.yaml

Trong file này, ta sẽ thêm các tham chiếu vào Bí mật của ta cho các khóa biến sau: MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD . Hình ảnh mongo cung cấp các biến này để bạn có thể sửa đổi quá trình khởi tạo đối tượng database của bạn . MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD cùng nhau tạo user root trong database xác thực admin và đảm bảo xác thực được bật khi containers database khởi động.

Việc sử dụng các giá trị mà ta đặt trong Bí mật của bạn đảm bảo ta sẽ có một user ứng dụng có quyền root trên cá thể database , có quyền truy cập vào tất cả các quyền quản trị và hoạt động của role đó. Khi làm việc trong production , bạn cần tạo một user ứng dụng chuyên dụng với các quyền trong phạm vi phù hợp.

Trong các MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD , hãy thêm tham chiếu vào giá trị Bí mật:

~ / node_project / db-deploy.yaml
apiVersion: extensions/v1beta1 kind: Deployment ...     spec:       containers:       - env:         - name: MONGO_INITDB_ROOT_PASSWORD           valueFrom:             secretKeyRef:               name: mongo-secret               key: MONGO_PASSWORD                 - name: MONGO_INITDB_ROOT_USERNAME           valueFrom:             secretKeyRef:               name: mongo-secret               key: MONGO_USERNAME         image: mongo:4.1.8-xenial ... 

Lưu file khi bạn hoàn tất chỉnh sửa.

Với Bí mật của bạn tại chỗ, bạn có thể chuyển sang tạo Dịch vụ database của bạn và đảm bảo containers ứng dụng của bạn chỉ cố gắng kết nối với database sau khi nó được cài đặt và chạy đầy đủ.

Bước 5 - Tạo Dịch vụ Database và Vùng chứa Đơn vị Ứng dụng

Bây giờ ta đã có Bí mật của bạn , ta có thể chuyển sang tạo Dịch vụ database của bạn và Vùng chứa Init sẽ thăm dò Dịch vụ này đảm bảo rằng ứng dụng của ta chỉ cố gắng kết nối với database khi database khởi động tác vụ, bao gồm tạo user và password MONGO_INITDB , đã hoàn thành.

Để thảo luận về cách triển khai chức năng này trong Soạn thư, vui lòng xem Bước 4 của Quy trình quản lý ứng dụng Node.js để phát triển với Docker Compose .

Mở file để xác định các thông số kỹ thuật cho Dịch vụ database :

  • nano db-service.yaml

Thêm mã sau vào file để xác định Dịch vụ:

~ / node_project / db-service.yaml
apiVersion: v1 kind: Service metadata:   annotations:      kompose.cmd: kompose convert     kompose.version: 1.18.0 (06a2e56)   creationTimestamp: null   labels:     io.kompose.service: db   name: db spec:   ports:   - port: 27017     targetPort: 27017   selector:     io.kompose.service: db status:   loadBalancer: {} 

Bộ selector mà ta đã đưa vào đây sẽ khớp đối tượng Dịch vụ này với các Group database của ta , đã được xác định với nhãn io.kompose.service: db by kompose trong file db-deployment.yaml deploy.yaml. Ta cũng đã đặt tên cho dịch vụ này là db .

Lưu file khi bạn hoàn tất chỉnh sửa.

Tiếp theo, hãy thêm trường Init Container vào mảng containers trong nodejs-deployment.yaml . Điều này sẽ tạo một Vùng chứa Init mà ta có thể sử dụng để trì hoãn việc khởi động containers ứng dụng của bạn cho đến khi Dịch vụ db được tạo bằng một Pod có thể truy cập được. Đây là một trong những cách sử dụng có thể có cho Init Containers; để tìm hiểu thêm về các trường hợp sử dụng khác, vui lòng xem tài liệu chính thức .

Mở file nodejs-deployment.yaml :

  • nano nodejs-deployment.yaml

Trong Pod spec và cùng với mảng containers , ta sẽ thêm trường initContainers với một container sẽ thăm dò Dịch vụ db .

Thêm mã sau vào bên dưới các ports và trường resources và bên trên restartPolicy trong mảng vùng containers nodejs :

~ / node_project / nodejs-deploy.yaml
apiVersion: extensions/v1beta1 kind: Deployment ...     spec:       containers:       ...         name: nodejs         ports:         - containerPort: 8080         resources: {}       initContainers:       - name: init-db         image: busybox         command: ['sh', '-c', 'until nc -z db:27017; do echo waiting for db; sleep 2; done;']       restartPolicy: Always ...                

Init Container này sử dụng hình ảnh BusyBox , một hình ảnh nhẹ bao gồm nhiều tiện ích UNIX. Trong trường hợp này, ta sẽ sử dụng trình netcat để thăm dò xem liệu Pod được liên kết với Dịch vụ db có chấp nhận kết nối TCP trên cổng 27017 .

Container này command tái tạo các chức năng của wait-for kịch bản mà ta ra khỏi ta docker-compose.yaml file trong Bước 3 . Để thảo luận lâu hơn về cách thức và lý do ứng dụng của ta sử dụng tập lệnh wait-for khi làm việc với Soạn thư, vui lòng xem Bước 4 của Khoá chứa ứng dụng Node.js để phát triển với Docker Compose .

Init Container chạy đến khi hoàn thành; trong trường hợp của ta , điều này nghĩa là containers ứng dụng Node của ta sẽ không bắt đầu cho đến khi containers database đang chạy và chấp nhận các kết nối trên cổng 27017 . Định nghĩa Dịch vụ db cho phép ta đảm bảo chức năng này dù vị trí chính xác của containers database , có thể thay đổi.

Lưu file khi bạn hoàn tất chỉnh sửa.

Với Dịch vụ database của bạn đã được tạo và Vùng chứa Init của bạn tại chỗ để kiểm soát thứ tự khởi động của các containers , bạn có thể chuyển sang kiểm tra các yêu cầu lưu trữ trong PersisteVolumeClaim và hiển thị dịch vụ ứng dụng của bạn bằng cách sử dụng LoadBalancer .

Bước 6 - Sửa đổi PersermanentVolumeClaim và hiển thị giao diện user ứng dụng

Trước khi chạy ứng dụng của bạn , ta sẽ thực hiện hai thay đổi cuối cùng đảm bảo rằng bộ nhớ database của ta sẽ được cung cấp đúng cách và ta có thể hiển thị giao diện user ứng dụng của bạn bằng cách sử dụng LoadBalancer.

Đầu tiên, ta hãy sửa đổi resource storage được xác định trong PersentlyVolumeClaim mà kompose đã tạo cho ta . Khiếu nại này cho phép ta cung cấp động bộ lưu trữ để quản lý trạng thái ứng dụng của ta .

Để làm việc với PersentlyVolumeClaims, bạn phải tạo và cấu hình StorageClass để cung cấp tài nguyên lưu trữ. Trong trường hợp của ta , vì ta đang làm việc với DigitalOcean Kubernetes , nên bộ provisioner StorageClass mặc định của ta được đặt thành dobs.csi.digitalocean.com - DigitalOcean Block Storage .

Ta có thể kiểm tra bằng lệnh :

  • kubectl get storageclass

Nếu bạn đang làm việc với một cụm DigitalOcean, bạn sẽ thấy kết quả sau:

Output
NAME PROVISIONER AGE do-block-storage (default) dobs.csi.digitalocean.com 76m

Nếu bạn không làm việc với cụm DigitalOcean, bạn cần tạo StorageClass và cấu hình bộ provisioner mà bạn chọn. Để biết chi tiết về cách thực hiện việc này, vui lòng xem tài liệu chính thức .

Khi kompose tạo dbdata dbdata-persistentvolumeclaim.yaml dẳngvolumeclaim.yaml, nó sẽ đặt resource storage thành kích thước không đáp ứng yêu cầu kích thước tối thiểu của trình provisioner của ta . Do đó, ta cần sửa đổi PersentlyVolumeClaim của bạn để sử dụng đơn vị Lưu trữ khối DigitalOcean khả thi tối thiểu : 1GB. Vui lòng sửa đổi điều này để đáp ứng yêu cầu lưu trữ của bạn.

Mở dbdata-persistentvolumeclaim.yaml :

  • nano dbdata-persistentvolumeclaim.yaml

Thay thế giá trị storage bằng 1Gi :

~ / node_project / dbdata-dai dẳngvolumeclaim.yaml
apiVersion: v1 kind: PersistentVolumeClaim metadata:   creationTimestamp: null   labels:     io.kompose.service: dbdata   name: dbdata spec:   accessModes:   - ReadWriteOnce   resources:     requests:       storage: 1Gi status: {} 

Cũng lưu ý accessMode : ReadWriteOnce nghĩa là dung lượng được cung cấp là kết quả của Yêu cầu này sẽ chỉ được đọc-ghi bởi một nút duy nhất. Vui lòng xem tài liệu để biết thêm thông tin về các chế độ truy cập khác nhau.

Lưu file khi bạn hoàn tất.

Tiếp theo, mở nodejs-service.yaml :

  • nano nodejs-service.yaml

Ta sẽ đưa Dịch vụ này ra bên ngoài bằng cách sử dụng Bộ cân bằng tải DigitalOcean . Nếu bạn không sử dụng cụm DigitalOcean, vui lòng tham khảo tài liệu có liên quan từ nhà cung cấp cloud của bạn để biết thông tin về bộ cân bằng tải của họ. Ngoài ra, bạn có thể làm theo tài liệu chính thức của Kubernetes về cách cài đặt một cụm khả dụng cao với kubeadm , nhưng trong trường hợp này, bạn sẽ không thể sử dụng PersentlyVolumeClaims để cung cấp bộ nhớ.

Trong thông số Dịch vụ, chỉ định LoadBalancer làm type Dịch vụ:

~ / node_project / nodejs-service.yaml
apiVersion: v1 kind: Service ... spec:   type: LoadBalancer   ports: ... 

Khi ta tạo Dịch vụ nodejs , một bộ cân bằng tải sẽ được tạo tự động, cung cấp cho ta một IP bên ngoài để ta có thể truy cập ứng dụng của bạn .

Lưu file khi bạn hoàn tất chỉnh sửa.

Với tất cả các file của ta đã có sẵn, ta đã sẵn sàng để bắt đầu và thử nghiệm ứng dụng.

Bước 7 - Khởi động và truy cập ứng dụng

Đã đến lúc tạo các đối tượng Kubernetes của ta và kiểm tra xem ứng dụng của ta có hoạt động như mong đợi hay không.

Để tạo các đối tượng mà ta đã xác định, ta sẽ sử dụng kubectl create với cờ -f , cho phép ta chỉ định các file mà kompose đã tạo cho ta , cùng với các file ta đã viết. Chạy lệnh sau để tạo ứng dụng Node và các dịch vụ và triển khai database MongoDB, cùng với Secret, ConfigMap và PersentlyVolumeClaim của bạn:

  • kubectl create -f nodejs-service.yaml,nodejs-deployment.yaml,nodejs-env-configmap.yaml,db-service.yaml,db-deployment.yaml,dbdata-persistentvolumeclaim.yaml,secret.yaml

Bạn sẽ thấy kết quả sau cho biết các đối tượng đã được tạo:

Output
service/nodejs created deployment.extensions/nodejs created configmap/nodejs-env created service/db created deployment.extensions/db created persistentvolumeclaim/dbdata created secret/mongo-secret created

Để kiểm tra xem Pod của bạn có đang chạy hay không, hãy nhập:

  • kubectl get pods

Bạn không cần chỉ định Không gian tên ở đây, vì ta đã tạo các đối tượng của bạn trong Không gian tên default . Nếu bạn đang làm việc với nhiều Không gian tên, hãy đảm bảo bao gồm cờ -n khi chạy lệnh này, cùng với tên của Không gian tên của bạn.

Bạn sẽ thấy kết quả sau khi containers db của bạn đang khởi động và Vùng chứa Init ứng dụng của bạn đang chạy:

Output
NAME READY STATUS RESTARTS AGE db-679d658576-kfpsl 0/1 ContainerCreating 0 10s nodejs-6b9585dc8b-pnsws 0/1 Init:0/1 0 10s

Khi containers đó đã chạy và các containers ứng dụng và database của bạn đã bắt đầu, bạn sẽ thấy kết quả này:

Output
NAME READY STATUS RESTARTS AGE db-679d658576-kfpsl 1/1 Running 0 54s nodejs-6b9585dc8b-pnsws 1/1 Running 0 54s

STATUS Running cho biết Group của bạn được liên kết với các node và các containers được liên kết với các Group đó đang chạy. READY cho biết có bao nhiêu containers trong một Pod đang chạy. Để biết thêm thông tin, vui lòng tham khảo tài liệu về Vòng đời Pod .

Ghi chú:
Nếu bạn thấy các pha không mong muốn trong cột STATUS , hãy nhớ rằng bạn có thể khắc phục sự cố Group của bạn bằng các lệnh sau:

  • kubectl describe pods your_pod
  • kubectl logs your_pod

Với các containers của bạn đang chạy, bây giờ bạn có thể truy cập ứng dụng. Để lấy IP cho LoadBalancer, hãy nhập:

  • kubectl get svc

Bạn sẽ thấy kết quả sau:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE db ClusterIP 10.245.189.250 <none> 27017/TCP 93s kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 25m12s nodejs LoadBalancer 10.245.15.56 your_lb_ip 80:30729/TCP 93s

EXTERNAL_IP liên kết với dịch vụ nodejs là địa chỉ IP nơi bạn có thể truy cập ứng dụng. Nếu bạn thấy trạng thái <pending> trong cột EXTERNAL_IP , điều này nghĩa là trình cân bằng tải của bạn vẫn đang được tạo.

Khi bạn thấy một IP trong cột đó, hãy chuyển đến IP đó trong trình duyệt của bạn: http:// your_lb_ip .

Bạn sẽ thấy trang đích sau:

Trang đích ứng dụng

Nhấp vào nút Nhận thông tin cá mập . Bạn sẽ thấy một trang có mẫu mục nhập, nơi bạn có thể nhập tên cá mập và mô tả về đặc điểm chung của con cá mập đó:

Biểu mẫu thông tin cá mập

Trong biểu mẫu, hãy thêm một con cá mập mà bạn chọn. Để chứng minh, ta sẽ thêm Megalodon Shark vào trường Shark NameAncient vào trường Shark Character :

Hình thức cá mập đầy

Bấm vào nút Gửi . Bạn sẽ thấy một trang với thông tin cá mập này được hiển thị lại cho bạn:

Đầu ra cá mập

Đến đây bạn có một cài đặt version duy nhất của ứng dụng Node.js với database MongoDB chạy trên cụm Kubernetes.

Kết luận

Các file bạn đã tạo trong hướng dẫn này là một điểm khởi đầu tốt để xây dựng khi bạn chuyển sang production . Khi bạn phát triển ứng dụng của bạn , bạn có thể thực hiện các bước sau:


Tags:

Các tin liên quan

Cách tối ưu hóa image Docker cho sản xuất
2019-03-25
Giữ lại một ứng dụng Node.js để phát triển với Docker Compose
2019-03-05
Cách cài đặt và sử dụng Docker Compose trên CentOS 7
2019-01-23
Cách sử dụng Traefik làm reverse-proxy cho container Docker trên Debian 9
2019-01-08
Cách thiết lập registry Docker riêng trên Ubuntu 18.04
2019-01-07
Cách thiết lập triển khai nhiều node với Rancher 2.1, Kubernetes và Docker Machine trên Ubuntu 18.04
2019-01-03
Cách tạo ứng dụng Node.js với Docker
2018-11-29
Cách quản lý triển khai nhiều node với Máy Rancher và Docker trên Ubuntu 16.04
2018-10-30
Cách cài đặt và sử dụng Docker trên Ubuntu 16.04
2018-10-19
Cách cung cấp và quản lý server Docker từ xa bằng Máy Docker trên Ubuntu 18.04
2018-10-02