Konduktor simplifies Kubernetes secret management with a CLI that makes secrets easily accessible within your workloads.
Konduktor makes it easy to manage sensitive credentials like API keys, SSH keys, cloud credentials, and environment variables through a built-in secret management system. Secrets are stored as Kubernetes Secrets and are automatically injected into the workloads of the user who created them. Some secrets (kind=env) can be exposed inside the workload as environment variables, while others (kind=default) are mounted as files or directories.
To create a secret, use the konduktor secret create command shown below. If a Konduktor secret with the same name already exists under your ownership, the new data will be merged with the existing contents rather than replacing it. This allows a one to many relationship between Konduktor secret names and secrets data (basically key:value pairs). If you need to replace a Konduktor secret entirely, delete the existing Konduktor secret first, then create a new one. Different users in the same cluster can create secrets with the same name without conflict as each user’s secrets are functionally isolated.
konduktor secret create [FLAGS] <SECRET_NAME>
Where valid [FLAGS] include:
--kind=<KIND> # see below for supported secret types# mutually exclusive source flags:--from-file=<FILE_PATH>--from-directory=<DIRECTORY_PATH>--inline KEY=VALUE
You can choose from several secret kinds, depending on how you want the secret to be injected into your workload:
Use this kind to create general-purpose secrets that will be mounted directly into your pods as files or directories. Any of the three source flags are acceptable. Excluding the --kind flag will default to --kind=default.
They will be accessible within the workload at $KONDUKTOR_DEFAULT_SECRETS/<SECRET_NAME>/. Here is an example snippet of a workload yaml accessing the various default secrets:
name: test-default-secretsrun: | echo "Accessing file-based secret" ls "$KONDUKTOR_DEFAULT_SECRETS/my-default-file" cat "$KONDUKTOR_DEFAULT_SECRETS/my-default-file/secret-file.txt" # Note that directory name is preserved and whole directory (including subdirectories) is copied echo "Accessing directory-based secret" ls "$KONDUKTOR_DEFAULT_SECRETS/my-default-directory" ls "$KONDUKTOR_DEFAULT_SECRETS/my-default-directory/secrets/" cat "$KONDUKTOR_DEFAULT_SECRETS/my-default-directory/secrets/secret-file.txt" echo "Accessing inline secret" ls "$KONDUKTOR_DEFAULT_SECRETS/my-default-inline" cat "$KONDUKTOR_DEFAULT_SECRETS/my-default-inline/FOO"
Use this kind to store an SSH private key for accessing Git repositories via SSH. You must use --from-file. A user is limited to only one git-ssh secret.
This secret will be automatically mounted into workloads and configured via the environment variable GIT_SSH_COMMAND, allowing secure Git operations. Here is an example snippet of a workload yaml:
Use this kind to store environment variables directly. Environment secrets are automatically injected into job containers as environment variables. You must use --inline to define key-value pairs directly in the CLI.
On installations with dependency admission enabled, submission checks required
Secret and ConfigMap references before creating the workload. This covers Hub
JobSets and Jobs, native Dynamo serving graphs, and Deployments on existing
direct-cluster serving installations. The CLI, Python SDK, Hub serving requests,
and direct Kubernetes submissions receive the same check.A missing required Secret, ConfigMap, or explicitly referenced key rejects the
request. The error identifies the namespace, object name, and reference field
without showing values. Create or repair the dependency in the selected
namespace, then retry the same request. Rejected requests leave no workload
object behind. References marked optional: true may be absent.Checks cover volumes, projections, envFrom, and key references in containers
and init containers. ConfigMap file projections accept data and binaryData
keys; environment key references require data. Dynamo graph-level environment
references are checked where a component’s main container inherits them;
explicit component environment overrides take precedence.Keep using konduktor secret create and the existing automatic injection rules;
there is no separate task field listing required Secrets. Admission checks
rendered references, so it cannot infer credentials mentioned only inside a
shell script. Image pull credentials are excluded because public images may
remain pullable without them.If a dependency disappears after admission, dependency synchronization still
reports it while the job waits for dispatch. Cancellation and status updates
remain available.Operators enable this check after upgrading the Hub controller image. See the
rollout guide for activation and rollback.
To delete a secret, use the secret name. Users can only delete the secrets they created.
$ konduktor secret delete <SECRET_NAME>
There is a known issue where users who submit jobs from two different machines cannot manage/use the same set of secrets across workstations since ownership of the secret is determined currently by username + device MAC address. We are currently working to address this, but as a mitigation, users can recreate the same secrets on different workstations to get the same benefit.
Konduktor secrets are backed by Kubernetes secrets and as such have a size limit of 1MB. In practice, we recommend users only use secrets that are around 1K or less to prevent unexpected issues with secrets mounting
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Trainy Konduktor","colors":{"primary":"#F07900","light":"#F8A145","dark":"#D35100"},"logo":{"light":"https://mintcdn.com/trainy/l_Z-YzGUiwLATp8A/trainy.svg?fit=max\u0026auto=format\u0026n=l_Z-YzGUiwLATp8A\u0026q=85\u0026s=a69ed11bf7bc11900bbf4631c26f5b72","dark":"https://mintcdn.com/trainy/l_Z-YzGUiwLATp8A/trainy.svg?fit=max\u0026auto=format\u0026n=l_Z-YzGUiwLATp8A\u0026q=85\u0026s=a69ed11bf7bc11900bbf4631c26f5b72"},"favicon":"https://mintcdn.com/trainy/l_Z-YzGUiwLATp8A/trainy.svg?fit=max\u0026auto=format\u0026n=l_Z-YzGUiwLATp8A\u0026q=85\u0026s=a69ed11bf7bc11900bbf4631c26f5b72","navbar":{"links":[{"href":"mailto:support@trainy.ai","label":"Support"},{"href":"https://trainy.teleport.sh","label":"Konduktor Login","type":"button"}],"primary":{"type":"button","label":"Pluto","href":"https://pluto.trainy.ai"}},"footer":{"socials":{"github":"https://github.com/Trainy-ai","linkedin":"https://www.linkedin.com/company/trainy-ai"}},"banner":{"content":"🎓 Pluto PRO promo: academic users and early-stage startups can email \u003ca href='mailto:founders@trainy.ai'>founders@trainy.ai\u003c/a> for a PROMO code.","dismissible":true},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Community","icon":"discord","href":"https://discord.com/invite/HQUBJSVgAP"},{"anchor":"Blog","icon":"newspaper","href":"https://trainy.ai/blog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"trainy","hasAudioNarration":false,"actualSubdomain":"trainy","customDomains":["docs.trainy.ai"],"gitSource":{"type":"github","owner":"trainy-ai","repo":"konduktor","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae188e69b7d807c2d28ec7f","collectionId":"cf8cf953-69b5-4cd8-8395-d1eb9ebc7457","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae188e69b7d807c2d28ec7f"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6ae188e69b7d807c2d28ec7f","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Konduktor","count":68},{"language":"default","tag":"Pluto","count":56},{"language":"default","tag":"Core","count":24},{"language":"default","tag":"API Reference","count":22},{"language":"default","tag":"Examples","count":20},{"language":"default","tag":"Get Started","count":19},{"language":"default","tag":"Runs","count":19},{"language":"default","tag":"Example Task Yamls","count":13},{"language":"default","tag":"Visualizations","count":7},{"language":"default","tag":"Cloud Storage","count":5}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"secrets","slug":"/secrets","pageMetadata":{"title":"Managing Secrets","description":"Konduktor simplifies Kubernetes secret management with a CLI that makes secrets easily accessible within your workloads.","href":"/secrets"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Konduktor simplifies Kubernetes secret management with a CLI that makes secrets easily accessible within your workloads.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Konduktor makes it easy to manage sensitive credentials like API keys, SSH keys, cloud credentials, and environment variables through a built-in secret management system. Secrets are stored as Kubernetes Secrets and are `,_jsx(_components.strong,{children:`automatically injected into the workloads of the user who created them.`}),` Some secrets (kind=env) can be exposed inside the workload as environment variables, while others (kind=default) are mounted as files or directories.`]}),`\n`,_jsx(Heading,{level:`2`,id:`creating-secrets`,children:`Creating Secrets`}),`\n`,_jsxs(_components.p,{children:[`To create a secret, use the `,_jsx(_components.code,{children:`konduktor secret create`}),` command shown below. If a Konduktor secret with the same name already exists under your ownership, the new data will be merged with the existing contents rather than replacing it. This allows a one to many relationship between Konduktor secret names and secrets data (basically key:value pairs). If you need to replace a Konduktor secret entirely, delete the existing Konduktor secret first, then create a new one. Different users in the same cluster can create secrets with the same name without conflict as each user’s secrets are functionally isolated.`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`konduktor secret create [FLAGS] \u003cSECRET_NAME>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Where valid `,_jsx(_components.code,{children:`[FLAGS]`}),` include:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`7`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`--kind=\u003cKIND> # see below for supported secret types`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# mutually exclusive source flags:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`--from-file=\u003cFILE_PATH>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`--from-directory=\u003cDIRECTORY_PATH>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`--inline KEY=VALUE`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`You can choose from several secret kinds, depending on how you want the secret to be injected into your workload:`}),`\n`,_jsx(Heading,{level:`3`,id:`1-kind=default`,children:`1. kind=default`}),`\n`,_jsxs(_components.p,{children:[`Use this kind to create general-purpose secrets that will be mounted directly into your pods as files or directories. Any of the three source flags are acceptable. Excluding the `,_jsx(_components.code,{children:`--kind`}),` flag will default to `,_jsx(_components.code,{children:`--kind=default`}),`.`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ konduktor secret create --kind=default --from-file=./tests/secrets/secret-file.txt my-default-file`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ konduktor secret create --kind=default --from-directory=./tests/secrets my-default-directory`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ konduktor secret create --kind=default --inline FOO=bar my-default-inline`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`They will be accessible within the workload at `,_jsx(_components.code,{children:`$KONDUKTOR_DEFAULT_SECRETS/\u003cSECRET_NAME>/`}),`. Here is an example snippet of a workload yaml accessing the various default secrets:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`17`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`17`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`name: test-default-secrets`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`run: |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` echo \"Accessing file-based secret\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ls \"$KONDUKTOR_DEFAULT_SECRETS/my-default-file\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` cat \"$KONDUKTOR_DEFAULT_SECRETS/my-default-file/secret-file.txt\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` `})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` # Note that directory name is preserved and whole directory (including subdirectories) is copied`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` echo \"Accessing directory-based secret\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ls \"$KONDUKTOR_DEFAULT_SECRETS/my-default-directory\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ls \"$KONDUKTOR_DEFAULT_SECRETS/my-default-directory/secrets/\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` cat \"$KONDUKTOR_DEFAULT_SECRETS/my-default-directory/secrets/secret-file.txt\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` echo \"Accessing inline secret\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ls \"$KONDUKTOR_DEFAULT_SECRETS/my-default-inline\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` cat \"$KONDUKTOR_DEFAULT_SECRETS/my-default-inline/FOO\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`2-kind=git-ssh`,children:`2. kind=git-ssh`}),`\n`,_jsxs(_components.p,{children:[`Use this kind to store an SSH private key for accessing Git repositories via SSH. You must use `,_jsx(_components.code,{children:`--from-file`}),`. A user is limited to only one git-ssh secret.`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ konduktor secret create --kind=git-ssh --from-file=~/.ssh/id_rsa my-ssh-name`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`This secret will be automatically mounted into workloads and configured via the environment variable `,_jsx(_components.code,{children:`GIT_SSH_COMMAND`}),`, allowing secure Git operations. Here is an example snippet of a workload yaml:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`5`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`name: test-gitssh-secret`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`run: |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` git clone git@github.com:mygithubaccount/My-App.git`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`3-kind=env`,children:`3. kind=env`}),`\n`,_jsxs(_components.p,{children:[`Use this kind to store environment variables directly. Environment secrets are automatically injected into job containers as environment variables. You must use `,_jsx(_components.code,{children:`--inline`}),` to define key-value pairs directly in the CLI.`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ konduktor secret create --kind=env --inline FOO=bar my-env-name`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Here is an example snippet of a workload yaml utilizing the automatic env secret mounting:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`5`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`name: test-env-secret`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`run: |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` echo \"My FOO is $FOO\" # results in \"My FOO is bar\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`validation-when-submitting-a-job`,children:`Validation when submitting a job`}),`\n`,_jsx(_components.p,{children:`On installations with dependency admission enabled, submission checks required\nSecret and ConfigMap references before creating the workload. This covers Hub\nJobSets and Jobs, native Dynamo serving graphs, and Deployments on existing\ndirect-cluster serving installations. The CLI, Python SDK, Hub serving requests,\nand direct Kubernetes submissions receive the same check.`}),`\n`,_jsxs(_components.p,{children:[`A missing required Secret, ConfigMap, or explicitly referenced key rejects the\nrequest. The error identifies the namespace, object name, and reference field\nwithout showing values. Create or repair the dependency in the selected\nnamespace, then retry the same request. Rejected requests leave no workload\nobject behind. References marked `,_jsx(_components.code,{children:`optional: true`}),` may be absent.`]}),`\n`,_jsxs(_components.p,{children:[`Checks cover volumes, projections, `,_jsx(_components.code,{children:`envFrom`}),`, and key references in containers\nand init containers. ConfigMap file projections accept `,_jsx(_components.code,{children:`data`}),` and `,_jsx(_components.code,{children:`binaryData`}),`\nkeys; environment key references require `,_jsx(_components.code,{children:`data`}),`. Dynamo graph-level environment\nreferences are checked where a component’s `,_jsx(_components.code,{children:`main`}),` container inherits them;\nexplicit component environment overrides take precedence.`]}),`\n`,_jsxs(_components.p,{children:[`Keep using `,_jsx(_components.code,{children:`konduktor secret create`}),` and the existing automatic injection rules;\nthere is no separate task field listing required Secrets. Admission checks\nrendered references, so it cannot infer credentials mentioned only inside a\nshell script. Image pull credentials are excluded because public images may\nremain pullable without them.`]}),`\n`,_jsx(_components.p,{children:`If a dependency disappears after admission, dependency synchronization still\nreports it while the job waits for dispatch. Cancellation and status updates\nremain available.`}),`\n`,_jsxs(_components.p,{children:[`Operators enable this check after upgrading the Hub controller image. See the\n`,_jsx(_components.a,{href:`operations/workload-dependency-admission.md`,children:`rollout guide`}),` for activation and rollback.`]}),`\n`,_jsx(Heading,{level:`2`,id:`viewing-secrets`,children:`Viewing Secrets`}),`\n`,_jsx(_components.p,{children:`To view your own secrets:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ konduktor secret list`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`To view secrets of all users in the cluster:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ konduktor secret list --all-users`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ konduktor secret list -u`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`deleting-secrets`,children:`Deleting Secrets`}),`\n`,_jsx(_components.p,{children:`To delete a secret, use the secret name. Users can only delete the secrets they created.`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ konduktor secret delete \u003cSECRET_NAME>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`There is a known issue where users who submit jobs from two different machines cannot manage/use the same set of secrets across workstations since ownership of the secret is determined currently by username + device MAC address. We are currently working to address this, but as a mitigation, users can recreate the same secrets on different workstations to get the same benefit.`})}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Konduktor secrets are backed by Kubernetes secrets and as such have a size limit of 1MB. In practice, we recommend users only use secrets that are around 1K or less to prevent unexpected issues with secrets mounting`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Managing Secrets","description":"Konduktor simplifies Kubernetes secret management with a CLI that makes secrets easily accessible within your workloads.","href":"/secrets"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Creating Secrets","slug":"creating-secrets","depth":2,"children":[{"title":"1. kind=default","slug":"1-kind=default","depth":3,"children":[]},{"title":"2. kind=git-ssh","slug":"2-kind=git-ssh","depth":3,"children":[]},{"title":"3. kind=env","slug":"3-kind=env","depth":3,"children":[]}]},{"title":"Validation when submitting a job","slug":"validation-when-submitting-a-job","depth":2,"children":[]},{"title":"Viewing Secrets","slug":"viewing-secrets","depth":2,"children":[]},{"title":"Deleting Secrets","slug":"deleting-secrets","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"trainy","siteName":"Trainy Konduktor","title":"Managing Secrets - Trainy Konduktor","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-23T23:34:22.872Z","originalFileLocation":"secrets.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Konduktor simplifies Kubernetes secret management with a CLI that makes secrets easily accessible within your workloads.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Trainy Konduktor\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Managing Secrets - Trainy Konduktor\">\u003cmeta data-mint-head property=\"og:description\" content=\"Konduktor simplifies Kubernetes secret management with a CLI that makes secrets easily accessible within your workloads.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Trainy Konduktor\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.trainy.ai/secrets\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://trainy.mintlify.app/_mintlify/api/og/v2?division=Get+Started\u0026amp;title=Managing+Secrets\u0026amp;description=Konduktor+simplifies+Kubernetes+secret+management+with+a+CLI+that+makes+secrets+easily+accessible+within+your+workloads.\u0026amp;theme=3d9c285da33ee525cd476c3d\u0026amp;signature=1fca071e6e2988e15ca39eebeb2a88fa12b456736bcae4d38f576fa4012ecda2\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Managing Secrets - Trainy Konduktor\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Konduktor simplifies Kubernetes secret management with a CLI that makes secrets easily accessible within your workloads.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://trainy.mintlify.app/_mintlify/api/og/v2?division=Get+Started\u0026amp;title=Managing+Secrets\u0026amp;description=Konduktor+simplifies+Kubernetes+secret+management+with+a+CLI+that+makes+secrets+easily+accessible+within+your+workloads.\u0026amp;theme=3d9c285da33ee525cd476c3d\u0026amp;signature=1fca071e6e2988e15ca39eebeb2a88fa12b456736bcae4d38f576fa4012ecda2\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Trainy Konduktor\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#F07900\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.trainy.ai/secrets\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/secrets.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.trainy.ai/#organization\",\"name\":\"Trainy Konduktor\",\"url\":\"https://docs.trainy.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/trainy/l_Z-YzGUiwLATp8A/trainy.svg?fit=max\u0026auto=format\u0026n=l_Z-YzGUiwLATp8A\u0026q=85\u0026s=a69ed11bf7bc11900bbf4631c26f5b72\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.trainy.ai#website\",\"name\":\"Trainy Konduktor\",\"url\":\"https://docs.trainy.ai\",\"publisher\":{\"@id\":\"https://docs.trainy.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.trainy.ai/secrets#webpage\",\"url\":\"https://docs.trainy.ai/secrets\",\"name\":\"Managing Secrets\",\"description\":\"Konduktor simplifies Kubernetes secret management with a CLI that makes secrets easily accessible within your workloads.\",\"dateModified\":\"2026-10-23T23:34:22.872Z\",\"isPartOf\":{\"@id\":\"https://docs.trainy.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.trainy.ai/secrets#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.trainy.ai/secrets#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Get Started\",\"item\":\"https://docs.trainy.ai/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Managing Secrets\",\"item\":\"https://docs.trainy.ai/secrets\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.trainy.ai/secrets#article\",\"headline\":\"Managing Secrets\",\"name\":\"Managing Secrets\",\"description\":\"Konduktor simplifies Kubernetes secret management with a CLI that makes secrets easily accessible within your workloads.\",\"url\":\"https://docs.trainy.ai/secrets\",\"mainEntityOfPage\":{\"@id\":\"https://docs.trainy.ai/secrets#webpage\"},\"dateModified\":\"2026-10-23T23:34:22.872Z\",\"publisher\":{\"@id\":\"https://docs.trainy.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.trainy.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Trainy Konduktor\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Trainy Konduktor","nav":{"global":{"anchors":[{"anchor":"Community","icon":"discord","href":"https://discord.com/invite/HQUBJSVgAP"},{"anchor":"Blog","icon":"newspaper","href":"https://trainy.ai/blog"}]},"products":[{"product":"Konduktor","tabs":[{"tab":"Konduktor","groups":[{"group":"Get Started","pages":[{"title":"Overview","href":"/overview"},{"title":"Setup","href":"/setup"},{"title":"Quickstart","href":"/quickstart"},{"title":"Submit jobs through Trainy Hub","href":"/hub-quickstart"},{"title":"Common Commands","href":"/commands"},{"title":"File Sync on Launch","href":"/launch-file-sync"},{"title":"File Sync during Run","href":"/runtime-file-sync"},{"title":"Distributed Multi-Node Jobs","href":"/distributed-jobs"},{"title":"Many Parallel Jobs","href":"/many-jobs"},{"title":"Run Lifecycle","href":"/lifecycle"},{"title":"Get Started with Grafana","description":"Trainy: Konduktor users can connect their telemetry to Grafana, featuring pre-configured dashboards optimized to display the metrics, events, and logs most relevant to your workloads.","href":"/observability"},{"title":"Managing Secrets","href":"/secrets"},{"title":"Environment Variables","description":"Complete guide to all environment variables available in Konduktor containers and how to use them.","href":"/env-vars"},{"title":"Python API","href":"/python-api"},{"title":"Return values from jobs","href":"/return-values"},{"title":"Tailscale Interactive SSH (Experimental)","href":"/tailscale"},{"title":"Serving Deployments (Experimental)","href":"/deployments"}]},{"group":"CLI","pages":[{"title":"CLI Reference","href":"/cli-reference"}]},{"group":"User Guides","pages":[{"title":"Authentication","href":"/authentication"},{"group":"Minimal Cloud Permissions","pages":[{"title":"GCP - gs","href":"/minimal-cloud-permissions/GCP"},{"title":"AWS - s3","href":"/minimal-cloud-permissions/AWS"}]},{"group":"Troubleshooting","pages":[{"title":"Troubleshooting \u0026 FAQ GCP","href":"/troubleshooting/GCP"}]}]},{"group":"Cluster Operators","pages":[{"title":"Enroll a worker cluster","href":"/cluster-enrollment"},{"title":"Install Cluster Telemetry","href":"/cluster-telemetry"}]}]},{"tab":"Examples","pages":[{"title":"Examples","href":"/config-schema"}]}]},{"product":"Pluto","pages":[{"title":"Pluto","href":"/pluto/overview"}]}]},"basePath":"","title":"Managing Secrets - Trainy Konduktor","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["10e4515597"],"chunks":["BannerMarkdown-CX_qQQOL.js","dist-BTZUMDnx.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-xpJZXxdP.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js"]}