spring.profiles.active=${spring_profiles_active} server.servlet.context-path=/ server.port=8080 # encrypt jasypt.encryptor.bean=encryptorBean jasypt.encryptor.password=${jasypt_encryptor_password} jasypt.encryptor.algorithm=PBEWithMD5AndDESspring boot 的程式,設定多半寫在 application.properties,裡面的值基於資安,或是其它各種理由,可能不會直接寫在檔案裡,而會取自環境變數,如上的 application.properties 有兩個參數來自環境變數,在 K8s 的環境要怎麼傳入環境變數呢?
這裡簡單的寫一支 REST API,會傳回 application.properties 裡的值,看看那兩個取自環境變數的值是否正確,程式如下:
@RestController @RequestMapping("/info") @Slf4j public class InfoController { @Autowired private Environment env; @Autowired ResourceLoader resourceLoader; @GetMapping("/app") public Map app() { Map all = new HashMap(); Set keys = new HashSet<>(); try { Resource resource = resourceLoader.getResource("classpath:application.properties"); InputStream is = resource.getInputStream(); Properties prop = new Properties(); prop.load(is); keys = prop.keySet(); for(Object key:keys) { all.put((String) key, env.getProperty((String) key)); } } catch (IOException e) { log.error(e.getMessage(), e); } return all; } }下面是建立 pod 的 yaml,第 9~13 行就是傳入環境變數的方式。
apiVersion: v1 kind: Pod metadata: name: practice-pod spec: containers: - name: practice-pod image: steven/practice-pod env: - name: spring_profiles_active value: "test" - name: jasypt_encryptor_password value: "mykey" imagePullSecrets: - name: steven-harbor如果我們用 ReplicaSet 啟動兩個 pod,如下:
practice-pod 這個 pod 是用上面的 yaml 產生的,確實可以取得環境變數,但是 practice-rs-grtx7 和 practice-rs-lncdr 這兩個 pod 並無法取得環境變數,因為 rs 每次產生 pod,是從 image 產生,並沒有傳入環境變數,為了解決這個問題,建立 ReplicaSet 的 yaml 要如下 18~22 行:
apiVersion: apps/v1 kind: ReplicaSet metadata: name: practice-rs spec: replicas: 2 selector: matchLabels: app: practice-rs template: metadata: labels: app: practice-rs spec: containers: - name: practice-pod image: harbor.steven.idv.tw/steven/practice-pod env: - name: spring_profiles_active value: "test" - name: jasypt_encryptor_password value: "mykey" imagePullSecrets: - name: steven-harbor輸入如下指令測試看看: (使用 kubectl get svc 指令,可以看到 external-ip)
curl http://172.16.3.39:9090/info/app輸出如下結果:
{"jasypt.encryptor.algorithm":"PBEWithMD5AndDES","jasypt.encryptor.bean":"encryptorBean","server.servlet.context-path":"/","server.port":"8080","jasypt.encryptor.password":"mykey","spring.profiles.active":"test"}可以看到,兩個環境變數都有抓到。
沒有留言:
張貼留言