secret

Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。

创建secret
# 创建文件
echo -n 'admin' > username.txt
echo -n '123456' > password.txt
# 文件方式创建
[root@guanzc-130 secret]# kubectl create secret generic my-secret --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created
[root@guanzc-130 kubernetes]# kubectl get secret   #查看创建文件
NAME                  TYPE                                  DATA   AGE
db-user-pass          Opaque                                2      5h7m
default-token-m2gsx   kubernetes.io/service-account-token   3      6d21h

[root@guanzc-130 secret]# kubectl describe  secret/my-secret     #查看描述
Name:         db-user-pass
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
username.txt:  5 bytes
password.txt:  6 bytes

secret创建成功后,查看描述,不显示用户名和密码,key 是 文件名

  • 字符串方式创建

    kubectl create secret generic secret-volum --from-literal=username=admin --from-literal=password=123456 
    

    特殊字符无需提前定义

  • 文本方式创建

    # 用户名密码编码
    echo -n 'admin'|base64
    echo -n '123456'|base64
    
    #查看secret 创建配置
    kubectl get secret secret-volum  -o yaml
    
    #创建 secret-file.yaml 文件
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql-secret
      namespace: default
    data:
      password.txt: MTIzNDU2  #文件方式创建,key 是文件名
      username.txt: YWRtaW4=
    type: Opaque
    
    
    # 文本中以 k=v形式创建
    apiVersion: v1
    data:
      pwd: MTIzNDU2
      un: YWRtaW4=
    kind: Secret
    metadata:
      name: mysql-secret-02
      namespace: default
    type: Opaque
    

加密文件使用

作为环境变量使用 secret-env.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod-secret-1
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME  #用户名
        valueFrom:
          secretKeyRef:
            name: mysql-secret  # 从加密文件 mysql-secret中加载 key 为 username.txt 
            key: username.txt
      - name: SECRET_PASSWORD  #密码
        valueFrom:
          secretKeyRef:
            name: mysql-secret
            key: password.txt
            
  • 执行

    #生成pod
    kubectl apply -f secret-env.yaml
    #查看
    kubectl get pod 
    #查看环境变量,进入pod 执行查看
    kubectl exec -it mypod-secret-1 /bin/bash
    echo $SECRET_USERNAME
    echo $SECRET_PASSWORD
    
以容器形式挂载
  • 创建pod, secret-volum.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod-secret-2
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: foo # 卷名必须与容器外部卷名保持一致
      mountPath: "/etc/foo"	#容器内挂载路径
      readOnly: true
  volumes:  # 外部卷
  - name: foo  
    secret:
      secretName: mysecret
      

卷名称相同,名称为foo 的外部卷挂载到容器内部,容器内部地址:/etc/foo

  • 执行

    #进入pod 内部
    kubectl exec -it mypod-secret-2  bash
    root@mypod-secret-2:~# cd /etc/foo/
    root@mypod-secret-2:/etc/foo# ls
    password  username
    root@mypod-secret-2:/etc/foo# cat password  
    123456root@mypod-secret-2:/etc/foo# cat username 
    adminroot@mypod-secret-2:/etc/foo# 
    root@mypod-secret-2:/etc/foo# 
    
    

    在容器内部,自动解码为明文

    secret 认证配置

    secret 除了从配置文件中加载环境变量配置外,还可以用于镜像仓库认证

  • 从私有仓库拉取镜像
    secret-image.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: aliyun-app
  name: aliyun-app
spec:
  imagePullSecrets:
    name: private-image-secret  # 私有镜像加密配置,必须配置,否则创建失败
  containers:
  - image: registry.cn-zhangjiakou.aliyuncs.com/xxxxx/tomcat:8  #私有仓库镜像地址
    imagePullPolicy: Always
    name: aliyun-app
    ports:
    - containerPort: 8080
      name: http80
      protocol: TCP
  • 创建私有仓库密钥
kubectl create secret docker-registry private-image-secret --docker-server=registry.cn-zhangjiakou.aliyuncs.com --docker-username=私有仓库用户名  --docker-password=密码
  • 执行
kubectl apply -f secret-image.yaml
Logo

开源、云原生的融合云平台

更多推荐