Cấu hình ConfigMap trong Kubernetes – Cuongquach.com | Khi bạn quản lý các ứng dụng Deployment/Pod trong Kubernetes, chắc chắn sẽ có nhu cầu cấu hình các biến môi trường cho Pod hoặc khởi tạo file config cho dịch vụ Container theo cách nào đấy linh động nếu ứng dụng của bạn có mặt ở nhiều môi trường khác nhau như UAT/QA/DEV/TESTING. Thì resource ConfigMap trong Kubernetes vô cùng tiện lợi để hỗ trợ bạn những công việc như vậy.
Contents
ConfigMap là gì trong Kubernetes ?
ConfigMap là một resource trong Kubernetes giúp bạn quản lý được file cấu hình ứng dụng, nội dung file cấu hình ứng dụng, các giá trị truyền cho lệnh command-line, port ứng dụng,… và rất nhiều thứ khác có thể hỗ trợ khi bạn khai báo các thành phần của 1 Pod.
ConfigMap giúp ứng dụng của bạn tách biệt phần code ứng dụng với nội dung cấu hình về hệ thống. Ví dụ như bạn dễ dàng thay đổi cấu hình về môi trường Dev/QA/UAT/Production như database connection string, domain, hostname, url,… mà không cần phải can thiệp vào code. Một trong những điều quan trọng của 12Factor (https://12factor.net/vi/config).
ConfigMap rất hữu ích để lưu trữ và chia sẻ thông tin cấu hình không nhạy cảm, không được mã hóa. Để sử dụng thông tin nhạy cảm trong cụm của bạn, bạn phải sử dụng Bí mật.
Khởi tạo ConfigMap trong Kubernetes
Bạn có vài cách khởi tạo ConfigMap như : khai báo cấu hình định dạng YAML rồi apply config hay tạo ConfigMap từ command line.
+ Command line
# kubectl create configmap <name> <data>
Trong đó:
- name: là tên của ConfigMap.
- data: dữ liệu của ConfigMap với 2 hình thức cung cấp dữ liệu như sau
+ –from-file: load dữ liệu key-value cho ConfigMap từ file
+ –from-literal: tạo key-value cho ConfigMap từ command arguments trực tiếp.
Ví dụ ta tạo trực tiếp ConfigMap từ command line, rồi coi thông tin ConfigMap mà ta đã tạo thử.
# kubectl create configmap cuongquach-settings --from-literal env=production --from-literal domain=cuongquach.com configmap/cuongquach-settings created # kubectl get configmap cuongquach-settings -o yaml apiVersion: v1 data: domain: cuongquach.com env: production kind: ConfigMap metadata: creationTimestamp: "2020-04-11T08:51:52Z" name: cuongquach-settings namespace: default resourceVersion: "151390" selfLink: /api/v1/namespaces/default/configmaps/cuongquach-settings uid: 897a053d-3af1-416d-bcee-5924760bc68b
Rồi tạo một ConfigMap khác từ command line với input từ file nào.
# cat << EOF > config.properties env=development domain=cuongquach.com password=helloguys EOF # kubectl create configmap cuongquach-settings-2 --from-file config.properties configmap/cuongquach-settings-2 created # kubectl get configmap cuongquach-settings-2 -o yaml apiVersion: v1 data: config.properties: | env=development domain=cuongquach.com password=helloguys kind: ConfigMap metadata: creationTimestamp: "2020-04-11T09:12:55Z" name: cuongquach-settings-2 namespace: default resourceVersion: "152916" selfLink: /api/v1/namespaces/default/configmaps/cuongquach-settings-2 uid: ebecc338-d370-4a29-9647-acd6adecce5d
+ ConfigMap với YAML Manifest
Ok bạn cũng có thể tạo một file YAML Manifest để định nghĩa về tài nguyên ConfigMap trên hệ thống Kubernetes đấy.
# cat << EOF > cuongquach-configmap.yaml kind: ConfigMap apiVersion: v1 metadata: name: cuongquach-db1 data: # Configuration values can be set as key-value properties database: mongodb database_uri: mongodb://localhost:27017 mysqld_config: |- [mysqld] tmp_table_size = 128M max_heap_table_size = 32M key_buffer_size = 16M max_allowed_packet = 64M table_open_cache = 600 table_cache = 1024 EOF # kubectl create -f cuongquach-configmap.yaml configmap/cuongquach-db1 created # kubectl get configmap cuongquach-db1 -o yaml apiVersion: v1 data: database: mongodb database_uri: mongodb://localhost:27017 mysqld_config: |- [mysqld] tmp_table_size = 128M max_heap_table_size = 32M key_buffer_size = 16M max_allowed_packet = 64M table_open_cache = 600 table_cache = 1024 kind: ConfigMap metadata: creationTimestamp: "2020-04-11T09:39:36Z" name: cuongquach-db1 namespace: default resourceVersion: "154856" selfLink: /api/v1/namespaces/default/configmaps/cuongquach-db1 uid: 2c878a3f-238a-47f9-92d2-71de7f442ef2
Sử dụng ConfigMap với Pod Kubernetes
Mình không đề cập chi tiết cách sử dụng ConfigMap với Pod Kubernetes ở phần này, nhưng có 3 kiểu sử dụng ConfigMap với Pod :
- Load toàn bộ key-value data của một ConfigMap thành biến môi trường trong 1 Pod app.
kind: Pod apiVersion: v1 metadata: name: cuongquach-test-pod spec: containers: - name: cuongquach-test-container image: k8s.gcr.io/busybox command: [ "/bin/sh", "-c", "env" ] envFrom: - configMapRef: name: cuongquach-db1
- Load một giá trị biến môi trường được khai báo trong Pod từ ConfigMap key cụ thể.
apiVersion: v1 kind: Pod metadata: name: cuongquach-test-pod spec: containers: - name: cuongquach-test-container image: k8s.gcr.io/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: DATABASE_URI valueFrom: configMapKeyRef: name: cuongquach-db1 key: database_uri restartPolicy: Never
- Hoặc bạn cũng có thể mount volume file config trong app container từ ConfigMap đấy.
--- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: mysql-cuongquach namespace: default spec: template: metadata: labels: app: mysql-cuongquach spec: containers: - image: mysql:5.7 name: mysql-cuongquach imagePullPolicy: Always ports: - containerPort: 3306 volumeMounts: - name: mysqld-config mountPath: /etc/mysql/conf.d volumes: - name: mysqld-config configMap: name: cuongquach-db1 items: - key: mysqld_config path: my.cnf
Nguồn: https://cuongquach.com/