Update docs and examples to batch/v1 Job

Documented manualSelector field.

Documented that you do not need to provide a selector
or unique labels with batch/v1 Job.

Updated all Job examples to apiVersion: batch/v1

Updated all Job examples to use generated selectors.
This commit is contained in:
Eric Tune 2016-02-24 23:05:02 -08:00
parent 2afcc7d165
commit 095a85e76e
9 changed files with 108 additions and 98 deletions

View File

@ -1,16 +1,11 @@
apiVersion: extensions/v1beta1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: pi name: pi
spec: spec:
selector:
matchLabels:
app: pi
template: template:
metadata: metadata:
name: pi name: pi
labels:
app: pi
spec: spec:
containers: containers:
- name: pi - name: pi

View File

@ -47,6 +47,8 @@ Documentation for other releases can be found at
- [Controlling Parallelism](#controlling-parallelism) - [Controlling Parallelism](#controlling-parallelism)
- [Handling Pod and Container Failures](#handling-pod-and-container-failures) - [Handling Pod and Container Failures](#handling-pod-and-container-failures)
- [Job Patterns](#job-patterns) - [Job Patterns](#job-patterns)
- [Advanced Usage](#advanced-usage)
- [Specifying your own pod selector](#specifying-your-own-pod-selector)
- [Alternatives](#alternatives) - [Alternatives](#alternatives)
- [Bare Pods](#bare-pods) - [Bare Pods](#bare-pods)
- [Replication Controller](#replication-controller) - [Replication Controller](#replication-controller)
@ -76,19 +78,14 @@ It takes around 10s to complete.
<!-- BEGIN MUNGE: EXAMPLE job.yaml --> <!-- BEGIN MUNGE: EXAMPLE job.yaml -->
```yaml ```yaml
apiVersion: extensions/v1beta1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: pi name: pi
spec: spec:
selector:
matchLabels:
app: pi
template: template:
metadata: metadata:
name: pi name: pi
labels:
app: pi
spec: spec:
containers: containers:
- name: pi - name: pi
@ -170,21 +167,9 @@ Only a [`RestartPolicy`](pod-states.md) equal to `Never` or `OnFailure` are allo
### Pod Selector ### Pod Selector
The `.spec.selector` field is a label query over a set of pods. The `.spec.selector` field is optional. In almost all cases you should not specify it.
See section [specifying your own pod selector](#specifying-your-own-pod-selector).
The `spec.selector` is an object consisting of two fields:
* `matchLabels` - works the same as the `.spec.selector` of a [ReplicationController](replication-controller.md)
* `matchExpressions` - allows to build more sophisticated selectors by specifying key,
list of values and an operator that relates the key and values.
When the two are specified the result is ANDed.
If `.spec.selector` is unspecified, `.spec.selector.matchLabels` will be defaulted to
`.spec.template.metadata.labels`.
Also you should not normally create any pods whose labels match this selector, either directly,
via another Job, or via another controller such as ReplicationController. Otherwise, the Job will
think that those pods were created by it. Kubernetes will not stop you from doing this.
### Parallel Jobs ### Parallel Jobs
@ -323,6 +308,70 @@ Here, `W` is the number of work items.
| Single Job with Static Work Assignment | W | any | | Single Job with Static Work Assignment | W | any |
## Advanced Usage
### Specifying your own pod selector
Normally, when you create a job object, you do not specify `spec.selector`.
The system defaulting logic adds this field when the job is created.
It picks a selector value that will not overlap with any other jobs.
However, in some cases, you might need to override this automatically set selector.
To do this, you can specify the `spec.selector` of the job.
Be very careful when doing this. If you specify a label selector which is not
unique to the pods of that job, and which matches unrelated pods, then pods of the unrelated
job may be deleted, or this job may count other pods as completing it, or one or both
of the jobs may refuse to create pods or run to completion. If a non-unique selector is
chosen, then other controllers (e.g. ReplicationController) and their pods may behave
in unpredicatable ways too. Kubernetes will not stop you from making a mistake when
specifying `spec.selector`.
Here is an example of a case when you might want to use this feature.
Say job `old` is already running. You want existing pods
to keep running, but you want the rest of the pods it creates
to use a different pod template and for the job to have a new name.
You cannot update the job because these fields are not updatable.
Therefore, you delete job `old` but leave its pods
running, using `kubectl delete jobs/old-one --cascade=false`.
Before deleting it, you make a note of what selector it uses:
```
kind: Job
metadata:
name: old
...
spec:
selector:
matchLabels:
job-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002
...
```
Then you create a new job with name `new` and you explicitly specify the same selector.
Since the existing pods have label `job-uid=a8f3d00d-c6d2-11e5-9f87-42010af00002`,
they are controlled by job `new` as well.
You need to specify `manualSelector: true` in the new job since you are not using
the selector that the system normally generates for you automatically.
```
kind: Job
metadata:
name: new
...
spec:
manualSelector: true
selector:
matchLabels:
job-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002
...
```
The new Job itself will have a different uid from `a8f3d00d-c6d2-11e5-9f87-42010af00002`. Setting
`manualSelector: true` tells the system to that you know what you are doing and to allow this
mismatch.
## Alternatives ## Alternatives

View File

@ -40,21 +40,18 @@ First, create a template of a Job object:
<!-- BEGIN MUNGE: EXAMPLE job.yaml.txt --> <!-- BEGIN MUNGE: EXAMPLE job.yaml.txt -->
``` ```
apiVersion: extensions/v1beta1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: process-item-$ITEM name: process-item-$ITEM
labels:
jobgroup: jobexample
spec: spec:
selector:
matchLabels:
app: jobexample
item: $ITEM
template: template:
metadata: metadata:
name: jobexample name: jobexample
labels: labels:
app: jobexample jobgroup: jobexample
item: $ITEM
spec: spec:
containers: containers:
- name: c - name: c
@ -75,12 +72,14 @@ In a real use case, the processing would be some substantial computation, such a
of a movie, or processing a range of rows in a database. The "$ITEM" parameter would specify for of a movie, or processing a range of rows in a database. The "$ITEM" parameter would specify for
example, the frame number or the row range. example, the frame number or the row range.
This Job has two labels. The first label, `app=jobexample`, distinguishes this group of jobs from This Job and its Pod template have a label: `jobgroup=jobexample`. There is nothing special
other groups of jobs (these are not shown, but there might be other ones). This label to the system about this label. This label
makes it convenient to operate on all the jobs in the group at once. The second label, with makes it convenient to operate on all the jobs in this group at once.
key `item`, distinguishes individual jobs in the group. Each Job object needs to have We also put the same label on the pod template so that we can check on all Pods of these Jobs
a unique label that no other job has. This is it. with a single command.
Neither of these label keys are special to kubernetes -- you can pick your own label scheme. After the job is created, the system will add more labels that distinguish one Job's pods
from another Job's pods.
Note that the label key `jobgroup` is not special to Kubernetes. you can pick your own label scheme.
Next, expand the template into multiple files, one for each item to be processed. Next, expand the template into multiple files, one for each item to be processed.
@ -113,27 +112,25 @@ job "process-item-cherry" created
Now, check on the jobs: Now, check on the jobs:
```console ```console
$ kubectl get jobs -l app=jobexample -L item $ kubectl get jobs -l app=jobexample
JOB CONTAINER(S) IMAGE(S) SELECTOR SUCCESSFUL ITEM JOB CONTAINER(S) IMAGE(S) SELECTOR SUCCESSFUL
process-item-apple c busybox app in (jobexample),item in (apple) 1 apple process-item-apple c busybox app in (jobexample),item in (apple) 1
process-item-banana c busybox app in (jobexample),item in (banana) 1 banana process-item-banana c busybox app in (jobexample),item in (banana) 1
process-item-cherry c busybox app in (jobexample),item in (cherry) 1 cherry process-item-cherry c busybox app in (jobexample),item in (cherry) 1
``` ```
Here we use the `-l` option to select all jobs that are part of this Here we use the `-l` option to select all jobs that are part of this
group of jobs. (There might be other unrelated jobs in the system that we group of jobs. (There might be other unrelated jobs in the system that we
do not care to see.) do not care to see.)
The `-L` option adds an extra column with just the `item` label value.
We can check on the pods as well using the same label selector: We can check on the pods as well using the same label selector:
```console ```console
$ kubectl get pods -l app=jobexample -L item $ kubectl get pods -l app=jobexample
NAME READY STATUS RESTARTS AGE ITEM NAME READY STATUS RESTARTS AGE
process-item-apple-kixwv 0/1 Completed 0 4m apple process-item-apple-kixwv 0/1 Completed 0 4m
process-item-banana-wrsf7 0/1 Completed 0 4m banana process-item-banana-wrsf7 0/1 Completed 0 4m
process-item-cherry-dnfu9 0/1 Completed 0 4m cherry process-item-cherry-dnfu9 0/1 Completed 0 4m
``` ```
There is not a single command to check on the output of all jobs at once, There is not a single command to check on the output of all jobs at once,
@ -170,21 +167,17 @@ First, download or paste the following template file to a file called `job.yaml.
{%- for p in params %} {%- for p in params %}
{%- set name = p["name"] %} {%- set name = p["name"] %}
{%- set url = p["url"] %} {%- set url = p["url"] %}
apiVersion: extensions/v1beta1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: jobexample-{{ name }} name: jobexample-{{ name }}
labels:
jobgroup: jobexample
spec: spec:
selector:
matchLabels:
app: jobexample
item: {{ name }}
template: template:
metadata:
name: jobexample name: jobexample
labels: labels:
app: jobexample jobgroup: jobexample
item: {{ name }}
spec: spec:
containers: containers:
- name: c - name: c

View File

@ -5,21 +5,17 @@
{%- for p in params %} {%- for p in params %}
{%- set name = p["name"] %} {%- set name = p["name"] %}
{%- set url = p["url"] %} {%- set url = p["url"] %}
apiVersion: extensions/v1beta1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: jobexample-{{ name }} name: jobexample-{{ name }}
labels:
jobgroup: jobexample
spec: spec:
selector:
matchLabels:
app: jobexample
item: {{ name }}
template: template:
metadata:
name: jobexample name: jobexample
labels: labels:
app: jobexample jobgroup: jobexample
item: {{ name }}
spec: spec:
containers: containers:
- name: c - name: c

View File

@ -1,18 +1,15 @@
apiVersion: extensions/v1beta1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: process-item-$ITEM name: process-item-$ITEM
labels:
jobgroup: jobexample
spec: spec:
selector:
matchLabels:
app: jobexample
item: $ITEM
template: template:
metadata: metadata:
name: jobexample name: jobexample
labels: labels:
app: jobexample jobgroup: jobexample
item: $ITEM
spec: spec:
containers: containers:
- name: c - name: c

View File

@ -262,21 +262,16 @@ image to match the name you used, and call it `./job.yaml`.
<!-- BEGIN MUNGE: EXAMPLE job.yaml --> <!-- BEGIN MUNGE: EXAMPLE job.yaml -->
```yaml ```yaml
apiVersion: extensions/v1beta1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: job-wq-1 name: job-wq-1
spec: spec:
selector:
matchLabels:
app: job-wq-1
completions: 8 completions: 8
parallelism: 2 parallelism: 2
template: template:
metadata: metadata:
name: job-wq-1 name: job-wq-1
labels:
app: job-wq-1
spec: spec:
containers: containers:
- name: c - name: c

View File

@ -1,18 +1,13 @@
apiVersion: extensions/v1beta1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: job-wq-1 name: job-wq-1
spec: spec:
selector:
matchLabels:
app: job-wq-1
completions: 8 completions: 8
parallelism: 2 parallelism: 2
template: template:
metadata: metadata:
name: job-wq-1 name: job-wq-1
labels:
app: job-wq-1
spec: spec:
containers: containers:
- name: c - name: c

View File

@ -217,20 +217,15 @@ Here is the job definition:
<!-- BEGIN MUNGE: EXAMPLE job.yaml --> <!-- BEGIN MUNGE: EXAMPLE job.yaml -->
```yaml ```yaml
apiVersion: extensions/v1beta1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: job-wq-2 name: job-wq-2
spec: spec:
selector:
matchLabels:
app: job-wq-2
parallelism: 2 parallelism: 2
template: template:
metadata: metadata:
name: job-wq-2 name: job-wq-2
labels:
app: job-wq-2
spec: spec:
containers: containers:
- name: c - name: c

View File

@ -1,17 +1,12 @@
apiVersion: extensions/v1beta1 apiVersion: batch/v1
kind: Job kind: Job
metadata: metadata:
name: job-wq-2 name: job-wq-2
spec: spec:
selector:
matchLabels:
app: job-wq-2
parallelism: 2 parallelism: 2
template: template:
metadata: metadata:
name: job-wq-2 name: job-wq-2
labels:
app: job-wq-2
spec: spec:
containers: containers:
- name: c - name: c