mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			198 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
<!-- BEGIN MUNGE: UNVERSIONED_WARNING -->
 | 
						|
 | 
						|
<!-- BEGIN STRIP_FOR_RELEASE -->
 | 
						|
 | 
						|
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
						|
     width="25" height="25">
 | 
						|
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
						|
     width="25" height="25">
 | 
						|
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
						|
     width="25" height="25">
 | 
						|
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
						|
     width="25" height="25">
 | 
						|
<img src="http://kubernetes.io/img/warning.png" alt="WARNING"
 | 
						|
     width="25" height="25">
 | 
						|
 | 
						|
<h2>PLEASE NOTE: This document applies to the HEAD of the source tree</h2>
 | 
						|
 | 
						|
If you are using a released version of Kubernetes, you should
 | 
						|
refer to the docs that go with that version.
 | 
						|
 | 
						|
<strong>
 | 
						|
The latest 1.0.x release of this document can be found
 | 
						|
[here](http://releases.k8s.io/release-1.0/docs/user-guide/kubeconfig-file.md).
 | 
						|
 | 
						|
Documentation for other releases can be found at
 | 
						|
[releases.k8s.io](http://releases.k8s.io).
 | 
						|
</strong>
 | 
						|
--
 | 
						|
 | 
						|
<!-- END STRIP_FOR_RELEASE -->
 | 
						|
 | 
						|
<!-- END MUNGE: UNVERSIONED_WARNING -->
 | 
						|
 | 
						|
# kubeconfig files
 | 
						|
 | 
						|
In order to easily switch between multiple clusters, a kubeconfig file was defined.  This file contains a series of authentication mechanisms and cluster connection information associated with nicknames.  It also introduces the concept of a tuple of authentication information (user) and cluster connection information called a context that is also associated with a nickname.
 | 
						|
 | 
						|
Multiple kubeconfig files are allowed.  At runtime they are loaded and merged together along with override options specified from the command line (see rules below).
 | 
						|
 | 
						|
## Related discussion
 | 
						|
 | 
						|
https://github.com/GoogleCloudPlatform/kubernetes/issues/1755
 | 
						|
 | 
						|
## Example kubeconfig file
 | 
						|
 | 
						|
```yaml
 | 
						|
apiVersion: v1
 | 
						|
clusters:
 | 
						|
- cluster:
 | 
						|
    api-version: v1
 | 
						|
    server: http://cow.org:8080
 | 
						|
  name: cow-cluster
 | 
						|
- cluster:
 | 
						|
    certificate-authority: path/to/my/cafile
 | 
						|
    server: https://horse.org:4443
 | 
						|
  name: horse-cluster
 | 
						|
- cluster:
 | 
						|
    insecure-skip-tls-verify: true
 | 
						|
    server: https://pig.org:443
 | 
						|
  name: pig-cluster
 | 
						|
contexts:
 | 
						|
- context:
 | 
						|
    cluster: horse-cluster
 | 
						|
    namespace: chisel-ns
 | 
						|
    user: green-user
 | 
						|
  name: federal-context
 | 
						|
- context:
 | 
						|
    cluster: pig-cluster
 | 
						|
    namespace: saw-ns
 | 
						|
    user: black-user
 | 
						|
  name: queen-anne-context
 | 
						|
current-context: federal-context
 | 
						|
kind: Config
 | 
						|
preferences:
 | 
						|
  colors: true
 | 
						|
users:
 | 
						|
- name: blue-user
 | 
						|
  user:
 | 
						|
    token: blue-token
 | 
						|
- name: green-user
 | 
						|
  user:
 | 
						|
    client-certificate: path/to/my/client/cert
 | 
						|
    client-key: path/to/my/client/key
 | 
						|
```
 | 
						|
 | 
						|
## Loading and merging rules
 | 
						|
 | 
						|
The rules for loading and merging the kubeconfig files are straightforward, but there are a lot of them.  The final config is built in this order:
 | 
						|
  1.  Get the kubeconfig  from disk.  This is done with the following hierarchy and merge rules:
 | 
						|
 | 
						|
 | 
						|
      If the CommandLineLocation (the value of the `kubeconfig` command line option) is set, use this file only.  No merging.  Only one instance of this flag is allowed.
 | 
						|
 | 
						|
 | 
						|
      Else, if EnvVarLocation (the value of $KUBECONFIG) is available, use it as a list of files that should be merged.
 | 
						|
      Merge files together based on the following rules.
 | 
						|
      Empty filenames are ignored.  Files with non-deserializable content produced errors.
 | 
						|
      The first file to set a particular value or map key wins and the value or map key is never changed.
 | 
						|
      This means that the first file to set CurrentContext will have its context preserved.  It also means that if two files specify a "red-user", only values from the first file's red-user are used.  Even non-conflicting entries from the second file's "red-user" are discarded.
 | 
						|
 | 
						|
 | 
						|
      Otherwise, use HomeDirectoryLocation (~/.kube/config) with no merging.
 | 
						|
  1.  Determine the context to use based on the first hit in this chain
 | 
						|
      1.  command line argument - the value of the `context` command line option
 | 
						|
      1.  current-context from the merged kubeconfig file
 | 
						|
      1.  Empty is allowed at this stage
 | 
						|
  1.  Determine the cluster info and user to use.  At this point, we may or may not have a context.  They are built based on the first hit in this chain.  (run it twice, once for user, once for cluster)
 | 
						|
      1.  command line argument - `user` for user name and `cluster` for cluster name
 | 
						|
      1.  If context is present, then use the context's value
 | 
						|
      1.  Empty is allowed
 | 
						|
  1.  Determine the actual cluster info to use.  At this point, we may or may not have a cluster info.  Build each piece of the cluster info based on the chain (first hit wins):
 | 
						|
      1.  command line arguments - `server`, `api-version`, `certificate-authority`, and `insecure-skip-tls-verify`
 | 
						|
      1.  If cluster info is present and a value for the attribute is present, use it.
 | 
						|
      1.  If you don't have a server location, error.
 | 
						|
  1.  Determine the actual user info to use. User is built using the same rules as cluster info, EXCEPT that you can only have one authentication technique per user.
 | 
						|
      1. Load precedence is 1) command line flag, 2) user fields from kubeconfig
 | 
						|
      1. The command line flags are: `client-certificate`, `client-key`, `username`, `password`, and `token`.
 | 
						|
      1. If there are two conflicting techniques, fail.
 | 
						|
  1.  For any information still missing, use default values and potentially prompt for authentication information
 | 
						|
 | 
						|
## Manipulation of kubeconfig via `kubectl config <subcommand>`
 | 
						|
 | 
						|
In order to more easily manipulate kubeconfig files, there are a series of subcommands to `kubectl config` to help.
 | 
						|
See [kubectl/kubectl_config.md](kubectl/kubectl_config.md) for help.
 | 
						|
 | 
						|
### Example
 | 
						|
 | 
						|
```console
 | 
						|
$ kubectl config set-credentials myself --username=admin --password=secret
 | 
						|
$ kubectl config set-cluster local-server --server=http://localhost:8080
 | 
						|
$ kubectl config set-context default-context --cluster=local-server --user=myself
 | 
						|
$ kubectl config use-context default-context
 | 
						|
$ kubectl config set contexts.default-context.namespace the-right-prefix
 | 
						|
$ kubectl config view
 | 
						|
```
 | 
						|
 | 
						|
produces this output
 | 
						|
 | 
						|
```yaml
 | 
						|
clusters:
 | 
						|
  local-server:
 | 
						|
    server: http://localhost:8080
 | 
						|
contexts:
 | 
						|
  default-context:
 | 
						|
    cluster: local-server
 | 
						|
    namespace: the-right-prefix
 | 
						|
    user: myself
 | 
						|
current-context: default-context
 | 
						|
preferences: {}
 | 
						|
users:
 | 
						|
  myself:
 | 
						|
    username: admin
 | 
						|
    password: secret
 | 
						|
```
 | 
						|
 | 
						|
and a kubeconfig file that looks like this
 | 
						|
 | 
						|
```yaml
 | 
						|
apiVersion: v1
 | 
						|
clusters:
 | 
						|
- cluster:
 | 
						|
    server: http://localhost:8080
 | 
						|
  name: local-server
 | 
						|
contexts:
 | 
						|
- context:
 | 
						|
    cluster: local-server
 | 
						|
    namespace: the-right-prefix
 | 
						|
    user: myself
 | 
						|
  name: default-context
 | 
						|
current-context: default-context
 | 
						|
kind: Config
 | 
						|
preferences: {}
 | 
						|
users:
 | 
						|
- name: myself
 | 
						|
  user:
 | 
						|
    username: admin
 | 
						|
    password: secret
 | 
						|
```
 | 
						|
 | 
						|
#### Commands for the example file
 | 
						|
 | 
						|
```console
 | 
						|
$ kubectl config set preferences.colors true
 | 
						|
$ kubectl config set-cluster cow-cluster --server=http://cow.org:8080 --api-version=v1
 | 
						|
$ kubectl config set-cluster horse-cluster --server=https://horse.org:4443 --certificate-authority=path/to/my/cafile
 | 
						|
$ kubectl config set-cluster pig-cluster --server=https://pig.org:443 --insecure-skip-tls-verify=true
 | 
						|
$ kubectl config set-credentials blue-user --token=blue-token
 | 
						|
$ kubectl config set-credentials green-user --client-certificate=path/to/my/client/cert --client-key=path/to/my/client/key
 | 
						|
$ kubectl config set-context queen-anne-context --cluster=pig-cluster --user=black-user --namespace=saw-ns
 | 
						|
$ kubectl config set-context federal-context --cluster=horse-cluster --user=green-user --namespace=chisel-ns
 | 
						|
$ kubectl config use-context federal-context
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
<!-- BEGIN MUNGE: GENERATED_ANALYTICS -->
 | 
						|
[]()
 | 
						|
<!-- END MUNGE: GENERATED_ANALYTICS -->
 |