Kodunuzu değiştirmeden Spring Cloud uygulamalarınızı Service Mesh (ASM) ile entegre ederek cloud-native hizmet yönetimi yeteneklerinden yararlanabilirsiniz. Bu konuda, ASM kullanarak Spring Cloud hizmetlerinin nasıl yönetileceği açıklanmaktadır.
Önkoşullar
Bir ASM Enterprise veya Ultimate Edition örneğiniz olmalıdır. Daha fazla bilgi için bkz. ASM örneği oluşturma.
Yönetilen bir ACK kümesi oluşturulmuş olmalıdır. Daha fazla bilgi için bkz. ACK yönetilen kümesi oluşturma.
Otomatik sidecar proxy enjeksiyonu etkinleştirilmiş olmalıdır.
Bir giriş ağ geçidi dağıtılmış olmalıdır. Daha fazla bilgi için bkz. Giriş ağ geçidi oluşturma.
Arka Plan
Spring Cloud; Spring Cloud Netflix, Spring Cloud Alibaba ve Spring Cloud Consul gibi çeşitli uygulamalara sahip bir standarttır. ASM açısından bu uygulamalar arasındaki temel fark, kullandıkları hizmet kayıt defteridir. Aşağıdaki tabloda farklı Spring Cloud sürümleri için ASM geçiş desteği listelenmiştir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Demo genel bakış
Bu konuda, Spring Cloud ve Nacos kullanılarak oluşturulan bir uygulama örnek olarak ele alınmıştır. Örnek kodu nacos-example deposundan indirebilirsiniz.
Uygulama bir tüketici hizmetinden ve bir sağlayıcı hizmetinden oluşur. Sağlayıcı hizmetinin, her ikisi de bir Nacos kayıt defterine kayıtlı olan v1 ve v2 olmak üzere iki sürümü vardır. Tüketici hizmeti, sağlayıcı hizmetinin adreslerini Nacos kayıt defterinden alır ve istekler arasında yük dengeleme yapar. Tüketici hizmeti bir istek aldığında isteği bir sağlayıcıya iletir ve sağlayıcının yanıtını döndürür. İki sağlayıcı sürümü farklı yanıtlar verir:
v1 sağlayıcısı, bir echo isteğine
Hello Nacos Discovery From v1xxxyanıtını verir.v2 sağlayıcısı, bir echo isteğine
Hello Nacos Discovery From v2xxxyanıtını verir.
Yanıtta, .xxx ifadesi echo API'sine iletilen parametre için bir yer tutucudur. Örneğin, /echo/world yoluna yapılan bir istek v1 sağlayıcısına gönderilirse dönüş değeri Hello Nacos Discovery From v1world olur.
Tüketici ve sağlayıcı hizmetleri için hizmet ağı yeteneklerini etkinleştirmezseniz, yani uygulama pod'larına sidecar enjekte edilmezse istekler yine de işlenir ancak Istio tarafından sağlanan hizmet yönetimi yeteneklerinden yoksun kalır. Aşağıdaki adımlarda, Spring Cloud hizmetlerini yönetmek için ASM'nin nasıl kullanılacağı gösterilmektedir.
Adım 1: Spring Cloud desteğini etkinleştirme
Yöntem 1: Tüm sürümler ve kayıt defterleri için
ASM örnek sürümünün 1.13.4.32 veya üzeri olması gerekir.
Sınırlamalar:
Hedef hizmet için bir Kubernetes Service oluşturmanız gerekir. Hizmet bağlantı noktası ve hedef bağlantı noktası, uygulamanın dinleme bağlantı noktasına ayarlanmalıdır.
1.23.6.32 öncesi ASM sürümlerinde bu çözümü kullanırken REGISTRY_ONLY özelliğini devre dışı bırakmanız gerekir.
kubectl kullanarak kontrol düzlemi kümesine bağlanın. Daha fazla bilgi için bkz. kubectl kullanarak kontrol düzlemindeki Istio kaynaklarına erişim.
-
ASM kümesinde bir EnvoyFilter oluşturun.
-
Aşağıdaki içeriğe sahip any-spring-cloud-support.yaml adlı bir dosya oluşturun.
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: labels: provider: "asm" asm-system: "true" name: any-spring-cloud-support namespace: istio-system spec: configPatches: - applyTo: HTTP_FILTER match: proxy: proxyVersion: "^1.*" context: SIDECAR_OUTBOUND listener: portNumber: 8070 filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" patch: operation: INSERT_BEFORE value: # reverse_dns filter specification name: com.aliyun.reverse_dns typed_config: "@type": "type.googleapis.com/udpa.type.v1.TypedStruct" type_url: type.googleapis.com/envoy.config.filter.reverse_dns.v3alpha.CommonConfig value: pod_cidrs: - "10.0.128.0/18"Parametreleri iş gereksinimlerinize göre YAML dosyasında değiştirin. Parametrelerin açıklamaları aşağıdadır:
portNumber: Spring Cloud hizmetinin bağlantı noktasıdır. Bağlantı noktaları aynı değilse bu parametreyi kaldırabilirsiniz. Bağlantı noktaları tekilleştirilebiliyorsa, her biri belirli birportNumberdeğerine bağlanan birden fazla EnvoyFilter kaynağı yapılandırabilirsiniz.pod_cidrs: ACK veya ACK Serverless kümesinin pod CIDR bloğudur. Bu değeri bulmak için Container Service Management Console adresinde oturum açın ve Cluster Information sayfasına gidin. Cluster Resources sekmesinde, VPC altındaki Pod CIDR bloğunu bulun ve bu değeri parametre olarak kullanın.
-
EnvoyFilteröğesini uygulamak için aşağıdaki komutu çalıştırın.kubectl apply -f any-spring-cloud-support.yaml
-
Yöntem 2: Yalnızca Nacos kayıt defterleri için
kubectl kullanarak kontrol düzlemi kümesine bağlanın. Daha fazla bilgi için bkz. kubectl kullanarak kontrol düzlemindeki Istio kaynaklarına erişim.
-
Bir ServiceEntry oluşturun.
-
Aşağıdaki içeriğe sahip external-nacos-svc.yaml adlı bir dosya oluşturun.
kind: ServiceEntry metadata: name: external-nacos-svc spec: hosts: - "NACOS_SERVER_HOST" ## Replace this with your Nacos Server HOST, for example, "mse-xxx-p.nacos-ans.mse.aliyuncs.com". location: MESH_EXTERNAL ports: - number: 8848 name: http resolution: DNSÖnceki YAML dosyasında,
8848Nacos için varsayılan bağlantı noktasıdır. Kendi tarafından yönetilen bir Nacos sunucusu kullanıyorsanız ve bağlantı noktasını değiştirdiyseniznumberparametresini buna göre değiştirmeniz gerekir. -
ServiceEntry'i oluşturmak için aşağıdaki komutu çalıştırın.
kubectl apply -f external-nacos-svc.yaml
-
-
Bir EnvoyFilter oluşturun.
-
Aşağıdaki içeriğe sahip external-envoyfilter.yaml adlı bir dosya oluşturun.
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: labels: provider: "asm" asm-system: "true" name: nacos-subscribe-lua namespace: istio-system spec: configPatches: # The first patch adds the lua filter to the listener/http connection manager. - applyTo: HTTP_FILTER match: proxy: proxyVersion: "^1.*" context: SIDECAR_OUTBOUND listener: portNumber: 8848 filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" patch: operation: INSERT_BEFORE value: # lua filter specification name: envoy.lua typed_config: "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua" inlineCode: | -- copyright: ASM (Alibaba Cloud ServiceMesh) function envoy_on_request(request_handle) local request_headers = request_handle:headers() -- /nacos/v1/ns/instance/list?healthyOnly=false&namespaceId=public&clientIP=10.122.63.81&serviceName=DEFAULT_GROUP%40%40service-provider&udpPort=53174&encoding=UTF-8 local path = request_headers:get(":path") if string.match(path,"^/nacos/v1/ns/instance/list") then local servicename = string.gsub(path,".*&serviceName.*40([%w.\\_\\-]+)&.*","%1") request_handle:streamInfo():dynamicMetadata():set("context", "request.path", path) request_handle:streamInfo():dynamicMetadata():set("context", "request.servicename", servicename) request_handle:logInfo("subscribe for serviceName: " .. servicename) else request_handle:streamInfo():dynamicMetadata():set("context", "request.path", "") end end function envoy_on_response(response_handle) local request_path = response_handle:streamInfo():dynamicMetadata():get("context")["request.path"] if request_path == "" then return end local servicename = response_handle:streamInfo():dynamicMetadata():get("context")["request.servicename"] response_handle:logInfo("modified response ip to serviceName:" .. servicename) local bodyObject = response_handle:body(true) local body= bodyObject:getBytes(0,bodyObject:length()) body = string.gsub(body,"%s+","") body = string.gsub(body,"(ip\":\")(%d+.%d+.%d+.%d+)","%1"..servicename) response_handle:body():setBytes(body) end -
EnvoyFilter'i oluşturmak için aşağıdaki komutu çalıştırın.
kubectl apply -f external-envoyfilter.yaml
-
Adım 2: Spring Cloud hizmetlerini dağıtma
Kayıt işlemini yakalamak için iş yüklerini oluşturmadan önce EnvoyFilter'ı oluşturmanız gerekir. Bir iş yükü EnvoyFilter'dan önce oluşturulduysa bu iş yükü için rolling update gerçekleştirmeniz gerekir.
Her hizmet için ClusterIP türünde bir Kubernetes Service oluşturmanız gerekir.
kubectl kullanarak veri düzlemi kümesine bağlanın. Daha fazla bilgi için bkz. Kümenin kubeconfig dosyasını alma ve kubectl ile kümeye bağlanma.
-
Spring Cloud hizmetlerini dağıtmak için aşağıdaki komutları çalıştırın.
export NACOS_ADDRESS=xxxx # Replace xxxx with the address of your MSE or self-managed Nacos. We recommend using an internal VPC address. wget https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/springcloud/demo.yaml -O demo.yaml sed -e "s/NACOS_SERVER_CLUSTERIP/$NACOS_ADDRESS/g" demo.yaml |kubectl apply -f - -
Spring Cloud hizmetlerini kontrol etmek için aşağıdaki komutu çalıştırın.
kubectl get podsBeklenen çıktı:
consumer-bdd464654-jn8q7 2/2 Running 0 25h provider-v1-66bc67fb6d-46pgl 2/2 Running 0 25h provider-v2-76568c45f6-85z87 2/2 Running 0 25h
Adım 3: Ağ geçidi ve sanal hizmet oluşturma
-
Bir Istio ağ geçidi oluşturun.
-
Aşağıdaki içeriğe sahip test-gateway.yaml adlı bir dosya oluşturun.
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: test-gateway spec: selector: istio: ingressgateway # use istio default controller servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" -
ASM örneğinin kubeconfig dosyasını kullanarak Istio ağ geçidini oluşturmak için aşağıdaki komutu çalıştırın.
kubectl apply -f test-gateway.yaml
-
-
Bir sanal hizmet oluşturun.
-
Aşağıdaki içeriğe sahip consumer.yaml adlı bir dosya oluşturun.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: consumer spec: hosts: - "*" gateways: - test-gateway http: - match: - uri: prefix: / route: - destination: host: consumer.default.svc.cluster.local port: number: 8080 -
Sanal hizmeti oluşturmak için aşağıdaki komutu çalıştırın.
kubectl apply -f consumer.yaml
-
Adım 4: Hizmet yönetimini doğrulama
-
Giriş ağ geçidinin IP adresini alın.
ASM konsolunda oturum açın. Sol gezinme bölmesinde seçeneğini belirleyin.
Mesh Management sayfasında ASM örneğinin adına tıklayın. Sol gezinme bölmesinde seçeneğini belirleyin.
Ingress Gateway sayfasında giriş ağ geçidinin Service address değerini görüntüleyin.
-
Giriş ağ geçidi üzerinden Spring Cloud tüketici hizmetine istek göndermek için aşağıdaki komutu çalıştırın.
curl <IP address of the ingress gateway>/echo/worldBeklenen çıktı:
Hello Nacos Discovery From v1world Hello Nacos Discovery From v2world Hello Nacos Discovery From v1world Hello Nacos Discovery From v2worldÇıktı, isteklerin varsayılan olarak round-robin yöntemiyle v1 ve v2 sağlayıcılara yönlendirildiğini gösterir.
-
Bir hedef kuralı ve sanal hizmet oluşturun.
-
Aşağıdaki içeriğe sahip service-provider.yaml adlı bir dosya oluşturun.
--- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: service-provider spec: host: service-provider subsets: - name: v1 labels: label: v1 - name: v2 labels: label: v2 -
Hedef kuralını oluşturmak için aşağıdaki komutu çalıştırın.
kubectl apply -f service-provider.yaml -
Aşağıdaki içeriğe sahip service-provider1.yaml adlı bir dosya oluşturun.
Aşağıdaki sanal hizmet, /echo/hello yolundaki istekleri v1 sağlayıcıya, diğer tüm istekleri ise v2 sağlayıcıya yönlendirir.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: service-provider spec: hosts: - service-provider http: - name: "hello-v1" match: - uri: prefix: "/echo/hello" route: - destination: host: service-provider subset: v1 - name: "default" route: - destination: host: service-provider subset: v2 -
Sanal hizmeti oluşturmak için aşağıdaki komutu çalıştırın.
kubectl apply -f service-provider1.yaml
-
-
Spring Cloud tüketici hizmetine istek göndermek için aşağıdaki komutu çalıştırın.
curl <IP address of the ingress gateway>/echo/helloBeklenen çıktı:
Hello Nacos Discovery From v1hello Hello Nacos Discovery From v1helloÇıktı,
/echo/helloyoluna yapılan tüm isteklerin v1 sağlayıcıya, diğer isteklerin ise v2 sağlayıcıya yönlendirildiğini gösterir. Bu durum, Istio'nun artık Spring Cloud trafiğini kontrol ettiğini ve hizmetleri Istio yönlendirme kurallarını kullanarak yönetebilmenizi sağlar.
SSS
Spring Cloud hizmetlerinde sorun giderme
-
Nacos bağlantı noktası veya IP adresi için trafik yakalama özelliğinin etkin olup olmadığını kontrol edin.
reverse_dns yöntemini kullanıyorsanız pod IP adreslerini yakalamanız gerekir.
Lua betiği yöntemini kullanıyorsanız Nacos Sunucu IP adresini ve küme IP adresini yakalamanız gerekir.
Kayıt işlemini yakalamak için iş yüklerinden önce EnvoyFilter'ı oluşturmanız gerekir. İş yükü önce oluşturulduysa üzerinde rolling update gerçekleştirmeniz gerekir.
Her hizmet için ClusterIP türünde bir Kubernetes Service'in bulunduğunu kontrol edin.
-
ASM kontrol düzleminde Spring Cloud desteğini etkinleştirmek için hangi yöntemi kullandığınızı kontrol edin.
Hizmetlerin sidecar sürümünü kontrol edin. Sidecar görüntü sürümü 1.13.4.32'den önceyse yalnızca ASM örneğinin kontrol düzlemi yükseltilmiş demektir; veri düzlemi yükseltilmemiştir. Etkilenen hizmet dağıtımlarında rolling update gerçekleştirmeniz gerekir.