Trong Kubernetes, Secret là một đối tượng được sử dụng để lưu trữ các thông tin nhạy cảm như mật khẩu, khóa truy cập, chứng chỉ TLS/SSL, token, … Secret được mã hóa và lưu trữ dưới dạng Base64 encoded để bảo vệ các thông tin nhạy cảm trong quá trình lưu trữ hoặc chuyển tải trên mạng.
Các ví dụ về việc sử dụng Secret trong Kubernetes bao gồm:
- Lưu trữ mật khẩu cho cơ sở dữ liệu: Trong một ứng dụng, thường cần sử dụng cơ sở dữ liệu và cần cung cấp thông tin đăng nhập cho cơ sở dữ liệu đó. Thông tin đăng nhập này có thể được lưu trữ trong một Secret để tránh tiết lộ thông tin nhạy cảm như mật khẩu.
- Sử dụng chứng chỉ TLS/SSL: Một ứng dụng có thể sử dụng chứng chỉ TLS/SSL để đảm bảo an toàn khi truy cập các dịch vụ bảo mật. Các chứng chỉ này có thể được lưu trữ trong Secret để đảm bảo tính bảo mật.
- Lưu trữ các thông tin truy cập API: Nếu một ứng dụng cần truy cập vào một API bảo mật, thì thông tin truy cập đến API đó có thể được lưu trữ trong một Secret để đảm bảo an toàn.
- Lưu trữ token cho truy cập vào các dịch vụ bên ngoài: Nếu một ứng dụng cần truy cập vào các dịch vụ bên ngoài, ví dụ như truy cập vào Amazon S3, Google Cloud Storage, … thì các thông tin truy cập có thể được lưu trữ trong một Secret để đảm bảo an toàn.
Dưới đây là một ví dụ YAML để tạo một Secret cho MySQL trong Kubernetes:
apiVersion: v1
kind: Secret
metadata:
name: mysql
namespace: wordpress
labels:
app: website-wp
type: Opaque
data:
db_prefix: LWIgd3BfCg==
db_name: LWIgd2lraQo=
db_user: aG9hbmdoZA==
db_pass: aG9hbmdoZA==
username: aG9hbmdoZA==
password: aG9hbmdoZA==
Trong đó:
apiVersion: v1
: sử dụng phiên bản API Kubernetes v1kind: Secret
: định nghĩa loại đối tượng là Secretmetadata
: chứa thông tin metadata của Secret, bao gồmname
(tên của Secret) và các labels, annotations,…type: Opaque
: định nghĩa kiểu Secret là Opaque, có nghĩa là Secret không được mã hóa hoặc mã hóa đơn giản (không sử dụng các thuật toán mã hóa mạnh)data
: chứa các thông tin được mã hóa của Secret, bao gồm tên người dùng và mật khẩu (trong ví dụ này, username và password đã được mã hóa dưới dạng base64).
Trong thực tế, để sử dụng Secret, bạn có thể tạo một file YAML như trên, sau đó chạy lệnh kubectl apply -f <tên-file-YAML>
để tạo Secret trong Kubernetes. Sau đó, bạn có thể sử dụng Secret trong các đối tượng khác như Deployment, Pod, Service,… bằng cách đặt tên Secret trong trường spec.template.spec.containers[].env[].valueFrom.secretKeyRef.name
.
Lưu ý, thông tin username và mật khẩu tôi đã mã hoá base64, bạn có thể sử dụng lệnh dưới để mã hoá thông tin nhạy cảm của bạn.
$ echo -n "hoanghd" | base64
aG9hbmdoZA==
$ echo -n "wiki" | base64
d2lraQ==
$echo -n "wp_" | base64
d3Bf
Và bạn có thể giải mã giá trị đã mã hóa bằng lệnh sau:
$ echo -n "d2lraQ==" | base64 --decode
wiki
Nếu bạn muốn cập nhật giá trị trong Secret, bạn có thể sử dụng lệnh kubectl edit secret <secret-name>
để chỉnh sửa các giá trị và lưu thay đổi của bạn.
apiVersion: v1
items:
- apiVersion: v1
data:
ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1EVXhNVEUzTVRZek1sb1hEVE16TURVd09ERTNNVFl6TWxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTVR6CkFSTjI0MFVwcjJwTlMrSGZQTkZDRWJFZ3IvYmsxZXBSNFIzb25xMWJBWWp0cVpzYnYrTnhXTGhhb2l4Z1paRngKMDArbkVlWXpRaVBxMmcybVZKUVlrUFN2WFkxbTVaMVZFa0p3UldlOC9uaWY1L08wOVBiUXhrQUtpamhBQVY1ago5Y3g5Z2lYWDcrTmtxanZTYUZsZjJraWJHSExCWFlhWTEzUW8zUlJETVRxeS9sdEVCUERHaUhpYTM0V00yUjMvClRzVXNqT0FYQzAxNDlLeWxIYnNDeW5GYUpWd0huODhzdUdqbTBFYmVXd1p2RFZyM3hmQ2I5L1hPLzNMdEtRUisKSmJqai9YZEUzazlqSlpERjgvWU9xYVRxN1luRFZWK3h1M2s1THM3MmZzUU1BNXhzZTdRenJOMmYxRElCbjFoMwpUUGMzRGtXVVIvN21FNThCaXcwQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNVm44eGpQY2hGZ1RTYkdmTEZwOEZ6QnNqOFlNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRUxFT3Q0bm42L0tHanRqcHp4Qwo4eVFscUsxZXF3cng2VGx0a2d0cTUvR2RRNlBBNkJOelFUUXQ3b2RValJpQU0xMTJVV3U1c1B3OWZrKzFEa3RYCnZibE80bUZnYmVFQ28xT3ZmSWlzcUtFTHBDRHArY2lYUnA5NDgyTFFLSmhrRHJIckNLOUNvTWZCZlpSdEpDaTcKM3d1bjdSVVRpOWpCQ09jTEh2Mys5QVJ2NTlSbXV2TzNvRXZOcVU4K09tdGQvNG5DMWlrb1QvaWdmNHNtcUZhZgpNc2xVcFVDTGFmd2c0cVRyZkppcmdrVGxxdzAvck1iRTcyZUpjR1QzckhTd29UalhBQ1VUeXFadTdONXYxZ2p1Clp4TmN2TXVXU0ZhdDh6bmdGaE9VMzVaa3BYS1lRdVR0REl3WGVDSjRDQ2Zka1grckFIWTJGdlFnQlc5QW5Ka2gKNHdrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
namespace: d2lraS1ob2FuZ2hk
token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklsVmxiRU5KYW5KbVQyWk5VbTEzVW1kclRHdFhiVGd4VUZKTkxYQnZla1E0TmxCT1JFWkZXbVZGVFhjaWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUozYVd0cExXaHZZVzVuYUdRaUxDSnJkV0psY201bGRHVnpMbWx2TDNObGNuWnBZMlZoWTJOdmRXNTBMM05sWTNKbGRDNXVZVzFsSWpvaVpHVm1ZWFZzZEMxMGIydGxiaTFyWmpnNWJDSXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMbTVoYldVaU9pSmtaV1poZFd4MElpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WlhKMmFXTmxMV0ZqWTI5MWJuUXVkV2xrSWpvaU1ESmpaR1psTXpndFpUa3paUzAwTldJd0xXSTJPVEV0Tm1ZeU9UZzFNR0kzWmpVM0lpd2ljM1ZpSWpvaWMzbHpkR1Z0T25ObGNuWnBZMlZoWTJOdmRXNTBPbmRwYTJrdGFHOWhibWRvWkRwa1pXWmhkV3gwSW4wLm56WjQ5WFIxV3hNRnFheFpsMFo2cU5YX0lYdU1RbV8zd3k1V3ZkQk9EczJaUXV6dkJuNlVoeFB2TmZpOWhxRjVsdTlUUHYzSVJsVE93cTFicmE4dEJIRC04dXlIbV9IX184NzZqbjhfLVFNVE1WRlRDWm5DWFVxWWo2RzMtRC1SRkNDR2d4UExUdHZFdVg0cVZHSGkxWmRKbUdwbzkzbWlXUjA4R0NnUFV3alZOdWJDWnZpYzFQNUlJbTVYMjEzU2lYQW04S3NVM2pSdGpXVUVabjF6VHd6ZzNCbTJtYnpjbWl6R2R1ekhEd1lPUnUwdEhfaG9wTldobjBVQmxGanQwcmY3LU9JMTF0SzY4WFB6cXNlNEhCYjRqU1h0VHgyNjFyTDkxU0NBSXk2WFoxRVliZ1Q5M0JJckJMcnNNcnpEekJwcG5lZU0ya2J4MUpfRTlVN282UQ==
kind: Secret
metadata:
annotations:
kubernetes.io/service-account.name: default
kubernetes.io/service-account.uid: 02cdfe38-e93e-45b0-b691-6f29850b7f57
creationTimestamp: "2023-05-14T12:09:01Z"
name: default-token-kf89l
namespace: wiki-hoanghd
resourceVersion: "795029"
uid: ad3bbcb5-313a-4049-9dc8-11e4161979b7
type: kubernetes.io/service-account-token
- apiVersion: v1
data:
db_name: d2lraQ==
db_pass: aG9hbmdoZA==
db_prefix: d3Bf
db_user: aG9hbmdoZA==
password: aG9hbmdoZA==
username: aG9hbmdoZA==
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"db_name":"d2lraQ==","db_pass":"aG9hbmdoZA==","db_prefix":"d3Bf","db_user":"aG9hbmdoZA==","password":"aG9hbmdoZA==","username":"aG9hbmdoZA=="},"kind":"Secret","metadata":{"annotations":{},"labels":{"app":"website-wp"},"name":"mysql","namespace":"wiki-hoanghd"},"type":"Opaque"}
creationTimestamp: "2023-05-14T12:09:01Z"
labels:
app: website-wp
name: mysql
namespace: wiki-hoanghd
resourceVersion: "795027"
uid: 1810d03c-061c-4b9f-8d1a-bb52bad6383e
type: Opaque
kind: List
metadata: {}
Bạn có thể nhìn thấy các thông tin cần lưu ý như dưới. Bạn có thể thay đổi chúng và lưu lại, thông tin sẽ được cập nhật.
db_name: d2lraQ==
db_pass: aG9hbmdoZA==
db_prefix: d3Bf
db_user: aG9hbmdoZA==
password: aG9hbmdoZA==
username: aG9hbmdoZA==
Tiếp theo có thể gắn Secret này cho deployment để triển khai.
apiVersion: apps/v1
kind: Deployment
metadata:
name: website-mysql
namespace: wordpress
labels:
app: website-mysql
spec:
selector:
matchLabels:
app: website-mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: website-mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: mysql
key: db_name
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql
key: db_user
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: db_pass
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql
mountPath: /var/lib/mysql
volumes:
- name: mysql
persistentVolumeClaim:
claimName: website-mysql-pvc
Bạn có thể kiểm tra thông tin secret đã được tạo thành công thhay chưa bằng lệnh kubectl get secret -n <namespace>.
$ kubectl get secret -n wiki-hoanghd
NAME TYPE DATA AGE
default-token-kf89l kubernetes.io/service-account-token 3 50s
mysql Opaque 6 50s
Xem thông tin chi tiết bằng lệnh kubectl describe secret -n <namespace>.
$ kubectl describe secret -n wiki-hoanghd
Name: default-token-kf89l
Namespace: wiki-hoanghd
Labels: <none>
Annotations: kubernetes.io/service-account.name: default
kubernetes.io/service-account.uid: 02cdfe38-e93e-45b0-b691-6f29850b7f57
Type: kubernetes.io/service-account-token
Data
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlVlbENJanJmT2ZNUm13UmdrTGtXbTgxUFJNLXBvekQ4NlBOREZFWmVFTXcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJ3aWtpLWhvYW5naGQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiZGVmYXVsdC10b2tlbi1rZjg5bCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMDJjZGZlMzgtZTkzZS00NWIwLWI2OTEtNmYyOTg1MGI3ZjU3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Ondpa2ktaG9hbmdoZDpkZWZhdWx0In0.nzZ49XR1WxMFqaxZl0Z6qNX_IXuMQm_3wy5WvdBODs2ZQuzvBn6UhxPvNfi9hqF5lu9TPv3IRlTOwq1bra8tBHD-8uyHm_H__876jn8_-QMTMVFTCZnCXUqYj6G3-D-RFCCGgxPLTtvEuX4qVGHi1ZdJmGpo93miWR08GCgPUwjVNubCZvic1P5IIm5X213SiXAm8KsU3jRtjWUEZn1zTwzg3Bm2mbzcmizGduzHDwYORu0tH_hopNWhn0UBlFjt0rf7-OI11tK68XPzqse4HBb4jSXtTx261rL91SCAIy6XZ1EYbgT93BIrBLrsMrzDzBppneeM2kbx1J_E9U7o6Q
ca.crt: 1099 bytes
namespace: 12 bytes
Name: mysql
Namespace: wiki-hoanghd
Labels: app=website-wp
Annotations: <none>
Type: Opaque
Data
====
db_prefix: 3 bytes
db_user: 7 bytes
password: 7 bytes
username: 7 bytes
db_name: 4 bytes
db_pass: 7 bytes