侧边栏壁纸
  • 累计撰写 45 篇文章
  • 累计创建 15 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

【kubernetes】加密数据管理Secret

Administrator
2024-12-02 / 0 评论 / 0 点赞 / 44 阅读 / 5523 字 / 正在检测是否收录...

Secret用来保存敏感信息,例如密码、令牌和SSH Key,将这些信息放在Secret中比较安全和灵活。

1. 创建Secret

1. 使用kubectl命令行创建

# echo -n "admim" > ./username.txt
# echo -n "123456" > ./password.txt

# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret/db-user-pass created

# kubectl get secret db-user-pass
NAME           TYPE     DATA   AGE
db-user-pass   Opaque   2      32s

# kubectl get secret db-user-pass -oyaml
apiVersion: v1
data:
  password.txt: MTIzNDU2
  username.txt: YWRtaW0=
kind: Secret
metadata:
  name: db-user-pass
type: Opaque

# kubectl describe secret db-user-pass
Name:         db-user-pass
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

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

默认情况下,get和describe命令都不会显示文件内容,这是为了防止Secret中的内容被意外暴露。

2. 通过yaml文件创建

手动创建Secret时,每一项内容必须是base64编码的。

# echo -n "admin" | base64
YWRtaW4=
# echo -n "123456" | base64
MTIzNDU2

# cat db-user-pass-sceret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: MTIzNDU2

# kubectl create -f db-user-pass-sceret.yaml
secret/mysecret created

# kubectl get secret mysecret -oyaml
apiVersion: v1
data:
  password: MTIzNDU2
  username: YWRtaW4=
kind: Secret
metadata:
  name: mysecret
  namespace: default
type: Opaque

# kubectl describe secret mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

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

对于base64的解码,可以使用如下命令:

# echo "YWRtaW4=" | base64 --decode
admin

2. Secret实践

Secret与ConfigMap使用方法类似,区别就是将ConfigMap换成Secret。

  containers:
  - volumeMounts:
	- name: secret
	  mountPath: /etc/secret/mysecret   # 这里是挂载文件路径,可以重命名文件
	  subPath: mysecret
  volumes:
  - name: secret
	secret:
	  secretName: mysecret  # secret名称
	  defaultMode: 420  # 设置权限
- env:
  envFrom:   # 注意envFrom的位置
  - secretRef:
      name: mysecret   # Secret名称
- env:
  - name: SPECIAL_LEVEL_KEY    # 环境变量的名称
    valueFrom:     # 注意valueFrom的位置
      secretKeyRef:
        key: special.how # 需要引入的key
        name: special-configmap  # Secret名称

secret一般保存密钥等,key-value的形式,采用envFrom的形式较多。

3. 常用的Secret类型

通过命令行kubectl create secret generic创建的类型为Opaque。另外常见的类型有镜像仓库Secret和HTTPS证书的Secret。

1. Docker镜像仓库Secret

当部署应用所需镜像为私有仓库镜像时,需要认证后才能拉取,此时可以使用imagePullSecret字段包含Docker镜像注册密码的Secret,才可以拉取镜像。

kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

docker-registry:指定Secret的类型。

myregistrykey:Secret的名称。

docker-server:镜像仓库地址.

docker-username:镜像仓库用户名,需要有拉取镜像的权限。

docker-password:镜像仓库密码。

docker-email:邮箱信息,可以为空。

示例:

kubectl create secret docker-registry myregistrykey --docker-server=registry.cn-beijing.aliyuncs.com --docker-username=jiangStudy --docker-password=xxc113206
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-docker # Deployment的名称;
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
   matchLabels:
     app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.cn-beijing.aliyuncs.com/jiangxiaonan/nginx:1.22.1
        imagePullPolicy: Always  # 已经仓库设为私有,这里设置为Always
        ports:
        - containerPort: 80
      imagePullSecrets:   # 如果有多个,就写多行 -name
      - name: myregistrykey

2. HTTPS证书类型的Secret

传统架构中,域名证书一般在集群的代理服务器上进行管理,比如nginx,在kubernetes中,一般服务都是通过Ingress发布,此时可以将域名证书保存在TLS类型的Secret上,之后Ingress即可绑定该证书。

一般证书会生成 .key 和 .crt 的文件,我们根据生成的 .key 和 .crt 文件创建Secret。

kubectl create secret tls nginx-test-tls --key=tls.key --cert=tls.crt

最后创建一个ingress将证书绑定到指定的域名上。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-https-test
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: https-test.com
    http:
      paths:
      - backend:
        serviceName: nginx-svc
        servicePort: 80
  tls:
  - secretName: nginx-test-tls

一个ingress可以绑定多个TLS类型的Secret,同一个Secret也可以被多个ingress绑定。

0
博主关闭了所有页面的评论