Thứ năm, 23/04/2020 | 00:00 GMT+7

Cách cài đặt và sử dụng Linkerd với Kubernetes

Lưới dịch vụ là một lớp cơ sở hạ tầng chuyên dụng giúp administrator xử lý giao tiếp giữa dịch vụ và dịch vụ. Cung cấp nhiều công cụ mạnh mẽ, các lưới dịch vụ này có thể giúp hệ thống của bạn an toàn hơn, tin cậy hơn và cũng dễ thấy hơn.

Ví dụ, một lưới dịch vụ như Linkerd có thể tự động mã hóa kết nối, xử lý yêu cầu thử lại và thời gian chờ, cung cấp thông tin đo từ xa như tỷ lệ thành công và độ trễ, v.v.

Trong hướng dẫn này, bạn sẽ cài đặt lưới dịch vụ Linkerd trong cụm Kubernetes của bạn , triển khai một ứng dụng mẫu và sau đó khám phá console của Linkerd. Sau khi tự làm quen với một số thông tin trang tổng quan này, bạn sẽ cấu hình Linkerd để thực thi các policy timeoutretry cho một group Kubernetes cụ thể.

Ngoài ra, hãy xem xét khám phá tùy chọn cài đặt Linkerd / Kubernetes bằng một cú nhấp chuột của DigitalOcean .

Yêu cầu

  • Một cụm Kubernetes 1.12+. Trong hướng dẫn này, cài đặt sẽ sử dụng một cụm DigitalOcean Kubernetes với ba nút, 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 server phát triể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 của nó.

Bước 1 - Triển khai ứng dụng

Để xem Linkerd đang hoạt động, bạn cần có một ứng dụng đang chạy trong cụm của bạn . Trong bước này, bạn sẽ triển khai một ứng dụng có tên emojivoto , được group Linkerd tạo cho mục đích này .

Trong kho lưu trữ này , bạn có thể thấy mã cho bốn dịch vụ tạo ứng dụng, cũng như tệp kê khai mà bạn sẽ sử dụng để triển khai các dịch vụ này trong cụm Kubernetes của bạn .

Đầu tiên, lưu file kê khai này local :

  • curl https://run.linkerd.io/emojivoto.yml --output manifest.yaml

Bạn đang sử dụng curl để tìm nạp file , sau đó chuyển tùy chọn --output để cho nó biết nơi bạn muốn file được lưu. Trong trường hợp này, bạn đang tạo một file có tên là manifest.yaml .

Để hiểu rõ hơn về những gì file này sẽ đạt được, hãy kiểm tra nội dung của nó với cat hoặc mở nó bằng editor yêu thích của bạn:

  • cat manifest.yaml | less

Nhấn SPACE để trang thông qua các chỉ thị. Bạn sẽ thấy manifest.yaml khai.yaml đang tạo một không gian tên Kubernetes có tên là emojivoto , nơi mọi thứ liên quan đến ứng dụng này sẽ chạy và một vài DeploymentsServices Kubernetes.

Tiếp theo, áp dụng file kê khai này trong cụm Kubernetes của bạn:

  • kubectl apply -f manifest.yaml

, bạn đang sử dụng kubectl apply với cờ -f để gán một file mà bạn muốn áp dụng.

Lệnh này sẽ xuất ra danh sách tất cả các tài nguyên đã được tạo:

Output
namespace/emojivoto created serviceaccount/emoji created serviceaccount/voting created serviceaccount/web created service/emoji-svc created service/voting-svc created service/web-svc created deployment.apps/emoji created deployment.apps/vote-bot created deployment.apps/voting created deployment.apps/web created

Bây giờ hãy kiểm tra xem các dịch vụ đang chạy:

  • kubectl -n emojivoto get pods

Bạn đang sử dụng kubectl để liệt kê tất cả các pods bạn có đang chạy trong cluster của bạn, và sau đó đi qua các -n cờ để chỉ ra các không gian tên bạn muốn sử dụng. Bạn đang chuyển không gian tên emojivoto vì đó là nơi bạn đang chạy tất cả các dịch vụ này.

Khi bạn nhìn thấy tất cả các pods trong Running bang, bạn tốt để đi:

Output
NAME READY STATUS RESTARTS AGE emoji-566954596f-cw75b 1/1 Running 0 24s vote-bot-85c5f5699f-7dw5c 1/1 Running 0 24s voting-756995b6fc-czf8z 1/1 Running 0 24s web-7f7b69d467-2546n 1/1 Running 0 23s

Cuối cùng, để xem ứng dụng đang chạy trong trình duyệt của bạn, bạn sẽ sử dụng tính năng kubectl hợp sẵn kubectl để chuyển tiếp các yêu cầu local đến cụm từ xa của bạn:

  • kubectl -n emojivoto port-forward svc/web-svc 8080:80

Lưu ý: Nếu bạn không chạy phần mềm này từ máy local của bạn , bạn cần thêm cờ --address 0.0.0.0 để lắng nghe trên tất cả các địa chỉ chứ không chỉ localhost .

Ở đây, bạn lại đang sử dụng kubectl trong không gian tên emojivoto , nhưng bây giờ đang gọi lệnh phụ port-forward và hướng nó chuyển tiếp tất cả các yêu cầu local trên cổng 8080 tới web-svc dịch vụ Kubernetes, trên cổng 80 . Đây chỉ là một cách thuận tiện để bạn truy cập ứng dụng của bạn mà không cần phải có bộ cân bằng tải thích hợp.

Bây giờ hãy truy cập http://localhost:8080 và bạn sẽ thấy ứng dụng emojivoto.

Ứng dụng mẫu Emojivoto

Nhấn CTRL + C trong terminal của bạn. Với một ứng dụng đang chạy trong cụm của bạn, bây giờ bạn đã sẵn sàng cài đặt Linkerd và xem nó hoạt động như thế nào.

Bước 2 - Cài đặt Linkerd

Đến đây bạn có một ứng dụng đang chạy, hãy cài đặt Linkerd. Để cài đặt nó trong cụm Kubernetes của bạn, trước tiên bạn cần Linkerd CLI. Bạn sẽ sử dụng giao diện dòng lệnh này để tương tác với Linkerd từ máy local của bạn . Sau đó, bạn có thể cài đặt Linkerd trong cụm của bạn .

Đầu tiên, hãy cài đặt CLI với tập lệnh do group Linkerd cung cấp:

  • curl https://run.linkerd.io/install | sh

Ở đây bạn đang sử dụng curl để download lệnh cài đặt và sau đó bạn đang chuyển kết quả tới sh , tập lệnh này sẽ tự động thực thi tập lệnh. Ngoài ra, bạn có thể download CLI trực tiếp từ trang phát hành của Linkerd.

Nếu bạn sử dụng script thì nó sẽ cài đặt Linkerd tại ~/.linkerd2/bin . Bây giờ xác nhận CLI đang hoạt động chính xác:

  • ~/.linkerd2/bin/linkerd version

Lệnh sẽ xuất ra một thứ như sau:

Output
Client version: stable-2.7.1 Server version: unavailable

Sau đó, để chạy CLI dễ dàng hơn, hãy thêm folder này vào $PATH của bạn:

  • export PATH=$PATH:$HOME/.linkerd2/bin

Đến đây bạn có thể chạy trực tiếp các lệnh hơn, giống như lệnh trước:

  • linkerd version

Cuối cùng, hãy cài đặt Linkerd trong cụm Kubernetes của bạn. linkerd install được sử dụng để tạo tất cả các file kê khai yaml cần thiết để chạy Linkerd, nhưng nó sẽ không áp dụng các file kê khai này cho cụm của bạn. Chạy lệnh này để kiểm tra kết quả của nó:

  • linkerd install

Bạn sẽ thấy một kết quả dài, liệt kê tất cả các file kê khai yaml cho các tài nguyên mà Linkerd cần để chạy. Để áp dụng các file kê khai này cho cụm của bạn, hãy chạy:

  • linkerd install | kubectl apply -f -

Chạy linkerd install sẽ xuất ra tất cả các file kê khai mà bạn đã thấy trước đó. | sau đó chuyển kết quả này trực tiếp đến kubectl apply , điều này sẽ áp dụng chúng.

Sau khi bạn chạy lệnh này, kubectl apply sẽ xuất ra danh sách tất cả các tài nguyên đã được tạo.

Để xác nhận mọi thứ đang chạy trong cụm của bạn, hãy chạy linkerd check :

  • linkerd check

Điều này sẽ chạy một số kiểm tra đối với cụm của bạn để xác nhận tất cả các thành phần cần thiết đang chạy:

Output
kubernetes-api -------------- √ can initialize the client √ can query the Kubernetes API [...] control-plane-version --------------------- √ control plane is up-to-date √ control plane and cli versions match Status check results are √

Cuối cùng, chạy lệnh này để mở console Linkerd tích hợp trong trình duyệt của bạn (hãy nhớ rằng bạn cần cung cấp cờ --address 0.0.0.0 nếu bạn không chạy nó từ máy local của bạn ):

  • linkerd dashboard

 Control panel  Linkerd

Hầu hết thông tin bạn thấy trong console mà bạn có thể lấy bằng Linkerd CLI. Ví dụ: chạy lệnh này để xem các triển khai thống kê cấp cao:

  • linkerd stat deployments -n linkerd

Ở đây bạn đang nói rằng bạn muốn thống kê cho triển khai chạy trong linkerd namespace. Đây là các thành phần riêng của Linkerd và thú vị là bạn có thể sử dụng chính Linkerd để giám sát chúng. Bạn có thể xem các số liệu thống kê như yêu cầu mỗi giây (RPS), tỷ lệ thành công, độ trễ, v.v. Bạn cũng có thể thấy một Meshed cột, mà chỉ ra có bao nhiêu pods Linkerd đã tiêm:

Output
NAME MESHED SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99 TCP_CONN linkerd-controller 1/1 100.00% 0.4rps 1ms 87ms 98ms 5 linkerd-destination 1/1 100.00% 0.3rps 1ms 2ms 2ms 13 linkerd-grafana 1/1 100.00% 0.3rps 2ms 3ms 3ms 2 linkerd-identity 1/1 100.00% 0.3rps 1ms 2ms 2ms 10 linkerd-prometheus 1/1 100.00% 0.7rps 35ms 155ms 191ms 9 linkerd-proxy-injector 1/1 100.00% 0.3rps 2ms 3ms 3ms 2 linkerd-sp-validator 1/1 100.00% 0.3rps 1ms 5ms 5ms 2 linkerd-tap 1/1 100.00% 0.3rps 1ms 4ms 4ms 6 linkerd-web 1/1 100.00% 0.3rps 1ms 2ms 2ms 2

Bây giờ hãy thử lệnh này trong không gian tên emojivoto của bạn:

  • linkerd stat deployments -n emojivoto

Mặc dù bạn có thể thấy bốn dịch vụ của bạn , nhưng không có số liệu thống kê nào bạn thấy trước đây khả dụng cho những lần triển khai này và trong cột "Được chia lưới", bạn có thể thấy nó cho biết 0/1 :

Output
NAME MESHED SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99 TCP_CONN emoji 0/1 - - - - - - vote-bot 0/1 - - - - - - voting 0/1 - - - - - - web 0/1 - - - - - -

Kết quả ở đây nghĩa là bạn vẫn chưa đưa Linkerd vào ứng dụng. Đây sẽ là bước tiếp theo của bạn.

Bước 3 - Đưa Linkerd vào ứng dụng của bạn

Đến đây bạn có Linkerd đang chạy trong cụm của bạn , bạn đã sẵn sàng đưa nó vào ứng dụng emojivoto của bạn .

Linkerd hoạt động bằng cách chạy một container sidecar trong Kubernetes bạn pods . Tức là, bạn sẽ đưa một containers proxy linkerd vào mỗi pod bạn đang chạy. Mọi yêu cầu đó của bạn pods rồi gửi hoặc nhận sẽ đi qua proxy rất nhẹ này có thể thu thập số liệu (như tỷ lệ thành công, yêu cầu mỗi giây, và độ trễ) và thực thi policy (như timeout và thử lại).

Bạn có thể đưa proxy của Linkerd theo cách thủ công bằng lệnh này:

  • kubectl get deployments -n emojivoto -o yaml | linkerd inject - | kubectl apply -f -

Trong lệnh này, trước tiên bạn sử dụng kubectl get để lấy tất cả các deployment Kubernetes mà bạn đang chạy trong không gian tên emojivoto , sau đó chỉ định rằng bạn muốn kết quả ở định dạng yaml . Sau đó, bạn đang gửi kết quả đó đến lệnh linkerd inject . Lệnh này sẽ đọc file yaml với các file kê khai hiện tại bạn đang chạy và sửa đổi nó để bao gồm proxy linkerd cùng với mọi deployment .

Cuối cùng, bạn nhận được file kê khai đã sửa đổi này và áp dụng nó cho cụm của bạn với kubectl apply .

Sau khi chạy lệnh này, bạn sẽ thấy một thông báo cho biết rằng tất cả bốn dịch vụ emojivoto ( emoji , vote-bot voting , votingweb ) đã được đưa vào thành công.

Nếu bây giờ bạn lấy stats cho emojivoto , bạn sẽ thấy rằng tất cả các bạn deployment s đang ăn khớp, và sau một vài giây, bạn sẽ bắt đầu thấy các số liệu thống kê tương tự mà bạn nhìn thấy cho linkerd namespace:

  • linkerd stat deployments -n emojivoto

Tại đây, bạn có thể xem số liệu thống kê cho tất cả bốn dịch vụ tạo ứng dụng emojivoto , với tỷ lệ thành công, yêu cầu trên giây và độ trễ tương ứng của chúng mà không cần phải viết hoặc thay đổi bất kỳ mã ứng dụng nào.

Output
NAME MESHED SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99 TCP_CONN emoji 1/1 100.00% 1.9rps 1ms 2ms 2ms 2 vote-bot 1/1 - - - - - - voting 1/1 85.96% 0.9rps 1ms 1ms 1ms 2 web 1/1 93.04% 1.9rps 8ms 27ms 29ms 2

Dịch vụ vote-bot không hiển thị bất kỳ số liệu thống kê nào bởi vì nó chỉ là một bot gửi yêu cầu đến các dịch vụ khác và do đó không nhận được bất kỳ lưu lượng truy cập nào, bản thân nó là thông tin có giá trị.

Bây giờ, hãy xem cách bạn có thể cung cấp thêm một số thông tin cho Linkerd về các dịch vụ của bạn để tùy chỉnh hành vi của chúng.

Bước 4 - Xác định profile dịch vụ

Đến đây bạn đã đưa Linkerd vào ứng dụng của bạn , bạn có thể bắt đầu truy xuất thông tin có giá trị về cách mỗi dịch vụ của bạn đang hoạt động. Hơn nữa, bạn đã hoàn thành việc này mà không cần viết bất kỳ cấu hình tùy chỉnh nào hoặc thay đổi mã ứng dụng của bạn . Tuy nhiên, nếu bạn cung cấp cho Linkerd một số thông tin bổ sung, thì Linkerd có thể thực thi nhiều policy , như hết thời gian chờ và thử lại. Sau đó, nó cũng có thể cung cấp các số liệu cho mỗi tuyến đường.

Thông tin này được cung cấp thông qua Hồ sơ dịch vụ, là một tài nguyên Linkerd tùy chỉnh, nơi bạn có thể mô tả các tuyến trong ứng dụng của bạn và cách hoạt động của từng tuyến.

Dưới đây là ví dụ về file kê khai Hồ sơ dịch vụ trông như thế nào:

example-service-profile.yaml
apiVersion: linkerd.io/v1alpha2 kind: ServiceProfile metadata:   name: my-service.my-namespace.svc.cluster.local spec:   routes:   - name: My Route Name     isRetryable: true # Define it's safe to retry this route     timeout: 100ms # Define a timeout for this route     condition:       method: GET       pathRegex: /my/route/path 

Hồ sơ Dịch vụ mô tả danh sách các tuyến, sau đó xác định cách các yêu cầu phù hợp với condition chỉ định sẽ hoạt động. Trong ví dụ này, bạn đang nói rằng mọi yêu cầu GET được gửi đến /my/route/path sẽ hết thời gian chờ sau 100 mili giây và nếu chúng không thành công, chúng có thể được thử lại.

Bây giờ hãy tạo Hồ sơ dịch vụ cho một trong các dịch vụ của bạn. Lấy voting-svc làm ví dụ, trước tiên hãy sử dụng Linkerd CLI để kiểm tra các tuyến bạn đã xác định cho dịch vụ này:

  • linkerd routes svc/voting-svc -n emojivoto

Ở đây bạn đang sử dụng lệnh định linkerd routes để liệt kê tất cả các tuyến đường cho dịch vụ voting-svc , trong không gian tên emojiovoto :

Output
ROUTE SERVICE SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99 [DEFAULT] voting-svc 83.05% 1.0rps 1ms 1ms 2ms

Bạn sẽ chỉ tìm thấy một tuyến đường, [DEFAULT] . Đây là nơi tất cả các yêu cầu được group lại cho đến khi bạn xác định Hồ sơ dịch vụ của bạn .

Bây giờ, hãy mở nano hoặc editor bạn quen dùng để tạo file service-profile.yaml :

  • nano service-profile.yaml

Thêm định nghĩa Hồ sơ dịch vụ sau vào file này:

service-profile.yaml
apiVersion: linkerd.io/v1alpha2 kind: ServiceProfile metadata:   name: voting-svc.emojivoto.svc.cluster.local   namespace: emojivoto spec:   routes:   - name: VoteDoughnut     isRetryable: true     timeout: 100ms     condition:       method: POST       pathRegex: /emojivoto.v1.VotingService/VoteDoughnut 

Bây giờ hãy lưu file và đóng editor .

Ở đây bạn đang khai báo Hồ sơ dịch vụ cho dịch vụ voting-svc , trong không gian tên emojivoto . Bạn đã xác định một tuyến đường, được gọi là VoteDoughnut , sẽ trùng với bất kỳ yêu cầu POST nào với đường dẫn /emojivoto.v1.VotingService/VoteDoughnut . Nếu một yêu cầu phù hợp với các tiêu chí này mất hơn 100 mili giây, Linkerd sẽ hủy yêu cầu đó và khách hàng sẽ nhận lại phản hồi 504 . Bạn cũng đang nói với Linkerd rằng nếu yêu cầu này không thành công, nó có thể được thử lại.

Bây giờ áp dụng file này cho cụm của bạn:

  • kubectl apply -f service-profile.yaml

Sau vài giây, hãy kiểm tra lại các tuyến đường cho dịch vụ này:

  • linkerd routes svc/voting-svc -n emojivoto

Đến đây bạn sẽ thấy tuyến VoteDoughnut mới được xác định của VoteDoughnut :

Output
ROUTE SERVICE SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99 VoteDoughnut voting-svc 0.00% 0.2rps 1ms 1ms 1ms [DEFAULT] voting-svc 100.00% 0.8rps 1ms 4ms 4ms

Bạn có thể thấy một số chỉ số tùy chỉnh, như tỷ lệ thành công, yêu cầu mỗi giây và độ trễ cho tuyến đường cụ thể này. Lưu ý điểm cuối VoteDoughnut được cấu hình có chủ đích để luôn trả về lỗi và nó đang xuất ra tỷ lệ thành công là 0%, trong khi tuyến [DEFAULT] xuất ra 100%.

Vì vậy, bây giờ, sau khi cung cấp cho Linkerd một chút thông tin về dịch vụ của bạn, bạn có các chỉ số tùy chỉnh cho mỗi tuyến, cũng như hai policy được thực thi: hết thời gian chờ và thử lại.

Kết luận

Trong bài viết này, bạn đã cài đặt Linkerd trong cụm Kubernetes của bạn và sử dụng nó để giám sát một ứng dụng mẫu. Bạn đã extract thông tin đo từ xa hữu ích như tỷ lệ thành công, thông lượng và độ trễ. Bạn cũng đã cấu hình Hồ sơ dịch vụ Linkerd để thu thập số liệu trên mỗi tuyến đường và thực thi hai policy trong ứng dụng emojivoto .

Nếu bạn muốn tìm hiểu thêm về Linkerd, bạn có thể duyệt qua trang tài liệu tuyệt vời của họ, nơi họ hướng dẫn cách bảo mật các dịch vụ của bạn , cấu hình theo dõi phân tán , tự động hóa các bản phát hành canary , v.v.

Từ đây, bạn cũng có thể xem xét kiểm tra Istio , là một Service Mesh khác với một loạt các tính năng và sự cân bằng khác.


Tags:

Các tin liên quan