Kruise is at the core of the OpenKruise project. It is a set of controllers which extends and complements Kubernetes core controllers on application workload management.
Today, Kruise offers three application workload controllers:
-
Advanced StatefulSet: An enhanced version of default StatefulSet with extra functionalities such as
inplace-update
, sharding by namespace. -
BroadcastJob: A job that runs pods to completion across all the nodes in the cluster.
-
SidecarSet: A controller that injects sidecar container into the pod spec based on selectors.
Please see documents for more technical information.
A tutorial is provided to demonstrate how to use the workload controllers.
kubectl apply -f https://raw.githubusercontent.com/kruiseio/kruise/master/config/crds/apps_v1alpha1_broadcastjob.yaml
kubectl apply -f https://raw.githubusercontent.com/kruiseio/kruise/master/config/crds/apps_v1alpha1_sidecarset.yaml
kubectl apply -f https://raw.githubusercontent.com/kruiseio/kruise/master/config/crds/apps_v1alpha1_statefulset.yaml
Note that ALL three CRDs need to be installed for kruise-controller to run properly.
kubectl apply -f https://raw.githubusercontent.com/kruiseio/kruise/master/config/manager/all_in_one.yaml
Or run from the repo root directory:
kustomize build config/default | kubectl apply -f -
To Install Kustomize, check kustomize website.
Note that use Kustomize 1.0.11. Version 2.0.3 has compatibility issues with kube-builder
The official kruise-controller-manager image is hosted under docker hub.
apiVersion: apps.kruise.io/v1alpha1
kind: StatefulSet
metadata:
name: sample
spec:
replicas: 3
serviceName: fake-service
selector:
matchLabels:
app: sample
template:
metadata:
labels:
app: sample
spec:
readinessGates:
# A new condition must be added to ensure the pod remain at NotReady state while the in-place update is happening
- conditionType: InPlaceUpdateReady
containers:
- name: main
image: nginx:alpine
podManagementPolicy: Parallel # allow parallel updates, works together with maxUnavailable
updateStrategy:
type: RollingUpdate
rollingUpdate:
# Do in-place update if possible, currently only image update is supported for in-place update
podUpdatePolicy: InPlaceIfPossible
# Allow parallel updates with max number of unavailable instances equals to 2
maxUnavailable: 2
Run a BroadcastJob that each Pod computes pi, with ttlSecondsAfterFinished
set to 30. The job
will be deleted in 30 seconds after the job is finished.
apiVersion: apps.kruise.io/v1alpha1
kind: BroadcastJob
metadata:
name: broadcastjob-ttl
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
completionPolicy:
type: Always
ttlSecondsAfterFinished: 30
The yaml file below describes a SidecarSet that contains a sidecar container named sidecar1
# sidecarset.yaml
apiVersion: apps.kruise.io/v1alpha1
kind: SidecarSet
metadata:
name: test-sidecarset
spec:
selector: # select the pods to be injected with sidecar containers
matchLabels:
app: nginx
containers:
- name: sidecar1
image: centos:7
command: ["sleep", "999d"] # do nothing at all
There's a Makefile
in the root folder which describes the options to build and install. Here are some common ones:
Build the controller manager binary
make manager
Run the tests
make test
Build the docker image, by default the image name is openkruise/kruise-manager:v1alpha1
export IMG=<your_image_name> && make docker-build
Push the image
export IMG=<your_image_name> && make docker-push
or just
docker push <your_image_name>
Generate manifests e.g. CRD, RBAC etc.
make manifests
If you have any questions or want to contribute, you are welcome to join our slack channel
Mailing List: todo
Certain implementation relies on existing code from Kubernetes and the credit goes to original Kubernetes authors.