我正在使用一个kubernetes ConfigMap,其中包含一个应用程序的数据库配置,并且有一个包含数据库密码的秘密。我需要在ConfigMap中使用此密钥,因此当我尝试在ConfigMap中添加环境变量并从密钥中指定pod部署中的值时,由于ConfigMap中的值占用了密码,因此我无法使用密码连接到mysql变量的确切字符串。
apiVersion: v1
kind: ConfigMap
metadata:
name: config
data:
APP_CONFIG: |
port: 8080
databases:
default:
connector: mysql
host: "mysql"
port: "3306"
user: "root"
password: "$DB_PASSWORD"
Run Code Online (Sandbox Code Playgroud)
和deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: app
labels:
app: backend
spec:
replicas: 1
template:
metadata:
labels:
app: backend
spec:
containers:
- name: app
image: simple-app-image
ports:
- name: "8080"
containerPort: 8080
env:
- name: APP_CONFIG
valueFrom:
configMapKeyRef:
name: config
key: APP_CONFIG
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: "mysql-secret"
key: "mysql-root-password"
Run Code Online (Sandbox Code Playgroud)
注意:秘密存在,我能够获取“ mysql-root-password”值并用于登录数据库
我正在尝试在我的 kubernetes 部署 yaml 文件中传递 livenessProbe 以执行我的应用程序的运行状况。所以,我用令牌值创建了一个秘密,并按如下方式传递
livenessProbe:
httpGet:
path: test/actuator/health
port: 9001
httpHeaders:
- name: Authorization
valueFrom:
secretKeyRef:
name: actuator-token
value: token
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误
error: error validating "deployment.yaml": error validating data: [ValidationError(Deployment.spec.template.spec.containers[0].livenessProbe.httpGet.httpHeaders[0]): unknown field "valueFrom" in io.k8s.api.core.v1.HTTPHeader, ValidationError(Deployment.spec.template.spec.containers[0].livenessProbe.httpGet.httpHeaders[0]): missing required field "value" in io.k8s.api.core.v1.HTTPHeader, ValidationError(Deployment.spec.template.spec.containers[0].readinessProbe.httpGet.httpHeaders): invalid type for io.k8s.api.core.v1.HTTPGetAction.httpHeaders: got "map", expected "array"]; if you choose to ignore these errors, turn validation off with --validate=false
请建议并感谢您的帮助。
另外让我们知道他们有什么更好的处理令牌的方法,因为我不想直接在我的部署 yaml 文件上提供令牌值。
假设我有一个带有 configMap(或秘密)卷的 pod。ConfigMap(或秘密)对象在 Pod 创建期间存在,但我在 Pod 运行时删除了主服务器上的 configMap(或秘密)对象。预期的行为是什么?它在任何地方都有记录吗?
正在运行的 Pod 是否已终止?configMap(或秘密)文件是否被删除并且 pod 继续运行?
这是我能找到的有关更新的文档,没有提及任何有关删除的内容。
当更新已在卷中使用的 ConfigMap 时,投影键最终也会更新。Kubelet 在每次定期同步时都会检查已安装的 ConfigMap 是否是最新的。但是,它使用本地基于 ttl 的缓存来获取 ConfigMap 的当前值。因此,从 ConfigMap 更新到新 key 投射到 pod 的总延迟可以长达 kubelet 同步周期 + kubelet 中 ConfigMap 缓存的 ttl。
我想学习如何在不终止和重新创建部署的情况下更新工作 Pod 中的机密。
目前 pod 将秘密作为 env vars 提取:
env:
- name: SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
key: secret_access_key
name: secrets
Run Code Online (Sandbox Code Playgroud)
但这只发生在他们启动时。
因此,如果需要更改秘密,我必须:
secrets.yamlkubectl apply -f secrets.yamlkubectl delete -f worker-deployment.yamlkubectl apply -f worker-deployment.yaml我真的不喜欢第 3 步和第 4 步,因为它们会终止正在进行的工作。
更新 env var 机密的更好的工作流程是什么?
我使用一个秘密来存储多个数据项,如下所示:
apiVersion: v1
kind: Secret
metadata:
name: my-certs
namespace: my-namespace
data:
keystore.p12: LMNOPQRSTUV
truststore.p12: ABCDEFGHIJK
Run Code Online (Sandbox Code Playgroud)
在我的Deployment我将它们安装到这样的文件中:
volumeMounts:
- mountPath: /app/truststore.p12
name: truststore-secret
subPath: truststore.p12
- mountPath: /app/keystore.p12
name: keystore-secret
subPath: keystore.p12
volumes:
- name: truststore-secret
secret:
items:
- key: truststore.p12
path: truststore.p12
secretName: my-certs
- name: keystore-secret
secret:
items:
- key: keystore.p12
path: keystore.p12
secretName: my-certs
Run Code Online (Sandbox Code Playgroud)
这按预期工作,但我想知道是否可以实现将这两个秘密安装为具有较少 Yaml 的文件的相同结果?例如volumes使用,items但我不知道如何使用一个卷和多个卷items并安装它们。
我可以轻松获取存储在Kubernetes.
$ kubectl get secret my-app-secrets -o yaml
Run Code Online (Sandbox Code Playgroud)
从我要解码的输出中选择秘密值。
例子 ZXhwb3NlZC1wYXNzd29yZAo=
$ echo ZXhwb3NlZC1wYXNzd29yZAo= | base64 --decode
> exposed-password
Run Code Online (Sandbox Code Playgroud)
我不确定我是否了解Kubernetes生态系统中的秘密资源的有效性,因为它很容易获得。
我正在挂载一个 k8s 机密作为卷挂载,并且 pod 中的文件具有错误的权限。
在我Deployment的volumes数组中有这个条目:
- name: ssh-host-keys
secret:
secretName: ftp-ssh-host-keys
defaultMode: 0600
Run Code Online (Sandbox Code Playgroud)
然后像这样安装:
- mountPath: /etc/ssh/ssh_host_rsa_key
name: ssh-host-keys
subPath: ssh_host_rsa_key
readOnly: true
Run Code Online (Sandbox Code Playgroud)
但是,当我查看Pod文件权限中的文件时:
rw-r--r-- 1 root root 553122 Aug 21 2018 moduli
-rw-r--r-- 1 root root 1723 Aug 21 2018 ssh_config
-rw-r----- 1 root 1337 410 May 11 10:33 ssh_host_ed25519_key
-rw-r----- 1 root 1337 3242 May 11 10:33 ssh_host_rsa_key
-rw-r--r-- 1 root 1337 465 May 11 10:33 sshd_config
Run Code Online (Sandbox Code Playgroud)
即密钥具有权限 0644 而不是 0600。 …
我目前有一个用于 Asp.Net Core 的 docker-compose 设置。但是,在 Kubernetes 中测试集群时,我遇到了 Kestral 的 SSL 问题。最初使用 Docker/Docker-compose 你可以设置本地 SSL
dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\<app_name>.pfx -p <password>
Run Code Online (Sandbox Code Playgroud)
然后
dotnet dev-certs https --trust
Run Code Online (Sandbox Code Playgroud)
最后
dotnet user-secrets set "Kestrel:Certificates:Development:Password" "<password>"
Run Code Online (Sandbox Code Playgroud)
在 Docker-compose 中,我将卷设置为指向此证书
volumes:
- ${APPDATA}\microsoft\UserSecrets\:/root/.microsoft/usersecrets
- ${USERPROFILE}\.aspnet\https:/root/.aspnet/https/
Run Code Online (Sandbox Code Playgroud)
我很好奇如何使用 kubernetes 在本地测试 https。我看到了一个 git repo https://github.com/Lybecker/k8s-friendly-aspnetcore,但是我不知道如何将 .pfx 文件从我的本地计算机获取到秘密中,我认为复制和粘贴不是要走的路。
我在http 和 https 上查看了这个 SO post Access .NET Core app on Kubernetes on Kubernetes
但是看起来他们正在使用使用 .key 和 .crt 的 .Net 5。我在使用 .pfx 文件的 .Net 3.1 上。
I\xe2\x80\x99m 打包一个 Python 应用程序以在 Kubernetes 集群中使用。在代码库中存在此方法:
\n def get_pymongo_client(self):\n username = test;\n password = \'test\';\n url = \xe2\x80\x98test\n conn_str = "mongodb+srv://" + username + ":" + password + \xe2\x80\x9c/\xe2\x80\x9d+ url\n\n return pymongo.MongoClient(conn_str)\nRun Code Online (Sandbox Code Playgroud)\nI\xe2\x80\x99m 尝试保护用户名、密码和 URL 字段,以便它们在 src 代码中不可见。为此,我打算使用秘密。
\nURL https://kubernetes.io/docs/tasks/configmap-secret/managing-secret-using-kubectl/详细介绍了如何创建密钥。但我\xe2\x80\x99m 不知道如何从Python 应用程序读取秘密。
\n我的应用程序的 .Dockerfile:
\n#https://docs.docker.com/language/python/build-images/\n\nFROM python:3.8-slim-buster\n\nWORKDIR /app\n\nCOPY requirements.txt requirements.txt\n\nRUN pip3 install -r requirements.txt\n\nCOPY . .\n\nCMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]\nRun Code Online (Sandbox Code Playgroud)\n阅读Python Flask application access to docker Secrets in a swarm详细介绍了 …
几个月前我们创建了一个控制器,它使用 kubebuilder 运行得很好。
\n几周前,我们将 \xe2\x80\x9clistener\xe2\x80\x9d 添加到秘密中,当秘密更改时(秘密属性)\n应该调用协调,问题是它有时有效,有时无效, (您更改秘密应用它并且协调不会发生\xe2\x80\x99t),我们正在为完全相同的秘密文件执行此操作。
\n我们尝试了几天来找到根本原因,但没有成功,(我们将k8s.io/client-go v0.23.4和 更改为v0.22.3,现在 v0.22.1这才起作用。\n知道问题可能是什么吗?任何提示都会有帮助。或者我们有任何其他方法可以做到这一点可以尝试一下。
func (r *vtsReconciler) SetupWithManager(mgr ctrl.Manager) error {\n manager := ctrl.NewControllerManagedBy(mgr).\n For(&vts.str).\n WithEventFilter(predicate.Or(predicate.AnnotationChangedPredicate{}))\n manager = manager.Watches(&source.Kind{Type: &v1.Secret{}}, handler.EnqueueRequestsFromMapFunc(func(a client.Object) []reconcile.Request {\n return r.SecretRequests.SecretFinder(a.GetName())\n }))\n return manager.Complete(r)\n}\n\n\n\nfunc (secm *SecretMapper) SecretFinder(name string) []reconcile.Request {\n v := cli.ObjectKey{Name: name}\n return secm.SecMap[v.String()]\n}\nRun Code Online (Sandbox Code Playgroud)\n kubernetes ×10
amazon-eks ×1
asp.net-core ×1
configmap ×1
docker ×1
go ×1
kubebuilder ×1
kubectl ×1
kubelet ×1
python ×1
spring-boot ×1
ssl ×1