avatar

Quản lý cấu hình ứng dụng với ConfigMap và Secret trong Kubernetes

Trong bài này chúng ta sẽ tìm hiểu cách quản lý cấu hình ứng dụng với ConfigMap và Secret trong Kubernetes.

Đăng vào
23 phút

title

Mục lục

1. Giới thiệu chung

Trong những bài trước, các cấu hình của ứng dụng như: thông tin database (username, password) hoặc thông tin URI gọi đến các ứng dụng khác,... được cấu hình và thêm vào bên trong container khi ứng dụng khởi chạy thông qua các biến môi trường. Vì các thông tin cấu hình của ứng dụng sẽ thay đổi tùy theo môi trường mà ứng dụng này triển khai nên thường trong file cấu hình Deployment sẽ không định nghĩa trực tiếp các thông tin cấu hình này mà sẽ sử dụng hai đối tượng ConfigMap và Secret trong Kubernetes để quản lý các cấu hình ứng dụng theo từng môi trường trường hiệu quả và dễ dàng hơn.

Trong bài viết này chúng ta cùng nhau tìm hiểu hai đối tượng giúp lưu trữ những cấu hình, đó là ConfigMap và Secret trong Kubernetes. Để tránh bị trùng lặp, mình sẽ chỉ cấu hình Students-service, còn Courses-service cũng sẽ có cấu hình tương tự.

2. ConfigMap và Secret trong Kubernetes là gì?

ConfigMap và Secret trong Kubernetes

ConfigMap: là đối tượng trong Kubernetes giúp lưu trữ các thông tin cấu hình của ứng dụng dưới dạng key-value. ConfigMap thường được dùng để cấu hình những thông tin ít nhạy cảm và dữ liệu trong ConfigMap được lưu trữ dưới dạng plaintext (định nghĩa với data) và base64 encoded (định nghĩa với binaryData). Pods của ứng dụng có thể lấy dữ liệu được lưu trong ConfigMap bằng cách: sử dụng biến môi trường hoặc sử dụng volume để mount file cấu hình vào trong container. ConfigMap cần triển khai trước khi triển khai ứng dụng nếu không các pod của ứng dụng sẽ không khởi chạy được vì không tìm thấy ConfigMap đã chỉ định trong file cấu hình và pod chỉ có thể đọc được ConfigMap trên cùng namespace.

Bạn có thể tìm hiểu thêm về ConfigMap tại trang web chính thức của Kubernetes.

Secret: là đối tượng trong Kubernetes giúp lưu trữ các thông tin cấu hình của ứng dụng dưới dạng key-value. Secret thì thường được dùng để cấu hình các thông tin nhạy cảm như: thông tin database (username, password), thông tin secretKey, accessKey,... và các thông tin cấu hình này sẽ được mã hóa bằng base64. Pods của ứng dụng có thể lấy dữ liệu được lưu trong Secret bằng cách: sử dụng biến môi trường hoặc sử dụng volume để mount file cấu hình vào trong container. Secret phải được triển khai trước khi triển khai ứng dụng nếu không pod của ứng dụng sẽ không khỏi chạy được vì không tìm thấy Secret đã chỉ định trong file cấu hình và pod chỉ có thể đọc được Secret trên cùng namespace.

Bạn có thể tìm hiểu thêm về Secret tại trang web chính thức của Kubernetes.

3. Tạo ConfigMap và triển khai ConfigMap trên Kubernetes

Tạo ConfigMap cho ứng dụng

ConfigMap là đối tượng khá đơn giản để định nghĩa trong Kubernetes, các thông tin cấu hình thì định nghĩa dưới trường data (dữ liệu dưới dạng plaintext) hoặc binaryData (dữ liệu dưới dạng base64 encoded) theo format key=value, tên của ConfigMap được định nghĩa tại trường metadata.name.

Tạo file cấu hình students-cm.yaml cho Students-service:

k8s/students-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: students-cm
data:
  SERVER_PORT: "8080"
  MYSQL_URL: "jdbc:mysql://mysql:3306/students"
  MYSQL_USERNAME: "students"
  MYSQL_PASSWORD: "VNTechies2023"

Tạo file cấu hình courses-cm.yaml cho Courses-service:

k8s/courses-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: courses-cm
data:
  SERVER_PORT: "8080"
  MYSQL_URL: "jdbc:mysql://mysql:3306/courses"
  MYSQL_USERNAME: "courses"
  MYSQL_PASSWORD: "VNTechies2023"
  STUDENTS_URI: "http://students-service"

Các thành phần của ConfigMap:

TênĐịnh nghĩa
apiVersionVersion của Kubernetes API mà bạn sử dụng để tạo object/resource. Hai file cấu hình trên là: v1.
kindLoại object/resource của Kubernetes. Hai file cấu hình trên là: ConfigMap.
metadata.nameĐịnh nghĩa tên của ConfigMap. Hai file cấu hình trên là: students-cmcourses-cm.
dataChứa các thông tin cấu hình của ứng dụng theo format key=value.

Triển khai ConfigMap trên Kubernetes

Để triển khai ConfigMap trên Kubernetes sử dụng lệnh: kubectl apply -f <file-path>.

# 1. Triển khai ConfigMap trên Kubernetes
kubectl apply -f students-cm.yaml
configmap/students-cm created

kubectl apply -f courses-cm.yaml
configmap/courses-cm created

# 2. Lấy danh sách ConfigMap
kubectl get configmap
NAME                  DATA   AGE
students-cm           4      58s
courses-cm            5      48s

Cấu hình sử dụng ConfigMap trong Pods

Khi triển khai ConfigMap thành công thì Pods có thể sử dụng các thông tin cấu hình bên trong ConfigMap bằng một số cách như sau:

  • Sử dụng biến môi trường: Thường sử dụng cho các thông tin cấu hình không quá lớn (< 1MB). Khi thay đổi thông tin cấu hình ở ConfigMap thì các Pod CẦN restart lại để cập nhật thông tin cấu hình mới nhất.
  • Sử dụng Volume: Sẽ mount file cấu hình dưới dạng volume và thường dùng cho các file cấu hình lớn. Khi thay đổi thông tin cấu hình ở ConfigMap thì các Pod KHÔNG CẦN restart lại để cập nhật thông tin cấu hình mới nhất.

Lấy thông tin cấu hình bên bên trong ConfigMap thông qua biến môi trường

Sử dụng trường spec.containers.envFrom.configMapRef để chỉ định tên ConfigMap muốn lấy. File cấu hình dưới đây chỉ định muốn lấy dữ liệu cấu hình ở ConfigMap tên là students-cm và tất cả dữ liệu bên trong ConfigMap sẽ được thêm vào bên trong container theo kiểu biến môi trường khi container khởi chạy. Cấu hình sẽ tương tự đối với Courses-service.

k8s/students-deployment-configMap-env.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: students-service
  labels:
    app: students-service
spec:
  selector:
    matchLabels:
      app: students-service
  replicas: 3
  template:
    metadata:
      labels:
        app: students-service
    spec:
      containers:
        - name: students-service
          image: thanhnb1/students-service:latest

          # Định nghĩa lấy thông tin cấu hình ở ConfigMap nào.
          envFrom:
            - configMapRef:
                # Tên ConfigMap
                name: students-cm
          ports:
            - containerPort: 8080
      restartPolicy: Always

Bạn cũng có thể cấu hình lấy từng dữ liệu bên trong ConfigMap và các biến môi trường này sẽ được thêm vào container khi container khởi chạy.

k8s/students-deployment-configMap-env2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: students-service
  labels:
    app: students-service
spec:
  selector:
    matchLabels:
      app: students-service
  replicas: 3
  template:
    metadata:
      labels:
        app: students-service
    spec:
      containers:
        - name: students-service
          image: thanhnb1/students-service:latest
          env:
              # Tên biến môi trường.
            - name: SERVER_PORT
              valueFrom:
                # Lấy biến môi trường từ ConfigMap.
                configMapKeyRef:
                  # Tên ConfigMap.
                  name: students-cm
                  # Tên key sẽ lấy được định nghĩa ở phần `data` trong ConfigMap.
                  key: SERVER_PORT
            - name: MYSQL_URL
              valueFrom:
                configMapKeyRef:
                  name: students-cm
                  key: MYSQL_URL
            - name: MYSQL_USERNAME
              valueFrom:
                configMapKeyRef:
                  name: students-cm
                  key: MYSQL_USERNAME
            - name: MYSQL_PASSWORD
              valueFrom:
                configMapKeyRef:
                  name: students-cm
                  key: MYSQL_PASSWORD
                 ports:
                   - containerPort: 8080
      restartPolicy: Always

Lấy các biến môi trường bên trong Pod:

# 1. Lâý danh sách pods:
kubectl get pods
NAME                                READY   STATUS    RESTARTS        AGE
students-service-6698fcb486-8lfzt   1/1     Running   0               4m25s
students-service-6698fcb486-xtk5n   1/1     Running   0               4m25s
students-service-6698fcb486-mlzk6   1/1     Running   0               4m25s

# 2. Lấy biên môi trường bên trong pod:
kubectl exec -it po/students-service-6698fcb486-mlzk6 sh -- env

...
...
# Đây là các thông tin cấu hình lấy từ ConfigMap
MYSQL_URL=jdbc:mysql://mysql:3306/students
MYSQL_USERNAME=students
SERVER_PORT=8080
MYSQL_PASSWORD=VNTechies2023
MYSQL_SERVICE_PORT=3306
...

Lấy thông tin cấu hình bên bên trong ConfigMap thông qua Mounted Volume

Khi ứng dụng Spring boot khởi chạy thì sẽ nó sẽ tự động tìm và load file cấu hình application.properties hoặc application.yaml. Nếu bạn muốn chỉ định một file cấu hình khác (chính là file cấu hình mà sẽ ta mounted vào container của ứng dụng) thì có thể chỉ định đường dẫn đến file đó bằng cách thêm tham số --spring.config.location=file:<path-config-file> khi chạy file jar trong Dockerfile.

students/Dockerfile
FROM adoptopenjdk/openjdk11:latest
WORKDIR /workspace
COPY target/*-SNAPSHOT.jar /workspace/app.jar
ENV TZ="Asia/Ho_Chi_Minh"
EXPOSE 8080
ENTRYPOINT ["java","-jar","/workspace/app.jar", "--spring.config.location=file:/config/application.yaml"]

Tạo file students-cm-volume.yaml để tạo cấu hình ConfigMap cho ứng dụng:

k8s/students-cm-volume.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: students-cm
data:
  application.yaml: |-
    server:
      port: 8080

    spring:
      datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://mysql:3306/students
        username: students
        password: VNTechies2023
      jpa:
        hibernate.ddl-auto: update
        generate-ddl: true
        show-sql: false

ConfigMap có thể được mounted vào bên trong container giống như sử dụng volume. Thông tin cấu hình bên trong ConfigMap sẽ được mounted vào bên trong container thông qua trường volumeMounts.

k8s/students-deployment-configmap-volume.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: students-service
  labels:
    app: students-service
spec:
  selector:
    matchLabels:
      app: students-service
  replicas: 3
  template:
    metadata:
      labels:
        app: students-service
    spec:
      containers:
        - name: students-service
          image: thanhnb1/students-service:latest
          ports:
            - containerPort: 8080
          volumeMounts:

              # File "application.yaml" trong ConfigMap sẽ được mounted vào folder "/config" bên trong contaienr.
            - mountPath: /config
              name: application-config
              readOnly: true
      volumes:
          # Tên ở phần "volumes.name" phải giống với "volumeMounts.name".
        - name: application-config
          configMap:
            name: students-cm

            # Sử dụng trường "items" này để mô tả cụ thể file bên trong ConfigMap sẽ được mounted và trong container.
            # Ở trường hợp này file "application.yaml" trong ConfigMap sẽ được mounted vào trong container.
            items:
            - key: application.yaml
              path: application.yaml
      restartPolicy: Always

Triển khai và lấy chi tiết ConfigMap trên Kubernetes:

# Triển khai ConfigMap
kubectl apply -f students-cm-volume.yaml
configmap/students-cm created

# Lấy danh sách ConfigMap
kubectl get cm
NAME                  DATA   AGE
students-cm           1      80m

# Lấy data cấu hình trong ConfigMap
kubectl describe cm/students-cm
Name:         students-cm
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
application.yaml:
----
server:
  port: 8080

spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://mysql:3306/students
    username: students
    password: VNTechies2023
  jpa:
    hibernate.ddl-auto: update
    generate-ddl: true
    show-sql: false

BinaryData
====

Events:  <none>

Triển khai file cấu hình ứng dụng và lấy data được cấu hình trong ConfigMap được mounted vào container giống volume:

kubectl apply -f students-deployment-configmap-volume.yaml
deployment.apps/students-service created

# Lấy danh sach pods
kubectl get pods
NAME                              READY   STATUS    RESTARTS        AGE
students-service-f7cc674f-m7xqv   1/1     Running   0               86m
students-service-f7cc674f-nq8fc   1/1     Running   0               86m
students-service-f7cc674f-lzwg4   1/1     Running   0               86m

# File cấu hình trong configMap được đã được mounted vào folder "config" trong container
kubectl exec -it students-service-f7cc674f-nq8fc sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
bin  boot  config  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  workspace
# cd config
# ls
application.yaml
# cat application.yaml
server:
  port: 8080

spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://mysql:3306/students
    username: students
    password: VNTechies2023
  jpa:
    hibernate.ddl-auto: update
    generate-ddl: true
    show-sql: false

Gọi API lấy các thông tin cấu hình ứng dụng:

kubectl port-forward po/students-service-f7cc674f-lzwg4 8080:8080

# API đơn giản để demo ứng dụng đã lấy các thông tin cấu hình từ ConfigMap.
curl http://localhost:8080/api/configs/v1
AppConfigs{SERVER_PORT=8080, MYSQL_URL='jdbc:mysql://mysql:3306/students', MYSQL_USERNAME='students', MYSQL_PASSWORD='VNTechies2023'}

Phần trên chúng ta đã cấu hình ứng dụng Spring Boot bằng cách mounted file config "application.yaml" vào bên trong folder "/config". Theo lý thuyết thì khi thực hiện cập nhật ConfigMap thì file config "application.yaml" được mouted vào container trước đó cũng sẽ thay đổi theo mà Pod không cần restart. Nhưng vì Spring Boot thường để cấu hình thành bean mặc định bean sẽ chỉ được khởi tạo một lần (theo cấu hình bean mặc định) khi ứng dụng Spring Boot khởi chạy và sẽ tái sử dụng, nên dù ConfigMap có thay đổi và file "application.yaml" được mounted vào container đã thay đổi thì khi lấy các thông tin cấu hình vẫn không được cập nhật. Để ứng dụng Spring Boot cập nhật được thông tin cấu hình mới khi ConfigMap thay đổi thì ứng dụng Spring Boot của chúng ta cần phải thay đổi cách thức lấy thông tin cấu hình (có thể là cấu hình scope cho bean, viết API để làm mới lại cấu hình,..).

Hãy xem xét ứng dụng của bạn là gì và cách thức ứng dụng của bạn lấy cấu hình thế nào để lựa chọn một trong hai cách (biến môi trường, mounted volume) lấy cấu hình từ ConfigMap cho phù hợp.

4. Tạo Secret và triển khai Secret trên Kubernetes

Tạo Secret cho ứng dụng

Hai ứng dụng Courses-service và Students-service phía trên có thông tin kết nối đến database gồm username và password đang để ở ConfigMap và không được mã hóa. Phần này ta sẽ sử dụng đối tượng Secret trong Kyberentes để lưu trữ thông tin kết nối đến database cho hai ứng dụng để tăng thêm một chút bảo mật với những dữ liệu nhạy cảm.

Tạo file courses-sc.yaml để cấu hình Secret cho Courses-service:

k8s/courses-sc.yaml
apiVersion: v1
kind: Secret
metadata:
  name: courses-sc
type: Opaque
data:
  # Thông tin cấu hình ở dạng encode Base64.
  MYSQL_USERNAME: Y291cnNlcw==
  MYSQL_PASSWORD: Vk5UZWNoaWVzMjAyMw==

Tạo file students-sc.yaml để cấu hình Secret cho Students-service:

k8s/students-sc.yaml
apiVersion: v1
kind: Secret
metadata:
  name: students-sc
type: Opaque
data:
  # Thông tin cấu hình ở dạng encode Base64.
  MYSQL_USERNAME: c3R1ZGVudHM=
  MYSQL_PASSWORD: Vk5UZWNoaWVzMjAyMw==

Các thành phần của ConfigMap:

TênĐịnh nghĩa
apiVersionVersion của Kubernetes API mà bạn sử dụng để tạo object/resource. Hai file cấu hình trên là: v1.
kindLoại object/resource của Kubernetes. Hai file cấu hình trên là: Secret.
metadata.nameĐịnh nghĩa tên của Secret. Hai file cấu hình trên là: students-sccourses-sc.
typeKubernetes Secret có một số loại trong đó type: Opaque là loại mặc định. Bạn có thể xem thêm các loại Secret ở đây.
dataChứa các thông tin cấu hình của ứng dụng theo format key=value và được encode base64.

Triển khai Secret trên Kubernetes

Triển khai Secret trên Kubernetes bằng lệnh: kubectl apply -f <file-path>

# Triển khai Secret.
kubectl apply -f courses-sc.yaml
secret/courses-sc created

kubectl apply -f students-sc.yaml
secret/students-sc created

# Lấy danh sách Secret.
kubectl get secret
NAME          TYPE     DATA   AGE
courses-sc    Opaque   2      109s
students-sc   Opaque   2      30s

Cấu hình sử dụng Secret trong Pods

Khi triển khi Secret thành công trên Kubernetes thì có một số cách để Pod có thể sử dụng được Secret như:

  • Sử dụng biến môi trường: Giống với ConfigMap các thông tin trong Secret sẽ được inject vào trong container và khi thay đổi thông tin cấu hình ở Secret thì các cũng Pod CẦN restart lại để cập nhật thông tin cấu hình mới nhất.
  • Sử dụng Volume: Giống với ConfigMap khi thay đổi thông tin cấu hình ở Secret thì các Pod KHÔNG CẦN restart lại để cập nhật thông tin cấu hình mới nhất.

Lấy thông tin cấu hình bên bên trong Secret thông qua biến môi trường

Định nghĩa tên Secret ở trường spec.containers.envFrom.secretRef để chỉ định Secret muốn lấy. Trong file cấu hình dưới đây đang lấy thông tin cấu hình ở Secret có tên là students-sc và tất cả thông tin cấu hình sẽ được thêm vào bên trong container dưới dạng biến môi trường khi container khởi chạy. Cấu hình sẽ tương tự đối với Courses-service.

k8s/students-deployment-secret-env.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: students-service
  labels:
    app: students-service
spec:
  selector:
    matchLabels:
      app: students-service
  replicas: 3
  template:
    metadata:
      labels:
        app: students-service
    spec:
      containers:
        - name: students-service
          image: thanhnb1/students-service:latest
          envFrom:
            # Thông tin kết nối database thì lấy trong Secret.
            - secretRef:
                name: students-sc

            # Thông tin còn lại thì lấy trong ConfigMap.
            - configMapRef:
                name: students-cm
          ports:
            - containerPort: 8080
      restartPolicy: Always

Bạn cũng có thể cấu hình lấy từng dữ liệu bên trong Secret à các biến môi trường này sẽ được thêm vào container khi container khởi chạy.

k8s/students-deployment-secret-env2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: students-service
  labels:
    app: students-service
spec:
  selector:
    matchLabels:
      app: students-service
  replicas: 3
  template:
    metadata:
      labels:
        app: students-service
    spec:
      containers:
        - name: students-service
          image: thanhnb1/students-service:latest
          ports:
            - containerPort: 8080
          env:
            # Lấy thông tin từ ConfigMap.
            - name: SERVER_PORT
              valueFrom:
                configMapKeyRef:
                  name: students-cm
                  key: SERVER_PORT
            - name: MYSQL_URL
              valueFrom:
                configMapKeyRef:
                  name: students-cm
                  key: MYSQL_URL

            # Lấy thông tin từ Secret.
            - name: MYSQL_USERNAME
              valueFrom:
                # Lấy biến môi trường từ Secret.
                secretKeyRef:
                  # Tên Secret.
                  name: students-cm
                  # Tên key sẽ lấy được định nghĩa ở phần `data` trong Secret.
                  key: MYSQL_USERNAME
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: students-cm
                  key: MYSQL_PASSWORD
      restartPolicy: Always

Lấy các biến môi trường bên trong Pod:

# 1. Lâý danh sách pods:
kubectl get po
NAME                                READY   STATUS    RESTARTS        AGE
students-service-6cd8f7bdbf-trlz7   1/1     Running   0               9s
students-service-6cd8f7bdbf-qxxg6   1/1     Running   0               9s
students-service-6cd8f7bdbf-bdlkf   1/1     Running   0               9s

# 2. Lấy biên môi trường bên trong pod:
kubectl exec -it po/students-service-6cd8f7bdbf-bdlkf sh -- env
...
# Đây là các thông tin cấu hình của ứng dụng lấy từ ConfigMap và Secret.
MYSQL_URL=jdbc:mysql://mysql:3306/students
MYSQL_USERNAME=students
SERVER_PORT=8080
MYSQL_PASSWORD=VNTechies2023
MYSQL_SERVICE_PORT=3306
...

Lấy thông tin cấu hình bên bên trong Secret thông qua Mounted Volume

Tương tự như ConfigMap bạn cũng có thể cấu hình để mounted một file cấu hình vào bên trong container bằng cách sử dụng volume.

Tạo file students-sc-volume.yaml để tạo Secret:

k8s/students-sc-volume.yaml
apiVersion: v1
kind: Secret
metadata:
  name: students-sc-volume
type: Opaque
data:
  app.firstSecret: Zmlyc3Qgc2VjcmV0IHNwcmluZyBib290IGRlbW8u

Tạo file students-deployment-secret-volume.yaml để cấu hình ứng dụng lấy dữ liệu từ Secret thông qua mount volume.

k8s/students-deployment-secret-volume.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: students-service
  labels:
    app: students-service
spec:
  selector:
    matchLabels:
      app: students-service
  replicas: 3
  template:
    metadata:
      labels:
        app: students-service
    spec:
      containers:
        - name: students-service
          image: thanhnb1/students-service:latest
          ports:
            - containerPort: 8080
          envFrom:
            # Thông tin kết nối database thì lấy trong Secret.
            - secretRef:
                name: students-sc
            # Thông tin còn lại thì lấy trong ConfigMap.
            - configMapRef:
                name: students-cm
          volumeMounts:
              # Secret sẽ được mount vào bên trong folder "/config/app/secrets".
            - mountPath: /config/app/secrets
              name: app-secrets
              readOnly: true
      volumes:
          # Tên ở phần "volumes.name" phải giống với "volumeMounts.name".
        - name: app-secrets
          secret:
            secretName: students-sc-volume
            items:
            - key: app.firstSecret
              path: app.firstSecret
      restartPolicy: Always

Triển khai Secret và ứng dụng:

# 1. Triển khai ConfigMap trên Kubernetes:
kubectl apply -f students-cm.yaml

# 2. Triển khai Secret trên Kubernetes:
kubectl apply -f students-sc.yaml

# 3. Triển khai Secret trên Kubernetes:
kubectl apply -f students-sc-volume.yaml

# 4. Triển khai ứng dụng trên Kubernetes:
kubectl apply -f students-deployment-secret-volume.yaml

# 5. Lấy danh sách pods:
kubectl get po
NAME                                READY   STATUS    RESTARTS        AGE
students-service-8457ff899f-nls5k   1/1     Running   0               11s
students-service-8457ff899f-5rztk   1/1     Running   0               8s
students-service-8457ff899f-jj225   1/1     Running   0               5s

kubectl exec -it po/students-service-8457ff899f-jj225 sh
# 6. Xem các biến môi trường bên được lấy từ ConfigMap và Secret bên trong container:
# printenv
....
MYSQL_USERNAME=students
MYSQL_PASSWORD=VNTechies2023
MYSQL_URL=jdbc:mysql://mysql:3306/students
MYSQL_SERVICE_PORT=3306
SERVER_PORT=8080
TZ=Asia/Ho_Chi_Minh
....

# 7. Xem secret đã được mount vào trong container ở folder "config/app/secrets":

# ls
app.jar
# cd ..
# ls
bin     dev   lib    libx32  opt   run   sys  var
boot    etc   lib32  media   proc  sbin  tmp  workspace
config  home  lib64  mnt     root  srv   usr
# cd config/app/secrets
# ls
app.firstSecret
# cat app.firstSecret
first secret spring boot demo.# ^C
#

5. Tổng kết

Trong bài này chúng ta đã tìm hiểu hai đổi tượng ConfigMap và Secret trong Kubernetes để lưu trữ các thông tin cấu hình của ứng dụng. Cũng đã tìm hiểu cấu hình ứng dụng cũng có thể lấy dữ liệu ở ConfigMap, Secret thông qua 2 cách: sử dụng biến môi trường và mounted volume. Hãy xem xét yêu cầu của ứng dụng để lựa chọn cách sử dụng configmap và secret phù hợp.