Kubernetes资源对象之Secret

2017-02-02 阅读: Kubernetes

Kubernetes中的Secret资源可以用来存储密码、Token、秘钥等敏感数据。 将这些敏感信息保存在Secret中,相对于暴露到Pod、镜像中更加的安全和灵活。

1.Kubernetes Secret的类型

Kubernetes内置了三种类型的Secret:

1.1 Service Account Secret

为了能从Pod内部访问Kubernetes API,Kubernetes提供了Service Account资源。 Service Account会自动创建和挂载访问Kubernetes API的Secret,会挂载到Pod的 /var/run/secrets/kubernetes.io/serviceaccount目录中。 关于这种类型的Secret我们这里先不展开。

1.2 Opaque Secret

Opaue类型的Secret是一个map结构(key-value),其中vlaue要求以base64格式编码。

我们可以使用yaml文件手动创建Opaue Secret:

echo -n "admin" | base64
YWRtaW4=
echo -n "1f2d1e2e67df" | base64
MWYyZDFlMmU2N2Rm

secret.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
kubectl create -f ./secret.yaml
secret "mysecret" created

也可以从文件创建Secret,将文件内容保存到Secret中,这种情况多用于秘钥证书和配置文件:

kubectl create secret generic etcd-tls-secret  \
  --from-file=/etc/etcd/ssl/etcd.pem \
  --from-file=/etc/etcd/ssl/etcd-key.pem  \
  --from-file=/etc/etcd/ssl/ca.pem \
  -n kube-system


kubectl describe secret etcd-tls-secret -n kube-system
Name:           etcd-tls-secret
Namespace:      kube-system
Labels:         <none>
Annotations:    <none>

Type:   Opaque

Data
====
etcd-key.pem:   1675 bytes
etcd.pem:       1489 bytes
ca.pem:         1330 bytes

1.3 kubernetes.io/dockercfg Secret

kubernetes.io/dockercfg类型的Secret用于存放私有Docker Registry的认证信息。 当Kubernetes在创建Pod并且需要从私有Docker Registry pull镜像时,需要使用认证信息,就会用到kubernetes.io/dockercfg类型的Secret。

kubectl create secret docker-registry regsecret \
--docker-server=harbor.frognew.com \
--docker-username=the-user \
--docker-password=the-password \
--docker-email=the-email \
--namespace=the-namspace 

在创建Pod时需要在Pod的spec中按如下形式使用:

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
    - name: private-reg-container
      image: <your-private-image>
  imagePullSecrets:
    - name: regsecret

2.使用Secret

在创建Opaque Secret完之后,我们有两种使用方式:

2.1 将Secret挂载为Volume

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: myns
spec: 
  containers:
    - name: mypod
      image: reids
      valueMounts:
        - name: foo
          mountPath: /etc/foo
          readOnly: treu
  volumes:
    - name: foo
      secret:
        secretName: mysecret

2.2 将Secret导出为环境变量

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
    - name: mycontainer
      image: redis
      env:
        - name: SECRET_USERNAME
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: username
        - name: SECRET_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: password
  restartPolicy: Never

参考

标题:Kubernetes资源对象之Secret
本文链接:https://blog.frognew.com/2017/02/kubernetes-secret.html
转载请注明出处。

目录