Thứ sáu, 05/09/2014 | 00:00 GMT+7

Cách tạo và chạy một dịch vụ trên một cụm CoreOS


Tình trạng: Đã hết hạn

Bài báo này hiện không còn nữa. Nếu bạn quan tâm đến việc viết bản cập nhật cho bài viết này, vui lòng xem DigitalOcean muốn xuất bản hướng dẫn công nghệ của bạn !

Lý do: Vào ngày 22 tháng 12 năm 2016, CoreOS thông báo rằng họ không còn duy trì hạm đội. CoreOS khuyến nghị sử dụng Kubernetes cho tất cả các nhu cầu phân cụm.

Xem Thay vào đó:
Để được hướng dẫn sử dụng Kubernetes trên CoreOS không cần hạm đội, hãy xem Kubernetes trên Tài liệu CoreOS .

Một trong những lợi ích chính của CoreOS là khả năng quản lý các dịch vụ trên toàn bộ cụm từ một điểm duy nhất. Nền tảng CoreOS cung cấp các công cụ tích hợp để làm cho quá trình này trở nên đơn giản.

Trong hướng dẫn này, ta sẽ trình bày quy trình công việc điển hình để nhận các dịch vụ chạy trên các cụm CoreOS của bạn. Quá trình này sẽ trình bày một số cách đơn giản, thực tế để tương tác với một số tiện ích thú vị nhất của CoreOS để cài đặt một ứng dụng.

Yêu cầu và Mục tiêu

Để bắt đầu với hướng dẫn này, bạn nên có một cụm CoreOS với tối thiểu ba máy được cấu hình. Bạn có thể làm theo hướng dẫn của ta để khởi động cụm CoreOS tại đây.

Vì lợi ích của hướng dẫn này, ba nút của ta sẽ như sau:

  • coreos-1
  • coreos-2
  • coreos-3

Ba nút này nên được cấu hình bằng cách sử dụng network interface riêng cho địa chỉ client etcd và địa chỉ ngang hàng, cũng như địa chỉ hạm đội. Chúng phải được cấu hình bằng cách sử dụng file cấu hình cloud như được minh họa trong hướng dẫn ở trên.

Trong hướng dẫn này, ta sẽ đi qua quy trình công việc cơ bản để nhận các dịch vụ chạy trên một cụm CoreOS. Với mục đích demo , ta sẽ cài đặt một web server Apache đơn giản. Ta sẽ đề cập đến việc cài đặt môi trường dịch vụ được chứa trong Docker và sau đó ta sẽ tạo một file đơn vị kiểu systemd để mô tả dịch vụ và các thông số hoạt động của nó.

Trong file đơn vị đồng hành, ta sẽ yêu cầu dịch vụ của bạn đăng ký với etcd, điều này sẽ cho phép các dịch vụ khác theo dõi chi tiết của nó. Ta sẽ gửi cả hai dịch vụ của bạn cho group , nơi ta có thể bắt đầu và quản lý các dịch vụ trên các máy trong toàn bộ cụm của ta .

Kết nối với một nút và vượt qua đại lý SSH của bạn

Điều đầu tiên ta cần làm để bắt đầu cấu hình các dịch vụ là kết nối với một trong các node của ta bằng SSH.

Để công cụ fleetctl hoạt động mà ta sẽ sử dụng để giao tiếp với các node lân cận, ta cần chuyển thông tin tác nhân SSH của bạn trong khi kết nối.

Trước khi kết nối qua SSH, bạn phải khởi động đại lý SSH của bạn . Điều này sẽ cho phép bạn chuyển tiếp thông tin đăng nhập của bạn đến server mà bạn đang kết nối, cho phép bạn đăng nhập từ máy đó đến các node khác. Để khởi động tác nhân user trên máy của bạn, bạn nên nhập:

eval $(ssh-agent) 

Sau đó, bạn có thể thêm private key của bạn vào bộ nhớ của tác nhân trong bộ nhớ bằng lệnh :

ssh-add 

Đến đây, đại lý SSH của bạn sẽ chạy và nó sẽ biết về SSH key riêng tư của bạn. Bước tiếp theo là kết nối với một trong các node trong cụm của bạn và chuyển tiếp thông tin đại lý SSH của bạn. Bạn có thể làm điều này bằng cách sử dụng cờ -A :

ssh -A core@coreos_node_public_IP 

Khi bạn đã kết nối với một trong các node của bạn , ta có thể bắt đầu xây dựng dịch vụ của bạn .

Tạo containers Docker

Điều đầu tiên mà ta cần làm là tạo một containers Docker sẽ chạy dịch vụ của ta . Bạn có thể làm điều này bằng một trong hai cách. Bạn có thể khởi động containers Docker và cấu hình nó theo cách thủ công hoặc bạn có thể tạo Dockerfile mô tả các bước cần thiết để xây dựng hình ảnh bạn muốn.

Đối với hướng dẫn này, ta sẽ xây dựng một hình ảnh bằng cách sử dụng phương pháp đầu tiên vì nó sẽ dễ hiểu hơn đối với những người mới làm quen với Docker. Hãy nhấp vào liên kết này nếu bạn muốn tìm hiểu thêm về cách tạo Docker image từ Dockerfile . Mục tiêu của ta là cài đặt Apache trên ảnh cơ sở Ubuntu 14.04 trong Docker.

Trước khi bắt đầu, bạn cần đăng nhập hoặc đăng ký với register Docker Hub. Để làm điều này, hãy nhập:

docker login 

Bạn cần cung cấp tên user , password và địa chỉ email. Nếu đây là lần đầu tiên bạn làm việc này, một account sẽ được tạo bằng thông tin chi tiết bạn đã cung cấp và email xác nhận sẽ được gửi đến địa chỉ đã cung cấp. Nếu bạn đã tạo account trước đây, bạn sẽ đăng nhập bằng thông tin xác thực đã cho.

Để tạo hình ảnh, bước đầu tiên là khởi động containers Docker với hình ảnh cơ sở mà ta muốn sử dụng. Lệnh mà ta cần là:

docker run -i -t ubuntu:14.04 /bin/bash 

Các đối số mà ta đã sử dụng ở trên là:

  • run : Điều này cho Docker biết rằng ta muốn khởi động một containers với các tham số theo sau.
  • -i : Khởi động containers Docker ở chế độ tương tác. Điều này sẽ đảm bảo STDIN đối với môi trường containers sẽ khả dụng, ngay cả khi nó không được gắn vào.
  • -t : Điều này tạo ra một TTY giả, cho phép ta truy cập terminal vào môi trường containers .
  • ubuntu: 14.04 : Đây là repository và kết hợp hình ảnh mà ta muốn chạy. Trong trường hợp này, ta đang chạy Ubuntu 14.04. Hình ảnh được lưu trong kho lưu trữ Docker của Ubuntu tại Docker Hub .
  • / bin / bash : Đây là lệnh mà ta muốn chạy trong containers . Vì ta muốn truy cập terminal , ta cần tạo ra một phiên shell.

Các lớp hình ảnh cơ sở sẽ được kéo xuống từ register Docker trực tuyến Docker Hub và một phiên bash sẽ được bắt đầu. Bạn sẽ được đưa vào phiên shell kết quả.

Từ đây, ta có thể tiếp tục tạo ra môi trường dịch vụ của bạn . Ta muốn cài đặt web server Apache, vì vậy ta nên cập nhật index gói local của bạn và cài đặt thông qua apt :

apt-get update apt-get install apache2 

Sau khi cài đặt xong, ta có thể chỉnh sửa index.html mặc định:

echo "<h1>Running from Docker on CoreOS</h1>" > /var/www/html/index.html 

Khi kết thúc, bạn có thể thoát phiên bash của bạn theo cách thông thường:

exit 

Quay lại server của bạn, ta cần lấy ID containers của containers Docker mà ta vừa để lại. Để làm điều này, ta có thể yêu cầu Docker hiển thị thông tin quy trình mới nhất:

docker ps -l 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES cb58a2ea1f8f        ubuntu:14.04        "/bin/bash"         8 minutes ago       Exited (0) 55 seconds ago                       jovial_perlman 

Cột mà ta cần là "CONTAINER ID". Trong ví dụ trên, đây sẽ là cb58a2ea1f8f . Để có thể tạo ra cùng một containers sau này với tất cả các thay đổi mà bạn đã thực hiện, bạn cần phải commit các thay đổi đối với repository tên user của bạn . Bạn cũng cần chọn tên cho hình ảnh.

Vì mục đích của ta , ta sẽ giả vờ rằng tên user là user_name nhưng bạn nên thay thế tên user này bằng tên account Docker Hub mà bạn đã đăng nhập một chút trước đó. Ta sẽ gọi hình ảnh của ta là apache . Lệnh để áp dụng các thay đổi hình ảnh là:

docker commit container_ID user_name/apache 

Thao tác này sẽ lưu hình ảnh để bạn có thể nhớ lại trạng thái hiện tại của containers . Bạn có thể xác minh điều này bằng lệnh :

docker images 
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE user_name/apache     latest              42a71fb973da        4 seconds ago       247.4 MB ubuntu               14.04               c4ff7513909d        3 weeks ago         213 MB 

Tiếp theo, bạn nên xuất bản hình ảnh lên Docker Hub để các node của bạn có thể kéo xuống và chạy hình ảnh theo ý muốn. Để thực hiện việc này, hãy sử dụng định dạng lệnh sau:

docker push user_name/apache 

Đến đây bạn có một containers images được cấu hình với version Apache của bạn.

Tạo file đơn vị dịch vụ Apache

Bây giờ ta đã có sẵn containers Docker, ta có thể bắt đầu xây dựng các file dịch vụ của bạn .

Fleet quản lý việc lập lịch dịch vụ cho toàn bộ cụm CoreOS. Nó cung cấp một giao diện tập trung cho user , đồng thời thao tác local hệ thống systemd init của mỗi server để hoàn thành các hành động thích hợp.

Các file xác định thuộc tính của từng dịch vụ là các file đơn vị systemd được sửa đổi một chút. Nếu bạn đã làm việc với systemd trong quá khứ, bạn sẽ rất quen thuộc với cú pháp.

Để bắt đầu, hãy tạo một file có tên apache@.service trong folder chính của bạn. @ Cho biết đây là một file dịch vụ mẫu. Ta sẽ xem xét điều đó nghĩa là gì sau một chút. Hình ảnh CoreOS đi kèm với editor vim :

vim apache@.service 

Để bắt đầu định nghĩa dịch vụ, ta sẽ tạo tiêu đề phần [Unit] và cài đặt một số metadata về đơn vị này. Ta sẽ bao gồm một mô tả và chỉ định thông tin phụ thuộc. Vì đơn vị của ta cần được chạy sau khi có cả etcd và Docker, ta cần xác định yêu cầu đó.

Ta cũng cần thêm file dịch vụ khác mà ta sẽ tạo theo yêu cầu. Tệp dịch vụ thứ hai này sẽ chịu trách nhiệm cập nhật etcd thông tin về dịch vụ của ta . Yêu cầu nó ở đây sẽ buộc nó bắt đầu khi dịch vụ này được bắt đầu. Ta sẽ giải thích %i trong tên dịch vụ sau:

[Unit] Description=Apache web server service After=etcd.service After=docker.service Requires=apache-discovery@%i.service 

Tiếp theo, ta cần cho hệ thống biết điều gì cần xảy ra khi khởi động hoặc dừng thiết bị này. Ta thực hiện việc này trong phần [Service] , vì ta đang cấu hình một dịch vụ.

Điều đầu tiên ta muốn làm là vô hiệu hóa quá thời gian khởi động dịch vụ. Vì dịch vụ của ta là containers Docker nên lần đầu tiên nó được khởi động trên mỗi server , hình ảnh sẽ phải được kéo xuống khỏi server Docker Hub, có khả năng gây ra thời gian khởi động lâu hơn bình thường trong lần chạy đầu tiên.

Ta muốn đặt KillMode thành “none” để systemd sẽ cho phép lệnh “dừng” của ta để giết quá trình Docker. Nếu ta bỏ qua điều này, systemd sẽ nghĩ rằng quá trình Docker không thành công khi ta gọi lệnh dừng của bạn .

Ta cũng cần đảm bảo môi trường của ta sạch sẽ trước khi bắt đầu dịch vụ của ta . Điều này đặc biệt quan trọng vì ta sẽ tham chiếu các dịch vụ của bạn theo tên và Docker chỉ cho phép một containers duy nhất đang chạy với mỗi tên duy nhất.

Ta cần phải giết bất kỳ containers nào còn sót lại với tên mà ta muốn sử dụng và sau đó loại bỏ chúng. Đến đây, ta cũng thực sự kéo hình ảnh xuống từ Docker Hub. Ta cũng muốn tạo nguồn file /etc/environment . Điều này bao gồm các biến, chẳng hạn như địa chỉ IP công cộng và riêng tư của server đang chạy dịch vụ:

[Unit] Description=Apache web server service After=etcd.service After=docker.service Requires=apache-discovery@%i.service  [Service] TimeoutStartSec=0 KillMode=none EnvironmentFile=/etc/environment ExecStartPre=-/usr/bin/docker kill apache%i ExecStartPre=-/usr/bin/docker rm apache%i ExecStartPre=/usr/bin/docker pull user_name/apache 

Cú pháp =- cho hai dòng ExecStartPre đầu tiên cho biết những dòng chuẩn bị đó có thể không thành công và file đơn vị sẽ vẫn tiếp tục. Vì những lệnh đó chỉ thành công nếu một containers có tên đó tồn tại, chúng sẽ thất bại nếu không tìm thấy containers nào.

Bạn có thể nhận thấy hậu tố %i ở cuối tên containers apache trong các lệnh trên. Tệp dịch vụ ta đang tạo thực sự là một tệp đơn vị mẫu . Điều này nghĩa là khi chạy file , hạm đội sẽ tự động thay thế một số thông tin bằng các giá trị thích hợp. Đọc thông tin tại liên kết được cung cấp để tìm hiểu thêm.

Trong trường hợp của ta , %i sẽ được thay thế ở bất kỳ nơi nào nó tồn tại trong file bằng phần tên của file dịch vụ ở bên phải của @ trước hậu tố .service . Tuy nhiên, file của ta có tên đơn giản là apache@.service .

Mặc dù ta sẽ gửi file tới fleetctl với apache@.service , khi ta tải file , ta sẽ tải file dưới dạng apache@ PORT_NUM .service , trong đó “PORT_NUM” sẽ là cổng mà ta muốn khởi động server này. Ta sẽ gắn nhãn dịch vụ của bạn dựa trên cổng mà nó sẽ chạy để ta có thể dễ dàng phân biệt chúng.

Tiếp theo, ta cần thực sự khởi động containers Docker thực tế:

[Unit] Description=Apache web server service After=etcd.service After=docker.service Requires=apache-discovery@%i.service  [Service] TimeoutStartSec=0 KillMode=none EnvironmentFile=/etc/environment ExecStartPre=-/usr/bin/docker kill apache%i ExecStartPre=-/usr/bin/docker rm apache%i ExecStartPre=/usr/bin/docker pull user_name/apache ExecStart=/usr/bin/docker run --name apache%i -p ${COREOS_PUBLIC_IPV4}:%i:80 user_name/apache /usr/sbin/apache2ctl -D FOREGROUND 

Ta gọi lệnh docker run thông thường và chuyển cho nó một số tham số. Ta chuyển tên nó theo cùng một định dạng mà ta đã sử dụng ở trên. Ta cũng sẽ hiển thị một cổng từ containers Docker của ta với giao diện công khai của server của ta . Số cổng của server sẽ được lấy từ biến %i , đây là biến thực sự cho phép ta chỉ định cổng.

Ta sẽ sử dụng biến COREOS_PUBLIC_IPV4 (lấy từ file môi trường mà ta có nguồn root ) để rõ ràng với giao diện server mà ta muốn liên kết. Ta có thể bỏ qua điều này, nhưng nó cài đặt cho ta để dễ dàng sửa đổi sau này nếu ta muốn thay đổi nó thành một giao diện riêng tư (ví dụ: nếu ta đang cân bằng tải).

Ta tham chiếu containers Docker mà ta đã tải lên Docker Hub trước đó. Cuối cùng, ta gọi lệnh sẽ bắt đầu dịch vụ Apache của ta trong môi trường containers . Vì containers Docker tắt ngay sau khi lệnh được cấp cho chúng thoát ra, ta muốn chạy dịch vụ của bạn ở nền trước thay vì dưới dạng daemon. Điều này sẽ cho phép containers của ta tiếp tục chạy thay vì thoát ra ngay sau khi nó sinh ra một quy trình con thành công.

Tiếp theo, ta cần chỉ định lệnh để gọi khi dịch vụ cần dừng. Ta chỉ cần dừng container. Việc dọn dẹp containers được thực hiện khi khởi động lại mỗi lần.

Ta cũng muốn thêm một phần có tên [X-Fleet] . Phần này được thiết kế đặc biệt để cung cấp hướng dẫn cho đội tàu về cách lên lịch dịch vụ. Tại đây, bạn có thể thêm các hạn chế để dịch vụ của bạn phải hoặc không được chạy theo những thỏa thuận nhất định liên quan đến các dịch vụ hoặc trạng thái máy khác.

Ta muốn dịch vụ của bạn chỉ chạy trên các server chưa chạy web server Apache, vì điều này sẽ cho ta một cách dễ dàng để tạo các dịch vụ có tính khả dụng cao. Ta sẽ sử dụng ký tự đại diện để bắt các file dịch vụ apache nào mà ta có thể đang chạy:

[Unit] Description=Apache web server service After=etcd.service After=docker.service Requires=apache-discovery@%i.service  [Service] TimeoutStartSec=0 KillMode=none EnvironmentFile=/etc/environment ExecStartPre=-/usr/bin/docker kill apache%i ExecStartPre=-/usr/bin/docker rm apache%i ExecStartPre=/usr/bin/docker pull user_name/apache ExecStart=/usr/bin/docker run --name apache%i -p ${COREOS_PUBLIC_IPV4}:%i:80 user_name/apache /usr/sbin/apache2ctl -D FOREGROUND ExecStop=/usr/bin/docker stop apache%i  [X-Fleet] X-Conflicts=apache@*.service 

Như vậy, ta đã hoàn thành với file đơn vị server Apache của bạn . Bây giờ ta sẽ tạo một file dịch vụ đồng hành để đăng ký dịch vụ với etcd.

Đăng ký các tiểu bang dịch vụ với Etcd

Để ghi lại trạng thái hiện tại của các dịch vụ bắt đầu trên cụm, ta sẽ muốn ghi một số mục vào etcd. Điều này được gọi là đăng ký với etcd.

Để làm điều này, ta sẽ khởi động một dịch vụ đồng hành tối thiểu có thể cập nhật etcd khi server có sẵn cho lưu lượng truy cập.

Tệp dịch vụ mới sẽ được gọi là apache-discovery@.service . Mở nó bây giờ:

vim apache-discovery@.service 

Ta sẽ bắt đầu với phần [Unit] , giống như ta đã làm trước đây. Ta sẽ mô tả mục đích của dịch vụ và sau đó ta sẽ cài đặt một chỉ thị được gọi là BindsTo .

Chỉ thị BindsTo xác định dependencies mà dịch vụ này tìm kiếm thông tin tiểu bang. Nếu dịch vụ được liệt kê bị dừng, đơn vị ta đang viết bây giờ cũng sẽ dừng. Ta sẽ sử dụng điều này để nếu đơn vị web server của ta bị lỗi đột ngột, dịch vụ này sẽ cập nhật etcd để phản ánh thông tin đó. Điều này giải quyết vấn đề tiềm ẩn về việc có thông tin cũ trong etcd có thể bị sử dụng sai bởi các dịch vụ khác:

[Unit] Description=Announce Apache@%i service BindsTo=apache@%i.service 

Đối với phần [Service] , ta muốn lấy lại nguồn file môi trường bằng thông tin địa chỉ IP của server .

Đối với lệnh start thực tế, ta muốn chạy một vòng lặp bash vô hạn đơn giản. Trong vòng lặp, ta sẽ sử dụng lệnh etcdctl , được sử dụng để sửa đổi các giá trị etcd, để đặt khóa trong repository lưu trữ etcd tại /announce/services/apache%i . %i sẽ được thay thế bằng phần của tên dịch vụ mà ta sẽ tải giữa hậu tố @.service , sẽ là số cổng của dịch vụ Apache.

Giá trị của khóa này sẽ được đặt thành địa chỉ IP công cộng của nút và số cổng. Ta cũng sẽ đặt thời gian hết hạn là 60 giây cho giá trị để khóa sẽ bị xóa nếu dịch vụ bị lỗi bằng cách nào đó. Sau đó ta sẽ ngủ 45 giây. Điều này sẽ tạo ra sự trùng lặp với thời gian hết hạn để ta luôn cập nhật giá trị TTL (thời gian tồn tại) trước khi nó hết thời gian chờ.

Đối với hành động dừng, ta sẽ chỉ xóa khóa có cùng tiện ích etcdctl , đánh dấu dịch vụ là không khả dụng:

[Unit] Description=Announce Apache@%i service BindsTo=apache@%i.service  [Service] EnvironmentFile=/etc/environment ExecStart=/bin/sh -c "while true; do etcdctl set /announce/services/apache%i ${COREOS_PUBLIC_IPV4}:%i --ttl 60; sleep 45; done" ExecStop=/usr/bin/etcdctl rm /announce/services/apache%i 

Điều cuối cùng ta cần làm là thêm một điều kiện đảm bảo rằng dịch vụ này được khởi động trên cùng một server lưu trữ như web server mà nó đang báo cáo. Điều này sẽ đảm bảo nếu server gặp sự cố, thông tin etcd sẽ thay đổi một cách thích hợp:

[Unit] Description=Announce Apache@%i service BindsTo=apache@%i.service  [Service] EnvironmentFile=/etc/environment ExecStart=/bin/sh -c "while true; do etcdctl set /announce/services/apache%i ${COREOS_PUBLIC_IPV4}:%i --ttl 60; sleep 45; done" ExecStop=/usr/bin/etcdctl rm /announce/services/apache%i  [X-Fleet] X-ConditionMachineOf=apache@%i.service 

Đến đây bạn có dịch vụ sidekick của bạn có thể ghi lại tình trạng sức khỏe hiện tại của server Apache của bạn trong etcd.

Làm việc với các file đơn vị và hạm đội

Đến đây bạn có hai mẫu dịch vụ. Ta có thể gửi những thông tin này trực tiếp vào fleetctl để group của ta biết về chúng:

fleetctl submit apache@.service apache-discovery@.service 

Bạn có thể xem các file dịch vụ mới của bạn bằng lệnh :

fleetctl list-unit-files 
UNIT                HASH    DSTATE      STATE       TMACHINE apache-discovery@.service   26a893f inactive    inactive    - apache@.service         72bcc95 inactive    inactive    - 

Các mẫu hiện đã tồn tại trong hệ thống init toàn cụm của ta .

Vì ta đang sử dụng các mẫu phụ thuộc vào việc được lên lịch trên các server cụ thể, ta cần tải các file tiếp theo. Điều này sẽ cho phép ta chỉ định tên mới cho các file này với số cổng. Đây là thời điểm fleetctl vẻ tại [X-Fleet] phần để xem những gì các yêu cầu lập kế hoạch đang có.

Vì ta không thực hiện bất kỳ cân bằng tải nào, ta sẽ chỉ chạy web server của bạn trên cổng 80. Ta có thể tải từng dịch vụ bằng cách chỉ định giữa hậu tố @.service :

fleetctl load apache@80.service fleetctl load apache-discovery@80.service 

Bạn sẽ nhận được thông tin về server lưu trữ nào trong cụm của bạn mà dịch vụ đang được tải:

Unit apache@80.service loaded on 41f4cb9a.../10.132.248.119 Unit apache-discovery@80.service loaded on 41f4cb9a.../10.132.248.119 

Như bạn thấy , cả hai dịch vụ này đều được tải trên cùng một máy, đó là những gì ta đã chỉ định. Vì file dịch vụ apache-discovery của ta được liên kết với dịch vụ Apache của ta , ta chỉ cần bắt đầu muộn hơn để chạy cả hai dịch vụ của bạn :

fleetctl start apache@80.service 

Bây giờ, nếu bạn hỏi đơn vị nào đang chạy trên cụm của ta , ta sẽ thấy như sau:

fleetctl list-units 
UNIT                MACHINE             ACTIVE  SUB apache-discovery@80.service 41f4cb9a.../10.132.248.119  active  running apache@80.service       41f4cb9a.../10.132.248.119  active  running 

Có vẻ như web server của ta đang hoạt động. Trong file dịch vụ của ta , ta đã yêu cầu Docker liên kết với địa chỉ IP công cộng của server lưu trữ, nhưng IP được hiển thị với fleetctl là địa chỉ riêng (vì ta đã chuyển vào $private_ipv4 trong cloud-config khi tạo cụm ví dụ này).

Tuy nhiên, ta đã đăng ký địa chỉ IP công cộng và số cổng với etcd. Để lấy giá trị, bạn có thể sử dụng trình etcdctl để truy vấn các giá trị mà ta đã đặt. Nếu bạn nhớ lại, các khóa ta đặt là /announce/services/apache PORT_NUM . Vì vậy, để nhận thông tin chi tiết về server của ta , hãy nhập:

etcdctl get /announce/services/apache80 
104.131.15.192:80 

Nếu ta truy cập trang này trong trình duyệt web của bạn , ta sẽ thấy trang rất đơn giản mà ta đã tạo:

Trang web cơ bản về CoreOS

Dịch vụ của ta đã được triển khai thành công. Hãy thử tải lên một version khác bằng một cổng khác. Ta nên mong đợi rằng web server và containers sidekick được liên kết sẽ được lên lịch trên cùng một server . Tuy nhiên, do hạn chế của ta trong file dịch vụ Apache của ta , ta nên mong đợi cho server này là khác nhau từ một trong những phục vụ dịch vụ cổng 80 của ta .

Hãy tải một dịch vụ chạy trên cổng 9999:

fleetctl load apache@9999.service apache-discovery@9999.service 
Unit apache-discovery@9999.service loaded on 855f79e4.../10.132.248.120 Unit apache@9999.service loaded on 855f79e4.../10.132.248.120 

Ta có thể thấy rằng cả hai dịch vụ mới đã được lên lịch trên cùng một server mới. Khởi động web server :

fleetctl start apache@9999.service 

Bây giờ, ta có thể lấy địa chỉ IP công cộng của server mới này:

etcdctl get /announce/services/apache9999 
104.131.15.193:9999 

Nếu ta truy cập địa chỉ và số cổng được chỉ định, ta sẽ thấy một web server khác:

Trang web cơ bản về CoreOS

Hiện ta đã triển khai hai web server trong cụm của bạn .

Nếu bạn dừng một web server , containers sidekick cũng sẽ dừng theo:

fleetctl stop apache@80.service fleetctl list-units 
UNIT                MACHINE             ACTIVE      SUB apache-discovery@80.service 41f4cb9a.../10.132.248.119  inactive    dead apache-discovery@9999.service   855f79e4.../10.132.248.120  active  running apache@80.service       41f4cb9a.../10.132.248.119  inactive    dead apache@9999.service     855f79e4.../10.132.248.120  active  running 

Bạn có thể kiểm tra xem khóa etcd cũng đã bị xóa:

etcdctl get /announce/services/apache80 
Error:  100: Key not found (/announce/services/apache80) [26693] 

Điều này dường như đang hoạt động chính xác như mong đợi.

Kết luận

Theo hướng dẫn này, bây giờ bạn sẽ làm quen với một số cách làm việc phổ biến với các thành phần CoreOS.

Ta đã tạo containers Docker của riêng mình với dịch vụ mà ta muốn chạy được cài đặt bên trong và ta đã tạo file đơn vị hạm đội để cho CoreOS biết cách quản lý containers của ta . Ta đã triển khai dịch vụ sidekick để cập nhật repodata etcd của ta với thông tin trạng thái về web server của ta . Ta đã quản lý các dịch vụ của bạn với hạm đội, lập lịch dịch vụ trên các server khác nhau.

Trong các hướng dẫn sau, ta sẽ tiếp tục khám phá một số lĩnh vực mà ta đã đề cập ngắn gọn trong bài viết này.


Tags:

Các tin liên quan