Kubernetes进阶实战读书笔记:配置容器应用(secret)

一、secret概述

 1、注意事项

secret资源的功能类似于、但它专用于存放敏感数据、例如密码、数字证书、私钥、令牌和SSH key等

需要注意的是、在master节点上、secret对象以非加密的格式存储于etcd中,因此管理员必须加以精心管控以确保敏感数据的机密性、必须确保etcd集群节点间以及API server的安全通信、etcd服务的访问授权、还包括用户访问API server时的授权、因为拥有创建pod资源的用户都可以使用secret资源并能通过pod中的容器访问其数据

2、两种用途

一是作为存储卷注入到pod上由容器应用程序所使用
二是用于kubelet为POD里的容器拉取镜像时向私有仓库提供认证信息
不过后面使用ServiceAccount资源自建的secret对象是一种更安全性的方式

二、创建secret资源(命令式创建)

1、generic标识符创建的secret对象为Opaque类型

1、创建

[root@master chapter8]# kubectl create secret generic mysal-auth --from-literal=username=root --from-literal=password=ikubernetes
secret/mysal-auth created

2、验证

查看新建的资源属性信息、由下面的命令及输出结果可以看出、以generic标识符创建的secret对象为Opaque类型、其键值数据会以base64的编码格式进行保存和打印

[root@master chapter8]# kubectl get secrets mysal-auth -o yaml
apiVersion: v1
data:
  password: aWt1YmVybmV0ZXM=
  username: cm9vdA==
kind: Secret
metadata:
  creationTimestamp: "2020-09-01T07:22:58Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:password: {}
        f:username: {}
      f:type: {}
    manager: kubectl
    operation: Update
    time: "2020-09-01T07:22:58Z"
  name: mysal-auth
  namespace: default
  resourceVersion: "6309979"
  selfLink: /api/v1/namespaces/default/secrets/mysal-auth
  uid: 43573f71-255d-4dc7-acd8-e3e5a42d55ee
type: Opaque

不过kubernetes系统的secrets对象的base64编码的数据并非加密格式、许多相关的工具程序均可轻松完成解码、如下面所示的base64命令

[root@master chapter8]# echo aWt1YmVybmV0ZXM= | base64 -d
ikubernetes[root@master chapter8]# 

2、创建用于ssh认证的secrets对象 

对于本身以存储与文件中的数据、也可以在创建generic格式secrets的对象时使用"--from-file"、选项从文件中直接进行加载、例如创建用于ssh认证的secrets对象时、如果尚且没有认证信息你文件、则需要首先使用命令生成一堆认证文件 

[root@master chapter8]# ssh-keygen -t rsa -P '' -f ${HOME}/.ssh/id_rsa
Generating public/private rsa key pair.
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? Y
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:4TyF9Zx0hBkWcvICRm4OrWPz3Na1YNcSNfa3eCARWPc root@master
The key's randomart image is:
+---[RSA 2048]----+
|       .+ *+BBoo.|
|       + = X=oo.o|
|      . * o.=..Eo|
|       B o .. ooo|
|      = S   o.+o.|
|     . = o o +.o |
|        o o . .  |
|         .       |
|                 |
+----[SHA256]-----+

加载文件内容生成secrets对象

[root@master chapter8]# kubectl create secret generic ssh-key-secret --from-file=ssh-privatekey=${HOME}/.ssh/id_rsa --from-file=ssh-publickey=${home}/.ssh/id_rsa.pub
Error from server (AlreadyExists): secrets "ssh-key-secret" already exists

3、生成基于私钥和数字证书文件创建用于SSL/TLS通信的secrets对象 

生成私钥和自签证书

[root@master chapter8]# umask 077;openssl genrsa -out nginx.key 2048
Generating RSA private key, 2048 bit long modulus
.......................+++
...+++
e is 65537 (0x10001)
[root@master chapter8]# ll nginx.*
-rw------- 1 root root 1679 Sep  1 15:36 nginx.key

生成secrets对象

[root@master chapter8]# openssl req -new -x509 -key nginx.key -out nginx.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=www.iliunx.io
[root@master chapter8]# ll nginx.*
-rw------- 1 root root 1285 Sep  1 15:38 nginx.crt
-rw------- 1 root root 1679 Sep  1 15:36 nginx.key

注意其类型应该为“kubernetes.io/tls” 例如细面命令结果中显示

[root@master chapter8]# kubectl create secret tls nginx-ssl --key=./nginx.key --cert=./nginx.crt 
secret/nginx-ssl created
[root@master chapter8]# kubectl get secrets nginx-ssl 
NAME        TYPE                DATA   AGE
nginx-ssl   kubernetes.io/tls   2      13s

三、创建secret资源(清单式创建)

1、字段详解

[root@master chapter8]# kubectl explain secret
KIND:     Secret
VERSION:  v1

DESCRIPTION:
     Secret holds secret data of a certain type. The total bytes of the values
     in the Data field must be less than MaxSecretSize bytes.

FIELDS:
   apiVersion	<string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

   data	<map[string]string>
   #"key:value" 格式的数据、通产格式敏感信息、数据格式需要是以Base64格式编码的字符串、因此需要用户实现完成编码
     Data contains the secret data. Each key must consist of alphanumeric
     characters, '-', '_' or '.'. The serialized form of the secret data is a
     base64 encoded string, representing the arbitrary (possibly non-string)
     data value here. Described in https://tools.ietf.org/html/rfc4648#section-4

   immutable	<boolean>
     Immutable, if set to true, ensures that data stored in the Secret cannot be
     updated (only object metadata can be modified). If not set to true, the
     field can be modified at any time. Defaulted to nil. This is an alpha field
     enabled by ImmutableEphemeralVolumes feature gate.

   kind	<string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

   metadata	<Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

   stringData	<map[string]string>
   #以明文格式(非Base64编码)定义的"key:value" 数据;无须用户实现对数据进行Base64编码,而是在创建为Secret对象时自动进行编码并保存于data字段中stringData字段中的明文不会被API Servers输出,不过若是使用"kubectl apply" 命令进行的创建、那么注解信息中还是可能会直接输出这些信息的
     stringData allows specifying non-binary secret data in string form. It is
     provided as a write-only convenience method. All keys and values are merged
     into the data field on write, overwriting any existing values. It is never
     output when reading from the API.

   type	<string>
   #为了便于配置文件中的资源定义示例、其使用stringData提供了明文格式的键值数据、从而免去了事先进行手动编码的麻烦
     Used to facilitate programmatic handling of secret data.

2、secret-demo.yaml 定义示例

其使用stringData提供了明文格式的键值数据、从而免去了事先进行手动编码的麻烦

[root@master chapter8]# cat secret-demo.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: secret-demo
stringData:
  username: redis
  password: redispass
type: Opaque

secret对象也是kubernetes系统的"一等公民"、因此使用标准资源创建命令即可完成其创建、相比较来说、基于清单文件将保存于文件中的敏感信息创建secret对象时,用户首先需要将敏感信息独处、转为编码Base64编码格式而后再将其创建为清单文件,过程繁琐、反而不如命令式创建来的便捷、不过、如果存在多次创建或重构之需,那么将其保存为配置清单也是形式所需

四、secret存储卷

1、资源清单

[root@master chapter8]# cat secret-demo.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: secret-demo
stringData:
  username: redis
  password: redispass
type: Opaque
[root@master chapter8]# cat secret-volume-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-demo
  namespace: default
spec:
  containers:
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: nginxcert
      mountPath: /etc/nginx/ssl/
      readOnly: true
  volumes:
  - name: nginxcert
    secret:
      secretName: nginx-ssl

2、创建验证

[root@master chapter8]# kubectl apply -f secret-volume-pod.yaml 
pod/secret-volume-demo created
[root@master chapter8]# kubectl exec secret-volume-demo ls /etc/nginx/ssl
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
tls.crt
tls.key

五、imagePullSecret资源对象

1、创建docker-registry类型的对象

[root@master chapter8]# kubectl create secret docker-registry local-registry --docker-username=Ops --docker-password=Opspasil=ops@ilinux.io

2、打印类型信息

[root@master chapter8]# kubectl get secrets local-registry 
NAME             TYPE                             DATA   AGE
local-registry   kubernetes.io/dockerconfigjson   1      13s

3、通过字段使用此secrets 对象  

资源清单

[root@master chapter8]# cat secret-imagepull-pod.yaml.0
apiVersion: v1
kind: Pod
metadata:
  name: secret-imagepull-demo
  namespace: default
spec:
  imagePullSecrets:
  - name: local-registry
  containers:
  - image: registry.ikubernetes.io/dev/myimage
    name: myapp

验证

[root@master chapter8]# kubectl get pods|grep secret-imagepull-demo
secret-imagepull-demo     0/1     ImagePullBackOff   0          23h

[root@master chapter8]# kubectl describe pod secret-imagepull-demo
Name:         secret-imagepull-demo
Namespace:    default
Priority:     0
Node:         node1/192.168.118.19
Start Time:   Tue, 01 Sep 2020 15:47:16 +0800
Labels:       <none>
Annotations:  Status:  Pending
IP:           10.244.1.57
IPs:
  IP:  10.244.1.57
Containers:
  myapp:
    Container ID:   
    Image:          registry.ikubernetes.io/dev/myimage
    Image ID:       
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       ErrImagePull
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-pwl2t (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  default-token-pwl2t:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-pwl2t
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason   Age                     From            Message
  ----     ------   ----                    ----            -------
  Warning  Failed   8m59s (x6246 over 23h)  kubelet, node1  Error: ImagePullBackOff
  Normal   BackOff  4m6s (x6268 over 23h)   kubelet, node1  Back-off pulling image "registry.ikubernetes.io/dev/myimage"
原文地址:https://www.cnblogs.com/luoahong/p/13601343.html