kubernetes 配置JAVA微服務(wù)

構(gòu)建和部署Java微服務(wù)

首先,確保設(shè)置了Kubernetes環(huán)境。一旦終端輸出完消息并準(zhǔn)備好輸入,就應(yīng)該設(shè)置它。要確認(rèn)已準(zhǔn)備就緒,請(qǐng)運(yùn)行以下命令:

kubectl version
現(xiàn)在應(yīng)該可以看到kubectl客戶機(jī)和服務(wù)器的版本了。如果是這樣的話,你的環(huán)境就都設(shè)置好了。如果看不到Kubernetes服務(wù)器的版本,請(qǐng)稍等片刻,然后重復(fù)前面的命令,直到它顯示出來。
現(xiàn)在您需要導(dǎo)航到為您提供的項(xiàng)目目錄。這包括微文件微服務(wù)的實(shí)現(xiàn)、微文件運(yùn)行時(shí)的配置和Kubernetes配置。
cd sample-kubernetes-config/start/
您將注意到有一個(gè)“finish”目錄。其中包含本教程的完成代碼,以供參考。
您將部署的兩個(gè)微服務(wù)稱為“system”和“inventory”。系統(tǒng)微服務(wù)返回它正在運(yùn)行的容器的JVM屬性。inventory微服務(wù)將系統(tǒng)微服務(wù)中的屬性添加到inventory中。這演示了如何在Kubernetes集群中的獨(dú)立pod中實(shí)現(xiàn)兩個(gè)微服務(wù)之間的通信。要使用Maven構(gòu)建應(yīng)用程序,請(qǐng)依次運(yùn)行以下命令:
mvn package -pl system
mvn package -pl inventory

一旦構(gòu)建了服務(wù),就需要將它們部署到Kubernetes。要了解有關(guān)Kubernetes清單的更多信息,請(qǐng)查看以下文檔:https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/
為此,請(qǐng)使用以下命令:

kubectl apply -f kubernetes.yaml

向微服務(wù)發(fā)出請(qǐng)求

下面的兩個(gè)命令將檢查pods的狀態(tài),并檢查它們何時(shí)處于就緒狀態(tài)。這是通過向命令提供pod的標(biāo)簽(如inventory)來實(shí)現(xiàn)的。發(fā)出以下命令以檢查微服務(wù)的狀態(tài):

kubectl wait --for=condition=ready pod -l app=inventory
kubectl wait --for=condition=ready pod -l app=system
一旦您看到上述每個(gè)命令滿足了輸出條件,就意味著您的微服務(wù)已經(jīng)準(zhǔn)備好接收請(qǐng)求。
既然您的微服務(wù)已經(jīng)部署并以就緒狀態(tài)運(yùn)行,那么您就可以發(fā)送一些請(qǐng)求了。接下來,您將使用curl向“system”服務(wù)發(fā)出httpget請(qǐng)求。該服務(wù)由請(qǐng)求中傳遞的用戶id和密碼進(jìn)行保護(hù)。
curl -u bob:bobpwd http://( minikube ip ):31000/system/properties 您應(yīng)該看到一個(gè)響應(yīng),它將向您顯示正在運(yùn)行的容器的JVM系統(tǒng)屬性。類似地,使用以下curl命令調(diào)用清單服務(wù): curl http://( minikube ip ):32000/inventory/systems/system-service
清單服務(wù)將調(diào)用系統(tǒng)服務(wù)并在返回結(jié)果之前將響應(yīng)數(shù)據(jù)存儲(chǔ)在清單服務(wù)中。
在本教程中,您將使用Kubernetes ConfigMap修改X-App-Name:response頭。通過運(yùn)行以下curl命令查看它們的當(dāng)前值:
curl -# -I -u bob:bobpwd -D - http://$( minikube ip ):31000/system/properties | grep -i ^X-App-Name:

修改系統(tǒng)微服務(wù)

系統(tǒng)服務(wù)被硬編碼為將system作為應(yīng)用程序名稱。為了使其可配置,您將添加appName成員和代碼,以將X-App-Name設(shè)置到/sample kubernetes config/start/system/src/main/java/system/SystemResource.java文件中。單擊上面的鏈接打開文件,然后使用Katacode文本編輯器將現(xiàn)有代碼替換為以下代碼:

復(fù)制到剪貼簿包裝系統(tǒng);

package system;

// CDI
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.GET;
// JAX-RS
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.eclipse.microprofile.config.inject.ConfigProperty;

@RequestScoped
@Path("/properties")
public class SystemResource {

  @Inject
  @ConfigProperty(name = "APP_NAME")
  private String appName;

  @Inject
  @ConfigProperty(name = "HOSTNAME")
  private String hostname;

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response getProperties() {
    return Response.ok(System.getProperties())
      .header("X-Pod-Name", hostname)
      .header("X-App-Name", appName)
      .build();
  }
}

這些更改使用microfile Config和CDI將名為APP\u NAME的環(huán)境變量的值注入到SystemResource類的appName成員中。microfile Config支持從中接收配置的許多配置源,包括環(huán)境變量。

修改資源清冊(cè)微服務(wù)

清單服務(wù)是硬編碼的,以使用bob和bobpwd作為憑據(jù)來對(duì)系統(tǒng)服務(wù)進(jìn)行身份驗(yàn)證。您將使用Kubernetes秘密配置這些憑據(jù)。在Katacoda文本編輯器中,通過單擊以下鏈接打開該文件/sample kubernetes config/start/inventory/src/main/java/inventory/client/SystemClient.java并將//Basic Auth Credentials下的兩行替換為

// Basic Auth Credentials
@Inject
@ConfigProperty(name = "SYSTEM_APP_USERNAME")
private String username;

@Inject
@ConfigProperty(name = "SYSTEM_APP_PASSWORD")
private String password;

這些更改使用microfile Config和CDI將環(huán)境變量 SYSTEM_APP_USERNAME 和 SYSTEM APP PASSWORD的值注入到SystemClient類中。

創(chuàng)建ConfigMap和Secret

有幾種方法可以在容器中配置環(huán)境變量。您將使用Kubernetes ConfigMap和Kubernetes secret來設(shè)置這些值。這些是Kubernetes提供的資源,用于向容器提供配置值。一個(gè)好處是它們可以跨多個(gè)容器重用,包括為不同的容器分配不同的環(huán)境變量。
使用以下kubectl命令創(chuàng)建ConfigMap以配置應(yīng)用程序名稱:
kubectl create configmap sys app name--from literal name=my system
此命令將名為sys app name的ConfigMap部署到集群。它有一個(gè)名為name的鍵,其值為my system。--from literal標(biāo)志允許您指定要存儲(chǔ)在此ConfigMap中的各個(gè)鍵值對(duì)。其他可用的選項(xiàng),例如--from file和--from env file,提供了關(guān)于如何配置的更多功能。關(guān)于這些選項(xiàng)的詳細(xì)信息可以在這里的Kubernetes CLI文檔中找到https://kubernetes.io/docs/concepts/configuration/configmap/.
使用以下kubectl命令創(chuàng)建一個(gè)機(jī)密以配置清單服務(wù)將用于對(duì)系統(tǒng)服務(wù)進(jìn)行身份驗(yàn)證的憑據(jù):

kubectl create secret generic sys-app-credentials --from-literal username=bob --from-literal password=bobpwd
這個(gè)命令看起來與創(chuàng)建ConfigMap的命令非常相似,一個(gè)區(qū)別是generic這個(gè)詞。這意味著你正在創(chuàng)建一個(gè)通用的秘密,這意味著它不是一個(gè)特殊類型的秘密。有不同類型的秘密,例如存儲(chǔ)Docker憑據(jù)的秘密和存儲(chǔ)公鑰/私鑰對(duì)的秘密。
機(jī)密與ConfigMap類似,只是機(jī)密用于敏感信息(如憑據(jù))。其中一個(gè)主要的區(qū)別是,你必須明確地告訴kubectl給你看一個(gè)秘密的內(nèi)容。此外,當(dāng)它確實(shí)向您顯示信息時(shí),它只向您顯示Base64編碼版本,以便臨時(shí)旁觀者不會(huì)意外地看到任何敏感數(shù)據(jù)。默認(rèn)情況下,“秘密”不提供任何加密,這是您需要自己完成或找到其他選項(xiàng)來配置的。

更新Kubernetes資源

現(xiàn)在,您將根據(jù)ConfigMap和Secret中配置的值更新Kubernetes部署,以設(shè)置容器中的環(huán)境變量。編輯kubernetes.yaml文件(位于start目錄中)。此文件定義Kubernetes部署。請(qǐng)注意valueFrom字段。這指定了環(huán)境變量的值,可以從各種源進(jìn)行設(shè)置。源包括ConfigMap、Secret和有關(guān)集群的信息。在本例中,configMapKeyRef使用ConfigMap sys app name的值設(shè)置密鑰名稱。類似地,secretKeyRef使用Secret sys app credentials中的值設(shè)置密鑰username和password。
通過單擊上面的鏈接打開/sample kubernetes config/start/kubernetes.yaml文件,并用以下內(nèi)容替換內(nèi)容:

  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: system-deployment
    labels:
      app: system
  spec:
    selector:
      matchLabels:
        app: system
    template:
      metadata:
        labels:
          app: system
      spec:
        containers:
        - name: system-container
          image: system:1.0-SNAPSHOT
          ports:
          - containerPort: 9080
          # Set the APP_NAME environment variable
          env:
          - name: APP_NAME
            valueFrom:
              configMapKeyRef:
                name: sys-app-name
                key: name
  ---
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: inventory-deployment
    labels:
      app: inventory
  spec:
    selector:
      matchLabels:
        app: inventory
    template:
      metadata:
        labels:
          app: inventory
      spec:
        containers:
        - name: inventory-container
          image: inventory:1.0-SNAPSHOT
          ports:
          - containerPort: 9080
          # Set the SYSTEM_APP_USERNAME and SYSTEM_APP_PASSWORD environment variables
          env:
          - name: SYSTEM_APP_USERNAME
            valueFrom:
              secretKeyRef:
                name: sys-app-credentials
                key: username
          - name: SYSTEM_APP_PASSWORD
            valueFrom:
              secretKeyRef:
                name: sys-app-credentials
                key: password
  ---
  apiVersion: v1
  kind: Service
  metadata:
    name: system-service
  spec:
    type: NodePort
    selector:
      app: system
    ports:
    - protocol: TCP
      port: 9080
      targetPort: 9080
      nodePort: 31000
  ---
  apiVersion: v1
  kind: Service
  metadata:
    name: inventory-service
  spec:
    type: NodePort
    selector:
      app: inventory
    ports:
    - protocol: TCP
      port: 9080
      targetPort: 9080
      nodePort: 32000

部署更改

現(xiàn)在需要重新構(gòu)建和部署應(yīng)用程序,以使更改生效。使用以下命令重新生成應(yīng)用程序,確保位于開始目錄中:

mvn package -pl system
mvn package -pl inventory
現(xiàn)在,您需要?jiǎng)h除舊的Kubernetes部署,然后通過發(fā)出以下命令部署更新的部署:
kubectl replace --force -f kubernetes.yaml
您應(yīng)該看到命令的以下輸出:

  kubectl replace --force -f kubernetes.yaml
  deployment.apps "system-deployment" deleted
  deployment.apps "inventory-deployment" deleted
  service "system-service" deleted
  service "inventory-service" deleted
  deployment.apps/system-deployment replaced
  deployment.apps/inventory-deployment replaced
  service/system-service replaced
  service/inventory-service replaced

使用以下工具檢查服務(wù)的pods的狀態(tài):

kubectl get --watch pods
您最終應(yīng)該看到這兩個(gè)服務(wù)的就緒狀態(tài)。按Ctrl-C退出終端命令。
調(diào)用更新的系統(tǒng)服務(wù)并使用curl命令檢查標(biāo)頭:
curl -# -I -u bob:bobpwd -D - http://( minikube ip ):31000/system/properties | grep -i ^X-App-Name: 您應(yīng)該看到響應(yīng)X-App-Name標(biāo)頭已從system更改為my system. 通過發(fā)出以下curl請(qǐng)求,驗(yàn)證清單服務(wù)現(xiàn)在正在對(duì)憑據(jù)使用Kubernetes機(jī)密: curl http://( minikube ip ):32000/inventory/systems/system-service
如果請(qǐng)求失敗,請(qǐng)檢查您是否正確配置了密碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容