理论+实操:k8S配置参数管理——secret与configmap
文章目录一:secret概述1.1 创建secret的方法1.2 使用secret的方法二:创建Secret2.1 基于文件创建2.2 基于参数手动创建2.2.1 编辑yaml文件2.3 总结三:使用secret3.1 作为环境变量暴露出来3.2 以volume的形式挂载到pod的某个目录下四:configmap4.1 创建方式4.2 使用kubectl创建4.3 创建yaml文件4.4 使用变量
文章目录
secret 安全配置参数
configmap 配置文件参数
一:secret概述
加密数据并存放在etcd中,让pod的容器以挂载volume方式访问
应用场景:凭据,身份令牌
官方文档:https://kubernetes.io/docs/concepts/configuration/secret/
Secret
对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。 将这些信息放在 secret
中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活
Secret 是一种包含少量敏感信息例如密码、token 或 key 的对象。这样的信息可能会被放在 Pod spec 中或者镜像中;将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险。
1.1 创建secret的方法
用户可以创建 secret,同时系统也创建了一些 secret。
- 内置secret
Service Account 使用 API 凭证自动创建和附加 secret
Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改您的 pod 以使用此类型的 secret。这样可以安全地访问apiserver
- 创建您自己的sercet
使用 kubectl 创建 Secret
比如有些pod需要访问数据库,这些pod需要使用的用户名和密码可以放到本地宿主机的文件里
资源参数写入到etcd中
如果有多个pod资源,都可以与一个secret建立关系
1.2 使用secret的方法
要使用 secret,pod 需要引用 secret。
- Pod 可以用两种方式使用 secret:
作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里;
当 kubelet 为 pod 拉取镜像时使用。
二:创建Secret
2.1 基于文件创建
[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 <command> --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: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 6 bytes
username.txt: 3 bytes
2.2 基于参数手动创建
参数首先要进行base64编码
[root@master1 ~]# echo -n 'gsy' | base64
Z3N5
[root@master1 ~]# echo -n 'gsy123' | base64
Z3N5MTIz
2.2.1 编辑yaml文件
[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: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 6 bytes
username: 3 bytes
2.3 总结
第一种,使用参数文件,使用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
-
Secret 可以作为数据卷被挂载,
-
或作为环境变量 暴露出来以供 pod 中的容器使用。
它们也可以被系统的其他部分使用,而不直接暴露在 pod 内。 例如,它们可以保存凭据,系统的其他部分应该用它来代表您与外部系统进行交互。
3.1 作为环境变量暴露出来
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
- exec进入测试env
[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
3.2 以volume的形式挂载到pod的某个目录下
[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
四:configmap
与secret类似,区别在于configmap保存的是不需要加密配置的信息
应用场景:应用配置
4.1 创建方式
-
kubectl、编写yaml文件
-
变量参数形式
4.2 使用kubectl创建
[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: <none>
Annotations: <none>
Data
====
redis.txt:
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
Events: <none>
configmap的这种方式是松耦合处理,这种处理方式可以减轻运维压力
简化分工
4.3 创建yaml文件
[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 ~]#
4.4 使用变量参数形式
创建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
更多推荐
所有评论(0)