首页 > 系统相关 >linux系统kubernetes的资源对象secret

linux系统kubernetes的资源对象secret

时间:2024-03-20 17:58:57浏览次数:31  
标签:kubectl name kubernetes secret yaml Secret linux foo

资源对象-secret

Secret实现

作用:加密数据,存储在etcd中,让pod容器,以挂载Volume方式进行访问

场景

凭证,凭据
如:用户名,密码     
常见编码格式:
base64编码:echo -n "123" | base64    //以base64编码编译123

解释

secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。
 
用户可以创建自己的secret,系统也会有自己的secret。
Pod需要先引用才能使用某个secret

Pod使用secret方式:作为volume的一个域被一个或多个容器挂载

內建的Secrets

由ServiceAccount创建的API证书附加的秘钥k8s自动生成的用来访问apiserver的Secret,所有Pod会默认使用这个Secret与apiserver通信

创建自己的Secret

方式1:使用kubectl create secret命令
方式2:yaml文件创建Secret
方式3:kuboard创建

secret 使用

创建Secret

假如某个Pod要访问数据库,需要用户名密码,现在我们分别设置这个用户名和密码
Secret 对象要求这些数据必须是经过 Base64 转码的,以免出现明文密码显示的安全隐患。

创建一个secret.yaml文件,内容用base64编码:明文显示容易被别人发现,这里先转码。

echo -n 'admin' | base64
echo -n '0' | base64

创建一个secret.yaml文件,内容用base64编码

vim secret.yml

---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque  #模糊
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm

创建:

kubectl apply -f secret.yml 

解析Secret中内容,还是经过编码的—需要解码

查看secret详细信息
kubectl get secret mysecret -o yaml

apiVersion: v1
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: "2019-10-21T03:07:56Z"
  name: mysecret
  namespace: default
  resourceVersion: "162855"
  selfLink: /api/v1/namespaces/default/secrets/mysecret
  uid: 36bcd07d-92eb-4755-ac0a-a5843ed986dd
type: Opaque

手动base64解码方式:

echo 'MWYyZDFlMmU2N2Rm' | base64 --d

使用Secret

secret可以作为数据卷挂载或者作为环境变量暴露给Pod中的容器使用,也可以被系统中的其他资源使用。

一个Pod中引用Secret的列子:

创建一个Secret,多个Pod可以引用同一个Secret

修改Pod的定义,在spec.volumes[]加一个volume,给这个volume起个名字,spec.volumes[].secret.secretName记录的是要引用的Secret名字
vim pod_use_secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: testredis
    image: daocloud.io/library/redis
    volumeMounts:    #挂载一个卷
    - name: foo     #这个名字需要与定义的卷的名字一致
      mountPath: "/etc/foo"  #挂载到容器里哪个目录下,随便写
      readOnly: true
       
  volumes:     #数据卷的定义
  - name: foo   #卷的名字这个名字自定义
    secret:    #卷是直接使用的secret。
      secretName: mysecret   #调用刚才定义的secret
      
      
创建:
kubectl apply -f pod_use_secret.yaml       //创建pod

kubectl exec -it mypod /bin/bash           //进入目录,再映射目录下去看base64编码的文字
结果中看到,保存在Etcd里的用户名和密码信息,已经以文件的形式出现在了容器的Volume目录里。
而这个文件的名字,就是kubectl create secret指定的Key,或者说是Secret对象的data字段指定的Key。 
每一个被引用的Secret都要在spec.volumes中定义
如果Pod中的多个容器都要引用这个Secret那么每一个容器定义中都要指定自己的volumeMounts,但是Pod定义中声明一次spec.volumes就好了。 

映射secret key到指定的路径

可以控制secret key被映射到容器内的路径,利用spec.volumes[].secret.items来修改被映射的具体路径

vim pod_use_secret.yaml

---
apiVersion: v1
kind: Pod
metadata:
 name: mypod
spec:
 containers:
 - name: testredis
   image: daocloud.io/library/redis
   volumeMounts:
   - name: foo
     mountPath: "/etc/foo"
     readOnly: true
 volumes:
 - name: foo
   secret:
     secretName: mysecret
     items:   #定义一个items
      - key: username   #将那个key重新定义到那个目录下
        path: ls  #相对路径,相对于/etc/foo的路径,也就是/etc/foo/ls
       
2.创建
kubectl apply -f pod_use_secret.yaml 

3.从volume中读取secret的值
kubectl exec -it mypod /bin/bash     

username被映射到了文件/etc/foo/my-group/my-username而不是/etc/foo/username,而password没有被使用,这种方式每个key的调用需要单独用key像username一样调用

被挂载的secret内容自动更新

也就是如果修改一个Secret的内容,那么挂载了该Secret的容器中也将会取到更新后的值,但是这个时间间隔是由kubelet的同步时间决定的。

vim secret.yml

---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: cWlhbmZlbmcK   #修改为qianfeng的base64加密后的
  password: MWYyZDFlMmU2N2Rm
  
1.创建
kubectl apply -f secret.yml 

2.连接pod容器
kubectl exec -it mypod /bin/bash

root@mypod:/data# cd /etc/foo/my-group
root@mypod:/etc/foo/my-group# ls
my-username
root@mypod:/etc/foo/my-group# cat my-username 
qianfeng

以环境变量的形式使用Secret

kubectl delete -f pod_use_secret.yaml 

vim pod_use_secret.yaml

---
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: testredis
    image: daocloud.io/library/redis
    env:  #定义环境变量
     - name: SECRET_USERNAME   #创建新的环境变量名称
       valueFrom:
        secretKeyRef:     #调用的key是什么
         name: mysecret       #变量的值来自于mysecret
         key: username       #username里面的值

2.创建使用secret的pod容器
kubectl apply -f pod_use_secret.yaml 

3.连接
kubectl exec -it mypod /bin/bash 

加密流程

创建secret加密数据

编码数据的创建
vim secret.yaml

apiVersion:v1
kind: Secret
metadata:
  name:mysecret
type:Opaque
data:
  username: YWRtaW4=
  password: MWYyZDF1MmU2N2Rm
  
kubecrl create -f secret.yaml   //创建加密文件

kubectl get secret     //查看secret

挂载到pod容器

以变量形式挂载
vim secret-var.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

kubectl apply -f secret-var.yaml

kubectl exec -it mypod bash   //进入镜像
echo $SECRET_USERNAME     //查看用户名
echo $SECRET_PASSWORD     //查看密码
以Volume数据卷形式挂载
vim secret-vol.yaml

apiversion:v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"   #挂载目录
      readonly: true
   volumes:
   - name:foo
     secret:
       secretName: mysecret
       
kubectl apply -f secret-vol.yaml

kubectl exec -it mypod bash
cd /etc/foo
cat possword    //查看密码
cat username    //查看用户名

案例

1.创建数据库用户的密码secret

vim secret.yml 

apiVersion: v1
kind: Secret
metadata:
 name: mysql-secret
type: Opaque
data:
 password: UWlhbkZlbmdAMTIzIQ==
 
kubectl apply -f secret.yml

2.创建数据库并使用secret
vim mysql.yaml 

apiVersion: v1
kind: Pod
metadata:
 name: my-mysql
spec:
 containers:
 - name: mysql
   image: daocloud.io/library/mysql:5.7
   ports:
    - containerPort: 3306
   env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
       secretKeyRef:
        name: mysql-secret
        key: password

创建:
kubectl apply -f myslq.yaml

测试:
mysql -uroot -p'QianFeng@123!' -h 10.244.2.13 -P3306
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque    #模糊
data:
  password: MTIzNDU2
  database: d29yZHByZXNz
  db_user: eXVuamlzdWFu
  user_passwd: MTIzNDU2
---
apiVersion: v1
kind: Pod
metadata:
  name: database
  labels:
    name: database
spec:
  containers:
  - name: database
    image: 10.12.153.250:8888/library/mysql:5.7
    volumeMounts:    #挂载一个卷
    - name: foo     #这个名字需要与定义的卷的名字一致
      mountPath: "/etc/foo"  #挂载到容器里哪个目录下,随便写
      readOnly: true
    env:
      - name: MYSQL_ROOT_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
      - name: MYSQL_DATABASE
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: database
  volumes:     #数据卷的定义
  - name: foo   #卷的名字这个名字自定义
    secret:    #卷是直接使用的secret。
      secretName: mysecret   #调用刚才定义的secret
      items:
        - key: db_user
          path: mysql/username
  nodeSelector:
    kubernetes.io/hostname: kube-node1

标签:kubectl,name,kubernetes,secret,yaml,Secret,linux,foo
From: https://blog.csdn.net/qq_59207739/article/details/136884454

相关文章

  • linux系统kubernetes容器检查和恢复机制
    容器检查和恢复机制容器检查和恢复机制命令模式探针httpget方式探针POD的恢复策略容器检查和恢复机制在kubernetes中,可以为容器定义一个健康探针,kubelet就会根据这个Probe的返回值决定这个容器的状态,而不是直接以容器是否运行(来自Docker返回的信息)作为依据......
  • Linux进程控制
    1.进程创建fork函数#include<unistd.h>pid_tfork(void);返回值:自进程中返回0,父进程返回子进程id,出错返回-1进程调用fork,当控制转移到内核中的fork代码后,内核做:1.分配新的内存块和内核数据结构给子进程2.将父进程部分数据结构内容拷贝至子......
  • 1、戴尔R630本地服务器搭建Linux系统软件硬件环境配置
    目录1.1、服务器配置1.1.1、选择服务器配置方案1.1.2、服务器硬件配置1.1.3、服务器配置检测1.2、网络配置1.2.1、外网配置1.2.2、内网配置1.3、Linux系统Centos镜像下载......
  • linux 中shell脚本中遇到 Runtime error (func=(main), adr=22): Divide by zero
    在Linux中编写Shell脚本时,遇到“Runtimeerror(func=(main),adr=22):Dividebyzero”这样的错误通常是因为在脚本中进行了除以零的操作,类似于编程语言中的除零错误。要解决这个问题,您需要检查Shell脚本中涉及到除法运算的地方,确保分母不为零。下面是一个示例S......
  • linux下InetAddress.getLocalHost()很慢10s
    问题原因:执行InetAddress.getLocalHost()方法的时候,根据系统名称去hosts文件里找匹配的ip发现找不到合适的IP,一直处于等待状态。解决办法:1、查看本机系统名称 2、编辑hosts文件,在其后补充“cenos1”     参考链接:https://blog.csdn.net/lijun169/article/detail......
  • Linux安装字体库
    Linux安装字体下载需要安装的字体①在Windows/Fonts路径下找到需要的字体,上传到需要安装字体的linux服务器查看linux有什么字体命令:fc-list 安装字体库命令:yum-yinstallfontconfig这时在/usr/share/目录就可以看到fonts和fontconfig目录了,本来就有说明已经安......
  • Linux系统的目录及重要文件
    [root@test/]#tree-L1>/home/text1.txt├──bin->usr/bin#所有二进制命令所在的目录(用户)├──boot#内核及引导系统程序所在的目录├──dev#所有设备文件的目录(如磁盘、光驱)├──etc#二进制安......
  • linux通过docker部署sock5的代理
    参考链接:https://appscross.com/2023/06/quickly-install-and-deploy-socks5-service/昨日研究单位的内网机器,如果通过家里的服务器能够ssh访问内网的服务器。无疑查到ssh的软件功能强大,后无聊转到了如何自己在服务器开启socks5代理。 这里我使用的是网上查的使用docker容器......
  • Linux环境运行python项目提示No module named '_ssl'
    版本python3.11.4控制台错误提醒File"/usr/local/python3/lib/python3.11/ssl.py",line100,in<module> import_ssl#ifwecan'timportit,lettheerrorpropagate ^^^^^^^^^^^ModuleNotFoundError:Nomodulenamed'_ssl'错误原因:ce......
  • MySQL - 使用navicate连接虚拟机中linux的mysql
    1、首先在命令行中使用ifconfig命令查看虚拟机IP地址,这个地址是输入到navicat主机名中的。 2、查看window本地Telnet有没有选上;没有的话就勾选上。 3、虚拟机Linux防火墙设置 使用systemctlstopfirewalld命令关闭防火墙#检查Linux防火墙设置状态systemctlstat......