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
spring 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"}
可以看到,兩個環境變數都有抓到。

沒有留言:
張貼留言