Istio là một công cụ thuận tiện để kết nối, bảo mật và giám sát các ứng dụng phân tán. Istio sử dụng nhiều công nghệ khác nhau để chạy và quản lý phần mềm trên quy mô lớn, bao gồm các bộ chứa để đóng gói mã ứng dụng và các phần phụ thuộc để triển khai cũng như Kubernetes để quản lý các bộ chứa đó. Do đó, để làm việc với Istio, bạn phải biết cách hoạt động của một ứng dụng có nhiều dịch vụ dựa trên các công nghệ này mà không Istio. Nếu những công cụ và khái niệm này đã quen thuộc với bạn, vui lòng bỏ qua hướng dẫn này và đi thẳng đến phần Cài đặt Istio trên Google Kubernetes Engine (GKE) hoặc cài đặt tiện ích mở rộng Istio trên GKE.
Đây là hướng dẫn từng bước trong đó chúng tôi sẽ hướng dẫn toàn bộ quy trình từ mã nguồn đến vùng chứa GKE để giúp bạn hiểu cơ bản về các công nghệ này thông qua một ví dụ. Bạn cũng sẽ thấy Istio tận dụng sức mạnh của những công nghệ này như thế nào. Điều này giả định rằng bạn không biết gì về vùng chứa, Kubernetes, lưới dịch vụ hoặc Istio.
nhiệm vụ
Trong hướng dẫn này, bạn sẽ hoàn thành các nhiệm vụ sau:
Học một ứng dụng hello world đơn giản với nhiều dịch vụ.
Chạy ứng dụng từ mã nguồn.
Đóng gói ứng dụng trong các thùng chứa.
Tạo cụm Kubernetes.
Triển khai các container vào một cụm.
Trước khi bạn bắt đầu
Làm theo hướng dẫn để kích hoạt API Kubernetes Engine:
Trong hướng dẫn này, bạn có thể sử dụng Cloud Shell để chuẩn bị cho máy ảo g1-small trong Google Computing Engine với Linux dựa trên Debian hoặc máy tính Linux hoặc macOS.
Tùy chọn A: Sử dụng Cloud Shell
Lợi ích của việc sử dụng Cloud Shell:
Môi trường phát triển Python 2 và Python 3 (bao gồm virtualenv) được cấu hình đầy đủ.
Công cụ dòng lệnh gcloud, docker, git и kubectl, mà chúng tôi sẽ sử dụng đã được cài đặt.
Ứng dụng mẫu được viết bằng Python và bao gồm hai thành phần tương tác bằng cách sử dụng REST của:
máy chủ: máy chủ đơn giản với một điểm cuối LẤY, /, in "hello world" ra bảng điều khiển.
chất tải: tập lệnh gửi lưu lượng truy cập tới máy chủ, với số lượng yêu cầu có thể định cấu hình mỗi giây.
Chạy một ứng dụng từ mã nguồn
Để khám phá ứng dụng mẫu, hãy chạy ứng dụng đó trong Cloud Shell hoặc trên máy tính của bạn.
1) Trong danh mục istio-mẫu/ứng dụng mẫu/helloserver chạy máy chủ:
python3 server/server.py
Khi chạy máy chủ sau đây được hiển thị:
INFO:root:Starting server...
2) Mở một cửa sổ terminal khác để gửi yêu cầu tới máy chủ. Nếu bạn đang sử dụng Cloud Shell, hãy nhấp vào biểu tượng thêm để mở một phiên khác.
3) Gửi yêu cầu tới máy chủ:
curl http://localhost:8080
máy chủ trả lời:
Hello World!
4) Từ thư mục mà bạn đã tải xuống mã mẫu, hãy chuyển đến thư mục chứa chất tải:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
Từ góc độ mạng, toàn bộ ứng dụng chạy trên một máy chủ duy nhất (máy tính cục bộ hoặc máy ảo Cloud Shell). Vì vậy bạn có thể sử dụng localhostđể gửi yêu cầu đến máy chủ.
10) Dừng lại chất tải и máy chủ, đi vào Ctrl-c trong mọi cửa sổ terminal.
11) Trong cửa sổ terminal chất tải tắt môi trường ảo:
deactivate
Đóng gói ứng dụng trong container
Để chạy ứng dụng trên GKE, bạn cần đóng gói ứng dụng mẫu - máy chủ и chất tải - tại container. Vùng chứa là một cách để đóng gói một ứng dụng để cách ly nó khỏi môi trường của nó.
Để đóng gói một ứng dụng vào một thùng chứa, bạn cần Dockerfile. Dockerfile là một tệp văn bản xác định các lệnh để xây dựng mã nguồn của ứng dụng và các phần phụ thuộc của nó vào Hình ảnh Docker. Sau khi được xây dựng, bạn tải hình ảnh lên sổ đăng ký vùng chứa như Docker Hub hoặc Đăng ký vùng chứa.
Ví dụ đã có rồi Dockerfile cho máy chủ и chất tải với tất cả các lệnh cần thiết để thu thập hình ảnh. Dưới - Dockerfile cho máy chủ:
FROM python:3-slim as base
FROM base as builder
RUN apt-get -qq update
&& apt-get install -y --no-install-recommends
g++
&& rm -rf /var/lib/apt/lists/*
# Enable unbuffered logging
FROM base as final
ENV PYTHONUNBUFFERED=1
RUN apt-get -qq update
&& apt-get install -y --no-install-recommends
wget
WORKDIR /helloserver
# Grab packages from builder
COPY --from=builder /usr/local/lib/python3.7/ /usr/local/lib/python3.7/
# Add the application
COPY . .
EXPOSE 8080
ENTRYPOINT [ "python", "server.py" ]
Đội TỪ trăn: 3-slim làm cơ sở yêu cầu Docker sử dụng phiên bản mới nhất Hình ảnh Python 3 làm cơ sở.
Đội SAO CHÉP. . sao chép các tập tin nguồn vào thư mục làm việc hiện tại (trong trường hợp của chúng tôi chỉ máy chủ.py) vào hệ thống tệp của vùng chứa.
ĐIỂM VÀO xác định lệnh được sử dụng để khởi động vùng chứa. Trong trường hợp của chúng tôi, lệnh này gần giống với lệnh bạn đã từng chạy máy chủ.py từ mã nguồn.
Đội PHƠI RA chỉ ra rằng máy chủ chờ dữ liệu qua cổng 8080. Đội ngũ này không phải cung cấp cổng. Đây là một số loại tài liệu cần thiết để mở cổng 8080 khi khởi động container.
Chuẩn bị chứa ứng dụng của bạn
1) Đặt các biến môi trường sau. Thay thế DỰ ÁN_ID vào ID dự án GCP của bạn.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
Sử dụng giá trị DỰ ÁN_ID и GCR_REPO bạn gắn thẻ hình ảnh Docker khi xây dựng nó và đẩy nó vào Cơ quan đăng ký vùng chứa riêng tư.
2) Đặt dự án GCP mặc định cho công cụ dòng lệnh gcloud.
gcloud config set project $PROJECT_ID
3) Đặt vùng mặc định cho công cụ dòng lệnh gcloud.
gcloud config set compute/zone us-central1-b
4) Đảm bảo rằng dịch vụ Đăng ký vùng chứa được bật trong dự án GCP.
Xem lại danh sách hình ảnh trong kho lưu trữ và xác minh rằng hình ảnh đã được tải lên:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
Lệnh hiển thị tên của các hình ảnh mới được tải lên:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
Tạo cụm GKE.
Các thùng chứa này có thể chạy trên máy ảo Cloud Shell hoặc trên máy tính có lệnh bến tàu chạy. Nhưng trong môi trường sản xuất, bạn cần một cách để sắp xếp các vùng chứa một cách tập trung. Ví dụ: bạn cần một hệ thống đảm bảo các vùng chứa luôn chạy và bạn cần một cách để mở rộng quy mô và tăng thêm các phiên bản vùng chứa nếu lưu lượng truy cập tăng.
Để chạy các ứng dụng được chứa, bạn có thể sử dụng G.K.E.. GKE là một nền tảng điều phối vùng chứa tổng hợp các máy ảo thành một cụm. Mỗi máy ảo được gọi là một nút. Các cụm GKE dựa trên hệ thống quản lý cụm Kubernetes nguồn mở. Kubernetes cung cấp các cơ chế tương tác với cụm.
Đội gcloud tạo một cụm istioready trong dự án GCP và vùng mặc định mà bạn đã chỉ định. Để chạy Istio, chúng tôi khuyên bạn nên có ít nhất 4 nút và máy ảo n1-tiêu chuẩn-2.
Nhóm tạo ra cụm trong vài phút. Khi cụm đã sẵn sàng, lệnh sẽ xuất ra kết quả như thế này tin nhắn.
2) Cung cấp thông tin xác thực trong công cụ dòng lệnh kubectlđể sử dụng nó để quản lý cụm:
3) Bây giờ bạn có thể giao tiếp với Kubernetes qua kubectl. Ví dụ: lệnh sau có thể tìm hiểu trạng thái của các nút:
kubectl get nodes
Lệnh tạo ra một danh sách các nút:
NAME STATUS ROLES AGE VERSION
gke-istoready-default-pool-dbeb23dc-1vg0 Ready <none> 99s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-36z5 Ready <none> 100s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-fj7s Ready <none> 99s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-wbjw Ready <none> 99s v1.13.6-gke.13
Các khái niệm chính của Kubernetes
Sơ đồ thể hiện một ứng dụng trên GKE:
Trước khi triển khai vùng chứa trong GKE, hãy tìm hiểu các khái niệm chính của Kubernetes. Có các liên kết ở cuối nếu bạn muốn tìm hiểu thêm.
Nút và cụm. Trong GKE, nút là một máy ảo. Trên các nền tảng Kubernetes khác, nút có thể là máy tính hoặc máy ảo. Cụm là một tập hợp các nút có thể được coi là một đơn vị duy nhất nơi bạn triển khai một ứng dụng được đóng gói.
Vỏ. Trong Kubernetes, các container chạy theo nhóm. Pod trong Kubernetes là một đơn vị không thể chia cắt. Một Pod chứa một hoặc nhiều container. Bạn triển khai các thùng chứa máy chủ và chất tải trong các nhóm riêng biệt. Khi có nhiều vùng chứa trong một nhóm (ví dụ: máy chủ ứng dụng và máy chủ proxy), các vùng chứa được quản lý dưới dạng một thực thể duy nhất và chia sẻ tài nguyên nhóm.
Triển khai. Trong Kubernetes, triển khai là một đối tượng là tập hợp các nhóm giống hệt nhau. Triển khai khởi chạy nhiều bản sao của nhóm được phân phối trên các nút cụm. Triển khai tự động thay thế các nhóm bị lỗi hoặc không phản hồi.
Dịch vụ Kubernetes. Khi chạy mã ứng dụng trong GKE, kết nối giữa chất tải и máy chủ. Khi bạn khởi động các dịch vụ trên máy ảo hoặc máy tính để bàn Cloud Shell, bạn đã gửi yêu cầu tới máy chủ tại localhost: 8080. Sau khi được triển khai lên GKE, các nhóm sẽ được thực thi trên các nút có sẵn. Theo mặc định, bạn không có quyền kiểm soát nút nào mà nhóm đang chạy, vì vậy bạn vỏ quả không có địa chỉ IP cố định.
Để có được địa chỉ IP cho máy chủ, bạn cần xác định mức độ trừu tượng hóa mạng trên đầu các nhóm. Đó là những gì nó là Dịch vụ Kubernetes. Dịch vụ Kubernetes cung cấp điểm cuối liên tục cho một tập hợp các nhóm. Có một vài các loại dịch vụ. máy chủ sử dụng Cân bằng tải, cung cấp địa chỉ IP bên ngoài để liên hệ máy chủ từ bên ngoài cụm.
Kubernetes cũng có hệ thống DNS tích hợp để gán tên DNS (ví dụ: helloserver.default.cluster.local) dịch vụ. Nhờ đó, các nhóm trong cụm giao tiếp với các nhóm khác trong cụm tại một địa chỉ cố định. Không thể sử dụng tên DNS bên ngoài cụm, chẳng hạn như trong Cloud Shell hoặc trên máy tính.
Kubernetes biểu hiện
Khi bạn chạy ứng dụng từ nguồn, bạn đã sử dụng lệnh mệnh lệnh python3
máy chủ.py
Mệnh lệnh ngụ ý một động từ: "làm điều này."
Sử dụng Kubernetes mô hình khai báo. Điều này có nghĩa là chúng tôi không nói cho Kubernetes chính xác phải làm gì mà chỉ mô tả trạng thái mong muốn. Ví dụ: Kubernetes khởi động và dừng các nhóm khi cần để đảm bảo rằng trạng thái thực tế của hệ thống khớp với trạng thái mong muốn.
Bạn chỉ ra trạng thái mong muốn trong bảng kê khai hoặc tệp YAML. Tệp YAML chứa thông số kỹ thuật cho một hoặc nhiều đối tượng Kubernetes.
Ví dụ này chứa tệp YAML cho máy chủ и chất tải. Mỗi tệp YAML chỉ định trạng thái mong muốn của đối tượng triển khai và dịch vụ Kubernetes.
Trường đầu tiên suy nghi chứa mô tả về trạng thái mong muốn.
thông số kỹ thuật.bản sao cho biết số lượng nhóm mong muốn.
Mục thông số kỹ thuật.template xác định một mẫu nhóm. Có một trường trong đặc tả nhóm hình ảnh, trong đó chỉ định tên của hình ảnh cần trích xuất từ Sổ đăng ký vùng chứa.
Cân bằng tải: Khách hàng gửi yêu cầu đến địa chỉ IP của bộ cân bằng tải, địa chỉ này có địa chỉ IP cố định và có thể truy cập được từ bên ngoài cụm.
cổng đích: như bạn còn nhớ, đội MỞ RỘNG 8080 в Dockerfile không cung cấp cổng. Bạn cung cấp cổng 8080để bạn có thể liên hệ với container máy chủ bên ngoài cụm. Trong trường hợp của chúng ta hellosvc.default.cluster.local:80 (tên ngắn: hellosvc) tương ứng với cổng 8080 Địa chỉ IP nhóm máy chủ xin chào.
cổng: Đây là số cổng nơi các dịch vụ khác trong cụm sẽ gửi yêu cầu.
tảigen.yaml
Đối tượng triển khai tới tảigen.yaml trông giống như máy chủ.yaml. Sự khác biệt là đối tượng triển khai có chứa một phần env. Nó xác định các biến môi trường cần thiết chất tải và bạn đã cài đặt khi chạy ứng dụng từ nguồn.
thời gian chất tải không chấp nhận các yêu cầu đến, đối với trường kiểu chỉ định Cụm IP. Loại này cung cấp một địa chỉ IP liên tục mà các dịch vụ trong cụm có thể sử dụng, nhưng địa chỉ IP này không được hiển thị cho các máy khách bên ngoài.
Thay thế DỰ ÁN_ID vào ID dự án GCP của bạn.
9) Lưu và đóng tảigen.yaml, đóng trình soạn thảo văn bản.
10) Triển khai tệp YAML cho Kubernetes:
kubectl apply -f loadgen.yaml
Sau khi hoàn thành thành công, lệnh sẽ tạo ra đoạn mã sau:
deployment.apps/loadgenerator created
service/loadgensvc created
11) Kiểm tra trạng thái của nhóm:
kubectl get pods
Lệnh hiển thị trạng thái:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) Trích xuất nhật ký ứng dụng từ nhóm chất tải. Thay thế POD_ID đến mã định danh từ câu trả lời trước đó.
kubectl logs loadgenerator-POD_ID
13) Lấy địa chỉ IP bên ngoài hellosvc:
kubectl get service
Phản hồi lệnh trông giống như thế này:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hellosvc LoadBalancer 10.81.15.158 192.0.2.1 80:31127/TCP 33m
kubernetes ClusterIP 10.81.0.1 <none> 443/TCP 93m
loadgensvc ClusterIP 10.81.15.155 <none> 80/TCP 4m52s
14) Gửi yêu cầu tới hellosvc: thay thế EXTERNAL_IP đến địa chỉ IP bên ngoài hellosvc.
curl http://EXTERNAL_IP
Hãy đối đầu với Istio
Bạn đã triển khai một ứng dụng cho GKE. chất tải có thể sử dụng DNS Kubernetes (hellosvc:80) để gửi yêu cầu tới máy chủvà bạn có thể gửi yêu cầu tới máy chủ bằng địa chỉ IP bên ngoài. Mặc dù Kubernetes có nhiều tính năng nhưng vẫn thiếu một số thông tin về dịch vụ:
Các dịch vụ tương tác như thế nào? Mối quan hệ giữa các dịch vụ là gì? Lưu lượng truy cập giữa các dịch vụ như thế nào? Bạn có biết rằng chất tải gửi yêu cầu đến máy chủ, nhưng hãy tưởng tượng rằng bạn không biết gì về ứng dụng. Để trả lời những câu hỏi này, chúng ta hãy xem danh sách các nhóm đang chạy trong GKE.
Số liệu. Bao lâu máy chủ đáp ứng một yêu cầu đến? Máy chủ nhận được bao nhiêu yêu cầu mỗi giây? Nó có đưa ra thông báo lỗi không?
Thông tin an ninh. Giao thông giữa chất tải и máy chủ vừa đi qua HTTP hoặc bằng cách mTLS?
Istio trả lời tất cả những câu hỏi này. Để làm điều này, Istio đặt một proxy sidecar Đặc phái viên trong mỗi nhóm. Proxy Envoy chặn tất cả lưu lượng truy cập đến và đi đến vùng chứa ứng dụng. Nó có nghĩa là máy chủ и chất tải nhận thông qua Envoy proxy sidecar và tất cả lưu lượng truy cập từ chất tải к máy chủ đi qua proxy Envoy.
Kết nối giữa các proxy Envoy tạo thành một mạng lưới dịch vụ. Kiến trúc lưới dịch vụ cung cấp một lớp điều khiển trên Kubernetes.
Vì proxy Envoy chạy trong vùng chứa riêng của chúng nên Istio có thể được cài đặt trên cụm GKE mà hầu như không có thay đổi nào đối với mã ứng dụng. Nhưng bạn đã thực hiện một số công việc để ứng dụng của mình sẵn sàng được quản lý bởi Istio:
Dịch vụ cho tất cả các container. Để triển khai máy chủ и chất tải gắn liền với dịch vụ Kubernetes. Thậm chí chất tải, không nhận được yêu cầu đến thì có một dịch vụ.
Các cổng trong dịch vụ phải có tên. Mặc dù các cổng dịch vụ có thể không được đặt tên trong GKE nhưng Istio yêu cầu bạn chỉ định tên cổng theo giao thức của ông ấy. Trong tệp YAML, cổng dành cho máy chủ được gọi là httpvì máy chủ sử dụng giao thức HTTP... Nếu như dịch vụ đã sử dụng gRPC, bạn sẽ đặt tên cho cổng grpc.
Triển khai được gắn cờ. Vì vậy, bạn có thể sử dụng các tính năng quản lý lưu lượng của Istio, chẳng hạn như phân chia lưu lượng giữa các phiên bản của cùng một dịch vụ.
Cài đặt Istio
Có hai cách để cài đặt Istio. Có thể bật Istio trên tiện ích mở rộng GKE hoặc cài đặt phiên bản mã nguồn mở của Istio trên cụm. Với Istio trên GKE, bạn có thể dễ dàng quản lý việc cài đặt và nâng cấp Istio trong suốt vòng đời của cụm GKE. Nếu bạn muốn phiên bản mới nhất của Istio hoặc có nhiều quyền kiểm soát hơn đối với cấu hình bảng điều khiển Istio của mình, hãy cài đặt phiên bản nguồn mở thay vì tiện ích mở rộng Istio trên GKE. Để quyết định cách tiếp cận, hãy đọc bài viết Tôi có cần Istio trên GKE không?.
Chọn một tùy chọn, xem lại hướng dẫn thích hợp và làm theo hướng dẫn để cài đặt Istio trên cụm của bạn. Nếu bạn muốn sử dụng Istio với ứng dụng mới được triển khai của mình, cho phép triển khai sidecar cho không gian tên mặc định.
Vệ sinh
Để tránh bị tính phí vào tài khoản Google Cloud Platform đối với các tài nguyên bạn đã sử dụng trong hướng dẫn này, hãy xóa cụm vùng chứa sau khi bạn đã cài đặt Istio và chơi với ứng dụng mẫu. Thao tác này sẽ xóa tất cả tài nguyên cụm, chẳng hạn như phiên bản điện toán, ổ đĩa và tài nguyên mạng.