如何在Kubernetes中通过环境变量访问TLS Secret?
问题描述
我有一个TLS Secret,定义如下:
apiVersion: v1 kind: Secret metadata: name: tls-ingress-secret namespace: ingress-namespace type: kubernetes.io/tls data: tls.key: | -----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCtwUrZ6zS+GdAw ldIUxIXpnajvAZun1mf8DD0nWJRBonzbBIZhLyHqQyPvz4B+ZfZ/ql/vucpLEPnq V3HqJraydt7kw/MBCS6a8GRObFx/faIWolbF5FjVgJexAxydeE35A7+hJUdElA7e jOVPzafz53oJvyCdtdRTVwbH6EA+aJGZ0eTmzRobLVdqmqCejN4soDeRZQcMXYrG uW+rTy3dyRCbMGV33GzYYJk2qBNFz+DqZbp1TyFcOQKBgQDW3IvXES4hfgtmj8NK 0BKdX7gUyANdZooJ1tXoMjVmcFbdvoUprED3hpiI1WTYiZ3dqKD7QrHGsBW/yHZB UfFFxSj+vKotgxBhe06o2SDkXCnWfuQSJDZEgL/TuI9Qb/w1QeDxTZG4KCPiBrPD MiXRtvV7qdyWoPjUolWfWyef4K5NVo34TF4DHseY1QMoI8dTmB0nnZiDfZA6B+t0 jgrnP8RpqaAOH8UjRwC+QMCfuq0SejUWocSobc/7K+7HJlMRwi6FuPXb7omyut+5 34pCkfAj8Lwtleweh/PbSDnX9g== -----END PRIVATE KEY----- tls.crt: | -----BEGIN CERTIFICATE----- MIIEDDCCAvSgAwIBAgIUDr8pM7eB+UPyMD0sY0yR5XmWrVQwDQYJKoZIhvcNAQEL BQAwgY8xCzAJBgNVBAYTAlJVMQ8wDQYDVQQIDAZSdXNzaWExDzANBgNVBAcMBk1v c2NvdzEmMCQGA1UECgwdS2lyaWxsIEtsaW11c2hpbnMgQ29ycG9yYXRpb24xHDAa BgNVBAsME09yZ2FuaXphdGlvbmFsIFVuaXQxGDAWBgNVBAMMD3d3dy5zdG9yZXJ1 LmNvbTAeFw0yMjA3MjgxMTAyMThaFw0yMzA1MjQxMTAyMThaMIGPMQswCQYDVQQG PkBW2sS7dMxNLLeHyZ3st1SJfmWZhya1LsPvo1ilU3+d8rD5JjlC/cQ7EAF9DDXR i3/9zNzx3R6MMgNqkzQ89dDjHH+FZ2R0VkBKp35MYVg= -----END CERTIFICATE-----
请问是否可以将该Secret中的tls.crt和tls.key以环境变量形式获取,以便我能在应用中通过如下Go代码访问对应内容:
SSlCertFile := os.Getenv("tls.cert") // cert file with payload. SslCertKey := os.Getenv("tls.key") // cert file key.
解决方案
完全可以通过环境变量的方式将Secret中的内容注入到Pod中,具体实现步骤如下:
1. 在Deployment/StatefulSet中配置环境变量
在Pod的容器定义里,通过env字段引用Secret中的数据项,Kubernetes会自动将Secret中base64编码的内容解码为明文,注入到容器的环境变量中。示例配置如下:
apiVersion: apps/v1 kind: Deployment metadata: name: your-app-deployment namespace: ingress-namespace # 和Secret同命名空间 spec: replicas: 1 selector: matchLabels: app: your-app template: metadata: labels: app: your-app spec: containers: - name: your-app-container image: your-app-image:tag env: # 将Secret中的tls.crt映射为环境变量tls.cert - name: tls.cert valueFrom: secretKeyRef: name: tls-ingress-secret key: tls.crt # 将Secret中的tls.key映射为环境变量tls.key - name: tls.key valueFrom: secretKeyRef: name: tls-ingress-secret key: tls.key
2. 代码适配说明
你的代码中环境变量名是tls.cert,而Secret中的数据项是tls.crt,上面的Deployment配置已经做了映射,所以代码可以直接使用。如果不想做映射,也可以把代码中的环境变量名改成tls.crt,对应修改Deployment中的name字段即可。
注意事项
- Secret和Pod必须处于同一个命名空间,否则无法引用。
- 环境变量中存储的是证书/密钥的明文内容,不是文件路径,所以Go代码可以直接使用
os.Getenv获取完整的证书字符串,无需额外读取文件。 - 若Secret内容更新,Pod不会自动刷新环境变量,需要重启Pod才能获取新内容。
内容的提问来源于stack exchange,提问作者CraZyCoDer
相关产品推荐
相关产品推荐

