Google Code Prettify

2020年4月15日 星期三

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

沒有留言:

張貼留言