diff --git a/Dockerfile b/Dockerfile
index dc285b904..77ec8e8da 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -18,3 +18,5 @@ RUN make ${MAKE_TARGET} && \
 
 FROM ${RELEASE_IMAGE} as release
 COPY --from=builder /usr/src/airshipctl/bin/airshipctl /usr/local/bin/airshipctl
+USER 65534
+ENTRYPOINT [ "/usr/local/bin/airshipctl" ]
diff --git a/Makefile b/Makefile
index 3e39e3094..828f7cded 100644
--- a/Makefile
+++ b/Makefile
@@ -1,22 +1,29 @@
 SHELL := /bin/bash
 
-GO_FLAGS       := -ldflags '-extldflags "-static"' -tags=netgo
+GO_FLAGS            := -ldflags '-extldflags "-static"' -tags=netgo
 
-BINDIR         := bin
-EXECUTABLE_CLI := airshipctl
+BINDIR              := bin
+EXECUTABLE_CLI      := airshipctl
 
-SCRIPTS_DIR    := scripts
+SCRIPTS_DIR         := scripts
 
 # linting
-LINTER_CMD     := "github.com/golangci/golangci-lint/cmd/golangci-lint" run
-ADDTL_LINTERS  := goconst,gofmt,unparam
+LINTER_CMD          := "github.com/golangci/golangci-lint/cmd/golangci-lint" run
+ADDTL_LINTERS       := goconst,gofmt,unparam
 
 # docker
-DOCKER_MAKE_TARGET := build
+DOCKER_MAKE_TARGET  := build
+
+# docker image options
+DOCKER_REGISTRY     ?= quay.io
+DOCKER_IMAGE_NAME   ?= airshipctl
+DOCKER_IMAGE_PREFIX ?= airshipit
+DOCKER_IMAGE_TAG    ?= dev
+DOCKER_IMAGE        ?= ${DOCKER_REGISTRY}/${DOCKER_IMAGE_PREFIX}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}
 
 # go options
-PKG          := ./...
-TESTS        := .
+PKG                 := ./...
+TESTS               := .
 
 .PHONY: get-modules
 get-modules:
@@ -46,7 +53,11 @@ lint:
 
 .PHONY: docker-image
 docker-image:
-	@docker build . --build-arg MAKE_TARGET=$(DOCKER_MAKE_TARGET)
+	@docker build . --build-arg MAKE_TARGET=$(DOCKER_MAKE_TARGET) --tag $(DOCKER_IMAGE)
+
+.PHONY: print-docker-image-tag
+print-docker-image-tag:
+	@echo "$(DOCKER_IMAGE)"
 
 .PHONY: docker-image-unit-tests
 docker-image-unit-tests: DOCKER_MAKE_TARGET = unit-tests
diff --git a/playbooks/airship-airshipctl-common.yaml b/playbooks/airship-airshipctl-deploy-docker.yaml
similarity index 99%
rename from playbooks/airship-airshipctl-common.yaml
rename to playbooks/airship-airshipctl-deploy-docker.yaml
index d1dffe950..483283736 100644
--- a/playbooks/airship-airshipctl-common.yaml
+++ b/playbooks/airship-airshipctl-deploy-docker.yaml
@@ -9,6 +9,7 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
 - hosts: all
   roles:
     - install-docker
diff --git a/playbooks/airship-airshipctl-deploy-existing-k8s.yaml b/playbooks/airship-airshipctl-deploy-existing-k8s.yaml
new file mode 100644
index 000000000..d6c5bf180
--- /dev/null
+++ b/playbooks/airship-airshipctl-deploy-existing-k8s.yaml
@@ -0,0 +1,15 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+- hosts: primary
+  roles:
+    - install-kubernetes
diff --git a/playbooks/airship-airshipctl-functional-existing-k8s.yaml b/playbooks/airship-airshipctl-functional-existing-k8s.yaml
new file mode 100644
index 000000000..d116fbeb5
--- /dev/null
+++ b/playbooks/airship-airshipctl-functional-existing-k8s.yaml
@@ -0,0 +1,39 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+- hosts: primary
+  tasks:
+    - name: "Build and install airshipctl"
+      block:
+        - name: "make docker-image"
+          make:
+            chdir: "{{ zuul.project.src_dir }}"
+            target: docker-image
+
+        - name: "copy airshipctl binary to host"
+          shell: |
+            set -ex
+            DOCKER_IMAGE_TAG=$(make print-docker-image-tag)
+            CONTAINER=$(docker create "${DOCKER_IMAGE_TAG}")
+            sudo docker cp "${CONTAINER}:/usr/local/bin/airshipctl" "/usr/local/bin/airshipctl"
+            docker rm "${CONTAINER}"
+          args:
+            chdir: "{{ zuul.project.src_dir }}"
+
+    - name: "Run functional test cases against pre-existing k8s cluster"
+      block:
+      - name: "airshipctl kubectl version"
+        shell: |
+          set -ex
+          airshipctl kubectl version
+        args:
+          chdir: "{{ zuul.project.src_dir }}"
diff --git a/playbooks/airship-airshipctl-lint-test.yaml b/playbooks/airship-airshipctl-lint-unit.yaml
similarity index 100%
rename from playbooks/airship-airshipctl-lint-test.yaml
rename to playbooks/airship-airshipctl-lint-unit.yaml
index cf467c0ea..cf735a6ef 100644
--- a/playbooks/airship-airshipctl-lint-test.yaml
+++ b/playbooks/airship-airshipctl-lint-unit.yaml
@@ -9,9 +9,9 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
 - hosts: primary
   tasks:
-
     - name: Run Linter
       block:
         - name: "make docker-image-lint"
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 773dda002..f2697dddd 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -1,4 +1,3 @@
----
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -10,8 +9,15 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
 - job:
-    name: airship-airshipctl-lint-test
-    pre-run: playbooks/airship-airshipctl-common.yaml
-    run: playbooks/airship-airshipctl-lint-test.yaml
+    name: airship-airshipctl-lint-unit
+    pre-run: playbooks/airship-airshipctl-deploy-docker.yaml
+    run: playbooks/airship-airshipctl-lint-unit.yaml
+    nodeset: airship-airshipctl-single-node
+
+- job:
+    name: airship-airshipctl-functional-existing-k8s
+    pre-run: playbooks/airship-airshipctl-deploy-existing-k8s.yaml
+    run: playbooks/airship-airshipctl-functional-existing-k8s.yaml
     nodeset: airship-airshipctl-single-node
diff --git a/zuul.d/nodesets.yaml b/zuul.d/nodesets.yaml
index 906ee1230..611facf3f 100644
--- a/zuul.d/nodesets.yaml
+++ b/zuul.d/nodesets.yaml
@@ -1,4 +1,3 @@
----
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -10,6 +9,7 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
 - nodeset:
     name: airship-airshipctl-single-node
     nodes:
diff --git a/zuul.d/projects.yaml b/zuul.d/projects.yaml
index aa883cfd7..9afb22caf 100644
--- a/zuul.d/projects.yaml
+++ b/zuul.d/projects.yaml
@@ -1,4 +1,3 @@
----
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -10,10 +9,13 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
 - project:
     check:
       jobs:
-        - airship-airshipctl-lint-test
+        - airship-airshipctl-lint-unit
+        - airship-airshipctl-functional-existing-k8s
     gate:
       jobs:
-        - airship-airshipctl-lint-test
+        - airship-airshipctl-lint-unit
+        - airship-airshipctl-functional-existing-k8s