{"id":3063,"date":"2017-09-13T17:15:04","date_gmt":"2017-09-13T14:15:04","guid":{"rendered":"https:\/\/www.systemcodegeeks.com\/?p=3063"},"modified":"2017-09-12T12:19:14","modified_gmt":"2017-09-12T09:19:14","slug":"get-kubernetes-running-ubuntu-machine","status":"publish","type":"post","link":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/","title":{"rendered":"How to Get Kubernetes Running &#8211; On Your Own Ubuntu Machine!"},"content":{"rendered":"<p><i><b>Note:<\/b> This article largely borrows from my previous writeup on <a href=\"http:\/\/randomizd.blogspot.com\/2017\/09\/kubernetes-17-on-centos-this-is-how-we.html?m=1\" target=\"_blank\" rel=\"noopener\">installing K8s 1.7 on CentOS<\/a>.<\/i><\/p>\n<p>Getting a local K8s cluster up and running is one of the first &#8220;baby steps&#8221; of toddling into the K8s ecosystem. While it would often be considered easier (and safer) to get K8s set up in a cluster of virtual machines (VMs), it does not really give you the same degree of advantage and flexibility as running K8s &#8220;natively&#8221; on your own host.<\/p>\n<p>That is why, when we decided to upgrade our <a href=\"https:\/\/developer.adroitlogic.com\/ips\/docs\/17.07\/overview\/\" target=\"_blank\" rel=\"noopener\">Integration Platform<\/a> for K8s 1.7 compatibility, I decided to go with a native K8s installation for my dev environment, a laptop running Ubuntu 16.04 on 16GB RAM and a ?? CPU. While I could run three\u2014at most four\u2014reasonably powerful VMs in there as my dev K8s cluster, I could do much better in terms of resource saving (the cluster would be just a few low-footprint services, rather than resource-eating VMs) as well as ease of operation and management (start the services, and the cluster is ready in seconds). Whenever I wanted to try multi-node stuff like <a href=\"https:\/\/developer.adroitlogic.com\/ips\/17.07\/components-of-ips\/node-group\/index.html\" target=\"_blank\" rel=\"noopener\">node groups<\/a> or <a href=\"https:\/\/developer.adroitlogic.com\/ips\/docs\/17.07\/components-of-ips\/zone\/zone.html\" target=\"_blank\" rel=\"noopener\">zones with fail-over<\/a> I could simply hook up one or two secondary (worker) VMs to get things going, and shut them down when I&#8217;m done.<\/p>\n<p>I had already been running K8s 1.2 on my machine, but the upgrade would not have been easy as it&#8217;s a <a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/master\/CHANGELOG.md\" target=\"_blank\" rel=\"noopener\">hyperjump<\/a> from 1.2 to 1.7. Luckily, the K8s guys had written their installation scripts in an amazingly structured and intuitive way, so I could get everything running with around one day&#8217;s struggle (most of which went into understanding the command flow and modifying it to suit Ubuntu, and my particular requirements).<\/p>\n<p>I could easily have utilized the <a href=\"https:\/\/kubernetes.io\/docs\/getting-started-guides\/kubeadm\/\" target=\"_blank\" rel=\"noopener\">official <code>kubeadm<\/code> guide<\/a> or the <a href=\"https:\/\/kubernetes.io\/docs\/getting-started-guides\/ubuntu\/installation\/\" target=\"_blank\" rel=\"noopener\">Juju-based installer for Ubuntu<\/a>, but I wanted to get at least a basic idea of how things get glued together; additionally I also wanted an easily reproducable installation from scratch, with minimal dependencies on external packages or installers, so I could upgrade my cluster any time I desire, by directly building the latest stable\u2014or beta or even alpha, if it comes to that\u2014directly off the K8s source.<\/p>\n<p>I started with the <a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/tree\/master\/cluster\/centos\" target=\"_blank\" rel=\"noopener\">CentOS cluster installer<\/a>, and gradually modified it to suit Ubuntu 16.04 (luckily the changes were minimal). Most of the things were in line with the <a href=\"http:\/\/randomizd.blogspot.com\/2017\/09\/kubernetes-17-on-centos-this-is-how-we.html?m=1\" target=\"_blank\" rel=\"noopener\">installation for CentOS<\/a>, including artifact build (<code>make<\/code> at the <a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/tree\/release-1.7?files=1\" target=\"_blank\" rel=\"noopener\">source root<\/a>) and modifications to exclude custom downloads for <code>etcd<\/code>, <code>flanneld<\/code> and <code>docker<\/code> (I built the former two from their sources, and the latter I had already installed via the <code>apt<\/code> package manager). However the service configuration scripts had to be modified slightly to suit the Ubuntu (more precisely Debian) filesystem.<\/p>\n<p>In my case I run <a href=\"https:\/\/kubernetes.io\/docs\/admin\/kube-apiserver\/\" target=\"_blank\" rel=\"noopener\"><code>apiserver<\/code><\/a> on port <code>8090<\/code> rather than <code>8080<\/code> (to leave room for other application servers that are fond of <code>8080<\/code>), hence I had to do some additional changes to propagate the port change throughout the K8s platform.<\/p>\n<p>So, in summary, I had to utilize the following set of patches to get everything in place. If necessary, you could utilize them by applying them on top of the <code>v1.7.2-beta.0<\/code> tag (possibly even a different tag) of the K8s source using the <code>git apply<\/code> command.<\/p>\n<ol>\n<li>Skipping <code>etcd<\/code>, <code>flannel<\/code> and <code>docker<\/code> binaries:\n<pre class=\"brush:php\">diff --git a\/cluster\/centos\/build.sh b\/cluster\/centos\/build.sh\r\nindex 5d31437..df057e4 100755\r\n--- a\/cluster\/centos\/build.sh\r\n+++ b\/cluster\/centos\/build.sh\r\n@@ -42,19 +42,6 @@ function clean-up() {\r\n function download-releases() {\r\n   rm -rf ${RELEASES_DIR}\r\n   mkdir -p ${RELEASES_DIR}\r\n-\r\n-  echo \"Download flannel release v${FLANNEL_VERSION} ...\"\r\n-  curl -L ${FLANNEL_DOWNLOAD_URL} -o ${RELEASES_DIR}\/flannel.tar.gz\r\n-\r\n-  echo \"Download etcd release v${ETCD_VERSION} ...\"\r\n-  curl -L ${ETCD_DOWNLOAD_URL} -o ${RELEASES_DIR}\/etcd.tar.gz\r\n-\r\n-  echo \"Download kubernetes release v${K8S_VERSION} ...\"\r\n-  curl -L ${K8S_CLIENT_DOWNLOAD_URL} -o ${RELEASES_DIR}\/kubernetes-client-linux-amd64.tar.gz\r\n-  curl -L ${K8S_SERVER_DOWNLOAD_URL} -o ${RELEASES_DIR}\/kubernetes-server-linux-amd64.tar.gz\r\n-\r\n-  echo \"Download docker release v${DOCKER_VERSION} ...\"\r\n-  curl -L ${DOCKER_DOWNLOAD_URL} -o ${RELEASES_DIR}\/docker.tar.gz\r\n }\r\n \r\n function unpack-releases() {\r\n@@ -80,19 +67,12 @@ function unpack-releases() {\r\n   fi\r\n \r\n   # k8s\r\n-  if [[ -f ${RELEASES_DIR}\/kubernetes-client-linux-amd64.tar.gz ]] ; then\r\n-    tar xzf ${RELEASES_DIR}\/kubernetes-client-linux-amd64.tar.gz -C ${RELEASES_DIR}\r\n     cp ${RELEASES_DIR}\/kubernetes\/client\/bin\/kubectl ${BINARY_DIR}\r\n-  fi\r\n-\r\n-  if [[ -f ${RELEASES_DIR}\/kubernetes-server-linux-amd64.tar.gz ]] ; then\r\n-    tar xzf ${RELEASES_DIR}\/kubernetes-server-linux-amd64.tar.gz -C ${RELEASES_DIR}\r\n     cp ${RELEASES_DIR}\/kubernetes\/server\/bin\/kube-apiserver \\\r\n        ${RELEASES_DIR}\/kubernetes\/server\/bin\/kube-controller-manager \\\r\n        ${RELEASES_DIR}\/kubernetes\/server\/bin\/kube-scheduler ${BINARY_DIR}\/master\/bin\r\n     cp ${RELEASES_DIR}\/kubernetes\/server\/bin\/kubelet \\\r\n        ${RELEASES_DIR}\/kubernetes\/server\/bin\/kube-proxy ${BINARY_DIR}\/node\/bin\r\n-  fi\r\n \r\n   # docker\r\n   if [[ -f ${RELEASES_DIR}\/docker.tar.gz ]]; then\r\ndiff --git a\/cluster\/centos\/config-build.sh b\/cluster\/centos\/config-build.sh\r\nindex 4887bc1..39a2b25 100755\r\n--- a\/cluster\/centos\/config-build.sh\r\n+++ b\/cluster\/centos\/config-build.sh\r\n@@ -23,13 +23,13 @@ RELEASES_DIR=${RELEASES_DIR:-\/tmp\/downloads}\r\n DOCKER_VERSION=${DOCKER_VERSION:-\"1.12.1\"}\r\n \r\n # Define flannel version to use.\r\n-FLANNEL_VERSION=${FLANNEL_VERSION:-\"0.6.1\"}\r\n+FLANNEL_VERSION=${FLANNEL_VERSION:-\"0.8.0\"}\r\n \r\n # Define etcd version to use.\r\n-ETCD_VERSION=${ETCD_VERSION:-\"3.0.9\"}\r\n+ETCD_VERSION=${ETCD_VERSION:-\"3.2.2\"}\r\n \r\n # Define k8s version to use.\r\n-K8S_VERSION=${K8S_VERSION:-\"1.3.7\"}\r\n+K8S_VERSION=${K8S_VERSION:-\"1.7.0\"}\r\n \r\n DOCKER_DOWNLOAD_URL=\\\r\n \"https:\/\/get.docker.com\/builds\/Linux\/x86_64\/docker-${DOCKER_VERSION}.tgz\"\r\ndiff --git a\/cluster\/kube-up.sh b\/cluster\/kube-up.sh\r\nindex 7877fb9..9e793ce 100755\r\n--- a\/cluster\/kube-up.sh\r\n+++ b\/cluster\/kube-up.sh\r\n@@ -40,8 +40,6 @@ fi\r\n \r\n echo \"... calling verify-prereqs\" &gt;&amp;2\r\n verify-prereqs\r\n-echo \"... calling verify-kube-binaries\" &gt;&amp;2\r\n-verify-kube-binaries\r\n \r\n if [[ \"${KUBE_STAGE_IMAGES:-}\" == \"true\" ]]; then\r\n   echo \"... staging images\" &gt;&amp;2<\/pre>\n<\/li>\n<li>Changing <code>apiserver<\/code> listen port to <code>8090<\/code>, and binary (symlink) and service configuration file locations to Debian defaults:\n<pre class=\"brush:php; wrap-lines:false\">diff --git a\/cluster\/centos\/master\/scripts\/apiserver.sh b\/cluster\/centos\/master\/scripts\/apiserver.sh\r\nindex 6b7b1c2..62d24fd 100755\r\n--- a\/cluster\/centos\/master\/scripts\/apiserver.sh\r\n+++ b\/cluster\/centos\/master\/scripts\/apiserver.sh\r\n@@ -43,8 +43,8 @@ KUBE_ETCD_KEYFILE=\"--etcd-keyfile=\/srv\/kubernetes\/etcd\/client-key.pem\"\r\n # --insecure-bind-address=127.0.0.1: The IP address on which to serve the --insecure-port.\r\n KUBE_API_ADDRESS=\"--insecure-bind-address=0.0.0.0\"\r\n \r\n-# --insecure-port=8080: The port on which to serve unsecured, unauthenticated access.\r\n-KUBE_API_PORT=\"--insecure-port=8080\"\r\n+# --insecure-port=8090: The port on which to serve unsecured, unauthenticated access.\r\n+KUBE_API_PORT=\"--insecure-port=8090\"\r\n \r\n # --kubelet-port=10250: Kubelet port\r\n NODE_PORT=\"--kubelet-port=10250\"\r\n@@ -101,7 +101,7 @@ KUBE_APISERVER_OPTS=\"   \\${KUBE_LOGTOSTDERR}         \\\\\r\n                         \\${KUBE_API_TLS_PRIVATE_KEY_FILE}\"\r\n \r\n \r\n-cat &lt;&lt;EOF &gt;\/usr\/lib\/systemd\/system\/kube-apiserver.service\r\n+cat &lt;&lt;EOF &gt;\/lib\/systemd\/system\/kube-apiserver.service\r\n [Unit]\r\n Description=Kubernetes API Server\r\n Documentation=https:\/\/github.com\/kubernetes\/kubernetes\r\ndiff --git a\/cluster\/centos\/master\/scripts\/controller-manager.sh b\/cluster\/centos\/master\/scripts\/controller-manager.sh\r\nindex 3025d06..5aa0f12 100755\r\n--- a\/cluster\/centos\/master\/scripts\/controller-manager.sh\r\n+++ b\/cluster\/centos\/master\/scripts\/controller-manager.sh\r\n@@ -20,7 +20,7 @@ MASTER_ADDRESS=${1:-\"8.8.8.18\"}\r\n cat &lt;&lt;EOF &gt;\/opt\/kubernetes\/cfg\/kube-controller-manager\r\n KUBE_LOGTOSTDERR=\"--logtostderr=true\"\r\n KUBE_LOG_LEVEL=\"--v=4\"\r\n-KUBE_MASTER=\"--master=${MASTER_ADDRESS}:8080\"\r\n+KUBE_MASTER=\"--master=${MASTER_ADDRESS}:8090\"\r\n \r\n # --root-ca-file=\"\": If set, this root certificate authority will be included in\r\n # service account's token secret. This must be a valid PEM-encoded CA bundle.\r\n@@ -41,7 +41,7 @@ KUBE_CONTROLLER_MANAGER_OPTS=\"  \\${KUBE_LOGTOSTDERR} \\\\\r\n                                 \\${KUBE_CONTROLLER_MANAGER_SERVICE_ACCOUNT_PRIVATE_KEY_FILE}\\\\\r\n                                 \\${KUBE_LEADER_ELECT}\"\r\n \r\n-cat &lt;&lt;EOF &gt;\/usr\/lib\/systemd\/system\/kube-controller-manager.service\r\n+cat &lt;&lt;EOF &gt;\/lib\/systemd\/system\/kube-controller-manager.service\r\n [Unit]\r\n Description=Kubernetes Controller Manager\r\n Documentation=https:\/\/github.com\/kubernetes\/kubernetes\r\ndiff --git a\/cluster\/centos\/master\/scripts\/etcd.sh b\/cluster\/centos\/master\/scripts\/etcd.sh\r\nindex aa73b57..34eff5c 100755\r\n--- a\/cluster\/centos\/master\/scripts\/etcd.sh\r\n+++ b\/cluster\/centos\/master\/scripts\/etcd.sh\r\n@@ -64,7 +64,7 @@ ETCD_PEER_CERT_FILE=\"\/srv\/kubernetes\/etcd\/peer-${ETCD_NAME}.pem\"\r\n ETCD_PEER_KEY_FILE=\"\/srv\/kubernetes\/etcd\/peer-${ETCD_NAME}-key.pem\"\r\n EOF\r\n \r\n-cat &lt;&lt;EOF &gt;\/\/usr\/lib\/systemd\/system\/etcd.service\r\n+cat &lt;&lt;EOF &gt;\/lib\/systemd\/system\/etcd.service\r\n [Unit]\r\n Description=Etcd Server\r\n After=network.target\r\ndiff --git a\/cluster\/centos\/master\/scripts\/flannel.sh b\/cluster\/centos\/master\/scripts\/flannel.sh\r\nindex 092fcd8..21e2bbe 100644\r\n--- a\/cluster\/centos\/master\/scripts\/flannel.sh\r\n+++ b\/cluster\/centos\/master\/scripts\/flannel.sh\r\n@@ -30,7 +30,7 @@ FLANNEL_ETCD_CERTFILE=\"--etcd-certfile=${CERT_FILE}\"\r\n FLANNEL_ETCD_KEYFILE=\"--etcd-keyfile=${KEY_FILE}\"\r\n EOF\r\n \r\n-cat &lt;&lt;EOF &gt;\/usr\/lib\/systemd\/system\/flannel.service\r\n+cat &lt;&lt;EOF &gt;\/lib\/systemd\/system\/flannel.service\r\n [Unit]\r\n Description=Flanneld overlay address etcd agent\r\n After=network.target\r\ndiff --git a\/cluster\/centos\/master\/scripts\/scheduler.sh b\/cluster\/centos\/master\/scripts\/scheduler.sh\r\nindex 1a68d71..3b444bf 100755\r\n--- a\/cluster\/centos\/master\/scripts\/scheduler.sh\r\n+++ b\/cluster\/centos\/master\/scripts\/scheduler.sh\r\n@@ -27,7 +27,7 @@ KUBE_LOGTOSTDERR=\"--logtostderr=true\"\r\n # --v=0: log level for V logs\r\n KUBE_LOG_LEVEL=\"--v=4\"\r\n \r\n-KUBE_MASTER=\"--master=${MASTER_ADDRESS}:8080\"\r\n+KUBE_MASTER=\"--master=${MASTER_ADDRESS}:8090\"\r\n \r\n # --leader-elect\r\n KUBE_LEADER_ELECT=\"--leader-elect\"\r\n@@ -43,7 +43,7 @@ KUBE_SCHEDULER_OPTS=\"   \\${KUBE_LOGTOSTDERR}     \\\\\r\n                         \\${KUBE_LEADER_ELECT}    \\\\\r\n                         \\${KUBE_SCHEDULER_ARGS}\"\r\n \r\n-cat &lt;&lt;EOF &gt;\/usr\/lib\/systemd\/system\/kube-scheduler.service\r\n+cat &lt;&lt;EOF &gt;\/lib\/systemd\/system\/kube-scheduler.service\r\n [Unit]\r\n Description=Kubernetes Scheduler\r\n Documentation=https:\/\/github.com\/kubernetes\/kubernetes\r\ndiff --git a\/cluster\/centos\/node\/bin\/mk-docker-opts.sh b\/cluster\/centos\/node\/bin\/mk-docker-opts.sh\r\nindex 041d977..177ee9f 100755\r\n--- a\/cluster\/centos\/node\/bin\/mk-docker-opts.sh\r\n+++ b\/cluster\/centos\/node\/bin\/mk-docker-opts.sh\r\n@@ -69,7 +69,6 @@ done\r\n \r\n if [[ $indiv_opts = false ]] &amp;&amp; [[ $combined_opts = false ]]; then\r\n   indiv_opts=true\r\n-  combined_opts=true\r\n fi\r\n \r\n if [[ -f \"$flannel_env\" ]]; then\r\ndiff --git a\/cluster\/centos\/node\/scripts\/docker.sh b\/cluster\/centos\/node\/scripts\/docker.sh\r\nindex 320446a..b0312fc 100755\r\n--- a\/cluster\/centos\/node\/scripts\/docker.sh\r\n+++ b\/cluster\/centos\/node\/scripts\/docker.sh\r\n@@ -20,10 +20,10 @@ DOCKER_OPTS=${1:-\"\"}\r\n DOCKER_CONFIG=\/opt\/kubernetes\/cfg\/docker\r\n \r\n cat &lt;&lt;EOF &gt;$DOCKER_CONFIG\r\n-DOCKER_OPTS=\"-H tcp:\/\/127.0.0.1:4243 -H unix:\/\/\/var\/run\/docker.sock -s overlay --selinux-enabled=false ${DOCKER_OPTS}\"\r\n+DOCKER_OPTS=\"-H tcp:\/\/127.0.0.1:4243 -H unix:\/\/\/var\/run\/docker.sock -s aufs --selinux-enabled=false ${DOCKER_OPTS}\"\r\n EOF\r\n \r\n-cat &lt;&lt;EOF &gt;\/usr\/lib\/systemd\/system\/docker.service\r\n+cat &lt;&lt;EOF &gt;\/lib\/systemd\/system\/docker.service\r\n [Unit]\r\n Description=Docker Application Container Engine\r\n Documentation=http:\/\/docs.docker.com\r\n@@ -35,7 +35,7 @@ Type=notify\r\n EnvironmentFile=-\/run\/flannel\/docker\r\n EnvironmentFile=-\/opt\/kubernetes\/cfg\/docker\r\n WorkingDirectory=\/opt\/kubernetes\/bin\r\n-ExecStart=\/opt\/kubernetes\/bin\/dockerd \\$DOCKER_OPT_BIP \\$DOCKER_OPT_MTU \\$DOCKER_OPTS\r\n+ExecStart=\/usr\/bin\/dockerd \\$DOCKER_OPT_BIP \\$DOCKER_OPT_MTU \\$DOCKER_OPTS\r\n LimitNOFILE=1048576\r\n LimitNPROC=1048576\r\n \r\ndiff --git a\/cluster\/centos\/node\/scripts\/flannel.sh b\/cluster\/centos\/node\/scripts\/flannel.sh\r\nindex 2830dae..a927bb2 100755\r\n--- a\/cluster\/centos\/node\/scripts\/flannel.sh\r\n+++ b\/cluster\/centos\/node\/scripts\/flannel.sh\r\n@@ -30,7 +30,7 @@ FLANNEL_ETCD_CERTFILE=\"--etcd-certfile=${CERT_FILE}\"\r\n FLANNEL_ETCD_KEYFILE=\"--etcd-keyfile=${KEY_FILE}\"\r\n EOF\r\n \r\n-cat &lt;&lt;EOF &gt;\/usr\/lib\/systemd\/system\/flannel.service\r\n+cat &lt;&lt;EOF &gt;\/lib\/systemd\/system\/flannel.service\r\n [Unit]\r\n Description=Flanneld overlay address etcd agent\r\n After=network.target\r\ndiff --git a\/cluster\/centos\/node\/scripts\/kubelet.sh b\/cluster\/centos\/node\/scripts\/kubelet.sh\r\nindex 323a03e..4c93015 100755\r\n--- a\/cluster\/centos\/node\/scripts\/kubelet.sh\r\n+++ b\/cluster\/centos\/node\/scripts\/kubelet.sh\r\n@@ -39,7 +39,7 @@ NODE_HOSTNAME=\"--hostname-override=${NODE_ADDRESS}\"\r\n \r\n # --api-servers=[]: List of Kubernetes API servers for publishing events,\r\n # and reading pods and services. (ip:port), comma separated.\r\n-KUBELET_API_SERVER=\"--api-servers=${MASTER_ADDRESS}:8080\"\r\n+KUBELET_API_SERVER=\"--api-servers=${MASTER_ADDRESS}:8090\"\r\n \r\n # --allow-privileged=false: If true, allow containers to request privileged mode. [default=false]\r\n KUBE_ALLOW_PRIV=\"--allow-privileged=false\"\r\n@@ -63,7 +63,7 @@ KUBE_PROXY_OPTS=\"   \\${KUBE_LOGTOSTDERR}     \\\\\r\n                     \\${KUBELET_DNS_DOMAIN}      \\\\\r\n                     \\${KUBELET_ARGS}\"\r\n \r\n-cat &lt;&lt;EOF &gt;\/usr\/lib\/systemd\/system\/kubelet.service\r\n+cat &lt;&lt;EOF &gt;\/lib\/systemd\/system\/kubelet.service\r\n [Unit]\r\n Description=Kubernetes Kubelet\r\n After=docker.service\r\ndiff --git a\/cluster\/centos\/node\/scripts\/proxy.sh b\/cluster\/centos\/node\/scripts\/proxy.sh\r\nindex 584987b..1f365fb 100755\r\n--- a\/cluster\/centos\/node\/scripts\/proxy.sh\r\n+++ b\/cluster\/centos\/node\/scripts\/proxy.sh\r\n@@ -29,7 +29,7 @@ KUBE_LOG_LEVEL=\"--v=4\"\r\n NODE_HOSTNAME=\"--hostname-override=${NODE_ADDRESS}\"\r\n \r\n # --master=\"\": The address of the Kubernetes API server (overrides any value in kubeconfig)\r\n-KUBE_MASTER=\"--master=http:\/\/${MASTER_ADDRESS}:8080\"\r\n+KUBE_MASTER=\"--master=http:\/\/${MASTER_ADDRESS}:8090\"\r\n EOF\r\n \r\n KUBE_PROXY_OPTS=\"   \\${KUBE_LOGTOSTDERR} \\\\\r\n@@ -37,7 +37,7 @@ KUBE_PROXY_OPTS=\"   \\${KUBE_LOGTOSTDERR} \\\\\r\n                     \\${NODE_HOSTNAME}    \\\\\r\n                     \\${KUBE_MASTER}\"\r\n \r\n-cat &lt;&lt;EOF &gt;\/usr\/lib\/systemd\/system\/kube-proxy.service\r\n+cat &lt;&lt;EOF &gt;\/lib\/systemd\/system\/kube-proxy.service\r\n [Unit]\r\n Description=Kubernetes Proxy\r\n After=network.target\r\ndiff --git a\/cluster\/centos\/util.sh b\/cluster\/centos\/util.sh\r\nindex 88302a3..dbb3ca5 100755\r\n--- a\/cluster\/centos\/util.sh\r\n+++ b\/cluster\/centos\/util.sh\r\n@@ -136,7 +136,7 @@ function kube-up() {\r\n \r\n   # set CONTEXT and KUBE_SERVER values for create-kubeconfig() and get-password()\r\n   export CONTEXT=\"centos\"\r\n-  export KUBE_SERVER=\"http:\/\/${MASTER_ADVERTISE_ADDRESS}:8080\"\r\n+  export KUBE_SERVER=\"http:\/\/${MASTER_ADVERTISE_ADDRESS}:8090\"\r\n   source \"${KUBE_ROOT}\/cluster\/common.sh\"\r\n \r\n   # set kubernetes user and password\r\n@@ -199,7 +199,7 @@ function troubleshoot-node() {\r\n function tear-down-master() {\r\n echo \"[INFO] tear-down-master on $1\"\r\n   for service_name in etcd kube-apiserver kube-controller-manager kube-scheduler ; do\r\n-      service_file=\"\/usr\/lib\/systemd\/system\/${service_name}.service\"\r\n+      service_file=\"\/lib\/systemd\/system\/${service_name}.service\"\r\n       kube-ssh \"$1\" \" \\\r\n         if [[ -f $service_file ]]; then \\\r\n           sudo systemctl stop $service_name; \\\r\n@@ -217,7 +217,7 @@ echo \"[INFO] tear-down-master on $1\"\r\n function tear-down-node() {\r\n echo \"[INFO] tear-down-node on $1\"\r\n   for service_name in kube-proxy kubelet docker flannel ; do\r\n-      service_file=\"\/usr\/lib\/systemd\/system\/${service_name}.service\"\r\n+      service_file=\"\/lib\/systemd\/system\/${service_name}.service\"\r\n       kube-ssh \"$1\" \" \\\r\n         if [[ -f $service_file ]]; then \\\r\n           sudo systemctl stop $service_name; \\<\/pre>\n<\/li>\n<\/ol>\n<p>With these changes in place, installing K8s on my machine was straightforward, which included simply running this command from within the <code>cluster<\/code> directory of the patched source:<\/p>\n<pre class=\"brush:php\">MASTER=janaka@10.0.0.1 \\\r\nNODES=janaka@10.0.0.1 \\\r\nDOCKER_OPTS=\"--insecure-registry=hub.adroitlogic.com:5000\" \\\r\nKUBERNETES_PROVIDER=centos \\\r\nCERT_GROUP=janaka \\\r\n.\/kube-up.sh<\/pre>\n<ol>\n<li>Because the certificate generation process has problems with <code>localhost<\/code> or <code>127.0.0.1<\/code> I had to use a static IP (<code>10.0.0.1<\/code>) assigned to one of my network interfaces.<\/li>\n<li>I have one master and one worker node, both of which are my own machine itself.<\/li>\n<li><code>janaka<\/code> is the username on my local machine.<\/li>\n<li>We have a local Docker hub for holding our IPS images, at <code>hub.adroitlogic.com:5000<\/code> (resolved via internal hostname mappings), which we need to inject to the Docker startup script (in order to be able to utilize our own images within the future IPS set-up).<\/li>\n<\/ol>\n<p>Takeaway?<\/p>\n<ul>\n<li>learned a bit about how K8s components fit together,<\/li>\n<li>added quite a bit of shell scripting tips and tricks to my book of knowledge,<\/li>\n<li>had my 101 on [Linux services (<code>systemd<\/code>)],<\/li>\n<li>skipped one lunch,<\/li>\n<li>fought several hours of frustration,<\/li>\n<li>and finally felt a truckload of satisfaction, which flushed out the frustration without a trace.<\/li>\n<\/ul>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/randomizd.blogspot.com\/2017\/09\/how-to-get-kubernetes-running-on-your.html\">How to Get Kubernetes Running &#8211; On Your Own Ubuntu Machine!<\/a> from our <a href=\"http:\/\/www.systemcodegeeks.com\/join-us\/scg\/\">SCG partner<\/a> Janaka Bandara at the <a href=\"http:\/\/randomizd.blogspot.com\">Randomizd | Random Thoughts Serialized<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Note: This article largely borrows from my previous writeup on installing K8s 1.7 on CentOS. Getting a local K8s cluster up and running is one of the first &#8220;baby steps&#8221; of toddling into the K8s ecosystem. While it would often be considered easier (and safer) to get K8s set up in a cluster of virtual &hellip;<\/p>\n","protected":false},"author":300,"featured_media":188,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[39],"tags":[],"class_list":["post-3063","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Get Kubernetes Running - On Your Own Ubuntu Machine! - System Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Note: This article largely borrows from my previous writeup on installing K8s 1.7 on CentOS. Getting a local K8s cluster up and running is one of the\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Get Kubernetes Running - On Your Own Ubuntu Machine! - System Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Note: This article largely borrows from my previous writeup on installing K8s 1.7 on CentOS. Getting a local K8s cluster up and running is one of the\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/\" \/>\n<meta property=\"og:site_name\" content=\"System Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/systemcodegeeks\" \/>\n<meta property=\"article:author\" content=\"https:\/\/m.facebook.com\/ukjubandara\/\" \/>\n<meta property=\"article:published_time\" content=\"2017-09-13T14:15:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/devops-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Janaka Bandara\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@janakaud\" \/>\n<meta name=\"twitter:site\" content=\"@systemcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Janaka Bandara\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/\"},\"author\":{\"name\":\"Janaka Bandara\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/0003dc4337b73d54d7384cdd7ec44e6e\"},\"headline\":\"How to Get Kubernetes Running &#8211; On Your Own Ubuntu Machine!\",\"datePublished\":\"2017-09-13T14:15:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/\"},\"wordCount\":759,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/devops-logo.jpg\",\"articleSection\":[\"DevOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/\",\"url\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/\",\"name\":\"How to Get Kubernetes Running - On Your Own Ubuntu Machine! - System Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/devops-logo.jpg\",\"datePublished\":\"2017-09-13T14:15:04+00:00\",\"description\":\"Note: This article largely borrows from my previous writeup on installing K8s 1.7 on CentOS. Getting a local K8s cluster up and running is one of the\",\"breadcrumb\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#primaryimage\",\"url\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/devops-logo.jpg\",\"contentUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/devops-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.systemcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\/\/www.systemcodegeeks.com\/category\/devops\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Get Kubernetes Running &#8211; On Your Own Ubuntu Machine!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#website\",\"url\":\"https:\/\/www.systemcodegeeks.com\/\",\"name\":\"System Code Geeks\",\"description\":\"Operating System Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.systemcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.systemcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/systemcodegeeks\",\"https:\/\/x.com\/systemcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/0003dc4337b73d54d7384cdd7ec44e6e\",\"name\":\"Janaka Bandara\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c80abe449651e6f36269b02e1dc5ce942bc5c51a4e857cb8bea2b02a04793772?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c80abe449651e6f36269b02e1dc5ce942bc5c51a4e857cb8bea2b02a04793772?s=96&d=mm&r=g\",\"caption\":\"Janaka Bandara\"},\"description\":\"A budding software engineer in the enterprise integration space, and a simplistic guy who likes to learn, appreciate, help, share, and enjoy life\",\"sameAs\":[\"http:\/\/randomizd.blogspot.com\",\"https:\/\/m.facebook.com\/ukjubandara\/\",\"https:\/\/www.linkedin.com\/in\/janakaubandara\",\"https:\/\/x.com\/janakaud\"],\"url\":\"https:\/\/www.systemcodegeeks.com\/author\/janaka-bandara\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Get Kubernetes Running - On Your Own Ubuntu Machine! - System Code Geeks - 2026","description":"Note: This article largely borrows from my previous writeup on installing K8s 1.7 on CentOS. Getting a local K8s cluster up and running is one of the","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/","og_locale":"en_US","og_type":"article","og_title":"How to Get Kubernetes Running - On Your Own Ubuntu Machine! - System Code Geeks - 2026","og_description":"Note: This article largely borrows from my previous writeup on installing K8s 1.7 on CentOS. Getting a local K8s cluster up and running is one of the","og_url":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/","og_site_name":"System Code Geeks","article_publisher":"https:\/\/www.facebook.com\/systemcodegeeks","article_author":"https:\/\/m.facebook.com\/ukjubandara\/","article_published_time":"2017-09-13T14:15:04+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/devops-logo.jpg","type":"image\/jpeg"}],"author":"Janaka Bandara","twitter_card":"summary_large_image","twitter_creator":"@janakaud","twitter_site":"@systemcodegeeks","twitter_misc":{"Written by":"Janaka Bandara","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#article","isPartOf":{"@id":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/"},"author":{"name":"Janaka Bandara","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/0003dc4337b73d54d7384cdd7ec44e6e"},"headline":"How to Get Kubernetes Running &#8211; On Your Own Ubuntu Machine!","datePublished":"2017-09-13T14:15:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/"},"wordCount":759,"commentCount":0,"publisher":{"@id":"https:\/\/www.systemcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#primaryimage"},"thumbnailUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/devops-logo.jpg","articleSection":["DevOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/","url":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/","name":"How to Get Kubernetes Running - On Your Own Ubuntu Machine! - System Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.systemcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#primaryimage"},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#primaryimage"},"thumbnailUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/devops-logo.jpg","datePublished":"2017-09-13T14:15:04+00:00","description":"Note: This article largely borrows from my previous writeup on installing K8s 1.7 on CentOS. Getting a local K8s cluster up and running is one of the","breadcrumb":{"@id":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#primaryimage","url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/devops-logo.jpg","contentUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/devops-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.systemcodegeeks.com\/devops\/get-kubernetes-running-ubuntu-machine\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.systemcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"DevOps","item":"https:\/\/www.systemcodegeeks.com\/category\/devops\/"},{"@type":"ListItem","position":3,"name":"How to Get Kubernetes Running &#8211; On Your Own Ubuntu Machine!"}]},{"@type":"WebSite","@id":"https:\/\/www.systemcodegeeks.com\/#website","url":"https:\/\/www.systemcodegeeks.com\/","name":"System Code Geeks","description":"Operating System Developers Resource Center","publisher":{"@id":"https:\/\/www.systemcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.systemcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.systemcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.systemcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/systemcodegeeks","https:\/\/x.com\/systemcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/0003dc4337b73d54d7384cdd7ec44e6e","name":"Janaka Bandara","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c80abe449651e6f36269b02e1dc5ce942bc5c51a4e857cb8bea2b02a04793772?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c80abe449651e6f36269b02e1dc5ce942bc5c51a4e857cb8bea2b02a04793772?s=96&d=mm&r=g","caption":"Janaka Bandara"},"description":"A budding software engineer in the enterprise integration space, and a simplistic guy who likes to learn, appreciate, help, share, and enjoy life","sameAs":["http:\/\/randomizd.blogspot.com","https:\/\/m.facebook.com\/ukjubandara\/","https:\/\/www.linkedin.com\/in\/janakaubandara","https:\/\/x.com\/janakaud"],"url":"https:\/\/www.systemcodegeeks.com\/author\/janaka-bandara\/"}]}},"_links":{"self":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts\/3063","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/users\/300"}],"replies":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/comments?post=3063"}],"version-history":[{"count":0,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts\/3063\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/media\/188"}],"wp:attachment":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/media?parent=3063"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/categories?post=3063"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/tags?post=3063"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}