From 4e088cc5d21523f1e7394dae490563ea936589db Mon Sep 17 00:00:00 2001 From: Tristan Cacqueray Date: Wed, 10 Apr 2019 02:49:54 +0000 Subject: [PATCH] Add nodepool deployment --- README.md | 10 ++- ansible/group_vars/all.yaml | 12 ++++ ansible/roles/create_config/tasks/main.yaml | 65 +++++++++++++++++ .../tasks/create_nodepool_deployment.yaml | 72 +++++++++++++++++++ ansible/roles/deploy/tasks/main.yaml | 6 ++ ansible/roles/get_status/tasks/main.yaml | 2 + 6 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 ansible/roles/deploy/tasks/create_nodepool_deployment.yaml diff --git a/README.md b/README.md index 96d01df..3ae5177 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ A Zuul Operator PoC * [OKD](https://github.com/openshift/origin/releases/download/v3.11.0/openshift-origin-client-tools-v3.11.0-0cbc58b-linux-64bit.tar.gz) * [SDK](https://github.com/operator-framework/operator-sdk#quick-start) * [Zookeeper Operator](https://github.com/pravega/zookeeper-operator#install-the-operator) +* [Postgresql Operator](https://operatorhub.io/operator/alpha/postgres-operator.v3.5.0) ## Prepare cluster @@ -78,7 +79,11 @@ metadata: name: example-zuul spec: # Optional user-provided ssh key - sshsecretename: "" + #sshsecretename: "" + # Optional user-provided clouds.yaml + #cloudssecretname: "" + # Optional user-provided kube/config + #kubesecretname: "" merger: min: 0 max: 10 @@ -87,6 +92,8 @@ spec: max: 5 web: min: 1 + launcher: + min: 1 connections: [] tenants: - tenant: @@ -106,6 +113,7 @@ ssh-rsa AAAAB3Nza... $ oc get pods NAME READY STATUS RESTARTS AGE example-zuul-executor-696f969c4-6cpjv 1/1 Running 0 8s +example-zuul-launcher-5974789746-wbwpv 1/1 Running 0 9s example-zuul-pg-5dfc477bff-8426l 1/1 Running 0 30s example-zuul-scheduler-77b6cf7967-ksh64 1/1 Running 0 11s example-zuul-web-5f744f89c9-qjp9l 1/1 Running 0 6s diff --git a/ansible/group_vars/all.yaml b/ansible/group_vars/all.yaml index 9e88908..32aebd1 100644 --- a/ansible/group_vars/all.yaml +++ b/ansible/group_vars/all.yaml @@ -7,6 +7,12 @@ tenants: name: demo source: {} connections: [] +providers: [] +labels: + - name: okd-fedora + min-ready: 1 +launcher: + min: 1 merger: min: 0 max: 5 @@ -22,17 +28,23 @@ state: "present" zuul_app_name: "zuul" zuul_cluster_name: "{{ meta.name }}" sshsecretname: "{{ zuul_cluster_name }}-ssh-secret" +kubesecretname: "{{ zuul_cluster_name }}-kube-secret" +cloudssecretname: "{{ zuul_cluster_name }}-clouds-secret" zuul_version: "latest" #"3.7.1" +nodepool_version: "latest" # Use local image for https://review.openstack.org/650246 #zuul_image_name_base: "docker.io/zuul/zuul" +#nodepool_image_name_base: "docker.io/zuul/nodepool" zuul_image_name_base: "172.30.1.1:5000/myproject/zuul" +nodepool_image_name_base: "172.30.1.1:5000/myproject/nodepool" zuul_image_name: scheduler: "{{ zuul_image_name_base }}-scheduler:{{ zuul_version }}" merger: "{{ zuul_image_name_base }}-merger:{{ zuul_version }}" executor: "{{ zuul_image_name_base }}-executor:{{ zuul_version }}" web: "{{ zuul_image_name_base }}-web:{{ zuul_version }}" + launcher: "{{ nodepool_image_name_base }}-launcher:{{ nodepool_version }}" zuul_service_account_name: "zuul-operator" zuul_image_pull_policy: "IfNotPresent" diff --git a/ansible/roles/create_config/tasks/main.yaml b/ansible/roles/create_config/tasks/main.yaml index e9e9131..0681660 100644 --- a/ansible/roles/create_config/tasks/main.yaml +++ b/ansible/roles/create_config/tasks/main.yaml @@ -69,6 +69,48 @@ # TODO: cleanup key file from operator pod +- name: Create cloud config + when: not zuul_clouds_secret + k8s: + state: "{{ state }}" + definition: + apiVersion: v1 + kind: Secret + metadata: + labels: + app: "{{ zuul_app_name }}" + zuul_cluster: "{{ zuul_cluster_name }}" + name: "{{ cloudssecretname }}" + namespace: "{{ namespace }}" + type: Opaque + stringData: + clouds.yaml: | + cache: + expiration: + server: 5 + port: 5 + floating-ip: 5 + +- name: Create kube config + when: not zuul_kube_secret + k8s: + state: "{{ state }}" + definition: + apiVersion: v1 + kind: Secret + metadata: + labels: + app: "{{ zuul_app_name }}" + zuul_cluster: "{{ zuul_cluster_name }}" + name: "{{ kubesecretname }}" + namespace: "{{ namespace }}" + type: Opaque + stringData: + config: | + apiVersion: v1 + clusters: [] + contexts: [] + - name: Create the scheduler configmap k8s: state: "{{ state }}" @@ -170,3 +212,26 @@ {% endif %}{% endfor %} {% endfor %} + +- name: Create the nodepool configmap + k8s: + state: "{{ state }}" + definition: + kind: ConfigMap + apiVersion: v1 + metadata: + name: "{{ zuul_configmap_name }}-nodepool" + namespace: "{{ namespace }}" + labels: + app: "{{ zuul_app_name }}" + zuul_cluster: "{{ zuul_cluster_name }}" + data: + "nodepool.yaml": | + {{ ({'labels': labels})|to_yaml }} + {{ ({'providers': providers})|to_yaml }} + webapp: + port: 8006 + zookeeper-servers: + - host: {{ zk_cluster_name }}-client + port: 2181 + register: nodepool_config diff --git a/ansible/roles/deploy/tasks/create_nodepool_deployment.yaml b/ansible/roles/deploy/tasks/create_nodepool_deployment.yaml new file mode 100644 index 0000000..6ae43ba --- /dev/null +++ b/ansible/roles/deploy/tasks/create_nodepool_deployment.yaml @@ -0,0 +1,72 @@ +# TODO: +- name: Get autoscale count + # TODO: look for replicas count in zk requests list + # autoscale_zk: + # service: {{ deployment_name }} + # zkhost: "{{ zk_cluster_name }}-client:2181" + # min: {{ deployment_conf.min|default(0) }} + # register: autoscale + set_fact: + autoscale: + count: "{{ deployment_conf.min|default(0) }}" + +- name: Create Deployment + k8s: + state: "{{ state }}" + definition: + kind: "Deployment" + apiVersion: "extensions/v1beta1" + metadata: + name: "{{ zuul_cluster_name }}-{{ deployment_name }}" + namespace: "{{ namespace }}" + labels: + app: "{{ zuul_app_name }}" + zuul_cluster: "{{ zuul_cluster_name }}" + annotations: + configHash: "" + spec: + replicas: "{{ autoscale.count }}" + selector: + matchLabels: + app: "{{ zuul_cluster_name }}-{{ deployment_name }}" + zuul_cluster: "{{ zuul_cluster_name }}" + template: + metadata: + name: "{{ zuul_cluster_name }}-{{ deployment_name }}" + labels: + app: "{{ zuul_cluster_name }}-{{ deployment_name }}" + zuul_cluster: "{{ zuul_cluster_name }}" + spec: + containers: + - name: "{{ zuul_cluster_name }}-{{ deployment_name }}" + image: "{{ zuul_image_name[deployment_name] }}" + imagePullPolicy: "{{ zuul_image_pull_policy }}" + env: + - name: CONFIG_CHECKSUM + value: "{{ nodepool_config.result.data | checksum }}" + volumeMounts: + - mountPath: "/etc/nodepool" + name: nodepool-config-volume + readOnly: true + - mountPath: "/var/lib/nodepool" + name: nodepool-data-volume + - mountPath: "/var/lib/nodepool/.kube" + name: nodepool-kube-volume + - mountPath: "/var/lib/nodepool/.config/openstack" + name: nodepool-clouds-volume + command: + - "/uid_entrypoint" + - "nodepool-{{ deployment_name }}" + - "-d" + volumes: + - name: nodepool-config-volume + configMap: + name: "{{ zuul_configmap_name }}-nodepool" + - name: nodepool-data-volume + emptyDir: {} + - name: nodepool-kube-volume + secret: + secretName: "{{ kubesecretname }}" + - name: nodepool-clouds-volume + secret: + secretName: "{{ cloudssecretname }}" diff --git a/ansible/roles/deploy/tasks/main.yaml b/ansible/roles/deploy/tasks/main.yaml index 39616da..f4dddad 100644 --- a/ansible/roles/deploy/tasks/main.yaml +++ b/ansible/roles/deploy/tasks/main.yaml @@ -1,4 +1,10 @@ --- +- name: Nodepool Deployment + vars: + deployment_name: launcher + deployment_conf: "{{ launcher }}" + include_tasks: "./create_nodepool_deployment.yaml" + - name: Save queue include_tasks: "./queue_save.yaml" when: diff --git a/ansible/roles/get_status/tasks/main.yaml b/ansible/roles/get_status/tasks/main.yaml index bfaa574..8202ebc 100644 --- a/ansible/roles/get_status/tasks/main.yaml +++ b/ansible/roles/get_status/tasks/main.yaml @@ -13,6 +13,8 @@ set_fact: zuul_pg_user: "{{ secrets_lookup | json_query(pg_user_query) }}" zuul_ssh_key: "{{ lookup('k8s', api_version='v1', kind='Secret', namespace=namespace, resource_name=sshsecretname) }}" + zuul_clouds_secret: "{{ lookup('k8s', api_version='v1', kind='Secret', namespace=namespace, resource_name=cloudssecretname) }}" + zuul_kube_secret: "{{ lookup('k8s', api_version='v1', kind='Secret', namespace=namespace, resource_name=kubesecretname) }}" - name: lookup k8s postgres cr set_fact: