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.
Several tutorials are 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.