在Spring Boot應用程式中使用Kubernetes ConfigMap

banq發表於2019-01-07

讓我們以前的Spring Boot Kubernetes示例Spring Boot Kubernetes Deploy 作為入門者並將Kubernetes Config Map新增到遊戲中。

Spring Boot應用程式屬性
首先讓我們將簡單的啟動屬性新增到MVC控制器,沒什麼大不了的:

@RestController
    public class ControllerMVC {

        @Value("${my.system.property:defaultValue}")
        protected String fromSystem;

        @RequestMapping("/sayhello")
        public String mvcTest() {
             return "I'm saying hello to Kubernetes with system property "+fromSystem+" !";
        }
    }

在application.properties中定義my.system.property:

 server.port=8081 
 my.system.property=fromFile


測試該屬性是否已載入可執行:

輸出應該是:

I'm saying hello to Kubernetes with system property fromFile


在Spring Boot中使用Kubernetes ConfigMap
在Spring Boot中使用Kubernetes配置對映的好方法是透過環境變數。因此,讓我們使用configmap app-config 中的值定義環境變數my.system.property,以覆蓋application.properties中的值:

首先讓我們在configmap app-config使用鍵“my.system.property”和值“fromAnsible”定義:

kubectl create configmap app-config --from-literal=my.system.property=updatedFromAnsible


要檢視configmap是否定義良好,請執行:

kubectl describe configmap app-config


輸出應該是:

Name:         app-config
Namespace:    default    
Labels:       none    
Annotations:  none    
Data    
====    
my.system.property:    
----    
updatedFromAnsible    
Events:  none


好的,configmap已準備就緒,讓kubernetes知道它並定義環境變數my.system.property,它從configmap app-config讀取同名的金鑰。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: test-app
spec:
  replicas: 1
  template: 
    metadata:
      labels:
        app: test-app
    spec:
      containers:
      - name: test-app
        image: test-controller:1.0-SNAPSHOT
        env:
          # Define the environment variable
          - name: my.system.property
            valueFrom:
              configMapKeyRef:
                # The ConfigMap containing the value you want to assign to my.system.property
                name: app-config
                # Specify the key associated with the value
                key: my.system.property
        ports:
        - containerPort: 8081


現在使用kubernetes服務將部署清單上傳到kubernetes 

(這是所需的輸出,如何上傳請參閱上一個repo):

$ kubectl get deployments
    NAME             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    hello-minikube   1         1         1            1           26d
    test-app         1         1         1            1           2h
    tomask79:kubernetes-configmap tomask79$ kubectl get pods
    NAME                             READY     STATUS    RESTARTS   AGE
    hello-minikube-6c47c66d8-gzvgc   1/1       Running   5          26d
    test-app-745ff9546c-hrswc        1/1       Running   0          1h
    tomask79:kubernetes-configmap tomask79$ kubectl get services
    NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          26d
    test-app     NodePort    10.105.171.8   <none>        8081:30615/TCP   2h



kubernetes服務執行於:

$ minikube service test-app --url
http://192.168.99.100:30615


訪問這個url返回:

$ curl http://192.168.99.100:30615/sayhello
I'm saying hello to Kubernetes with system property updatedFromAnsible !


是的,我們透過將屬性作為環境變數注入,透過Kubernetes configmap覆蓋了spring屬性my.system.property ,因為env.variables 在Spring Boot中具有更高的優先順序 ,然後才會啟用application.property檔案的內容。

更新configMap
讓我們稍微玩一下configmap吧。如果我們想要更改Map值,該怎麼辦? 最簡單的方法是刪除map並建立一個新map。

$ kubectl delete configmap app-config
configmap "app-config" deleted
$ kubectl create configmap app-config --from-literal=my.system.property=changedValue
configmap "app-config" created
$ tomask79:kubernetes-configmap tomask79$ kubectl delete configmap app-config


現在再次curl 這個服務:

$ curl http://192.168.99.100:30615/sayhello
I'm saying hello to Kubernetes with system property updatedFromAnsible !


configmap的新值沒有反映出來,我們仍然是舊的。
要檢視configmap的實際值,我們需要重新啟動POD。由於我們使用部署,其中要求kubernetes始終執行一個副本,我們只需要刪除POD。新例項 最終會執行。

$ kubectl delete pod test-app-745ff9546c-hrswc
pod "test-app-745ff9546c-hrswc" deleted
tomask79:kubernetes-configmap tomask79$ kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
hello-minikube-6c47c66d8-gzvgc   1/1       Running   5          27d
test-app-745ff9546c-t92hb        1/1       Running   0          31s
tomask79:kubernetes-configmap tomask79$ curl http://192.168.99.100:30615/sayhello
I'm saying hello to Kubernetes with system property changedValue !


我們看到實際新的值!

點選標題檢視原文

相關文章