configmap 配置文件参数
加密数据并存放在etcd中,让pod的容器以挂载volume方式访问
应用场景:凭据,身份令牌
官方文档:https://kubernetes.io/docs/concepts/configuration/secret/
Secret
对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。 将这些信息放在 secret
中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活
Secret 是一种包含少量敏感信息例如密码、token 或 key 的对象。这样的信息可能会被放在 Pod spec 中或者镜像中;将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险。
用户可以创建 secret,同时系统也创建了一些 secret。
Service Account 使用 API 凭证自动创建和附加 secret
Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改您的 pod 以使用此类型的 secret。这样可以安全地访问apiserver
使用 kubectl 创建 Secret
比如有些pod需要访问数据库,这些pod需要使用的用户名和密码可以放到本地宿主机的文件里
资源参数写入到etcd中
如果有多个pod资源,都可以与一个secret建立关系
要使用 secret,pod 需要引用 secret。
作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里;
当 kubelet 为 pod 拉取镜像时使用。
[root@master1 ~]# kubectl create secret --help
Create a secret using specified subcommand.
Available Commands:
docker-registry 创建一个用于Docker注册表的秘密
generic 从本地文件、目录或文字值创建一个秘密
tls 创建一个TLS秘密
Usage:
kubectl create secret [flags] [options]
Use "kubectl --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
-n 转行符
注意: 特殊字符(例如 $
, \*
和 !
)需要转义。 如果您使用的密码具有特殊字符,则需要使用 \\
字符对其进行转义。 例如,如果您的实际密码是 S!B\*d$zDsb
,则应通过以下方式执行命令: kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=S\!B\\*d\$zDsb 您无需从文件中转义密码中的特殊字符( --from-file
)。
[root@master1 ~]# echo -n 'gsy' > /root/username.txt
[root@master1 ~]# echo -n 'gsy123' > /root/password.txt
[root@master1 ~]# kubectl create secret generic db-user-pass --from-file=/root/username.txt --from-file=/root/password.txt
secret/db-user-pass created
[root@master1 ~]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 10s
default-token-qm9rm kubernetes.io/service-account-token 3 17d
[root@master1 ~]# kubectl describe secret db-user-pass
Name: db-user-pass
Namespace: default
Labels:
Annotations:
Type: Opaque
Data
====
password.txt: 6 bytes
username.txt: 3 bytes
参数首先要进行base64编码
[root@master1 ~]# echo -n 'gsy' | base64
Z3N5
[root@master1 ~]# echo -n 'gsy123' | base64
Z3N5MTIz
[root@master1 ~]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: Z3N5
password: Z3N5MTIz
[root@master1 ~]# kubectl create -f secret.yaml
secret/mysecret created
[root@master1 ~]# kubectl get secret
NAME TYPE DATA AGE
db-user-pass Opaque 2 15m
default-token-qm9rm kubernetes.io/service-account-token 3 17d
mysecret Opaque 2 4s
[root@master1 ~]# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels:
Annotations:
Type: Opaque
Data
====
password: 6 bytes
username: 3 bytes
第一种,使用参数文件,使用secret中的变量导入到pod中
[root@master1 ~]# kubectl get secret mysecret -o yaml
apiVersion: v1
data:
password: Z3N5MTIz
username: Z3N5
kind: Secret
metadata:
creationTimestamp: 2020-05-17T07:02:12Z
name: mysecret
namespace: default
resourceVersion: "1022741"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: 55036ebf-980c-11ea-a668-000c29db840b
type: Opaque
注意:通过对内容进行序列化后,生成一个后缀作为 Secrets 的名称。这样可以确保每次修改内容时都会生成一个新的 Secret。
备注:解码方法
[root@master1 ~]# echo 'Z3N5' | base64 --decode
gsy[root@master1 ~]#
Secret 可以作为数据卷被挂载,
或作为环境变量 暴露出来以供 pod 中的容器使用。
它们也可以被系统的其他部分使用,而不直接暴露在 pod 内。 例如,它们可以保存凭据,系统的其他部分应该用它来代表您与外部系统进行交互。
key: username赋值给SECRET_USERNAME
key: password 赋值给SECRET_PASSWORD
gsy[root@master1 ~]# vim secret-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[root@master1 ~]# kubectl apply -f secret-env.yaml
pod/mypod created
[root@master1 ~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
dns-test 1/1 Running 0 4h16m
mypod 1/1 Running 0 9s
[root@master1 ~]# kubectl exec -it mypod bash
root@mypod:/# echo $SECRET_USERNAME
gsy
root@mypod:/# echo $SECRET_PASSWORD
gsy123
root@mypod:/# exit
exit
[root@master1 ~]# vim secret-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod-1
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo" #容器内挂载路径
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
[root@master1 ~]# kubectl create -f secret-volume.yaml
pod/mypod-1 created
[root@master1 ~]# kubectl exec -it mypod-1 bash
root@mypod-1:/# cd /etc/foo
root@mypod-1:/etc/foo# ls
password username
root@mypod-1:/etc/foo# cat password
gsy123root@mypod-1:/etc/foo# cat username
gsyroot@mypod-1:/etc/foo# ll
bash: ll: command not found
root@mypod-1:/etc/foo# ls -l
total 0
lrwxrwxrwx. 1 root root 15 May 17 07:24 password -> ..data/password
lrwxrwxrwx. 1 root root 15 May 17 07:24 username -> ..data/username
与secret类似,区别在于configmap保存的是不需要加密配置的信息
应用场景:应用配置
kubectl、编写yaml文件
变量参数形式
[root@master1 ~]# vim redis.txt
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
常见configmap资源
[root@master1 ~]# kubectl create configmap redis-config --from-file=redis.txt
configmap/redis-config created
查看资源
[root@master1 ~]# kubectl get configmap
NAME DATA AGE
redis-config 1 30s
查看描述信息
configmap可以简写成cm
[root@master1 ~]# kubectl describe configmap redis-config
Name: redis-config
Namespace: default
Labels:
Annotations:
Data
====
redis.txt:
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
Events:
configmap的这种方式是松耦合处理,这种处理方式可以减轻运维压力
简化分工
[root@master1 ~]# vim cm.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod-cm
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/redis.txt" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: redis-config
restartPolicy: Never
[root@master1 ~]# kubectl apply -f cm.yaml
pod/mypod-cm created
[root@master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
dns-test 1/1 Running 0 4h57m
mypod 1/1 Running 0 41m
mypod-1 1/1 Running 0 32m
mypod-cm 0/1 ContainerCreating 0 14s
查看验证结果
[root@master1 ~]# kubectl logs mypod-cm
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
[root@master1 ~]#
创建configmap资源
[root@master1 ~]# vim myconfig.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info
special.type: hello
[root@master1 ~]# kubectl create -f myconfig.yaml
configmap/myconfig created
[root@master1 ~]# kubectl get cm
NAME DATA AGE
myconfig 2 19s
redis-config 1 23m
创建测试pod,测试pod中输出configmap变量参数
[root@master1 ~]# vim ceshicmpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: ceshicmpod
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
env:
- name: LEVEL
valueFrom:
configMapKeyRef:
name: myconfig
key: special.level
- name: TYPE
valueFrom:
configMapKeyRef:
name: myconfig
key: special.type
restartPolicy: Never
[root@master1 ~]# kubectl apply -f ceshicmpod.yaml
pod/ceshicmpod created
查看变量输出结果
[root@master1 ~]# kubectl logs ceshicmpod
info hello