diff --git a/xos/synchronizer/steps/sync_kubernetes_service.py b/xos/synchronizer/steps/sync_kubernetes_service.py
new file mode 100644
index 0000000..5138c6c
--- /dev/null
+++ b/xos/synchronizer/steps/sync_kubernetes_service.py
@@ -0,0 +1,56 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# 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.
+
+
+from xossynchronizer.steps.syncstep import SyncStep
+from xossynchronizer.modelaccessor import KubernetesService
+
+from xosconfig import Config
+from multistructlog import create_logger
+
+log = create_logger(Config().get('logging'))
+
+class SyncK8Service(SyncStep):
+    provides = [KubernetesService]
+    observes = KubernetesService
+
+    max_version = "1.14"
+    [expected_major, expected_minor] = max_version.split(".")
+
+    def __init__(self, *args, **kwargs):
+        super(SyncK8Service, self).__init__(*args, **kwargs)
+        self.init_kubernetes_client()
+
+    def init_kubernetes_client(self):
+        from kubernetes.client.rest import ApiException
+        from kubernetes import client as kubernetes_client, config as kubernetes_config
+        kubernetes_config.load_incluster_config()
+        self.api_instance = kubernetes_client.VersionApi(kubernetes_client.ApiClient())
+        self.ApiException = ApiException
+
+    def sync_record(self, o):
+        log.info("[K8Service SyncStep] Sync'ing model", model=o, name=o.name)
+
+        res = self.api_instance.get_code()
+        major = res.major
+        minor = res.minor
+        log.info("[K8Service SyncStep] API Code", major=major, minor=minor,
+                 expected_major=self.expected_major, expected_minor=self.expected_minor)
+
+        if major != int(self.expected_major) or minor > int(self.expected_minor):
+            raise Exception("Kubernetes cluster of version %s is not supported by the kubernetes-services" % res.git_version+
+                            "the maximum supported version is %s" % self.max_version)
+
+    def delete_record(self, o):
+        pass
\ No newline at end of file
diff --git a/xos/synchronizer/tests/test_sync_kubernetesservice.py b/xos/synchronizer/tests/test_sync_kubernetesservice.py
new file mode 100644
index 0000000..75a79cc
--- /dev/null
+++ b/xos/synchronizer/tests/test_sync_kubernetesservice.py
@@ -0,0 +1,83 @@
+
+# Copyright 2017-present Open Networking Foundation
+#
+# 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.
+
+import json
+import os
+import sys
+import unittest
+from mock import patch, PropertyMock, ANY, MagicMock
+from unit_test_common import setup_sync_unit_test
+
+class ApiException(Exception):
+    def __init__(self, status, *args, **kwargs):
+        super(ApiException, self).__init__(*args, **kwargs)
+        self.status = status
+
+def fake_init_kubernetes_client(self):
+    self.api_instance = MagicMock()
+    self.ApiException = ApiException
+
+class TestSyncKubernetesServiceInstance(unittest.TestCase):
+
+    def setUp(self):
+        self.unittest_setup = setup_sync_unit_test(os.path.abspath(os.path.dirname(os.path.realpath(__file__))),
+                                                   globals(),
+                                                   [("kubernetes-service", "kubernetes.xproto")] )
+
+        self.MockObjectList = self.unittest_setup["MockObjectList"]
+        self.model_accessor = self.unittest_setup["model_accessor"]
+
+        sys.path.append(os.path.join(os.path.abspath(os.path.dirname(os.path.realpath(__file__))), "../steps"))
+
+        from sync_kubernetes_service import SyncK8Service
+        self.step_class = SyncK8Service
+
+        self.service = KubernetesService(name="TestK8")
+
+    def tearDown(self):
+        sys.path = self.unittest_setup["sys_path_save"]
+
+    def test_valid_version(self):
+
+        version = MagicMock()
+        version.major = 1
+        version.minor = 13
+        version.git_version = "v1.13.0"
+
+        with patch.object(self.step_class, "init_kubernetes_client", new=fake_init_kubernetes_client):
+            step = self.step_class(model_accessor=self.model_accessor)
+
+            step.api_instance.get_code.return_value = version
+
+            step.sync_record(self.service)
+
+    def test_invalid_version(self):
+
+        version = MagicMock()
+        version.major = 1
+        version.minor = 15
+        version.git_version = "v1.15.0"
+
+        with patch.object(self.step_class, "init_kubernetes_client", new=fake_init_kubernetes_client):
+            step = self.step_class(model_accessor=self.model_accessor)
+
+            step.api_instance.get_code.return_value = version
+
+            with self.assertRaises(Exception):
+                step.sync_record(self.service)
+
+
+if __name__ == '__main__':
+    unittest.main()
