我有一个kubernetes yaml部署文件,它接受db用户名和密码作为参数,如下所示.
args:
- "-db_host=postgres"
- "-db_port=5432"
- "-db_username=postgres"
- "-db_password=postgres"
Run Code Online (Sandbox Code Playgroud)
为了隐藏db_username和db_password的值,我想到了使用kubernetes的秘密类型.但要实现这一点,我必须将db_username和db_password作为环境变量,以便我可以使用它,如下所示:
args:
- "-db_host=postgres"
- "-db_port=5432"
env:
- name: db_username
valueFrom:
secretKeyRef:
name: db-secret
key: db-user
- name: db_password
valueFrom:
secretKeyRef:
name: db-secret
key: db-pass
Run Code Online (Sandbox Code Playgroud)
我们有什么方法可以在args中使用秘密,这样我就不必采用第二种方法了.
我正在查看https://godoc.org/k8s.io/api/core/v1#Secret
type Secret struct {
metav1.TypeMeta `json:",inline"`
// Standard object's metadata.
// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
// +optional
metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
// Data contains the secret data. Each key must consist of alphanumeric
// characters, '-', '_' or '.'. The serialized form of the secret data is a
// base64 encoded string, representing the arbitrary (possibly non-string)
// data value here. Described in https://tools.ietf.org/html/rfc4648#section-4
// +optional
Data map[string][]byte `json:"data,omitempty" protobuf:"bytes,2,rep,name=data"`
// stringData allows specifying non-binary secret data in string form. …Run Code Online (Sandbox Code Playgroud) 现在,我使用静态文件部署我的应用程序 pod,其中之一是app-secrets.yaml部署应用程序的所有秘密
---
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
root: xxxxxx
user1: xxxxxx
user2: xxxxxx
Run Code Online (Sandbox Code Playgroud)
但这既不安全也不方便(如果我需要另一个应用程序实例,我必须使用人工生成的密码创建另一个文件)。
我希望在创建应用程序时生成随机密码,但我不知道是否可行。我已经看过主题秘密,特别是secretGenerator但这并不是我所理解的直接想要的,因为它不会创建随机字符串而是随机秘密名称,例如secret/app-secrets-ssdsdfmfh4k但我仍然必须提供密码。
我正在使用 kubernetes 进行 Web 应用程序部署。
containers:
- name: myapp
image: tomcat8-jre8:latest
imagePullPolicy: Always
env:
- name: DATABASE_HOST
valueFrom:
secretKeyRef:
name: my-secret
key: external.database.host
- name: DATABASE_USER
valueFrom:
secretKeyRef:
name: my-secret
key: external.database.user
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: external.database.password
Run Code Online (Sandbox Code Playgroud)
我还将 tomcat JNDI 与自定义 server.xml 和 catalina.properties 一起使用
<Resource factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
name="jdbc/mysource"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://******" # secret url
username="${database.user}"
password="${database.password}" />
Run Code Online (Sandbox Code Playgroud)
我尝试将新属性放入 catalina.properties
### catalina specific configuration
database.user = ${DATABASE_USER}
database.password = ${DATABASE_PASSWORD}
Run Code Online (Sandbox Code Playgroud)
server.xml 可以很好地读取属性,但无法解析环境变量 ${DATABASE_USER} 和 ${DATABASE_PASSWORD}
server.xml …
我有一个 JSON 格式的现有配置文件,如下所示
{
"maxThreadCount": 10,
"trackerConfigs": [{
"url": "https://example1.com/",
"username": "username",
"password": "password",
"defaultLimit": 1
},
{
"url": "https://example2.com/",
"username": "username",
"password": "password",
"defaultLimit": 1
}
],
"repoConfigs": [{
"url": "https://github.com/",
"username": "username",
"password": "password",
"type": "GITHUB"
}],
"streamConfigs": [{
"url": "https://example.com/master.json",
"type": "JSON"
}]
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用 --from-file 选项传递键/值对属性文件,用于配置映射和秘密创建。
但是 JSON 格式的文件呢?Kubernetes 是否也将 JSON 格式文件作为输入文件来创建 configmap 和 secret?
$ kubectl create configmap demo-configmap --from-file=example.json
Run Code Online (Sandbox Code Playgroud)
如果我运行此命令,它会显示已创建 configmap/demo-configmap。但是如何在其他 pod 中引用此 configmap 值?
替换如下 2 个命令来获取 Kubernetes 秘密令牌的一个线性命令是什么?示例用例将从 kubernetes-dashboard-admin 的密钥中获取令牌以登录和查看 kubernetes-dashboard。
命令示例:
$ kubectl describe serviceaccount default
Name: default
Namespace: default
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: default-token-zvxf4
Tokens: default-token-zvxf4
Events: <none>
$ kubectl describe secret default-token-zvxf4
Name: default-token-zvxf4
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: default
kubernetes.io/service-account.uid: 809835e7-2564-439f-82f3-14762688ca80
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 7 bytes
token: TOKENHERE
Run Code Online (Sandbox Code Playgroud) jsonpath kubernetes kubectl kubernetes-dashboard kubernetes-secrets
我有一个配置文件作为 kubernetes 中的秘密,我想将其安装到容器内的特定位置。问题在于,在容器内创建的卷是一个文件夹,而不是其中包含机密内容的文件。有办法解决吗?我的部署如下所示:
kind: Deployment
apiVersion: apps/v1
metadata:
name: jetty
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: jetty
template:
metadata:
labels:
app: jetty
spec:
containers:
- name: jetty
image: quay.io/user/jetty
ports:
- containerPort: 8080
volumeMounts:
- name: config-properties
mountPath: "/opt/jetty/config.properties"
subPath: config.properties
- name: secrets-properties
mountPath: "/opt/jetty/secrets.properties"
- name: doc-path
mountPath: /mnt/storage/
resources:
limits:
cpu: '1000m'
memory: '3000Mi'
requests:
cpu: '750m'
memory: '2500Mi'
volumes:
- name: config-properties
configMap:
name: jetty-config-properties
- name: secrets-properties
secret:
secretName: jetty-secrets
- name: doc-path …Run Code Online (Sandbox Code Playgroud) 在我的舵图中,我有一些需要输入凭据的文件例如
<Resource
name="jdbc/test"
auth="Container"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://{{ .Values.DB.host }}:{{ .Values.DB.port }};selectMethod=direct;DatabaseName={{ .Values.DB.name }};User={{ Values.DB.username }};Password={{ .Values.DB.password }}"
/>
Run Code Online (Sandbox Code Playgroud)
我创造了一个秘密
Name: databaseinfo
Data:
username
password
Run Code Online (Sandbox Code Playgroud)
然后,我创建环境变量以在部署.yaml 中检索这些机密:
env:
- name: DBPassword
valueFrom:
secretKeyRef:
key: password
name: databaseinfo
- name: DBUser
valueFrom:
secretKeyRef:
key: username
name: databaseinfo
Run Code Online (Sandbox Code Playgroud)
在我的values.yaml 或其他文件中,我需要能够引用这个秘密/环境变量。我尝试了以下方法,但它不起作用:values.yaml
DB:
username: $env.DBUser
password: $env.DBPassword
Run Code Online (Sandbox Code Playgroud) 我正在替换 Kubernetes 秘密,我想确保捕获集群中使用它的所有位置。
有没有一种方法可以在不阅读所有使用 K8s 或 helm 的部署 YAML 的情况下进行判断?
我们在同一个集群上部署了多个服务并共享秘密。有些使用 Helm,有些则不使用。
我有一个 k3s 集群,我的应用程序 Pod 正在运行。当我登录(使用命令)时,在所有 Pod 中kubectl exec <pod_name> -n <ns> -it /bin/bash都有kubernetes.io一个目录,其中包含任何人都可以获得的秘密令牌 cat token:
root@Ubuntu-VM: kubectl exec app-test-pod -n app-system -it /bin/bash
root@app-test-pod:/var/run/secrets/kubernetes.io/serviceaccount# ls -lhrt
total 0
lrwxrwxrwx 1 root root 12 Oct 11 12:07 token -> ..data/token
lrwxrwxrwx 1 root root 16 Oct 11 12:07 namespace -> ..data/namespace
lrwxrwxrwx 1 root root 13 Oct 11 12:07 ca.crt -> ..data/ca.crt
Run Code Online (Sandbox Code Playgroud)
这似乎是一个安全威胁(或漏洞)。有人可以让我知道是否有办法从 pod 中删除此依赖项,以便我可以限制用户(甚至是 root 用户)在登录 pod 时访问此机密?另外,如果这是可能的,那么 pod 将如何与 API 服务器通信?
kubernetes kubernetes-security kubernetes-pod kubernetes-secrets k3s