diff --git a/Makefile b/Makefile index c082093..aced825 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,19 @@ +# Docker Image Options +DOCKER_REGISTRY ?= quay.io +DOCKER_FORCE_CLEAN ?= true +DOCKER_IMAGE_NAME ?= sip +DOCKER_IMAGE_PREFIX ?= airshipit +DOCKER_IMAGE_TAG ?= latest +DOCKER_TARGET_STAGE ?= release +PUBLISH ?= false + # Image URL to use all building/pushing image targets #IMG ?= controller:latest -IMG ?= quay.io/airshipit/sip +IMG ?= $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_PREFIX)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) # Produce CRDs that work back to Kubernetes 1.11 (no version conversion) CRD_OPTIONS ?= "crd:trivialVersions=true" -# Name of the kind cluster that will be created by kind-create target -KIND_CLUSTER_NAME ?= sip-cluster - TOOLBINDIR := tools/bin # linting @@ -26,6 +32,9 @@ DOCKER_PROXY_FLAGS := --build-arg http_proxy=$(HTTP_PROXY) DOCKER_PROXY_FLAGS += --build-arg https_proxy=$(HTTPS_PROXY) DOCKER_PROXY_FLAGS += --build-arg NO_PROXY=$(NO_PROXY) +kubernetes: + ./tools/deployment/install-k8s.sh + all: manager # Run tests @@ -78,14 +87,6 @@ docker-build: docker-push: docker push ${IMG} -# Create kind cluster -kind-create: - kind create cluster --name ${KIND_CLUSTER_NAME} - -# Build docker container and load it into running kind cluster -kind-load-image: docker-build - kind load docker-image ${IMG} --name ${KIND_CLUSTER_NAME} - # find or download controller-gen # download controller-gen if necessary controller-gen: diff --git a/README.md b/README.md index 58a3fe3..8ee004d 100644 --- a/README.md +++ b/README.md @@ -72,36 +72,68 @@ SIPCluster CR will exists within the Control phase for a Tenant cluster. ## Development environment -### Kind kubernetes cluster -Fastest way to set up a k8s cluster for development env is to use kind to set it up +### Pre-requisites -#### Install kind on linux (amd64 arch) +#### Install Golang 1.15+ + +SIP is a project written in Go, and the make targets used to deploy SIP leverage both Go and +Kustomize commands which require Golang be installed. + +For detailed installation instructions, please see the [Golang installation guide](https://golang.org/doc/install). + +#### Install Kustomize v3.2.3+ + +In order to apply manifests to your cluster via Make targets we suggest the use of Kustomize. + +For detailed installation instructions, please see the [Kustomize installation guide](https://kubectl.docs.kubernetes.io/installation/kustomize/). + +#### Proxy Setup + +If your organization requires development behind a proxy server, you will need to define the +following environment variables with your organization's information: ``` -# curl -Lo kind https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64 -# sudo install -m 755 --owner=root --group=root kind /usr/local/bin -# rm kind +HTTP_PROXY=http://username:password@host:port +HTTPS_PROXY=http://username:password@host:port +NO_PROXY="localhost,127.0.0.1,10.96.0.0/12" +PROXY=http://username:password@host:port +USE_PROXY=true ``` -More information on how to install kind binary can be found be found [here](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) +10.96.0.0/12 is the Kubernetes service CIDR. -#### Create k8s cluster with kind +#### Deploy kubernetes using minikube and create k8s cluster ``` -# make kind-create +# ./tools/deployment/install-k8s.sh +``` + +### Deploy SIP + +``` +# make docker-build # kubectl get nodes -``` - -### Deploy SIP operator on top of kind cluster -kind-load-image target will build docker image from the current state of your local -git repository and upload it to kind cluster to be available for kubelet. - -``` -# make kind-load-image # make deploy ``` -Now you have a working k8s cluster with sip installed on it with your changes to SIP operator +By now, you should have a working cluster with ViNO deployed on top of it. + +``` +kubectl get pods -A +NAMESPACE NAME READY STATUS RESTARTS AGE +kube-system calico-kube-controllers-744cfdf676-428vp 1/1 Running 0 4h30m +kube-system calico-node-pgr4k 1/1 Running 0 4h30m +kube-system coredns-f9fd979d6-qk2dc 1/1 Running 0 4h30m +kube-system etcd-govino 1/1 Running 0 4h30m +kube-system kube-apiserver-govino 1/1 Running 0 4h30m +kube-system kube-controller-manager-govino 1/1 Running 0 4h30m +kube-system kube-proxy-6wx46 1/1 Running 0 4h30m +kube-system kube-scheduler-govino 1/1 Running 0 4h30m +kube-system storage-provisioner 1/1 Running 0 4h30m +sipcluster-system sipcluster-controller-manager-59c7dddcb-65lcb 2/2 Running 0 3h47m +``` + + ### Deliver SIP CRs to kubernetes diff --git a/playbooks/integration-tests.yaml b/playbooks/integration-tests.yaml new file mode 100644 index 0000000..4297298 --- /dev/null +++ b/playbooks/integration-tests.yaml @@ -0,0 +1,23 @@ +- hosts: ubuntu-bionic + tasks: + - name: Run ensure-docker + include_role: + name: ensure-docker + - name: Install Dependent Packages + apt: + pkg: + - debconf + - make + - wget + - snapd + become: yes + - name: Set up requirements for kubernetes + include_role: + name: clear-firewall + - name: Install kubernetes and Deploy Sip + shell: | + set -xe; + ./tools/deployment/install-k8s.sh + ./tools/deployment/deploy-sip.sh + args: + chdir: "{{ zuul.project.src_dir }}" \ No newline at end of file diff --git a/tools/deployment/deploy-sip.sh b/tools/deployment/deploy-sip.sh new file mode 100755 index 0000000..6c5c515 --- /dev/null +++ b/tools/deployment/deploy-sip.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -xe +sudo snap install kustomize && sudo snap install go --classic +make docker-build +kubectl wait --for=condition=Ready pods --all -A --timeout=180s +make deploy +#Wait for sip controller manager Pod. +kubectl wait -n sipcluster-system pod -l control-plane=controller-manager --for=condition=ready --timeout=240s +kubectl get po -A \ No newline at end of file diff --git a/tools/deployment/install-k8s.sh b/tools/deployment/install-k8s.sh new file mode 100755 index 0000000..12e30d1 --- /dev/null +++ b/tools/deployment/install-k8s.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +set -ex + +: ${KUBE_VERSION:="v1.19.2"} +: ${MINIKUBE_VERSION:="v1.16.0"} +: ${UPSTREAM_DNS_SERVER:="8.8.4.4"} +: ${DNS_DOMAIN:="cluster.local"} +: ${CALICO_VERSION:="v3.17"} +: ${CNI_MANIFEST_PATH:="/tmp/calico.yaml"} + +export DEBCONF_NONINTERACTIVE_SEEN=true +export DEBIAN_FRONTEND=noninteractive +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + +sudo apt-key fingerprint 0EBFCD88 + +sudo add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) \ + stable" + +sudo -E apt-get update + +sudo -E apt-get install -y \ + docker-ce \ + docker-ce-cli \ + containerd.io \ + socat \ + jq \ + util-linux \ + nfs-common \ + bridge-utils \ + iptables \ + conntrack \ + libffi-dev + +# Prepare tmpfs for etcd +sudo mkdir -p /data +sudo mount -t tmpfs -o size=512m tmpfs /data + +# Download calico manifest +if [ ! -f "$CNI_MANIFEST_PATH" ]; then + curl -Ss https://docs.projectcalico.org/"${CALICO_VERSION}"/manifests/calico.yaml -o ${CNI_MANIFEST_PATH} +fi + +# Install minikube and kubectl +URL="https://storage.googleapis.com" +sudo -E curl -sSLo /usr/local/bin/minikube "${URL}"/minikube/releases/"${MINIKUBE_VERSION}"/minikube-linux-amd64 +sudo -E curl -sSLo /usr/local/bin/kubectl "${URL}"/kubernetes-release/release/"${KUBE_VERSION}"/bin/linux/amd64/kubectl +sudo -E chmod +x /usr/local/bin/minikube +sudo -E chmod +x /usr/local/bin/kubectl + +export CHANGE_MINIKUBE_NONE_USER=true +export MINIKUBE_IN_STYLE=false + +sudo -E minikube start \ + --kubernetes-version="${KUBE_VERSION}" \ + --embed-certs=true \ + --interactive=false \ + --driver=none \ + --wait=apiserver,system_pods,node_ready \ + --wait-timeout=6m0s \ + --network-plugin=cni \ + --cni=${CNI_MANIFEST_PATH} \ + --extra-config=kube-proxy.mode=ipvs \ + --extra-config=controller-manager.allocate-node-cidrs=true \ + --extra-config=controller-manager.cluster-cidr=192.168.0.0/16 \ + --extra-config=kubeadm.pod-network-cidr=192.168.0.0/16 \ + --extra-config=kubelet.resolv-conf=/run/systemd/resolve/resolv.conf + +kubectl get nodes -o wide +kubectl get pod -A + +cat <