Tugger is Kubernetes Admission webhook to enforce pulling of docker images from private registry.
Kubernetes 1.9.0 or above with the admissionregistration.k8s.io/v1
API enabled. Verify that by the following command:
kubectl api-versions | grep admissionregistration.k8s.io/v1beta1
The result should be:
admissionregistration.k8s.io/v1beta1
In addition, the MutatingAdmissionWebhook
and ValidatingAdmissionWebhook
admission controllers should be added and listed in the correct order in the admission-control flag of kube-apiserver.
# Build docker image
docker build -t jainishshah17/tugger:0.1.8 .
# Push it to Docker Registry
docker push jainishshah17/tugger:0.1.8
# Create a Docker registry secret called 'regsecret'
kubectl create secret docker-registry regsecret --docker-server=${DOCKER_REGISTRY} --docker-username=${DOCKER_USER} --docker-password=${DOCKER_PASS} --docker-email=${DOCKER_EMAIL}
Note: Create Docker registry secret in each non-whitelisted namespaces.
./tls/gen-cert.sh
./webhook/webhook-patch-ca-bundle.sh
The helm chart can generate certificates and configure webhooks in a single step. See the notes on webhooks below for more information.
# Add Tugger Helm repository
helm repo add tugger https://jainishshah17.github.io/tugger
# Update Helm repository index
helm repo update
helm install --name tugger \
--set docker.registrySecret=regsecret, \
--set docker.registryUrl=jainishshah17, \
--set whitelistNamespaces={kube-system,default}, \
--set whitelistRegistries={jainishshah17} \
--set createValidatingWebhook=true \
--set createMutatingWebhook=true \
tugger/tugger
-
Create deployment and service
# Run deployment kubectl create -f deployment/tugger-deployment.yaml # Create service kubectl create -f deployment/tugger-svc.yaml
-
Configure
MutatingAdmissionWebhook
andValidatingAdmissionWebhook
Note: Replace
${CA_BUNDLE}
with value generated by running./webhook/webhook-patch-ca-bundle.sh
# re MutatingAdmissionWebhook kubectl create -f webhook/tugger-mutating-webhook ration.yaml
Note: Use MutatingAdmissionWebhook only if you want to enforce pulling of docker image from Private Docker Registry e.g JFrog Artifactory. If your container image is
nginx
then Tugger will appendREGISTRY_URL
to it. e.gnginx
will becomejainishshah17/nginx
# Configure ValidatingWebhookConfiguration kubectl create -f webhook/tugger-validating-webhook ration.yaml
Note: Use ValidatingWebhookConfiguration only if you want to check pulling of docker image from Private Docker Registry e.g JFrog Artifactory. If your container image does not contain
REGISTRY_URL
then Tugger will deny request to run that pod.
# Deploy nginx
kubectl apply -f test/nginx.yaml
The mutation or validation policy can be defined as a list of rules in a YAML file.
The YALM file can be specified with the command line argument --policy-file=FILE
, or when using the Helm chart, populate rules:
in values.
rules:
- pattern: regex
replacement: template (optional)
condition: policy (optional)
- ...
pattern is a regex pattern
replacement is a template comprised of the captured groups to use to generate the new image name in the mutating admission controller. When replacement is null
or undefined, the image name is allowed without patching. Rules with this field are ignored by the validating admission controller, where mutation is not supported.
condition is a special condition to test before committing the replacement. Initially Always
and Exists
will be supported. Always
is the default and performs the replacement regardless of any condition. Exists
implements the behavior from #7; it only rewrites the image name if the target name exists in the remote registry.
Each rule will be evaluated in order, and if the list is exhausted without a match, the admission controller will return allowed: false
.
This example allows all images without rewriting:
rules:
- pattern: .*
This example implements the default behavior of rewriting all image names to start with jainishshah17
:
rules:
- pattern: ^jainishshah17/.*
- pattern: (.*)
replacement: jainishshah17/$1
Or the same thing, but only if the image exists in jainishshah17/
, and allowing all other images:
rules:
- pattern: ^jainishshah17/.*
- pattern: (.*)
replacement: jainishshah17/$1
condition: Exists
- pattern: .*
Allow the nginx image, but rewrite everything else:
rules:
- pattern: ^nginx(:.*)?$
- pattern: (?:jainishshah17)?(.*)
replacement: jainishshah17/$1