From 0e9777934f819d84ed9cfbb23ef6dafc715aa027 Mon Sep 17 00:00:00 2001 From: Kynan Rilee Date: Fri, 24 Nov 2017 23:26:10 -0800 Subject: [PATCH] more documentation review --- README.md | 115 +++++++++++++++++------ docs/index.md | 10 +- docs/resources/deployment.md | 32 +++---- docs/resources/index.md | 1 - docs/resources/pod.md | 34 ++++--- docs/resources/replica-set.md | 34 +++---- docs/resources/replication-controller.md | 32 +++---- docs/resources/service.md | 22 ++--- docs/resources/volume.md | 5 - docs/user-guide/getting-help.md | 12 --- docs/user-guide/man_command.png | Bin 59229 -> 0 bytes mkdocs.yml | 1 - 12 files changed, 165 insertions(+), 133 deletions(-) delete mode 100644 docs/resources/volume.md delete mode 100644 docs/user-guide/man_command.png diff --git a/README.md b/README.md index a2e99a83..55c46544 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,103 @@ # Koki Short -API friendly Kubernetes resources to user-friendly syntax + +Manageable Kubernetes manifests through composable, reusable syntax ## Motivation -The description format for Kubernetes manifests, as it stands today, is verbose and unintuitive. It has anecdotally been - - Time consuming to use it to create Kubernetes resources - - Error prone to get it right the first time - - Requires constant referral to documentation - - Difficult to maintain, read or reuse. +The description format for Kubernetes manifests, as it stands today, is verbose and unintuitive. Anecdotally, it has been: + + - Time consuming to write + - Error-prone, hard to get right without referring to documentation + - Difficult to maintain, read, and reuse -For eg. denoting that a pod runs on host with label `k8s.io/failure-domain=us-east-1`, here is the current syntax: +e.g. In order to create a simple nginx pod that runs on any host in region `us-east1` or `us-east2`, here is the Kubernetes native syntax: ```yaml -affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - matchExpressions: - - key: k8s.io/failure-domain - operator: In - value: us-east1 +apiVersion: v1 +kind: Pod +metadata: + name: nginx + labels: + app: nginx +spec: + containers: + - name: nginx_container + image: nginx:latest + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: k8s.io/failure-domain + operator: In + values: + - us-east1 + - matchExpressions: + - key: k8s.io/failure-domain + operator: In + value: + - us-east2 ``` -The Short format is designed to be user friendly, intuitive, reusable and maintainable. The same affinity syntax in Short looks like + +The Short format is designed to be user friendly, intuitive, reusable, and maintainable. The same pod in Short syntax looks like ```yaml -affinity: - - node: k8s.io/failure-domain=us-east1 +pod: + name: nginx + labels: + app: nginx + containers: + - name: nginx + image: nginx:latest + affinity: + - node: k8s.io/failure-domain=us-east1,us-east2 ``` -The approach we have followed behind this opinionated syntax is to reframe the Kubernetes syntax to one that is operator friendly without losing any information. -Since we do not throw away any information during the transformations, users can freely round trip back and forth between Short syntax and Kubernetes syntax. +Our approach is to reframe Kubernetes manifests in an operator-friendly syntax without sacrificing expressiveness. + +Koki Short can transform Kubernetes syntax into Short and Short syntax back into Kubernetes. No information is lost in either direction. -For more information on Koki Short transformations, please refer to [docs](http://docs.koki.io/short) +For more information on Koki Short transformations, please refer to [Resources.](https://docs.koki.io/short/resources) ## Modular and Reusable -Koki Short introduces the concept of modules, which are reusable collections of Short resources. Any resource can be reused multiple times in other resources and linked resources can be managed as one unit on the Koki platform. +Koki Short introduces the concept of modules, which are reusable collections of Short resources. Any resource can be reused multiple times in other resources and linked resources can be managed as a single unit on the Koki platform. + +Any valid koki resource object can be reused. This includes subtypes of top-level resource types. For example, here's module called `pod-affinity-us-east-1.yaml`: + +```yaml +exports: +- default: node affinity for us-east-1 + value: + - node: k8s.io/failure-domain=us-east-1 +``` + +This affinity value can be reused in any pod spec: -More on this will be available as soon as it is implemented. This is in the roadmap right now. +```yaml +imports: +- affinity: pod-affinity-us-east-1.yaml +exports: +- default: an nginx pod + value: + pod: + name: nginx + labels: + app: nginx + containers: + - name: nginx + image: nginx-latest + affinity: ${affinity} # re-use the affinity resource here +``` + +For more information on Koki Modules, please refer to [Modules.](https://docs.koki.io/modules) ## Getting started -In order to start using Short, simply download the binary from the [releases page](https://github.com/koki/short/releases), and then you can start using it. +In order to start using Short, simply download the binary from the [releases page](https://github.com/koki/short/releases). ```sh -#start with an existing Kubernetes manifest file +#start with any existing Kubernetes manifest file $$ cat kube_manifest.yaml apiVersion: v1 kind: Pod @@ -80,7 +134,7 @@ spec: memory: 512m -#convert an existing Kubernetes manifest into a Short syntax representation, just run +#convert Kubernetes manifest into a Short syntax representation $$ short -f kube_manifest.yaml pod: name: podName @@ -102,7 +156,7 @@ pod: name: service -#specify json input, or multi document yaml +#input can be json or yaml $$ short -f kube_manifest.json -f kube_manifest2.yaml -f kube_multi_manifest.yaml #stream input @@ -113,11 +167,10 @@ $$ short -k -f koki_spec.yaml #-k flag denotes that it should output Kubernetes manifest -#find out how koki transforms a particular resource type -short man v1/pod - ``` +For more information, refer to our [getting started guide.](https://docs.koki.io/user-guide#getting-started) + ## Contribute Koki is completely open source community driven, including the roadmaps, planning, and implementation. We encourage everyone to help us make Kubernetes manifests more manageable. We welcome Issues, Pull Requests and participation in our [weekly meetings](). @@ -126,9 +179,9 @@ If you'd like to get started with contributing to Koki Short, read our [Roadmap] ## Important Links - [Releases](https://github.com/koki/short/releases) -- [Docs]() +- [Docs](https://docs.koki.io/short) - [Roadmap](https://github.com/koki/short/projects) - [Issues](https://github.com/koki/short/issues) ## LICENSE -[Apache v2.0](LICENSE) +[Apache v2.0](https://github.com/koki/short/blob/master/LICENSE) diff --git a/docs/index.md b/docs/index.md index 3a8565d6..a2fd7f67 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,7 +3,7 @@ Manageable Kubernetes manifests through composable, reusable syntax ## Motivation -The description format for Kubernetes manifests, as it stands today, is verbose and unintuitive. Anecdotally, it has been +The description format for Kubernetes manifests, as it stands today, is verbose and unintuitive. Anecdotally, it has been: - Time consuming to write - Error-prone, hard to get right without referring to documentation @@ -38,7 +38,7 @@ spec: - us-east2 ``` -The Short format is designed to be user friendly, intuitive, reusable, and maintainable. The same pod denoted in Short syntax looks like +The Short format is designed to be user friendly, intuitive, reusable, and maintainable. The same pod in Short syntax looks like ```yaml pod: @@ -56,7 +56,7 @@ Our approach is to reframe Kubernetes manifests in an operator-friendly syntax w Koki Short can transform Kubernetes syntax into Short and Short syntax back into Kubernetes. No information is lost in either direction. -For more information on Koki Short transformations, please refer to [Resources.](resources) +For more information on Koki Short transformations, please refer to [Resources.](https://docs.koki.io/short/resources) ## Modular and Reusable @@ -89,7 +89,7 @@ exports: affinity: ${affinity} # re-use the affinity resource here ``` -For more information on Koki Modules, please refer to [Modules.](modules) +For more information on Koki Modules, please refer to [Modules.](https://docs.koki.io/modules) ## Getting started @@ -172,7 +172,7 @@ short man pod ``` -For more information, refer to our [getting started guide.](getting-started) +For more information, refer to our [getting started guide.](https://docs.koki.io/user-guide#getting-started) ## Contribute Koki is completely open source community driven, including the roadmaps, planning, and implementation. We encourage everyone to help us make Kubernetes manifests more manageable. We welcome Issues, Pull Requests and participation in our [weekly meetings](). diff --git a/docs/resources/deployment.md b/docs/resources/deployment.md index adb40321..38ff0f9e 100644 --- a/docs/resources/deployment.md +++ b/docs/resources/deployment.md @@ -50,24 +50,24 @@ The following sections contain detailed information about each field in Short sy |progress_deadline | `int32` | `progressDeadlineSeconds` | Maximum time for a deployment to make progress before it is considered unavailable| |selector | `map[string]string` or `string` | `selector` | An expression (string) or a set of key, value pairs (map) that is used to select a set of pods to manage using the deployment controller. See [Selector Overview](#selector-overview) | |pod_meta | `TemplateMetadata` | `template` | Metadata of the Pod that is selected by this Deployment. See [Template Metadata](#template-metadata)| -|volumes | [`Volume`](./pod.md#volume-overview) | `spec.volumes` | Denotes the volumes that are a part of the Pod. See [Volume Overview](./pod.md#volume-overview) | -| affinity | [`[]Affinity`](./pod.md#affinity-overview) | `spec.affinity` and `spec.NodeSelector` | The Pod's scheduling rules, expressed as (anti-)affinities for nodes or other Pods. See [Affinity Overview](./pod.md#affinity-overview) | +|volumes | `Volume` | `spec.volumes` | Denotes the volumes that are a part of the Pod. See [Volume Overview](pod#volume-overview) | +| affinity | `[]Affinity` | `spec.affinity` and `spec.NodeSelector` | The Pod's scheduling rules, expressed as (anti-)affinities for nodes or other Pods. See [Affinity Overview](pod#affinity-overview) | | node | `string` | `spec.nodeName` | Request that the Pod be scheduled on a specific node. | -| containers |[`Container`](../skel/container.short.skel.yaml) | `spec.containers` and `status`| Containers that run as a part of the Pod. See [Container Overview](./pod.md#container-overview) | -| init_containers | [`Container`](../skel/container.short.skel.yaml) | `spec.initContainers` and `status` | Containers that run as a part of the initialization process of the Pod. See [Container Overview](./pod.md#container-overview) | -| dns_policy | [`DNSPolicy`](./pod.md#dns-policy-overview) | `spec.dnsPolicy` | The DNS Policy of the Pod. See [DNS Policy Overview](./pod.md#dns-policy-overview) | -| host_aliases | `[]string` | `spec.aliases` | Set of additional records to be placed in `/etc/hosts` file inside the Pod. See [Host Aliases Overview](./pod.md#host-aliases-overview) | -| host_mode | `[]string` | `spec.hostPID`, `spec.hostNetwork` and `spec.hostIPC`| The Pod's access to host resources. See [Host Mode Conversion](./pod.md#host-mode-conversion) | +| containers |`Container` | `spec.containers` and `status`| Containers that run as a part of the Pod. See [Container Overview](pod#container-overview) | +| init_containers | `Container` | `spec.initContainers` and `status` | Containers that run as a part of the initialization process of the Pod. See [Container Overview](pod#container-overview) | +| dns_policy | `DNSPolicy` | `spec.dnsPolicy` | The DNS Policy of the Pod. See [DNS Policy Overview](pod#dns-policy-overview) | +| host_aliases | `[]string` | `spec.aliases` | Set of additional records to be placed in `/etc/hosts` file inside the Pod. See [Host Aliases Overview](pod#host-aliases-overview) | +| host_mode | `[]string` | `spec.hostPID`, `spec.hostNetwork` and `spec.hostIPC`| The Pod's access to host resources. See [Host Mode Conversion](pod#host-mode-conversion) | | hostname | `string` | `spec.hostname` and `spec.subDomain` | The fully qualified domain name of the pod| | registry_secrets | `[]string` |`spec.ImagePullSecrets` | A list of k8s secret resource names that contain credentials to required to access private registries. | -| restart_policy | [`RestartPolicy`](./pod.md#restart-policy) | `spec.restartPolicy` | Behavior of a Pod when it dies. Can be "always", "on-failure" or "never" | +| restart_policy | `RestartPolicy` | `spec.restartPolicy` | Behavior of a Pod when it dies. Can be "always", "on-failure" or "never" | | scheduler_name | `string` | `spec.schedulerName` | The value from `spec.schedulerName` is stored here | -| account | `string` | `spec.serviceAccountName` and `spec.automountServiceAccountToken` | The Pod's access to the K8s API. See [Account Conversion](./pod.md#account-conversion) | -| tolerations | [`[]Toleration`](../skel/toleration.short.skel.yaml) | `spec.tolerations` | Set of host taints this Pod tolerates. See [Toleration Conversion](./pod.md#toleration-conversion) | -| termination_grace_period | `int64` | `spec.terminationGracePeriodSeconds` | Number of seconds to wait before forcefully killing the Pod. | -| active_deadline | `int64` | `spec.activeDeadlineSeconds`| Number of seconds the Pod is allowed to be active | -| priority | `Priority` | `spec.priorityClassName` and `spec.priority` | Specifies the Pod's Priority. See [Priority](./pod.md#priority) | -| condition | `[]Pod Condition` | `status.conditions` | The list of current and previous conditions of the Pod. See [Pod Condition](./pod.md#pod-condition) | +| account | `string` | `spec.serviceAccountName` and `automountService` `AccountToken` | The Pod's access to the K8s API. See [Account Conversion](pod#account-conversion) | +| tolerations | `[]Toleration` | `spec.tolerations` | Set of host taints this Pod tolerates. See [Toleration Conversion](pod#toleration-conversion) | +| termination_ grace_period | `int64` | `spec.termination` `GracePeriodSeconds` | Number of seconds to wait before forcefully killing the Pod. | +| active_deadline | `int64` | `spec.` `activeDeadlineSeconds`| Number of seconds the Pod is allowed to be active | +| priority | `Priority` | `spec.priorityClassName` and `spec.priority` | Specifies the Pod's Priority. See [Priority](pod#priority) | +| condition | `[]Pod Condition` | `status.conditions` | The list of current and previous conditions of the Pod. See [Pod Condition](pod#pod-condition) | | node_ip | `string` | `status.hostIP` | The IP address of the Pod's host | | ip | `string` | `status.podIP` | The IP address of the Pod | | start_time | `time` | `status.startTime` | When the Pod started running | @@ -75,8 +75,8 @@ The following sections contain detailed information about each field in Short sy | phase | `string` | `status.phase` | The current phase of the Pod | | reason | `string` | `status.reason` | Reason indicating the cause for the current state of the Pod | | qos | `string` | `status.qosClass` | The QOS class assigned to the Pod based on resource requirements | -| fs_gid | `int64` | `spec.securityContext.fsGroup` | Special supplemental group that applies to all the Containers in the Pod | -| gids | `[]int64` | `spec.securityContext.supplementalGroups` | A list of groups applied to the first process in each of the Containers in the Pod | +| fs_gid | `int64` | `spec.securityContext.` `fsGroup` | Special supplemental group that applies to all the Containers in the Pod | +| gids | `[]int64` | `spec.securityContext.` `supplementalGroups` | A list of groups applied to the first process in each of the Containers in the Pod | `max_unavailable` and `max_extra` are used to configure `RollingUpdate` deployment strategy. `max_unavailable` indicates the maximum number of pods that can be unavailable during update. The value can be number or a percentage value of the total number of replicas. Percentage values are represented using a `%` symbol at the end of the value. diff --git a/docs/resources/index.md b/docs/resources/index.md index 7d869e8a..c9555f1e 100644 --- a/docs/resources/index.md +++ b/docs/resources/index.md @@ -87,4 +87,3 @@ The following types are currently supported | extensions/v1beta1 | Replica Set | [Replica Set](./replica-set.md) | [Replica Set Skeleton](./replica-set.md#skeleton) | [Replica Set Examples](./replica-set.md#examples) | | apps/v1beta2 | Replica Set | [Replica Set](./replica-set.md) | [Replica Set Skeleton](./replica-set.md#skeleton) | [Replica Set Examples](./replica-set.md#examples) | | core/v1 | Replication Controller | [Replication Controller](./replication-controller.md) | [Replication Controller Skeleton](./replication-controller.md#skeleton) | [Replication Controller Examples](./replication-controller.md#examples) | -| core/v1 | PersistentVolume | [Volume](./volume.md) | [Volume Skeleton](./volume.md#skeleton) | [Volume Examples](./volume.md#examples) | diff --git a/docs/resources/pod.md b/docs/resources/pod.md index d6622096..7822ef7b 100644 --- a/docs/resources/pod.md +++ b/docs/resources/pod.md @@ -49,22 +49,22 @@ The following sections contain detailed information about each field in Short sy |namespace | `string` | `metadata.namespace` | The K8s namespace this Pod will be a member of | |labels | `string` | `metadata.labels`| Metadata about the Pod, including identifying information | |annotations| `string` | `metadata.annotations`| Non-identifying information about the Pod | -|volumes | [`Volume`](#volume-overview) | `spec.volumes` | Denotes the volumes that are a part of the Pod. See [Volume Overview](#volume-overview) | -| affinity | [`[]Affinity`](#affinity-overview) | `spec.affinity` and `spec.NodeSelector` | The Pod's scheduling rules, expressed as (anti-)affinities for nodes or other Pods. See [Affinity Overview](#affinity-overview) | +|volumes | `Volume` | `spec.volumes` | Denotes the volumes that are a part of the Pod. See [Volume Overview](#volume-overview) | +| affinity | `[]Affinity` | `spec.affinity` and `spec.NodeSelector` | The Pod's scheduling rules, expressed as (anti-)affinities for nodes or other Pods. See [Affinity Overview](#affinity-overview) | | node | `string` | `spec.nodeName` | Request that the Pod be scheduled on a specific node. | -| containers |[`Container`](../skel/container.short.skel.yaml) | `spec.containers` and `status`| Containers that run as a part of the Pod. See [Container Overview](#container-overview) | -| init_containers | [`Container`](../skel/container.short.skel.yaml) | `spec.initContainers` and `status` | Containers that run as a part of the initialization process of the Pod. See [Container Overview](#container-overview) | -| dns_policy | [`DNSPolicy`](#dns-policy-overview) | `spec.dnsPolicy` | The DNS Policy of the Pod. See [DNS Policy Overview](#dns-policy-overview) | +| containers |`Container` | `spec.containers` and `status`| Containers that run as a part of the Pod. See [Container Overview](#container-overview) | +| init_containers | `Container` | `spec.initContainers` and `status` | Containers that run as a part of the initialization process of the Pod. See [Container Overview](#container-overview) | +| dns_policy | `DNSPolicy` | `spec.dnsPolicy` | The DNS Policy of the Pod. See [DNS Policy Overview](#dns-policy-overview) | | host_aliases | `[]string` | `spec.aliases` | Set of additional records to be placed in `/etc/hosts` file inside the Pod. See [Host Aliases Overview](#host-aliases-overview) | | host_mode | `[]string` | `spec.hostPID`, `spec.hostNetwork` and `spec.hostIPC`| The Pod's access to host resources. See [Host Mode Conversion](#host-mode-conversion) | | hostname | `string` | `spec.hostname` and `spec.subDomain` | The fully qualified domain name of the pod| | registry_secrets | `[]string` |`spec.ImagePullSecrets` | A list of k8s secret resource names that contain credentials to required to access private registries. | -| restart_policy | [`RestartPolicy`](#restart-policy) | `spec.restartPolicy` | Behavior of a Pod when it dies. Can be "always", "on-failure" or "never" | +| restart_policy | `RestartPolicy` | `spec.restartPolicy` | Behavior of a Pod when it dies. Can be "always", "on-failure" or "never" | | scheduler_name | `string` | `spec.schedulerName` | The value from `spec.schedulerName` is stored here | -| account | `string` | `spec.serviceAccountName` and `spec.automountServiceAccountToken` | The Pod's access to the K8s API. See [Account Conversion](#account-conversion) | -| tolerations | [`[]Toleration`](../skel/toleration.short.skel.yaml) | `spec.tolerations` | Set of host taints this Pod tolerates. See [Toleration Conversion](#toleration-conversion) | -| termination_grace_period | `int64` | `spec.terminationGracePeriodSeconds` | Number of seconds to wait before forcefully killing the Pod. | -| active_deadline | `int64` | `spec.activeDeadlineSeconds`| Number of seconds the Pod is allowed to be active | +| account | `string` | `spec.serviceAccountName` and `automountService` `AccountToken` | The Pod's access to the K8s API. See [Account Conversion](#account-conversion) | +| tolerations | `[]Toleration` | `spec.tolerations` | Set of host taints this Pod tolerates. See [Toleration Conversion](#toleration-conversion) | +| termination_ grace_period | `int64` | `spec.termination` `GracePeriodSeconds` | Number of seconds to wait before forcefully killing the Pod. | +| active_deadline | `int64` | `spec.` `activeDeadlineSeconds`| Number of seconds the Pod is allowed to be active | | priority | `Priority` | `spec.priorityClassName` and `spec.priority` | Specifies the Pod's Priority. See [Priority](#priority) | | condition | `[]Pod Condition` | `status.conditions` | The list of current and previous conditions of the Pod. See [Pod Condition](#pod-condition) | | node_ip | `string` | `status.hostIP` | The IP address of the Pod's host | @@ -74,8 +74,8 @@ The following sections contain detailed information about each field in Short sy | phase | `string` | `status.phase` | The current phase of the Pod | | reason | `string` | `status.reason` | Reason indicating the cause for the current state of the Pod | | qos | `string` | `status.qosClass` | The QOS class assigned to the Pod based on resource requirements | -| fs_gid | `int64` | `spec.securityContext.fsGroup` | Special supplemental group that applies to all the Containers in the Pod | -| gids | `[]int64` | `spec.securityContext.supplementalGroups` | A list of groups applied to the first process in each of the Containers in the Pod | +| fs_gid | `int64` | `spec.securityContext.` `fsGroup` | Special supplemental group that applies to all the Containers in the Pod | +| gids | `[]int64` | `spec.securityContext.` `supplementalGroups` | A list of groups applied to the first process in each of the Containers in the Pod | #### Affinity Overview @@ -84,8 +84,8 @@ The following sections contain detailed information about each field in Short sy | node | `string` | `affinity.nodeAffinity` | The Pod's affinity for certain nodes. More information below | | pod | `string` | `affinity.podAffinity` | The Pod's affinity for certain other other Pods in the cluster. More information below | | anti_pod | `string` | `affinity.podAntiAffinity` | The Pod's anti-affinity for certain other Pods in the cluster. More information below | -| topology | `string` | `affinity.pod*.podAffinityTerm.topologyKey` | A node label key, e.g. "kubernetes.io/hostname". Determines the scope (same host vs same region vs ...) of the Pod's (anti-)affinity for certain Pods. More information below| -| namespaces | `[]string` | `affinity.pod*.podAffinityTerm.namespaces` | A list of namespaces in which the `pod` and `anti_pod` affinities are applied | +| topology | `string` | `affinity.pod*.` `podAffinityTerm.topologyKey` | A node label key, e.g. "kubernetes.io/hostname". Determines the scope (same host vs same region vs ...) of the Pod's (anti-)affinity for certain Pods. More information below| +| namespaces | `[]string` | `affinity.pod*.` `podAffinityTerm.namespaces` | A list of namespaces in which the `pod` and `anti_pod` affinities are applied | `node`, `pod` and `anti_pod` are string fields that expect `expressions` that denote affinities of the Pod to nodes, other pods and anti-affinity to other pods respectively. @@ -408,13 +408,11 @@ action: | headers | `[]string` | `container.lifecycle.postStart.httpGet.headers` | The headers that get sent as a part of the network call | | url | `string` | `container.lifecycle.postStart.httpGet.(path|port|host|scheme)` | The url of the network call | -The URL should be of the form +The URL should be of this form: `$SCHEME://$HOST:$PORT` -Where, - -`$SCHEME` can be `HTTP` (default), `HTTPS` or `TCP` +where `$SCHEME` can be `HTTP` (default), `HTTPS` or `TCP` Here's few examples of net actions diff --git a/docs/resources/replica-set.md b/docs/resources/replica-set.md index de801733..50c18a45 100644 --- a/docs/resources/replica-set.md +++ b/docs/resources/replica-set.md @@ -58,25 +58,25 @@ The following sections contain detailed information about each field in Short sy |replicas| `int32` | `replicas`| The number of replicas of the selected pod| |min_ready | `int32` | `minReadySeconds` | Minimum number of seconds that your pod should be ready before it is considered available | |selector | `map[string]string` or `string` | `selector` | An expression (string) or a set of key, value pairs (map) that is used to select a set of pods to manage using the replica set controller. See [Selector Overview](./deployment.md#selector-overview) | -|pod_meta | `TemplateMetadata` | `template` | Metadata of the pod that is selected by this replica set. See [Template Metadata](#template-metadata)| -|volumes | [`Volume`](./pod.md#volume-overview) | `spec.volumes` | Denotes the volumes that are a part of the Pod. See [Volume Overview](./pod.md#volume-overview) | -| affinity | [`[]Affinity`](./pod.md#affinity-overview) | `spec.affinity` and `spec.NodeSelector` | The Pod's scheduling rules, expressed as (anti-)affinities for nodes or other Pods. See [Affinity Overview](./pod.md#affinity-overview) | +|pod_meta | `TemplateMetadata` | `template` | Metadata of the pod that is selected by this replica set. See [Template Metadata](deployment#template-metadata)| +|volumes | `Volume` | `spec.volumes` | Denotes the volumes that are a part of the Pod. See [Volume Overview](pod#volume-overview) | +| affinity | `[]Affinity` | `spec.affinity` and `spec.NodeSelector` | The Pod's scheduling rules, expressed as (anti-)affinities for nodes or other Pods. See [Affinity Overview](pod#affinity-overview) | | node | `string` | `spec.nodeName` | Request that the Pod be scheduled on a specific node. | -| containers |[`Container`](../skel/container.short.skel.yaml) | `spec.containers` and `status`| Containers that run as a part of the Pod. See [Container Overview](./pod.md#container-overview) | -| init_containers | [`Container`](../skel/container.short.skel.yaml) | `spec.initContainers` and `status` | Containers that run as a part of the initialization process of the Pod. See [Container Overview](./pod.md#container-overview) | -| dns_policy | [`DNSPolicy`](./pod.md#dns-policy-overview) | `spec.dnsPolicy` | The DNS Policy of the Pod. See [DNS Policy Overview](./pod.md#dns-policy-overview) | -| host_aliases | `[]string` | `spec.aliases` | Set of additional records to be placed in `/etc/hosts` file inside the Pod. See [Host Aliases Overview](./pod.md#host-aliases-overview) | -| host_mode | `[]string` | `spec.hostPID`, `spec.hostNetwork` and `spec.hostIPC`| The Pod's access to host resources. See [Host Mode Conversion](./pod.md#host-mode-conversion) | +| containers |`Container` | `spec.containers` and `status`| Containers that run as a part of the Pod. See [Container Overview](pod#container-overview) | +| init_containers | `Container` | `spec.initContainers` and `status` | Containers that run as a part of the initialization process of the Pod. See [Container Overview](pod#container-overview) | +| dns_policy | `DNSPolicy` | `spec.dnsPolicy` | The DNS Policy of the Pod. See [DNS Policy Overview](pod#dns-policy-overview) | +| host_aliases | `[]string` | `spec.aliases` | Set of additional records to be placed in `/etc/hosts` file inside the Pod. See [Host Aliases Overview](pod#host-aliases-overview) | +| host_mode | `[]string` | `spec.hostPID`, `spec.hostNetwork` and `spec.hostIPC`| The Pod's access to host resources. See [Host Mode Conversion](pod#host-mode-conversion) | | hostname | `string` | `spec.hostname` and `spec.subDomain` | The fully qualified domain name of the pod| | registry_secrets | `[]string` |`spec.ImagePullSecrets` | A list of k8s secret resource names that contain credentials to required to access private registries. | -| restart_policy | [`RestartPolicy`](./pod.md#restart-policy) | `spec.restartPolicy` | Behavior of a Pod when it dies. Can be "always", "on-failure" or "never" | +| restart_policy | `RestartPolicy` | `spec.restartPolicy` | Behavior of a Pod when it dies. Can be "always", "on-failure" or "never" | | scheduler_name | `string` | `spec.schedulerName` | The value from `spec.schedulerName` is stored here | -| account | `string` | `spec.serviceAccountName` and `spec.automountServiceAccountToken` | The Pod's access to the K8s API. See [Account Conversion](./pod.md#account-conversion) | -| tolerations | [`[]Toleration`](../skel/toleration.short.skel.yaml) | `spec.tolerations` | Set of host taints this Pod tolerates. See [Toleration Conversion](./pod.md#toleration-conversion) | -| termination_grace_period | `int64` | `spec.terminationGracePeriodSeconds` | Number of seconds to wait before forcefully killing the Pod. | -| active_deadline | `int64` | `spec.activeDeadlineSeconds`| Number of seconds the Pod is allowed to be active | -| priority | `Priority` | `spec.priorityClassName` and `spec.priority` | Specifies the Pod's Priority. See [Priority](./pod.md#priority) | -| condition | `[]Pod Condition` | `status.conditions` | The list of current and previous conditions of the Pod. See [Pod Condition](./pod.md#pod-condition) | +| account | `string` | `spec.serviceAccountName` and `automountService` `AccountToken` | The Pod's access to the K8s API. See [Account Conversion](pod#account-conversion) | +| tolerations | `[]Toleration` | `spec.tolerations` | Set of host taints this Pod tolerates. See [Toleration Conversion](pod#toleration-conversion) | +| termination_ grace_period | `int64` | `spec.termination` `GracePeriodSeconds` | Number of seconds to wait before forcefully killing the Pod. | +| active_deadline | `int64` | `spec.` `activeDeadlineSeconds`| Number of seconds the Pod is allowed to be active | +| priority | `Priority` | `spec.priorityClassName` and `spec.priority` | Specifies the Pod's Priority. See [Priority](pod#priority) | +| condition | `[]Pod Condition` | `status.conditions` | The list of current and previous conditions of the Pod. See [Pod Condition](pod#pod-condition) | | node_ip | `string` | `status.hostIP` | The IP address of the Pod's host | | ip | `string` | `status.podIP` | The IP address of the Pod | | start_time | `time` | `status.startTime` | When the Pod started running | @@ -84,8 +84,8 @@ The following sections contain detailed information about each field in Short sy | phase | `string` | `status.phase` | The current phase of the Pod | | reason | `string` | `status.reason` | Reason indicating the cause for the current state of the Pod | | qos | `string` | `status.qosClass` | The QOS class assigned to the Pod based on resource requirements | -| fs_gid | `int64` | `spec.securityContext.fsGroup` | Special supplemental group that applies to all the Containers in the Pod | -| gids | `[]int64` | `spec.securityContext.supplementalGroups` | A list of groups applied to the first process in each of the Containers in the Pod | +| fs_gid | `int64` | `spec.securityContext.` `fsGroup` | Special supplemental group that applies to all the Containers in the Pod | +| gids | `[]int64` | `spec.securityContext.` `supplementalGroups` | A list of groups applied to the first process in each of the Containers in the Pod | # Examples diff --git a/docs/resources/replication-controller.md b/docs/resources/replication-controller.md index 2de8e978..70d20b78 100644 --- a/docs/resources/replication-controller.md +++ b/docs/resources/replication-controller.md @@ -45,24 +45,24 @@ The following sections contain detailed information about each field in Short sy |min_ready | `int32` | `minReadySeconds` | Minimum number of seconds that your pod should be ready before it is considered available | |selector | `map[string]string` | `selector` | A set of key, value pairs (map) that is used to select a set of pods to manage using the replication controller. ReplicationController cannot use expressions like ReplicaSet, and that is the only differnce between them | |pod_meta | `TemplateMetadata` | `template` | Metadata of the pod that is selected by this replication controller. More details in [Template Metadata](./deployment.md#template-metadata)| -|volumes | [`Volume`](./pod.md#volume-overview) | `spec.volumes` | Denotes the volumes that are a part of the Pod. See [Volume Overview](./pod.md#volume-overview) | -| affinity | [`[]Affinity`](./pod.md#affinity-overview) | `spec.affinity` and `spec.NodeSelector` | The Pod's scheduling rules, expressed as (anti-)affinities for nodes or other Pods. See [Affinity Overview](./pod.md#affinity-overview) | +|volumes | `Volume` | `spec.volumes` | Denotes the volumes that are a part of the Pod. See [Volume Overview](pod#volume-overview) | +| affinity | `[]Affinity` | `spec.affinity` and `spec.NodeSelector` | The Pod's scheduling rules, expressed as (anti-)affinities for nodes or other Pods. See [Affinity Overview](pod#affinity-overview) | | node | `string` | `spec.nodeName` | Request that the Pod be scheduled on a specific node. | -| containers |[`Container`](../skel/container.short.skel.yaml) | `spec.containers` and `status`| Containers that run as a part of the Pod. See [Container Overview](./pod.md#container-overview) | -| init_containers | [`Container`](../skel/container.short.skel.yaml) | `spec.initContainers` and `status` | Containers that run as a part of the initialization process of the Pod. See [Container Overview](./pod.md#container-overview) | -| dns_policy | [`DNSPolicy`](./pod.md#dns-policy-overview) | `spec.dnsPolicy` | The DNS Policy of the Pod. See [DNS Policy Overview](./pod.md#dns-policy-overview) | -| host_aliases | `[]string` | `spec.aliases` | Set of additional records to be placed in `/etc/hosts` file inside the Pod. See [Host Aliases Overview](./pod.md#host-aliases-overview) | -| host_mode | `[]string` | `spec.hostPID`, `spec.hostNetwork` and `spec.hostIPC`| The Pod's access to host resources. See [Host Mode Conversion](./pod.md#host-mode-conversion) | +| containers |`Container` | `spec.containers` and `status`| Containers that run as a part of the Pod. See [Container Overview](pod#container-overview) | +| init_containers | `Container` | `spec.initContainers` and `status` | Containers that run as a part of the initialization process of the Pod. See [Container Overview](pod#container-overview) | +| dns_policy | `DNSPolicy` | `spec.dnsPolicy` | The DNS Policy of the Pod. See [DNS Policy Overview](pod#dns-policy-overview) | +| host_aliases | `[]string` | `spec.aliases` | Set of additional records to be placed in `/etc/hosts` file inside the Pod. See [Host Aliases Overview](pod#host-aliases-overview) | +| host_mode | `[]string` | `spec.hostPID`, `spec.hostNetwork` and `spec.hostIPC`| The Pod's access to host resources. See [Host Mode Conversion](pod#host-mode-conversion) | | hostname | `string` | `spec.hostname` and `spec.subDomain` | The fully qualified domain name of the pod| | registry_secrets | `[]string` |`spec.ImagePullSecrets` | A list of k8s secret resource names that contain credentials to required to access private registries. | -| restart_policy | [`RestartPolicy`](./pod.md#restart-policy) | `spec.restartPolicy` | Behavior of a Pod when it dies. Can be "always", "on-failure" or "never" | +| restart_policy | `RestartPolicy` | `spec.restartPolicy` | Behavior of a Pod when it dies. Can be "always", "on-failure" or "never" | | scheduler_name | `string` | `spec.schedulerName` | The value from `spec.schedulerName` is stored here | -| account | `string` | `spec.serviceAccountName` and `spec.automountServiceAccountToken` | The Pod's access to the K8s API. See [Account Conversion](./pod.md#account-conversion) | -| tolerations | [`[]Toleration`](../skel/toleration.short.skel.yaml) | `spec.tolerations` | Set of host taints this Pod tolerates. See [Toleration Conversion](./pod.md#toleration-conversion) | -| termination_grace_period | `int64` | `spec.terminationGracePeriodSeconds` | Number of seconds to wait before forcefully killing the Pod. | -| active_deadline | `int64` | `spec.activeDeadlineSeconds`| Number of seconds the Pod is allowed to be active | -| priority | `Priority` | `spec.priorityClassName` and `spec.priority` | Specifies the Pod's Priority. See [Priority](./pod.md#priority) | -| condition | `[]Pod Condition` | `status.conditions` | The list of current and previous conditions of the Pod. See [Pod Condition](./pod.md#pod-condition) | +| account | `string` | `spec.serviceAccountName` and `automountService` `AccountToken` | The Pod's access to the K8s API. See [Account Conversion](pod#account-conversion) | +| tolerations | `[]Toleration` | `spec.tolerations` | Set of host taints this Pod tolerates. See [Toleration Conversion](pod#toleration-conversion) | +| termination_ grace_period | `int64` | `spec.termination` `GracePeriodSeconds` | Number of seconds to wait before forcefully killing the Pod. | +| active_deadline | `int64` | `spec.` `activeDeadlineSeconds`| Number of seconds the Pod is allowed to be active | +| priority | `Priority` | `spec.priorityClassName` and `spec.priority` | Specifies the Pod's Priority. See [Priority](pod#priority) | +| condition | `[]Pod Condition` | `status.conditions` | The list of current and previous conditions of the Pod. See [Pod Condition](pod#pod-condition) | | node_ip | `string` | `status.hostIP` | The IP address of the Pod's host | | ip | `string` | `status.podIP` | The IP address of the Pod | | start_time | `time` | `status.startTime` | When the Pod started running | @@ -70,8 +70,8 @@ The following sections contain detailed information about each field in Short sy | phase | `string` | `status.phase` | The current phase of the Pod | | reason | `string` | `status.reason` | Reason indicating the cause for the current state of the Pod | | qos | `string` | `status.qosClass` | The QOS class assigned to the Pod based on resource requirements | -| fs_gid | `int64` | `spec.securityContext.fsGroup` | Special supplemental group that applies to all the Containers in the Pod | -| gids | `[]int64` | `spec.securityContext.supplementalGroups` | A list of groups applied to the first process in each of the Containers in the Pod | +| fs_gid | `int64` | `spec.securityContext.` `fsGroup` | Special supplemental group that applies to all the Containers in the Pod | +| gids | `[]int64` | `spec.securityContext.` `supplementalGroups` | A list of groups applied to the first process in each of the Containers in the Pod | # Examples diff --git a/docs/resources/service.md b/docs/resources/service.md index 5854e55f..3371b91c 100644 --- a/docs/resources/service.md +++ b/docs/resources/service.md @@ -28,25 +28,25 @@ The following sections contain detailed information about each field in Short sy | Field | Type | K8s counterpart(s) | Description | |:-----:|:----:|:-------:|:----------------------:| |version| `string` | `apiVersion` | The version of the resource object | -|cluster| `string` | `metadata.clusterName` | The name of the cluster on which this Service is running | +|cluster| `string` | `metadata.` `clusterName` | The name of the cluster on which this Service is running | |name | `string` | `metadata.name`| The name of the Service | -|namespace | `string` | `metadata.namespace` | The K8s namespace this Service will be a member of | +|namespace | `string` | `metadata.` `namespace` | The K8s namespace this Service will be a member of | |labels | `string` | `metadata.labels`| Metadata about the Service, including identifying information | -|annotations| `string` | `metadata.annotations`| Non-identifying information about the Service | +|annotations| `string` | `metadata.` `annotations`| Non-identifying information about the Service | |cname | `string` | `externalName` | This service will return a CNAME that is set by this field. No proxying will be performed| |type | `string` | `type` | The type of the service. Can be omitted (for `cname` services) or set to "cluster-ip", "node-port" or "load-balancer"| -|selector| `map[string]string` | `selector` | A set of key-value pairs that match the labels of pods that should be proxied to| +|selector| `map[string]` `string` | `selector` | A set of key-value pairs that match the labels of pods that should be proxied to| |external_ips| `[]string` | `externalIPs` | A set of ip addresses for which nodes in the cluster will accept traffic| -|port | `string` | `ports` | Unnamed port mapping of format `$PROTOCOL://$SERVICE_PORT:$CONTAINER_PORT`. More details below| +|port | `string` | `ports` | Unnamed port mapping of format `$PROTOCOL://$SVC_PORT:$CONTAINER_PORT`. More details below| |node_port| `int32` | `ports` | Request specific node port for a node-port service | |ports | `[]NamedPort`| `ports` | A list of named ports to expose. See [Named Port Overview](#named-port-overview)| |cluster_ip| `string` | `clusterIP`| Request specific cluster ip for the service| -|unready_endpoints| `bool` | `publishNotReadyAddresses` | Publish addresses before backends are ready| -|route_policy| `string` | `externalTrafficPolicy` | Policy for routing external traffic. Can be "node-local" or "cluster-wide" | -|stickiness | `int` or `bool` | `sessionAffinity` and `sessionAffinityConfig` | Stickiness Policy for the service. More information below | -|lb_ip | `string` | loadBalancerIP | Request specific IP address for the created LB service| -|lb_client_ips | `[]string` | `loadBalancerSourceRanges` | (for LB service) IP addresses to allow traffic from. Can specify CIDR here | -|healthecheck_port | `int32` | `healthCheckNodePort` | Port for health check| +|unready_ endpoints| `bool` | `publishNot` `ReadyAddresses` | Publish addresses before backends are ready| +|route_policy| `string` | `externalTraffic` `Policy` | Policy for routing external traffic. Can be "node-local" or "cluster-wide" | +|stickiness | `int` or `bool` | `sessionAffinity` and `sessionAffinity` `Config` | Stickiness Policy for the service. More information below | +|lb_ip | `string` | `loadBalancerIP` | Request specific IP address for the created LB service| +|lb_client_ips | `[]string` | `loadBalancer` `SourceRanges` | (for LB service) IP addresses to allow traffic from. Can specify CIDR here | +|healthcheck_ port | `int32` | `healthCheck` `NodePort` | Port for health check| The following fields are status fields, and cannot be set diff --git a/docs/resources/volume.md b/docs/resources/volume.md deleted file mode 100644 index 5dc71957..00000000 --- a/docs/resources/volume.md +++ /dev/null @@ -1,5 +0,0 @@ -# Introduction - -# Examples - -# Skeleton diff --git a/docs/user-guide/getting-help.md b/docs/user-guide/getting-help.md index 04bb9cef..99509864 100644 --- a/docs/user-guide/getting-help.md +++ b/docs/user-guide/getting-help.md @@ -8,18 +8,6 @@ This [docs](https://docs.koki.io/short) website is a complete, and exhaustive re Each of the commands, and sub-commands in the Short project support the help flag (`-h` or `--help`). The help flag provides information about the expected arguments and flags. This should be the first resource to turn to while looking for information about a command in the Short project. -## Man pages - -The Short project comes with its own built in man pages for complete information about resources, their transformations, and skeletons. The man page can be accessed by using the `man` subcommand. - -```sh -# Get information about pods -$$ short man pod -``` -[![man in action](man_command.png)](https://asciinema.org/a/AbjPBdIzj6rUz9k7PLLnSfaWf) - -As shown in the ascii video above, the man pages are searchable. Press the `/` key to start searching within the man page. Press `Ctrl+c` to exit a man page after viewing its contents. - ## YAML Skeletons We encourage users to write Short syntax instead of native Kubernetes syntax. In order to facilitate this, we provide skeletons for every Short resource type. They are available in the man pages, as well under the [Resources](../resources/index.md#resources) section under each resource. Users can copy these and use them as a starting point for writing their spec files. diff --git a/docs/user-guide/man_command.png b/docs/user-guide/man_command.png deleted file mode 100644 index 72d33670f2e6764f46d9ce4b4205042e891b7303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59229 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