spring boot 的程式,設定多半寫在 application.properties,裡面的值基於資安,或是其它各種理由,可能不會直接寫在檔案裡,而會取自環境變數,如上的 application.properties 有兩個參數來自環境變數,在 K8s 的環境要怎麼傳入環境變數呢?
- 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=PBEWithMD5AndDES
這裡簡單的寫一支 REST API,會傳回 application.properties 裡的值,看看那兩個取自環境變數的值是否正確,程式如下:
下面是建立 pod 的 yaml,第 9~13 行就是傳入環境變數的方式。
- @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;
- }
- }
如果我們用 ReplicaSet 啟動兩個 pod,如下:
- 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
practice-pod 這個 pod 是用上面的 yaml 產生的,確實可以取得環境變數,但是 practice-rs-grtx7 和 practice-rs-lncdr 這兩個 pod 並無法取得環境變數,因為 rs 每次產生 pod,是從 image 產生,並沒有傳入環境變數,為了解決這個問題,建立 ReplicaSet 的 yaml 要如下 18~22 行:
輸入如下指令測試看看: (使用 kubectl get svc 指令,可以看到 external-ip)
- 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
輸出如下結果:
- 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"}
沒有留言:
張貼留言