Secret
在 Kubernetes 中,Secret
是一种用于存储敏感信息的资源,比如密码、OAuth 令牌、SSH 密钥等。Secret
允许你以安全的方式将这些信息传递给 Pod,而不是硬编码在镜像或配置文件中。
配置管理中心:configMap、Secret
Secret 的类型
创建 Secret 时,你可以使用 Secret 资源的 type 字段,或者与其等价的 kubectl 命令行参数(如果有的话)为其设置类型。 Secret 类型有助于对 Secret 数据进行编程处理。
Kubernetes 提供若干种内置的类型,用于一些常见的使用场景。 针对这些类型,Kubernetes 所执行的合法性检查操作以及对其所实施的限制各不相同。内置类型 用法
Opaque 用户定义的任意数据
kubernetes.io/service-account-token 服务账号令牌
kubernetes.io/dockercfg ~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson ~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth 用于基本身份认证的凭据
kubernetes.io/ssh-auth 用于 SSH 身份认证的凭据
kubernetes.io/tls 用于 TLS 客户端或者服务器端的数据
bootstrap.kubernetes.io/token 启动引导令牌数据安全性
加密存储:Kubernetes 支持在 etcd 中加密 Secret。
访问控制:使用 RBAC(角色基础访问控制)来限制对 Secret 的访问。
Secret 是 Kubernetes 中用于处理敏感数据的关键资源,它提供了安全和灵活的方式来管理这些数据。
创建 Secret
Secret
可以通过多种方式创建,包括 YAML 文件、kubectl
命令或从文件中加载。以下是几种常见的创建方式:
-
从文件创建 Secret:
kubectl create secret generic my-secret --from-file=/path/to/secret/file
-
从字面量值创建 Secret:
kubectl create secret generic my-secret --from-literal=username=myuser --from-literal=password=mypassword
-
使用 YAML 文件定义 Secret:
apiVersion: v1 kind: Secret metadata:name: my-secret type: Opaque data:username: dXNlcg== # base64 编码后的 "user"password: cGFzc3dvcmQ= # base64 编码后的 "password"
Sectec如何加密: base64
## 编码
echo -n '123456' | base64
## 解码
echo "a3kzNg==" | base64 -d## yaml文件方式创建secret:yaml文件中的数据,必须要用base64加密。
## 命令的方式创建secret:
不需要BASE64提前加密;
kubectl create secret generic backend-user --from-literal=backend-username='backend-admin'
示例:
1.安全分发凭据
## 用户名和密码: ky36 123456echo -n 'ky36' | base64 ------ a3kzNg==echo -n '123456' | base64 ------ MTIzNDU2apiVersion: v1
kind: Pod
metadata:name: secret-test-pod
spec:containers:- name: test-containerimage: harbor.hiuiu.com/nginx/nginx:1.21.5volumeMounts:- name: secret-volumemountPath: /etc/secret-volumereadOnly: truevolumes:- name: secret-volumesecret:secretName: test-secret
---
apiVersion: v1
kind: Secret
metadata:name: test-secret
data:username: a3kzNg==password: MTIzNDU2class: ky36kubectl exec -it secret-test-pod -- bash
2.Secret 中的数据定义容器变量ENV
kubectl create secret generic backend-user --from-literal=backend-username='backend-admin'
apiVersion: v1
kind: Pod
metadata:name: env-single-secret
spec:containers:- name: envars-test-containerimage: harbor.hiuiu.com/nginx/nginx:1.21.5env:- name: SECRET_USERNAMEvalueFrom:secretKeyRef:name: backend-userkey: backend-username
kubectl exec -it env-single-secret -- bash -c 'echo $SECRET_USERNAME'
3.secret实现连接远程mysql
#数据库:
#####################总结#####################
#在集群外部,centos7系统安装mysql作为服务端。之前写的脚本,拖来直接运行
[root@Node5 ~]#:bash install_mysql.sh
#进入数据库之后
#密码策略,改密码,添加两条:
set global validate_password_policy=0;
set global validate_password_length=1;#将密码改成"abc123"
alter user root@'localhost' identified by 'abc123';
ctrl + D #退出,可以测试一下:mysql -uroot -pabc123,登录进去,ctrl+D退出登录。
#进去创建一个普通用户。允许任何主机登录。
[root@Node5 ~]#:mysql -uroot -pabc123
#创建一个普通用户。
mysql> create user user@"%" identified by "123456";
#查看主机和用户。
mysql> select host,user from mysql.user;
| % | user |4 rows in set (0.00 sec)
#赋权。
mysql> grant all privileges on *.* to user@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
#登录普通用户。由于赋权了,可以对数据库操作了。
[root@Node5 ~]#:mysql -uuser -p123456
mysql> create database ky36;
Query OK, 0 rows affected (0.00 sec)
#查看数据库。ky36
mysql> show databases;
| ky36 |
5 rows in set (0.00 sec)
mysql> exit
Bye
####去集群master上:可以在主上安装mysql:apt install -y mysql-client,测试登录mysql -uuser -p123456 -h 192.168.240.15
#获取用户名和密码的密文。写在yaml文件中。
[root@Node-1 9_02]#:echo -n "user" | base64
dXNlcg==
[root@Node-1 9_02]#:echo -n "123456" | base64
MTIzNDU2
#写两个yaml文件。secret.yaml和pod.yaml
[root@Node-1 9_02]#:cat secret.yaml
apiVersion: v1
kind: Secret
metadata:name: mysql-secret #secret的名字。
type: Opaque
data:mysql-password: MTIzNDU2 #密码密文mysql-user: dXNlcg== #用户名密文
[root@Node-1 9_02]#:cat pod.yaml
apiVersion: v1
kind: Pod
metadata:name: my-app-pod
spec:containers:- name: my-app-podimage: harbor.hiuiu.com/linux_system/centos/centos7:7.9.2009env:- name: MYSQL_HOST #变量名,进入容器中的变量。echo $MYSQL_HOSTvalue: "192.168.240.15" #值为主机- name: MYSQL_PORTvalue: "3306"- name: MYSQL_USERvalueFrom:secretKeyRef:name: mysql-secret #用户在secret中的key: mysql-user #取这个键的值- name: MYSQL_PASSWORDvalueFrom:secretKeyRef:name: mysql-secret #密码在secret中key: mysql-password #取这个键的值command: ["/bin/bash"] #在centos中持续运行的命令。args: ["-c", "while true; do echo hello; sleep 10; done"]
#运行secret
[root@Node-1 9_02]#:kubectl apply -f secret.yaml
secret/mysql-secret created
[root@Node-1 9_02]#:kubectl get secret
NAME TYPE DATA AGE
mysql-secret Opaque 2 6s
#运行pod
[root@Node-1 9_02]#:kubectl apply -f pod.yaml
pod/my-app-pod created
[root@Node-1 9_02]#:kubectl get pod
NAME READY STATUS RESTARTS AGE
my-app-pod 1/1 Running 0 3s
nginxtest 1/1 Running 25 (121m ago) 5d7h
[root@Node-1 9_02]#:kubectl exec -it my-app-pod bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
#搭建本地yum仓库。
[root@my-app-pod ~]# cd /etc/yum.repos.d/
[root@my-app-pod yum.repos.d]# mkdir bak
[root@my-app-pod yum.repos.d]# mv *.repo bak/
#从centos中,grep -vE "^#|^$" /etc/yum.repos.d/CentOS-Base.repo。把这个源复制到容器的源中。
[root@my-app-pod yum.repos.d]# vi CentOS-Base.repo
[root@my-app-pod yum.repos.d]# yum clean all
[root@my-app-pod yum.repos.d]# yum makecache
#安装数据库
[root@my-app-pod yum.repos.d]# yum install -y mysql
#查看变量
[root@my-app-pod yum.repos.d]# echo $MYSQL_HOST
192.168.240.15
[root@my-app-pod yum.repos.d]# echo $MYSQL_USER
user
[root@my-app-pod yum.repos.d]# echo $MYSQL_PASSWORD
123456
#登录数据库
[root@my-app-pod yum.repos.d]# mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 5.7.44 MySQL Community Server (GPL)Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ky36 | #发现有了我们在服务端创建的数据库ky36。
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)MySQL [(none)]> drop database ky36; #删除数据库
Query OK, 0 rows affected (0.00 sec)MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
#在centos7服务端查看,也就删除掉了ky36数据库。
[root@Node5 ~]#:mysql -uuser -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 5.7.44 MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)mysql>