Kubernetes-Secret使用说明

Kubernetes提供Secret资源用于解决密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。

Secret类型

  • Opaque:base64编码格式的Secret,用来存储密码、密钥等;但数据也通过base64 –decode解码得到原始数据,所有加密性很弱。
  • kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
  • kubernetes.io/service-account-token: 用于被serviceaccount引用。serviceaccout创建时Kubernetes会默认创建对应的secret。Pod如果使用了serviceaccount,对应的secret会自动挂载到Pod目录/run/secrets/ kubernetes.io/serviceaccount中。

常用的应用主要使用Opaque类型的Secret,本次我们主要介绍该类型

Secret的创建方式

1. 通过yaml文件创建

[root@k8s-node1 dinghh]# cat passwd-secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: passwd-secret 
type: Opaque 
data: 
  username: dXNlcm5hbWUK
  password: cGFzc3dvcmQK

其中username和password是根据base64加密

[root@k8s-node1 dinghh]# echo username | base64
dXNlcm5hbWUK
[root@k8s-node1 dinghh]# echo password | base64
cGFzc3dvcmQK

创建secret

[root@k8s-node1 dinghh]# kubectl create -f passwd-secret.yaml 
secret/passwd-secret created

[root@k8s-node1 dinghh]# kubectl get secrets passwd-secret -oyaml
apiVersion: v1
data:
  password: cGFzc3dvcmQK
  username: dXNlcm5hbWUK
kind: Secret
metadata:
  creationTimestamp: "2019-07-02T06:20:40Z"
  name: passwd-secret
  namespace: default
  resourceVersion: "995896"
  selfLink: /api/v1/namespaces/default/secrets/passwd-secret
  uid: 83644454-9c91-11e9-ad16-fa163e17fab9
type: Opaque

可以看到通过describe secret是可以看到secret中的具体数据的,通过base64解码则可以看到原始数据

[root@k8s-node1 dinghh]# echo dXNlcm5hbWUK | base64 --decode
username
[root@k8s-node1 dinghh]# echo cGFzc3dvcmQK | base64 --decode
password

2. 通过kubectl指定配置文件等参数来创建

kubectl create secret generic

根据配置文件、目录或指定的literal-value创建secret。

secret可以保存为一个或多个key/value信息。

当基于配置文件创建secret时,key将默认为文件的基础名称,value默认为文件内容。如果基本名称的key无效,则可以指定另一个key。

当基于目录创建secret时,key还是文件的基础名称,目录中有效的key的每个文件都被打包到secret中,除了常规文件之外的任何目录条目都被忽略(例如subdirectories, symlinks, devices, pipes, etc)。

基于文件创建(更多创建方式参考:http://docs.kubernetes.org.cn/556.html

[root@k8s-node1 dinghh]# echo username > username 
[root@k8s-node1 dinghh]# echo password > password

[root@k8s-node1 dinghh]# kubectl create secret generic test-secret --from-file=./username --from-file=./password 
secret/test-secret created

[root@k8s-node1 dinghh]# kubectl get secrets test-secret -oyaml
apiVersion: v1
data:
  password: cGFzc3dvcmQK
  username: dXNlcm5hbWUK
kind: Secret
metadata:
  creationTimestamp: "2019-07-02T06:52:47Z"
  name: test-secret
  namespace: default
  resourceVersion: "1000413"
  selfLink: /api/v1/namespaces/default/secrets/test-secret
  uid: 00824b62-9c96-11e9-ad16-fa163e17fab9
type: Opaque

可以看到指定文件创建时会自动进行base64加密

Secret的使用

1. 在文件中使用

通过volumeMount方式将secret挂载到pod容器中

创建一个pod

[root@k8s-node1 dinghh]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    k8s-app: nginx
    version: master
  name: nginx
spec:
  containers:
  - image: nginx:master
    imagePullPolicy: IfNotPresent
    name: nginx
    ports:
    - containerPort: 80
      name: dashboard
      protocol: TCP
    resources: {}
    volumeMounts:
    - mountPath: /etc/secrets
      name: passwd-secret
      readOnly: true
  restartPolicy: Always
  volumes:
  - name: passwd-secret
    secret:
      defaultMode: 420
      secretName: passwd-secret

[root@k8s-node1 dinghh]# kubectl create -f nginx.yaml 
pod/nginx created

通过yaml可以看到通过volumeMounts方式将secret挂载到容器的/etc/secret目录

进入容器查看

[root@k8s-node1 dinghh]# kubectl create -f nginx.yaml 
pod/nginx created
[root@k8s-node1 dinghh]# kubectl exec -it nginx bash
[root@nginx /]# cd /etc/secrets/
[root@nginx secrets]# ll
total 0
lrwxrwxrwx 1 root root 15 Jul  2 15:00 password -> ..data/password
lrwxrwxrwx 1 root root 15 Jul  2 15:00 username -> ..data/username
[root@nginx secrets]# cat username 
username
[root@nginx secrets]# cat password 
password

可以看到将secret中的key作为文件名称写在指定目录下,并且文件中的内容是base64解密之后的

2. 在环境变量中使用

创建pod

[root@k8s-node1 dinghh]# cat nginx-env.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    k8s-app: nginx
    version: master
  name: nginx-env
spec:
  containers:
  - env:
    - name: USERNAME_ENV
      valueFrom:
        secretKeyRef:
          name: passwd-secret
          key: username
    - name: PASSWORD_ENV
      valueFrom:
        secretKeyRef:
          name: passwd-secret
          key: password
    image: 192.168.133.20:30050/kube-system/aistack-dashboard:master
    imagePullPolicy: IfNotPresent
    name: nginx
    ports:
    - containerPort: 80
      name: dashboard
      protocol: TCP
    resources: {}
  restartPolicy: Always

[root@k8s-node1 dinghh]# kubectl create -f nginx-env.yaml 
pod/nginx-env created

可以看到在该Pod中定义了两个环境变量分别引用passwd-secret中的对应的key

进入容器查看

[root@k8s-node1 dinghh]# kubectl exec -it nginx-env bash
[root@nginx-env /]# echo $USERNAME_ENV
username
[root@nginx-env /]# echo $PASSWORD_ENV
password

 

### 如何使用 Helm 安装 Kubernetes Dashboard Helm 是 Kubernetes 的包管理工具,用于简化应用程序的部署和管理过程[^2]。通过 Helm Chart 可以轻松安装和配置复杂的 Kubernetes 应用程序,例如 Kubernetes Dashboard。 以下是关于如何使用 Helm 安装 Kubernetes Dashboard 的详细说明: #### 添加 Helm Repository 首先需要确保 Helm 已经正确安装并初始化完成。如果尚未安装 Helm,请参考官方文档进行安装[^3]。接着可以添加 Kubernetes Dashboard 的官方 Helm 仓库: ```bash helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/ ``` #### 更新本地 Helm 缓存 为了获取最新的 Chart 版本信息,执行以下命令更新缓存: ```bash helm repo update ``` #### 部署 Kubernetes Dashboard 可以通过 `helm install` 命令来部署 Kubernetes Dashboard。下面是一个基本的例子: ```bash helm install my-release kubernetes-dashboard/kubernetes-dashboard --namespace kube-system ``` 其中 `-namespace kube-system` 表示将 Kubernetes Dashboard 部署到默认的 `kube-system` 名字空间下。可以根据实际需求更改名字空间或者自定义其他参数。 #### 访问 Kubernetes Dashboard 一旦成功安装了 Kubernetes Dashboard,可以通过创建服务账户和服务角色绑定的方式访问它。具体操作如下所示: 1. 创建 ServiceAccount 和 ClusterRoleBinding 文件 (dashboard-admin.yaml): ```yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kube-system ``` 2. 使用该文件应用权限设置: ```bash kubectl apply -f dashboard-admin.yaml ``` 3. 获取 Token 并登录至 Web UI: ```bash kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') ``` 最后,在浏览器中输入对应的 NodePort 或者 Ingress 地址即可打开 Kubernetes Dashboard 页面,并利用上述 token 登录验证身份。 --- ### 注意事项 - 如果集群启用了 RBAC,则必须先授予适当的角色权限给用户才能正常查看资源状态。 - 默认情况下可能不会暴露外部 IP 地址供远程连接;此时需考虑设置 LoadBalancer 类型的服务或者其他代理机制实现外网可及性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值