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

Cách sử dụng mẫu Ambassador để cấu hình động các dịch vụ trên CoreOS

Tính năng Docker Links cho phép một phương pháp cấu hình động các kết nối mạng giữa các containers , được gọi là mẫu đại sứ . Mô hình đại sứ thúc đẩy tính khả chuyển của dịch vụ giữa nhà cung cấpngười tiêu dùng . Trong CoreOS, etcd có thể được tận dụng để triển khai mô hình đại sứ được phân phối trên nhiều máy trong một cụm.

Trong hướng dẫn này, ta sẽ chứng minh việc triển khai một containers Apache HTTP đã được đăng ký với etcd . Vùng chứa Apache sẽ đại diện cho containers nhà cung cấp của ta và ta sẽ sử dụng HAProxy làm containers dành cho người tiêu dùng của bạn . Ta sẽ sử dụng Docker image từ bản demo đại sứ CoreOS này cho các containers đại sứ của ta và ta sẽ tạo hình ảnh Apache và HAProxy Docker của riêng mình từ đầu.

Yêu cầu

Bạn phải có một cụm CoreOS trên DigitalOcean bao gồm ít nhất ba máy. Đây là hướng dẫn về cách cài đặt điều đó: Cách tạo và chạy dịch vụ trên cụm CoreOS

Bạn phải có kiến thức cơ bản về sử dụng CoreOS, etcdctl, flectl, cài đặt dịch vụ và chạy containers Docker. Các chủ đề này được đề cập trong loạt bài hướng dẫn Bắt đầu với CoreOS .

Bạn phải có account Docker Hub hoặc register Docker riêng. Điều này được đề cập trong phần Tạo containers Docker của hướng dẫn Cách tạo và chạy dịch vụ trên CoreOS Cluster .

Để biết chi tiết đầy đủ về cách hoạt động của mẫu đại sứ, hãy xem Liên kết qua bài viết Vùng chứa đại sứ từ Docker. Ngoài ra, hãy xem bài viết này được đăng trên blog CoreOS: Liên kết Dynamic Docker với một đại sứ được cung cấp bởi etcd .

Mục tiêu của ta

Ở phần cuối của hướng dẫn này, ta sẽ có sáu container chạy trên hai máy. Phần này sẽ cung cấp mô tả ngắn gọn về từng loại và cách chúng được group lại với nhau. Cài đặt chính xác này không hữu ích cho hầu hết mọi người, nhưng nó có thể được điều chỉnh để cho phép khám phá dịch vụ động cho các dịch vụ của bạn .

Máy A

Máy A sẽ chạy containers của nhà cung cấp, tức là web server Apache và một vài containers khác sẽ hỗ trợ nó.

  • Server Web Apache : Một containers Apache cơ bản mà ta sẽ tạo từ đầu, tương tự như containers được mô tả trong hướng dẫn Cách tạo và Chạy Dịch vụ trên CoreOS Cluster . Đây là nhà production của ta
  • polvi / docker-register : Một vùng chứa đăng ký sẽ đọc địa chỉ IP và cổng của Apache thông qua API Docker và ghi nó vào etcd
  • polvi / simple-amb : Một container đại sứ đơn giản sẽ chuyển tiếp lưu lượng truy cập đến một vị trí cụ thể. Trong trường hợp này, ta sẽ chuyển tiếp lưu lượng truy cập tới etcd và liên kết nó với containers etcd docker-register để cung cấp quyền truy cập containers đó vào etcd . Trong CoreOS, vì vị trí của etcd là tĩnh, điều này có thể bị xóa nếu docker-register etcd được sửa đổi để truy cập trực tiếp vào etcd

Máy B

Máy B là máy CoreOS sẽ chạy containers người tiêu dùng, tức là HAProxy và containers đại sứ chính.

  • HAProxy Reverse Proxy : Một containers HAProxy cơ bản mà ta sẽ tạo từ đầu, sẽ đại diện cho người tiêu dùng của ta . Điều này sẽ được sử dụng để chứng minh rằng cài đặt đại sứ hoạt động
  • polvi / dynamic-etcd-amb : Hộp chứa đại sứ chính.Một proxy động xem một khóa etcd được chỉ định cho địa chỉ IP và cổng của containers nhà cung cấp và định tuyến tất cả lưu lượng truy cập đến containers của nhà cung cấp. Giá trị của khóa có thể được cập nhật và proxy sẽ tự cập nhật
  • polvi / simple-amb : Cùng một containers được sử dụng trên máy khác, nhưng được sử dụng để liên kết dynamic-etcd-amb với etcd

Tạo hình ảnh Apache Docker

SSH tới một trong các máy CoreOS của bạn và chuyển đại lý SSH của bạn (thay thế trong địa chỉ IP công cộng):

ssh -A core@coreos-1_public_IP 

Sau đó đăng nhập vào Docker:

docker login 

Nhập user_name , password và địa chỉ email của bạn khi được yêu cầu .

Tiếp theo, tạo một folder mới để ghi Apache Docker file vào:

mkdir -p ambassador/apache 

Bây giờ thay đổi folder và mở Dockerfile để chỉnh sửa:

cd ambassador/apache vi Dockerfile 

Dựa trên cài đặt containers Apache từ Cách tạo và chạy dịch vụ trên cụm CoreOS , ta có thể tạo Dockerfile sau (thay thế user_name bằng tên user Docker của bạn ):

FROM ubuntu:14.04 MAINTAINER user_name  RUN apt-get update && \     DEBIAN_FRONTEND=noninteractive apt-get -y install apache2 && \     echo "<h1>Running from Docker on CoreOS</h1>" > /var/www/html/index.html  EXPOSE 80  ENTRYPOINT ["/usr/sbin/apache2ctl"] CMD ["-D", "FOREGROUND"] 

Lưu và thoát.

Bây giờ ta có một file Dockerfile cài đặt Apache và thay thế index.html bằng một thông báo cơ bản, hãy xây dựng Docker image của bạn và đặt tên cho nó là “apache” bằng lệnh sau (thay thế tên user của bạn ):

docker build --tag="user_name/apache" . 

Bây giờ, để cung cấp hình ảnh cho các máy CoreOS khác của bạn, hãy push nó vào register Docker của bạn bằng lệnh sau:

docker push user_name/apache 

Bây giờ hình ảnh Apache của bạn đã sẵn sàng để sử dụng. Hãy chuyển sang tạo một hình ảnh HAProxy.

Tạo hình ảnh HAProxy Docker

Ta sẽ tạo một hình ảnh HAProxy Docker, dựa trên HAproxy Dockerfile cho các bản dựng Docker tự động tin cậy . Ta sẽ sửa đổi một chút các haproxy.cfgstart.bash được cung cấp.

Trong folder ambassador , sử dụng git để sao chép repository HAProxy:

cd ~/ambassador git clone https://github.com/dockerfile/haproxy.git 

Thao tác này sẽ tạo một folder haproxy , với các Dockerfile , haproxy.cfgstart.bash .

Dockerfile về cơ bản cài đặt HAProxy và để lộ các cổng 80 và 443, vì vậy ta có thể để nguyên như vậy.

Ta sẽ sửa đổi file haproxy.cfg để thêm frontendbackend . Mở haproxy.cfg để chỉnh sửa:

cd haproxy vi haproxy.cfg 

Bây giờ, hãy tìm và xóa các dòng sau:

listen stats :80   stats enable   stats uri / 

Sau đó, thêm các dòng sau vào cuối file :

frontend www-http         bind :80         default_backend www-backend  backend www-backend         server apache private_ipv4:80 check 

Điều này cấu hình HAProxy để lắng nghe trên cổng 80 và chuyển tiếp lưu lượng đến tới www-backend , bao gồm một server duy nhất. Ta sẽ sử dụng tập lệnh start.bash để thay thế private_ipv4 bằng địa chỉ IP riêng của máy CoreOS mà containers này sẽ chạy trên đó, khi containers HAProxy khởi động. Vùng chứa đại sứ động của ta , mà HAProxy sẽ chuyển tiếp lưu lượng truy cập qua containers Apache, sẽ chạy trên cùng một máy.

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

vi start.bash 

Ở cuối file , bạn sẽ tìm thấy một dòng sẽ bắt đầu quá trình HAProxy trong containers này. Nó trông như thế này:

haproxy -f /etc/haproxy/haproxy.cfg -p "$PIDFILE" 

Ngay phía trên dòng này, hãy chèn các dòng sau:

# Set backend IP address to machine's private IP address PRIVATE_IPV4=$(curl -sw "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address) sed -i -e "s/server apache private_ipv4:80 check/server apache ${PRIVATE_IPV4}:80 check/g" $HAPROXY/$CONFIG 

Lưu và thoát. Lệnh curl sẽ truy xuất địa chỉ IP riêng của máy mà containers sẽ chạy qua dịch vụ Siêu dữ liệu DigitalOcean. Lệnh sed thay thế chuỗi private_ipv4 trong haproxy.cfg bằng địa chỉ IP thực được truy xuất từ Siêu dữ liệu. Tập lệnh này chạy từ bên trong containers HAProxy, vì vậy địa chỉ IP riêng sẽ được cấu hình trong thời gian chạy.

Bây giờ ta đã sẵn sàng để xây dựng docker image HAProxy. Tạo Docker image của bạn và đặt tên nó là “haproxy” bằng lệnh sau (thay thế tên user của bạn ):

docker build --tag="user_name/haproxy" . 

Bây giờ, để cung cấp hình ảnh cho các máy CoreOS khác của bạn, hãy push nó vào register Docker của bạn bằng lệnh sau:

docker push user_name/haproxy 

Hình ảnh HAProxy của bạn đã sẵn sàng để sử dụng. Ta đã sẵn sàng để viết các file đơn vị dịch vụ hạm đội của ta !

Tệp đơn vị dịch vụ của hạm đội

Bây giờ tất cả các Docker image bắt buộc đều có sẵn cho cụm CoreOS của ta , hãy bắt đầu làm việc trên các file cần thiết để triển khai containers của ta . Bởi vì ta đang sử dụng một cụm CoreOS, ta có thể tạo và lập lịch tất cả các file đơn vị dịch vụ group của ta từ một máy CoreOS duy nhất.

Ta sẽ tạo tất cả các file dịch vụ trong folder ~/ambassador mà ta đã tạo trước đó, vì vậy hãy thay đổi folder đó ngay bây giờ:

cd ~/ambassador 

apache.service

Đơn vị apache.service sẽ chạy trên Server A.

Tệp dịch vụ đầu tiên ta sẽ tạo dành cho containers web server Apache, user_name/apache . Mở một file có tên apache.service để chỉnh sửa ngay bây giờ:

vi apache.service 

Thêm các dòng sau (thay thế tên user Docker của bạn ở cả hai nơi):

[Unit] Description=Apache web server service  [Service] EnvironmentFile=/etc/environment ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStartPre=/usr/bin/docker pull user_name/apache ExecStart=/usr/bin/docker run --rm --name %n -p ${COREOS_PRIVATE_IPV4}::80 user_name/apache ExecStop=/usr/bin/docker stop -t 3 %n 

Lưu và thoát. Đây là một file dịch vụ khá đơn giản khởi động Apache ở chế độ nền trước. Đặc biệt lưu ý là ta đang liên kết cổng 80 bên trong containers với một cổng động trên network interface riêng ( -p ${COREOS_PRIVATE_IPV4}::80 ).

etcd-amb-apache.service

Đơn vị etcd-amb-apache.service sẽ chạy trên Server A.

Tiếp theo, ta sẽ muốn tạo một file dịch vụ cho containers đại sứ đơn giản của ta ( simple-amb ) để cho phép containers đăng ký Apache truy cập vào etcd . Mở một file có tên là etcd-amb-apache.service ngay bây giờ:

vi etcd-amb-apache.service 

Thêm các dòng sau:

[Unit] Description=Simple Apache ambassador After=apache.service BindsTo=apache.service  [Service] ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStart=/usr/bin/docker run --rm --name %n polvi/simple-amb 172.17.42.1:4001 ExecStop=/usr/bin/docker stop -t 3 %n  [X-Fleet] X-ConditionMachineOf=apache.service 

Lưu và thoát.

Các simple-amb chứa chuyển tiếp tất cả lưu lượng mà nó nhận được trên cổng 10000 cho lập luận được cung cấp khi nó được bắt đầu, tức là 172.17.42.1:4001 , đó là etcd 's vị trí tiêu chuẩn trong CoreOS.

X-ConditionMachineOf=apache.service cho hạm đội lên lịch điều này trên cùng một máy với Apache container, điều này rất quan trọng vì nó được sử dụng bởi docker-register container để đăng ký địa chỉ IP và cổng mà Apache đang sử dụng để etcd .

apache-docker-reg.service

Đơn vị apache-docker-reg.service sẽ chạy trên Server A.

Hãy tạo file dịch vụ cho containers của ta để đăng ký địa chỉ IP và cổng của Apache trong etcd , etcd docker-register . Mở file có tên apache-docker-reg.service ngay bây giờ:

vi apache-docker-reg.service 

Chèn các dòng sau:

[Unit] Description=Register Apache After=etcd-amb-apache.service BindsTo=etcd-amb-apache.service  [Service] ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStart=/usr/bin/docker run --link etcd-amb-apache.service:etcd -v /var/run/docker.sock:/var/run/docker.sock --rm polvi/docker-register apache.service 80 apache-A  [X-Fleet] X-ConditionMachineOf=etcd-amb-apache.service 

Lưu và thoát. Dưới đây là bảng phân tích các phần đáng chú ý của lệnh docker run :

  • --link etcd-amb-apache.service:etcd liên kết containers này với đại sứ đơn giản, sẽ được sử dụng để chuyển thông tin kết nối của Apache tới etcd
  • -v /var/run/docker.sock:/var/run/docker.sock cho phép containers này xác định cổng động mà Apache đang ràng buộc thông qua API Docker của máy mà nó sẽ chạy.
  • apache.service 80 apache-A chuyển các đối số này vào containers . Hai đối số đầu tiên chỉ định tên và cổng của containers docker để tra cứu và đối số thứ ba chỉ định tên của khóa etcd để ghi vào. Sau khi containers này khởi động, nó sẽ ghi cổng động và địa chỉ IP của apache.service vào khóa /services/apache-A/apache.service .

X-ConditionMachineOf=etcd-amb-apache.service yêu cầu hạm đội lên lịch điều này trên cùng một máy như containers đại sứ đơn giản, điều này rất quan trọng vì chúng được liên kết với liên kết Docker, để cung cấp cho containers đăng ký một cách tìm thấy etcd .

etcd-amb-apache2.service

Đơn vị etcd-amb-apache2.service sẽ chạy trên Server B.

Tạo file dịch vụ cho containers đại sứ đơn giản thứ hai của ta ( simple-amb ) sẽ cho phép containers đại sứ động truy cập vào etcd . Mở một file có tên là etcd-amb-apache2.service ngay bây giờ:

vi etcd-amb-apache2.service 

Thêm các dòng sau:

[Unit] Description=Simple Apache ambassador 2  [Service] ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStart=/usr/bin/docker run --rm --name %n polvi/simple-amb 172.17.42.1:4001 ExecStop=/usr/bin/docker stop -t 3 %n  [X-Fleet] X-Conflicts=apache.service 

Lưu và thoát.

Đây là file dịch vụ khá giống với etcd-amb-apache.service ngoại trừ X-Conflicts=apache.service yêu cầu hạm đội lên lịch trên một máy khác với containers Apache và nó sẽ được sử dụng để liên kết đại sứ động với etcd .

apache-dyn-amb.service

Đơn vị apache-dyn-amb.service sẽ chạy trên Server B.

Tạo file dịch vụ cho containers đại sứ động của ta ( dynamic-etd-amb ) sẽ cho phép containers đại sứ động truy cập vào etcd . Mở file có tên apache-dyn-amb.service ngay bây giờ:

vi apache-dyn-amb.service 

Thêm các dòng sau:

[Unit] Description=Dynamic ambassador for Apache After=etcd-amb-apache2.service BindsTo=etcd-amb-apache2.service  [Service] EnvironmentFile=/etc/environment ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStartPre=/usr/bin/docker pull polvi/dynamic-etcd-amb ExecStart=/usr/bin/docker run --link etcd-amb-apache2.service:etcd --rm --name %n -p ${COREOS_PRIVATE_IPV4}:80:80 polvi/dynamic-etcd-amb apache-A 80 ExecStop=/usr/bin/docker stop -t 3 %n  [X-Fleet] X-ConditionMachineOf=etcd-amb-apache2.service 

Lưu và thoát. Dưới đây là bảng phân tích các phần đáng chú ý của lệnh docker run :

  • --link etcd-amb-apache2.service:etcd liên kết containers này với đại sứ đơn giản thứ hai, sẽ được sử dụng để truy xuất thông tin kết nối của Apache từ etcd
  • -p ${COREOS_PRIVATE_IPV4}:80:80 hiển thị cổng 80 trên containers và network interface riêng của máy
  • apache-A 80 là hai đối số chỉ định rằng lưu lượng cổng 80 (tức là cổng 80 trên network interface riêng) nên được ủy quyền cho dịch vụ được đăng ký là apache-A trong etcd

X-ConditionMachineOf=etcd-amb-apache2.service cho hạm đội lập lịch trình này trên cùng một máy như containers đại sứ đơn giản thứ hai, điều này rất quan trọng vì chúng được liên kết với liên kết Docker, để cung cấp cho containers đại sứ động một cách tìm thấy etcd .

haproxy.service

Đơn vị haproxy.service sẽ chạy trên Server B.

Tạo file dịch vụ cho containers HAProxy ( haproxy ) của ta sẽ được sử dụng để kết nối với containers Apache, thông qua containers đại sứ động. Mở file có tên haproxy.service ngay bây giờ:

vi haproxy.service 

Thêm các dòng sau (thay thế tên user Docker của bạn ở cả hai nơi):

[Unit] Description=HAProxy consumer  [Service] EnvironmentFile=/etc/environment ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStartPre=/usr/bin/docker pull user_name/haproxy ExecStart=/usr/bin/docker run --name %n -p ${COREOS_PUBLIC_IPV4}:80:80 user_name/haproxy ExecStop=/usr/bin/docker stop -t 3 %n  [X-Fleet] X-ConditionMachineOf=apache-dyn-amb.service 

Lưu và thoát. Đây là một file dịch vụ đơn giản, khởi động HAProxy và hiển thị cổng 80 trên địa chỉ IP công cộng của server của nó. Lưu ý server backend sẽ được cấu hình thành địa chỉ IP riêng của server trên cổng 80, đây sẽ là nơi mà đại sứ động đang lắng nghe lưu lượng truy cập tới proxy đến dịch vụ Apache.

X-ConditionMachineOf=apache-dyn-amb.service yêu cầu đội xe lên lịch cho việc này trên cùng một máy với containers đại sứ động, điều này rất quan trọng vì đại sứ động cung cấp cho containers HAProxy một tuyến đường để đến containers Apache.

Triển khai với hạm đội

Bây giờ ta có tất cả các file dịch vụ hạm đội cần thiết, cuối cùng ta có thể triển khai cài đặt đại sứ của bạn . Trong folder chứa tất cả các file dịch vụ của bạn, hãy chạy các lệnh sau:

fleetctl start apache.service fleetctl start etcd-amb-apache.service fleetctl start apache-docker-reg.service fleetctl start etcd-amb-apache2.service fleetctl start apache-dyn-amb.service fleetctl start haproxy.service 

Bạn sẽ thấy các thông báo nói rằng mỗi dịch vụ đã được tải. Để kiểm tra trạng thái của các đơn vị hạm đội của bạn, hãy chạy lệnh sau:

fleetctl list-units 

Bạn sẽ thấy kết quả tương tự như sau:

UNIT                       MACHINE                      ACTIVE   SUB apache-docker-reg.service  ceb3ead2.../10.132.233.107   active   running apache-dyn-amb.service     3ce87ca7.../10.132.233.106   active   running apache.service             ceb3ead2.../10.132.233.107   active   running etcd-amb-apache.service    ceb3ead2.../10.132.233.107   active   running etcd-amb-apache2.service   3ce87ca7.../10.132.233.106   active   running haproxy.service            3ce87ca7.../10.132.233.106   active   running 

Tất cả các trạng thái phải activerunning . Một điều nữa cần lưu ý là các đơn vị “Máy A” phải nằm trên cùng một máy và các đơn vị “Máy B” phải nằm trên một máy khác – chỉ cần xem địa chỉ IP của từng máy để xác nhận điều này.

Kiểm tra cài đặt của bạn

Đảm bảo HAProxy có thể tiếp cận Apache

Vì ta không chỉ định rằng containers HAProxy sẽ chạy trên một máy cụ thể, ta cần tìm nơi nó đang chạy. Một cách dễ dàng để làm điều này là sử dụng lệnh fleetctl ssh :

fleetctl ssh haproxy.service 

Thao tác này sẽ kết nối bạn với máy đang chạy containers haproxy.service . Đến đây bạn có thể nguồn file /etc/environment để lấy địa chỉ IP công cộng của máy CoreOS đang chạy HAProxy:

. /etc/environment echo $COREOS_PUBLIC_IPV4 

Lấy địa chỉ IP kết quả và truy cập địa chỉ đó bằng trình duyệt web. Bạn sẽ thấy hình ảnh sau:

Chạy từ Docker trên CoreOS

Lưu ý bạn đang truy cập HAProxy và HAProxy đang truy cập Apache thông qua proxy đại sứ động.

Đến đây bạn có thể thoát phiên SSH hiện tại để quay lại phiên SSH ban đầu của bạn :

exit 

Kiểm tra dự phòng

Đến đây bạn đã xác nhận cài đặt apache.service hoạt động, hãy xem điều gì sẽ xảy ra khi dịch vụ nhà cung cấp ( apache.service ) thay đổi địa chỉ IP và cổng của nó.

Sử dụng fleetctl để kết nối với máy đang chạy apache.service :

fleetctl ssh apache.service 

Bây giờ khởi động lại máy Apache đang chạy:

sudo reboot 

Lưu ý: Nếu apache.service đang chạy trên máy mà bạn đã kết nối ban đầu qua SSH, bạn sẽ bị ngắt kết nối. Nếu đúng như vậy, chỉ cần SSH cho một máy khác của bạn trong cùng một cụm CoreOS.

Bây giờ, hãy đợi một phút và kiểm tra xem đơn vị nào đang chạy:

fleetctl list-units 

Tùy thuộc vào thời gian bạn đã đợi, bạn có thể thấy ba đơn vị liên quan đến “ Server A” ( apache.service , etcd-amb-apache.serviceapache-docker-reg.service ) đang khởi động lại hoặc hoạt động. Cuối cùng, tất cả chúng sẽ trở lại trạng thái hoạt động . Sau khi chúng hoạt động, hãy lưu ý chúng hiện đang chạy trên một máy khác với trước đây.

Bây giờ quay lại trình duyệt web đang kết nối với HAProxy và nhấn refresh. Bạn sẽ thấy trang kiểm tra tương tự như trước đây, cho biết HAProxy vẫn có thể kết nối với Apache thông qua đại sứ động!

Kết luận

Đến đây bạn đã cài đặt mẫu đại sứ của riêng mình, bạn có thể điều chỉnh các khái niệm được trình bày trong hướng dẫn này cho các dịch vụ của bạn . Đó là một cách độc đáo để cấu hình các dịch vụ tiêu dùng của bạn trong thời gian chạy, cho phép bạn di chuyển các dịch vụ của nhà cung cấp backend giữa các máy một cách dễ dàng. Trong một cài đặt thực tế hơn, bạn có thể sẽ thay thế dịch vụ Apache bằng một hoặc nhiều containers ứng dụng và bạn có thể cấu hình HAProxy với nhiều server backend (hoặc sử dụng một dịch vụ tiêu dùng hoàn toàn khác).


Tags:

Các tin liên quan