+6

Tạo và sử dụng ConfigMaps trong Kubernetes

Trong lập trình, chúng tôi sử dụng tệp env hoặc tệp cấu hình riêng biệt để lưu trữ các cài đặt, cấu hình hoặc các biến được yêu cầu để thực thi chương trình. Trong Kubernetes, chúng ta có thể sử dụng ConfigMaps để đạt được chức năng tương tự.

ConfigMap là gì?

Một ConfigMap là một Kubernetes API object có thể được sử dụng để lưu trữ dữ liệu dưới dạng các cặp key-value. Kubernetes có thể sử dụng ConfigMaps đã tạo dưới dạng:

  • Configuration file
  • Environment variable
  • Command-line argument

ConfigMaps cung cấp khả năng làm cho các ứng dụng linh động bằng cách tách các cấu hình dành riêng cho môi trường khỏi các containers.

Quan trọng, ConfigMaps không thích hợp để lưu các dữ liệu quan trọng. Chúng không cung cấp bất kỳ loại mã hóa nào, và tất cả dữ liệu trong đó đều hiển thị cho bất kỳ ai có quyền truy cập vào tệp (Kubernetes cung cấp các Secrets để chứa có dữ liệu nhạy cảm).

Một xem xét khác của ConfigMaps là kích thước của tệp, tốt nhất là dưới 1MB, đối với các dữ liệu lớn, tốt hơn nên sử dụng các file service, database hoặc mount tệp riêng biệt.

Ví dụ một ConfigMap

kind: ConfigMap
apiVersion: v1
metadata:
  name: example-configmap
  namespace: default
data:
  # Configuration Values are stored as key-value pairs
  system.data.name: "app-name"
  system.data.url: "https://app-name.com"
  system.data.type_one: "app-type-xxx"
  system.data.value: "3"
  # File like Keys
  system.interface.properties: |
    ui.type=2
    ui.color1=red
    ui.color2=green

Cách tạo ConfigMaps

ConfigMaps và pods đi cùng với nhau vì ConfigMaps có thể được sử dụng làm biến môi trường và thông tin cấu hình trong một Kubernetes pod.

Trong phần này, chúng ta sẽ xem xét cách tạo ConfigMaps.

Tạo ConfigMaps từ thư mục

Chúng ta dùng command sau để tạo ConfigMap directories

kubectl create configmap

Nó sẽ tìm kiếm các tệp thích hợp trong một thư mục cụ thể có thể được sử dụng để tạo ConfigMap trong khi bỏ qua bất kỳ loại tệp nào khác (tệp ẩn, thư mục con, liên kết biểu tượng, v.v.)

Trước tiên, hãy tạo một thư mục bằng lệnh sau:

mkdir configmap-example

Sau đó, ta sẽ tải xuống các tệp mẫu vào thư mục. Các tệp này sẽ được sử dụng để tạo ConfigMap.

wget https://kubernetes.io/examples/configmap/game.properties -O configmap-example/game.properties

wget https://kubernetes.io/examples/configmap/ui.properties -O configmap-example/ui.properties

Bây giờ chúng ta hãy xem nội dung tệp bằng các lệnh sau.

cat game.properties
cat ui.properties

Khi tạo ConfigMaps dùng thư mục, yếu tố quan trọng nhất là bạn phải xác định chính xác các cặp key-value pairs trong mỗi tệp.

kubectl create configmap game-config-example --from-file=configmap-example/

Lệnh này sẽ đóng gói các tệp trong thư mục được chỉ định và tạo tệp ConfigMap. Chúng ta có thể sử dụng lệnh kubectl describe để xem tệp ConfigMap.

kubectl describe configmaps game-config-example

Chúng ta có thể lấy ConfigMap ở định dạng YAML bằng lệnh sau.

kubectl get configmaps game-config-example -o yaml

Tạo ConfigMaps từ files

Giống như cách chúng ta tạo ConfigMaps bằng cách sử dụng thư mục, chúng ta cũng có thể tạo ConfigMaps bằng cách sử dụng tệp bằng cách sử dụng tham số –-from-file để trỏ đến một tệp duy nhất trong lệnh kubectl create configmap. Vì vậy, hãy tạo ConfigMap bằng tệp game.properties như được hiển thị bên dưới.

kubectl create configmap game-config-example-2 --from-file=configmap-example/game.properties

kubectl describe configmap game-config-example-2

Chúng ta có thể xác định nhiều đối số –-from-file nhiều lần để tạo một tệp ConfigMap duy nhất bằng cách sử dụng nhiều tệp khác nhau.

Tạo ConfigMaps từ environment file

Kubernetes cho phép bạn tạo ConfigMaps dùng env files. Chúng ta có thể dùng đối số –-from-env-file khi định nghĩa env file. Đối số này cũng có thể được sử dụng nhiều lần để xác định nhiều tệp env.

Khi sử dụng tệp env, mỗi dòng phải tuân theo định dạng name=value. Các dòng trống và nhận xét sẽ bị bỏ qua, trong khi dấu ngoặc kép sẽ là một phần của ConfigMap.

cat configmap-example/game-env-file.properties

kubectl create configmap game-config-env-file-example --from-env-file=configmap-example/game-env-file.properties

kubectl get configmap game-config-env-file-example -o yaml

Tạo ConfigMap từ một file với key xác định trước

Khi tạo ConfigMap, chúng ta có thể sử dụng định dạng sau trong đối số –-from-file để xác định tên khóa sẽ ghi đè tên tệp được sử dụng trong phần dữ liệu.

--from-file=<Key-Name>=<File-Path>

Ví dụ sau minh họa cách xác định khóa trong khi tạo ConfigMap.

kubectl create configmap game-config-key-example --from-file=game-key-example-data=configmap-example/game.properties

kubectl get configmap game-config-key-example -o yaml

Tạo ConfigMap từ values

Một cách khác để tạo ConfigMaps là cung cấp các giá trị làm tham số trong lệnh create configmap. Trong trường hợp này chúng ta có thể dùng đối số –-from-literal để pass từng cặp khóa. Điều này đặc biệt hữu ích khi chúng ta cần tạo ConfigMap một cách nhanh chóng.

kubectl create configmap config-example-values --from-literal=example.value=one --from-literal=example-type=2 --from-literal=example.url="http://example.com"

kubectl get configmap config-example-values -o yaml

Sử dụng ConfigMaps trong Pods

Bây giờ chúng ta đã hiểu cơ bản về cách tạo ConfigMaps. Bước tiếp theo là sử dụng ConfigMaps đã tạo để tạo Pod. Trong phần này, chúng ta sẽ tạo một ConfigMap đơn giản và sử dụng nó khi tạo một Pod trong Kubernetes.

Bước đầu tiên, hãy tạo một tệp có tên app-basic.properties và bao gồm hai cặp key-value.

Chúng ta sẽ tạo một ConfigMap có tên là app-basic-configmap bằng cách sử dụng tệp ở trên và tùy chọn –-from-file.

kubectl create configmap app-basic-configmap --from-file=configmap-example/app-basic.properties

kubectl get configmap app-basic-configmap -o yaml

Cuối cùng, hãy tạo một Pod tham chiếu đến ConfigMap mới được tạo. Chúng tôi sẽ sử dụng tệp YAML sau để tạo Pod.

example-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-example-pod
spec:
  containers:
    - name: configmap-example-busybox
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
        # Load the Complete ConfigMap
        - configMapRef:
            name: app-basic-configmap
  restartPolicy: Never

Như bạn có thể thấy từ ví dụ trên, chúng tôi sẽ load ConfigMap hoàn chỉnh mà chúng ta đã tạo vào Kubernetes Pod.

kubectl create -f example-pod.yaml
kubectl get pods

kubectl logs configmap-example-pod | grep system.number

Kết quả trên chỉ ra rằng ConfigMap app-basic-configmap đã được tải thành công khi tạo Kubernetes Pod.

Mapping keys từ ConfigMaps sang Pods

Một cách khác mà chúng ta có thể sử dụng ConfigMaps là ánh xạ trực tiếp các giá trị từ ConfigMaps tới các biến môi trường cụ thể trong Pod.

Trong phần này, chúng tôi sẽ tạo hai tệp configmap đơn giản theo cách thủ công, load và mapping các giá trị trực tiếp đến Kubernetes Pod. Chúng ta sẽ xác định các ConfigMaps dưới dạng tệp YAML và sau đó sử dụng lệnh kubectl create để tạo ConfigMap.

application-defaults.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: application-configs
  namespace: default
data:
  app.value: "45000"
  app.type: test-application
  app.ui: web
application-logs.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: application-log-configs
  namespace: default
data:
  log_level: WARNING
  log_type: TEXT
kubectl create -f application-defaults.yaml
kubectl create -f application-logs.yaml

example-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-example-pod
spec:
  containers:
    - name: configmap-example-busybox
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: APPLICATION_TYPE
          valueFrom:
            configMapKeyRef:
              name: application-configs
              key: app.type
        - name: APPLICATION_UI_TYPE
          valueFrom:
            configMapKeyRef:
              name: application-configs
              key: app.ui
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: application-log-configs
              key: log_level
  restartPolicy: Never

Trong cấu hình này, chúng tôi đang mapping các biến môi trường thành các giá trị trong mỗi ConfigMap.

Sau đây là cấu trúc cơ bản để mapping một giá trị.

env:
  - name: <<VARIABLE NAME>>
    valueFrom:
      configMapKeyRef:
        name: <<>CONFIMAP NAME>
        key: <<CONFIGMAP KEY>>

Tiếp theo chúng ta sẽ tạo Pod

kubectl create -f example-pod.yaml
kubectl get pods

Sau khi tạo Pod thành công, chúng ta có thể khám phá các biến môi trường như hình bên dưới.

kubectl logs configmap-example-pod | grep APPLICATION_TYPE
kubectl logs configmap-example-pod | grep APPLICATION_UI_TYPE
kubectl logs configmap-example-pod | grep LOG_LEVEL

ConfigMap đã xác định các biến môi trường trong pod commands

Một cách khác chúng ta có thể sử dụng các biến môi trường được xác định trong ConfigMap là sử dụng chúng trong Pod Commands.

Code sau đây trình bày cách sử dụng các biến môi trường này trong command element bằng cách sử dụng example-pod.yaml.

apiVersion: v1
kind: Pod
metadata:
  name: configmap-example-pod
spec:
  containers:
    - name: configmap-example-busybox
      image: k8s.gcr.io/busybox
      command: [ "/bin/echo", "Application Type $(APPLICATION_TYPE) - $(APPLICATION_UI_TYPE)" ]
      env:
        - name: APPLICATION_TYPE
          valueFrom:
            configMapKeyRef:
              name: application-configs
              key: app.type
        - name: APPLICATION_UI_TYPE
          valueFrom:
            configMapKeyRef:
              name: application-configs
              key: app.ui
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: application-log-configs
              key: log_level
  restartPolicy: Never

Trong trường hợp này, các biến môi trường được xác định khi thực hiện lệnh (khi bắt đầu container) và chúng sẽ được hiển thị trực tiếp trong terminal.

Thêm dữ liệu ConfigMap vào volume

Người dùng có thể sử dụng ConfigMaps gắn dữ liệu ConfigMap vào Kubernetes volume. Trong ví dụ sau, chúng ta đang gắn dữ liệu ConfigMap application-log-config vào một volume được gọi là config-volume được gắn trong /etc/config trong container. Sau đó, chúng ta đã cấu hình một lệnh sẽ liệt kê tất cả các tệp trong thư mục /etc/config.

apiVersion: v1
kind: Pod
metadata:
  name: configmap-example-volume-pod
spec:
  containers:
    - name: configmap-volume-example-busybox
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: application-log-configs
  restartPolicy: Never

ConfigMaps được gắn được tự động cập nhật. kubenet sẽ định kỳ kiểm tra xem ConfigMap được gắn kết có được cập nhật hay không và cập nhật ConfigMap lắp đặt cho phù hợp. Tuy nhiên, cơ chế tự động cập nhật này không áp dụng cho các volumes được ánh xạ dưới dạng SubPath volume.

Tổng kết

Trong bài viết này, chúng ta đã tìm hiểu về Kubernetes ConfigMaps, bao gồm nhiều cách có thể được sử dụng để tạo ConfigMaps và cách sử dụng ConfigMaps trong Kubernetes Pod. ConfigMaps là một phần thiết yếu của bất kỳ Kubernetes cluster nào, cung cấp một phương pháp mạnh mẽ để lưu trữ dữ liệu ứng dụng hoặc container đơn giản và được truy cập thường xuyên.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí