ACK One ALB多叢集網關支援後端服務為gRPC服務,本文介紹如何通過ALB多叢集網關實現gRPC服務的路由轉寄。
前提條件
-
已開通負載平衡ALB服務。
-
已開啟艦隊管理功能。
-
ACK One艦隊已關聯2個與Fleet執行個體相同VPC的ACK叢集。具體操作,請參見管理關聯集群。
-
已從ACK One控制台擷取Fleet執行個體的KubeConfig,並通過kubectl串連至Fleet執行個體。
-
已安裝grpccurl工具。
-
已擷取到可信的數位憑證。您可以從以下幾個途徑擷取數位憑證。
步驟一:產生自我簽署憑證(可選)
如果您暫未擁有認證,您可參照此步驟產生自我簽署憑證,樣本中使用grpc.example.com作為認證的網域名稱。關於對ALB執行個體配置認證的方式,請參見配置HTTPS認證以實現加密通訊,本文以其文中Secret認證方式為例。
-
建立並拷貝以下內容至
/tmp/openssl.cnf檔案中。[ req ] #default_bits = 2048 #default_md = sha256 #default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes req_extensions = v3_req [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (eg, fully qualified host name) commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 [v3_req] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = grpc.example.com
-
執行以下命令簽署認證請求。
openssl req -new -nodes -keyout grpc.key -out grpc.csr -config /tmp/openssl.cnf -subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=AlibabaCloud/OU=ContainerService/CN=grpc.example.com" -
執行以下命令簽署認證。
openssl x509 -req -days 3650 -in grpc.csr -signkey grpc.key -out grpc.crt -extensions v3_req -extfile /tmp/openssl.cnf命令執行成功後,可得到認證
grpc.crt與私密金鑰檔案grpc.key。 -
執行以下命令,將認證通過
grpc-secret添加到叢集中gateway-demoNamespace下。kubectl create secret tls grpc-secret --key grpc.key --cert grpc.crt -ngateway-demo # grpc.key替換為您的認證檔案,grpc.crt替換為您的私密金鑰檔案。
步驟二:部署gRPC服務到多個叢集
ACK One支援多叢集GitOps和多叢集應用資源分發兩種方式,方便您將應用部署到多個叢集,詳情請參見GitOps快速入門、建立多叢集應用與應用分發快速入門。本文以GitOps的多叢集應用分發為例。
-
登入ACK One控制台,在左側導覽列選擇。
-
在多叢集GitOps頁面左上方,單擊艦隊名稱後的
按鈕,在下拉式清單中選擇目標艦隊。 -
單擊進入建立多叢集應用 - GitOps頁面。
-
在YAML 建立頁簽,將以下樣本YAML內容複寫到控制台,然後單擊確定部署應用。
說明-
以下YAML內容是將部署到所有關聯集群中
gateway-demo namespace下,您也可以通過快捷建立選擇叢集,變化會同步到YAML 建立的內容。 -
若叢集中沒有
gateway-demoNamespace,則需您手動建立。
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: appset-grpc-demo namespace: argocd spec: template: metadata: name: '{{.metadata.annotations.cluster_name}}-grpc' namespace: argocd spec: destination: name: '{{.name}}' namespace: gateway-demo project: default source: repoURL: https://github.com/ivan-cai/gitops-demo.git path: manifests/directory/grpc targetRevision: main syncPolicy: automated: {} syncOptions: - CreateNamespace=true generators: - clusters: selector: matchExpressions: - values: - cluster key: argocd.argoproj.io/secret-type operator: In - values: - in-cluster key: name operator: NotIn goTemplateOptions: - missingkey=error syncPolicy: preserveResourcesOnDeletion: false goTemplate: true -
步驟三:建立ALB多叢集網關並建立Ingress
通過在ACK One 艦隊中建立AlbConfig對象來建立一個ACK One ALB多叢集網關,並為ALB多叢集網關添加關聯集群。對於gRPC服務,必須使用HTTPS協議,所以在listeners中需要添加HTTPS連接埠,本文以443連接埠為例。
-
從ACK One艦隊所在VPC,擷取兩個虛擬交換器ID。
-
使用以下內容,建立
gateway.yaml檔案。說明-
請將
${vsw-id1}和${vsw-id2}替換為您上一步擷取的交換器ID,${cluster1}、${cluster2}替換為您待添加的關聯集群ID。 -
子叢集
${cluster1}、${cluster2}的安全性群組的入方向需要允許該交換器網段的IP和所有連接埠通過。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: ackone-gateway-demo annotations: # 添加要處理流量的關聯集群到ALB多叢集執行個體。 alb.ingress.kubernetes.io/remote-clusters: ${cluster1},${cluster2} spec: config: name: one-alb-demo addressType: Internet addressAllocatedMode: Fixed zoneMappings: - vSwitchId: ${vsw-id1} - vSwitchId: ${vsw-id2} listeners: - port: 8001 protocol: HTTP - port: 443 protocol: HTTPS --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: ackone-gateway-demo -
-
使用以下內容,建立Ingress。
說明Ingress中必須指定
annotation:alb.ingress.kubernetes.io/backend-protocol: grpc,以及對應的alb.ingress.kubernetes.io/listen-ports。並且引用步驟一中的Secret認證。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: | [{"HTTPS": 443}] alb.ingress.kubernetes.io/backend-protocol: grpc name: grpc-ingress namespace: gateway-demo spec: ingressClassName: alb rules: - host: grpc.example.com http: paths: - backend: service: name: grpc-service port: number: 50051 path: / pathType: Prefix tls: - hosts: - grpc.example.com secretName: grpc-secret
步驟四:驗證流量轉寄效果
-
執行以下命令,查看Ingress資訊。
kubectl get ingress -ngateway-demo預期輸出:
NAME CLASS HOSTS ADDRESS PORTS AGE grpc-ingress alb grpc.example.com alb-***** 80, 443 3m51s -
使用
grpcurl串連服務。# <ADDRESS>替換為上一步中記錄的ALB網域名稱。 grpcurl -insecure -authority grpc.example.com <ADDRESS>:443 list輸出如下,表明流量被Ingress成功轉寄到後端gRPC服務:
grpc.reflection.v1alpha.ServerReflection helloworld.Greeter