Browse Source
Support for Ambassador OSS as an Ingress (#6135)
Support for Ambassador OSS as an Ingress (#6135)
Support for Ambassador OSS as an Ingress Controller when settings `ingress_ambassador_enabled: true`. Signed-off-by: Alvaro Saurin <alvaro.saurin@gmail.com>pull/6320/head
Alvaro
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 552 additions and 0 deletions
Split View
Diff Options
-
1docs/ansible.md
-
5inventory/sample/group_vars/k8s-cluster/addons.yml
-
11roles/download/defaults/main.yml
-
37roles/kubernetes-apps/ingress_controller/ambassador/README.md
-
9roles/kubernetes-apps/ingress_controller/ambassador/defaults/main.yml
-
72roles/kubernetes-apps/ingress_controller/ambassador/tasks/main.yml
-
7roles/kubernetes-apps/ingress_controller/ambassador/templates/00-namespace.yml.j2
-
14roles/kubernetes-apps/ingress_controller/ambassador/templates/clusterrole-ambassador.yml.j2
-
16roles/kubernetes-apps/ingress_controller/ambassador/templates/clusterrolebinding-ambassador.yml.j2
-
37roles/kubernetes-apps/ingress_controller/ambassador/templates/cr-ambassador-installation.yml.j2
-
186roles/kubernetes-apps/ingress_controller/ambassador/templates/crd-ambassador-installation.yml.j2
-
43roles/kubernetes-apps/ingress_controller/ambassador/templates/deploy-ambassador.yml.j2
-
82roles/kubernetes-apps/ingress_controller/ambassador/templates/role-ambassador.yml.j2
-
12roles/kubernetes-apps/ingress_controller/ambassador/templates/rolebinding-ambassador.yml.j2
-
9roles/kubernetes-apps/ingress_controller/ambassador/templates/sa-ambassador.yml.j2
-
7roles/kubernetes-apps/ingress_controller/meta/main.yml
-
1roles/kubespray-defaults/defaults/main.yaml
-
3tests/files/packet_opensuse-canal.yml
@ -0,0 +1,37 @@ |
|||
# Installation Guide |
|||
|
|||
- [Installation Guide](#installation-guide) |
|||
- [Ambassador](#ambassador) |
|||
- [Ambassador Operator](#ambassador-operator) |
|||
- [Configuration](#configuration) |
|||
- [Ingress annotations](#ingress-annotations) |
|||
|
|||
## Ambassador |
|||
|
|||
The Ambassador API Gateway provides all the functionality of a traditional ingress controller |
|||
(e.g., path-based routing) while exposing many additional capabilities such as authentication, |
|||
URL rewriting, CORS, rate limiting, and automatic metrics collection. |
|||
|
|||
## Ambassador Operator |
|||
|
|||
This addon deploys the Ambassador Operator, which in turn will install Ambassador in |
|||
a kubespray cluster. |
|||
|
|||
The Ambassador Operator is a Kubernetes Operator that controls Ambassador's complete lifecycle |
|||
in your cluster, automating many of the repeatable tasks you would otherwise have to perform |
|||
yourself. Once installed, the Operator will complete installations and seamlessly upgrade to new |
|||
versions of Ambassador as they become available. |
|||
|
|||
## Configuration |
|||
|
|||
* `ingress_ambassador_namespace` (default `ambassador`): namespace for installing Ambassador. |
|||
* `ingress_ambassador_update_window` (default `0 0 * * SUN`): _crontab_-like expression |
|||
for specifying when the Operator should try to update the Ambassador API Gateway. |
|||
* `ingress_ambassador_version` (defaulkt: `*`): SemVer rule for versions allowed for |
|||
installation/updates. |
|||
|
|||
## Ingress annotations |
|||
|
|||
The Ambassador API Gateway will automatically load balance `Ingress` resources |
|||
that include the annotation `kubernetes.io/ingress.class=ambassador`. All the other |
|||
resources will be just ignored. |
@ -0,0 +1,9 @@ |
|||
--- |
|||
ingress_ambassador_namespace: "ambassador" |
|||
ingress_ambassador_version: "*" |
|||
ingress_ambassador_update_window: "0 0 * * SUN" |
|||
ingress_ambassador_replicas: 1 |
|||
ingress_ambassador_insecure_port: 80 |
|||
ingress_ambassador_secure_port: 443 |
|||
ingress_ambassador_extra_args: [] |
|||
ingress_ambassador_host_network: false |
@ -0,0 +1,72 @@ |
|||
--- |
|||
|
|||
- name: Ambassador | Create addon dir |
|||
file: |
|||
path: "{{ kube_config_dir }}/addons/ambassador" |
|||
state: directory |
|||
owner: root |
|||
group: root |
|||
mode: 0755 |
|||
when: |
|||
- inventory_hostname == groups['kube-master'][0] |
|||
|
|||
- name: Ambassador | Templates list |
|||
set_fact: |
|||
ingress_ambassador_templates: |
|||
- { name: 00-namespace, file: 00-namespace.yml, type: ns } |
|||
- { name: crd-ambassador-installation, file: crd-ambassador-installation.yml, type: customresourcedefinition } |
|||
- { name: sa-ambassador, file: sa-ambassador.yml, type: sa } |
|||
- { name: clusterrole-ambassador, file: clusterrole-ambassador.yml, type: clusterrole } |
|||
- { name: clusterrolebinding-ambassador, file: clusterrolebinding-ambassador.yml, type: clusterrolebinding } |
|||
- { name: role-ambassador, file: role-ambassador.yml, type: role } |
|||
- { name: rolebinding-ambassador, file: rolebinding-ambassador.yml, type: rolebinding } |
|||
- { name: deploy-ambassador, file: deploy-ambassador.yml, type: deploy } |
|||
|
|||
- name: Ambassador | Create manifests |
|||
template: |
|||
src: "{{ item.file }}.j2" |
|||
dest: "{{ kube_config_dir }}/addons/ambassador/{{ item.file }}" |
|||
loop: "{{ ingress_ambassador_templates }}" |
|||
register: ingress_ambassador_manifests |
|||
when: |
|||
- inventory_hostname == groups['kube-master'][0] |
|||
|
|||
- name: Ambassador | Apply manifests |
|||
kube: |
|||
name: "{{ item.item.name }}" |
|||
namespace: "{{ ingress_ambassador_namespace }}" |
|||
kubectl: "{{ bin_dir }}/kubectl" |
|||
resource: "{{ item.item.type }}" |
|||
filename: "{{ kube_config_dir }}/addons/ambassador/{{ item.item.file }}" |
|||
state: "latest" |
|||
loop: "{{ ingress_ambassador_manifests.results }}" |
|||
when: |
|||
- inventory_hostname == groups['kube-master'][0] |
|||
|
|||
# load the AmbassadorInstallation _after_ the CustomResourceDefinition has been loaded |
|||
|
|||
- name: Ambassador | AmbassadorInstallation template |
|||
set_fact: |
|||
ingress_ambassador_cr_templates: |
|||
- { name: cr-ambassador-installation, file: cr-ambassador-installation.yml, type: cr } |
|||
|
|||
- name: Ambassador | Create installation manifests |
|||
template: |
|||
src: "{{ item.file }}.j2" |
|||
dest: "{{ kube_config_dir }}/addons/ambassador/{{ item.file }}" |
|||
loop: "{{ ingress_ambassador_cr_templates }}" |
|||
register: ingress_ambassador_cr_manifests |
|||
when: |
|||
- inventory_hostname == groups['kube-master'][0] |
|||
|
|||
- name: Ambassador | Apply AmbassadorInstallation |
|||
kube: |
|||
name: "{{ item.item.name }}" |
|||
namespace: "{{ ingress_ambassador_namespace }}" |
|||
kubectl: "{{ bin_dir }}/kubectl" |
|||
resource: "{{ item.item.type }}" |
|||
filename: "{{ kube_config_dir }}/addons/ambassador/{{ item.item.file }}" |
|||
state: "latest" |
|||
loop: "{{ ingress_ambassador_cr_manifests.results }}" |
|||
when: |
|||
- inventory_hostname == groups['kube-master'][0] |
@ -0,0 +1,7 @@ |
|||
--- |
|||
apiVersion: v1 |
|||
kind: Namespace |
|||
metadata: |
|||
name: {{ ingress_ambassador_namespace }} |
|||
labels: |
|||
name: {{ ingress_ambassador_namespace }} |
@ -0,0 +1,14 @@ |
|||
--- |
|||
apiVersion: rbac.authorization.k8s.io/v1 |
|||
kind: ClusterRole |
|||
metadata: |
|||
name: ambassador-operator-cluster |
|||
labels: |
|||
app.kubernetes.io/name: ambassador-operator |
|||
app.kubernetes.io/part-of: ambassador-operator |
|||
rules: |
|||
- apiGroups: ['*'] |
|||
resources: ['*'] |
|||
verbs: ['*'] |
|||
- nonResourceURLs: ['*'] |
|||
verbs: ['*'] |
@ -0,0 +1,16 @@ |
|||
--- |
|||
kind: ClusterRoleBinding |
|||
apiVersion: rbac.authorization.k8s.io/v1 |
|||
metadata: |
|||
name: ambassador-operator-cluster |
|||
labels: |
|||
app.kubernetes.io/name: ambassador-operator |
|||
app.kubernetes.io/part-of: ambassador-operator |
|||
subjects: |
|||
- kind: ServiceAccount |
|||
name: ambassador-operator |
|||
namespace: {{ ingress_ambassador_namespace }} |
|||
roleRef: |
|||
kind: ClusterRole |
|||
name: ambassador-operator-cluster |
|||
apiGroup: rbac.authorization.k8s.io |
@ -0,0 +1,37 @@ |
|||
apiVersion: getambassador.io/v2 |
|||
kind: AmbassadorInstallation |
|||
metadata: |
|||
name: ambassador |
|||
labels: |
|||
app.kubernetes.io/name: ambassador-operator |
|||
app.kubernetes.io/part-of: ambassador-operator |
|||
spec: |
|||
installOSS: true |
|||
{% if ingress_ambassador_update_window %} |
|||
updateWindow: "{{ ingress_ambassador_update_window }}" |
|||
{% endif %} |
|||
{% if ingress_ambassador_version %} |
|||
version: "{{ ingress_ambassador_version }}" |
|||
{% endif %} |
|||
helmValues: |
|||
tolerations: |
|||
- key: "node-role.kubernetes.io/master" |
|||
operator: Equal |
|||
effect: NoSchedule |
|||
deploymentTool: amb-oper-kubespray |
|||
{% if ingress_ambassador_host_network %} |
|||
hostNetwork: true |
|||
{% endif %} |
|||
replicaCount: {{ ingress_ambassador_replicas }} |
|||
service: |
|||
ports: |
|||
- name: http |
|||
port: 80 |
|||
hostPort: {{ ingress_ambassador_insecure_port }} |
|||
targetPort: 8080 |
|||
protocol: TCP |
|||
- name: https |
|||
port: 443 |
|||
hostPort: {{ ingress_ambassador_secure_port }} |
|||
targetPort: 8443 |
|||
protocol: TCP |
@ -0,0 +1,186 @@ |
|||
apiVersion: apiextensions.k8s.io/v1beta1 |
|||
kind: CustomResourceDefinition |
|||
metadata: |
|||
name: ambassadorinstallations.getambassador.io |
|||
spec: |
|||
additionalPrinterColumns: |
|||
- JSONPath: .spec.version |
|||
name: VERSION |
|||
type: string |
|||
- JSONPath: .spec.updateWindow |
|||
name: UPDATE-WINDOW |
|||
type: integer |
|||
- JSONPath: .status.lastCheckTime |
|||
description: Last time checked |
|||
name: LAST-CHECK |
|||
type: string |
|||
- JSONPath: .status.conditions[?(@.type=='Deployed')].status |
|||
description: Indicates if deployment has completed |
|||
name: DEPLOYED |
|||
type: string |
|||
- JSONPath: .status.conditions[?(@.type=='Deployed')].reason |
|||
description: Reason for deployment completed |
|||
name: REASON |
|||
priority: 1 |
|||
type: string |
|||
- JSONPath: .status.conditions[?(@.type=='Deployed')].message |
|||
description: Message for deployment completed |
|||
name: MESSAGE |
|||
priority: 1 |
|||
type: string |
|||
- JSONPath: .status.deployedRelease.appVersion |
|||
description: Deployed version of Ambassador |
|||
name: DEPLOYED-VERSION |
|||
type: string |
|||
- JSONPath: .status.deployedRelease.flavor |
|||
description: Deployed flavor of Ambassador (OSS or AES) |
|||
name: DEPLOYED-FLAVOR |
|||
type: string |
|||
group: getambassador.io |
|||
names: |
|||
kind: AmbassadorInstallation |
|||
listKind: AmbassadorInstallationList |
|||
plural: ambassadorinstallations |
|||
singular: ambassadorinstallation |
|||
scope: Namespaced |
|||
subresources: |
|||
status: {} |
|||
validation: |
|||
openAPIV3Schema: |
|||
description: AmbassadorInstallation is the Schema for the ambassadorinstallations |
|||
API |
|||
properties: |
|||
apiVersion: |
|||
description: 'APIVersion defines the versioned schema of this representation |
|||
of an object. Servers should convert recognized schemas to the latest |
|||
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' |
|||
type: string |
|||
kind: |
|||
description: 'Kind is a string value representing the REST resource this |
|||
object represents. Servers may infer this from the endpoint the client |
|||
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' |
|||
type: string |
|||
metadata: |
|||
type: object |
|||
spec: |
|||
description: AmbassadorInstallationSpec defines the desired state of AmbassadorInstallation |
|||
properties: |
|||
baseImage: |
|||
description: An (optional) image to use instead of the image specified |
|||
in the Helm chart. |
|||
type: string |
|||
helmRepo: |
|||
description: An (optional) Helm repository. |
|||
type: string |
|||
installOSS: |
|||
description: 'Installs [Ambassador OSS](https://www.getambassador.io/docs/latest/topics/install/install-ambassador-oss/) |
|||
instead of [AES](https://www.getambassador.io/docs/latest/topics/install/). |
|||
Default is false which means it installs AES by default. TODO: 1. |
|||
AES/AOSS is not installed and the user installs using `installOSS: |
|||
true`, then we straightaway install AOSS. 2. AOSS is installed via |
|||
operator and the user sets `installOSS: false`, then we perform the |
|||
migration as detailed here - https://www.getambassador.io/docs/latest/topics/install/upgrade-to-edge-stack/ |
|||
3. AES is installed and the user sets `installOSS: true`, then we |
|||
point users to the docs which gives them pointers on how to do |
|||
that themselves.' |
|||
type: boolean |
|||
logLevel: |
|||
description: 'An (optional) log level: debug, info...' |
|||
enum: |
|||
- info |
|||
- debug |
|||
- warn |
|||
- warning |
|||
- error |
|||
- critical |
|||
- fatal |
|||
type: string |
|||
updateWindow: |
|||
description: "`updateWindow` is an optional item that will control when |
|||
the updates can take place. This is used to force system updates to |
|||
happen late at night if that’s what the sysadmins want. \n * There |
|||
can be any number of `updateWindow` entries (separated by commas). |
|||
\ * `Never` turns off automatic updates even if there are other entries |
|||
in the comma-separated list. `Never` is used by sysadmins to disable |
|||
all updates during blackout periods by doing a `kubectl apply` |
|||
or using our Edge Policy Console to set this. * Each `updateWindow` |
|||
is in crontab format (see https://crontab.guru/) Some examples of |
|||
`updateWindows` are: - `* 0-6 * * * SUN`: every Sunday, from _0am_ |
|||
to _6am_ - `* 5 1 * * *`: every first day of the month, at _5am_ |
|||
* The Operator cannot guarantee minute time granularity, so specifying |
|||
\ a minute in the crontab expression can lead to some updates happening |
|||
\ sooner/later than expected." |
|||
type: string |
|||
version: |
|||
description: "We are using SemVer for the version number and it can |
|||
be specified with any level of precision and can optionally end in |
|||
`*`. These are interpreted as: \n * `1.0` = exactly version 1.0 * |
|||
`1.1` = exactly version 1.1 * `1.1.*` = version 1.1 and any bug fix |
|||
versions `1.1.1`, `1.1.2`, `1.1.3`, etc. * `2.*` = version 2.0 and |
|||
any incremental and bug fix versions `2.0`, `2.0.1`, `2.0.2`, `2.1`, |
|||
`2.2`, `2.2.1`, etc. * `*` = all versions. * `3.0-ea` = version `3.0-ea1` |
|||
and any subsequent EA releases on `3.0`. Also selects the final |
|||
3.0 once the final GA version is released. * `4.*-ea` = version `4.0-ea1` |
|||
and any subsequent EA release on `4.0`. Also selects the final GA |
|||
`4.0`. Also selects any incremental and bug fix versions `4.*` and |
|||
`4.*.*`. Also selects the most recent `4.*` EA release i.e., if |
|||
`4.0.5` is the last GA version and there is a `4.1-EA3`, then this |
|||
\ selects `4.1-EA3` over the `4.0.5` GA. \n You can find the reference |
|||
docs about the SemVer syntax accepted [here](https://github.com/Masterminds/semver#basic-comparisons)." |
|||
type: string |
|||
type: object |
|||
status: |
|||
description: AmbassadorInstallationStatus defines the observed state of |
|||
AmbassadorInstallation |
|||
properties: |
|||
conditions: |
|||
description: List of conditions the installation has experienced. |
|||
items: |
|||
description: AmbInsCondition defines an Ambassador installation condition, |
|||
as well as the last time there was a transition to this condition.. |
|||
properties: |
|||
lastTransitionTime: |
|||
format: date-time |
|||
type: string |
|||
message: |
|||
type: string |
|||
reason: |
|||
type: string |
|||
status: |
|||
type: string |
|||
type: |
|||
type: string |
|||
required: |
|||
- status |
|||
- type |
|||
type: object |
|||
type: array |
|||
deployedRelease: |
|||
description: the currently deployed Helm chart |
|||
nullable: true |
|||
properties: |
|||
appVersion: |
|||
type: string |
|||
flavor: |
|||
type: string |
|||
manifest: |
|||
type: string |
|||
name: |
|||
type: string |
|||
version: |
|||
type: string |
|||
type: object |
|||
lastCheckTime: |
|||
description: Last time a successful update check was performed. |
|||
format: date-time |
|||
nullable: true |
|||
type: string |
|||
required: |
|||
- conditions |
|||
type: object |
|||
type: object |
|||
version: v2 |
|||
versions: |
|||
- name: v2 |
|||
served: true |
|||
storage: true |
@ -0,0 +1,43 @@ |
|||
--- |
|||
apiVersion: apps/v1 |
|||
kind: Deployment |
|||
metadata: |
|||
name: ambassador-operator |
|||
namespace: {{ ingress_ambassador_namespace }} |
|||
labels: |
|||
app.kubernetes.io/name: ambassador-operator |
|||
app.kubernetes.io/part-of: ambassador-operator |
|||
getambassador.io/installer: operator |
|||
spec: |
|||
replicas: 1 |
|||
selector: |
|||
matchLabels: |
|||
name: ambassador-operator |
|||
app.kubernetes.io/name: ambassador-operator |
|||
app.kubernetes.io/part-of: ambassador-operator |
|||
template: |
|||
metadata: |
|||
labels: |
|||
name: ambassador-operator |
|||
getambassador.io/installer: operator |
|||
app.kubernetes.io/name: ambassador-operator |
|||
app.kubernetes.io/part-of: ambassador-operator |
|||
spec: |
|||
serviceAccountName: ambassador-operator |
|||
containers: |
|||
- name: ambassador-operator |
|||
image: {{ ingress_ambassador_image_repo }}:{{ ingress_ambassador_image_tag }} |
|||
command: |
|||
- ambassador-operator |
|||
imagePullPolicy: Always |
|||
env: |
|||
- name: WATCH_NAMESPACE |
|||
valueFrom: |
|||
fieldRef: |
|||
fieldPath: metadata.namespace |
|||
- name: POD_NAME |
|||
valueFrom: |
|||
fieldRef: |
|||
fieldPath: metadata.name |
|||
- name: OPERATOR_NAME |
|||
value: "ambassador-operator" |
@ -0,0 +1,82 @@ |
|||
--- |
|||
apiVersion: rbac.authorization.k8s.io/v1 |
|||
kind: Role |
|||
metadata: |
|||
creationTimestamp: null |
|||
name: ambassador-operator |
|||
rules: |
|||
- apiGroups: |
|||
- "" |
|||
resources: |
|||
- pods |
|||
- services |
|||
- services/finalizers |
|||
- endpoints |
|||
- persistentvolumeclaims |
|||
- events |
|||
- configmaps |
|||
- secrets |
|||
verbs: |
|||
- create |
|||
- delete |
|||
- get |
|||
- list |
|||
- patch |
|||
- update |
|||
- watch |
|||
- apiGroups: |
|||
- apps |
|||
resources: |
|||
- deployments |
|||
- daemonsets |
|||
- replicasets |
|||
- statefulsets |
|||
- customresourcedefinitions |
|||
verbs: |
|||
- create |
|||
- delete |
|||
- get |
|||
- list |
|||
- patch |
|||
- update |
|||
- watch |
|||
- apiGroups: |
|||
- monitoring.coreos.com |
|||
resources: |
|||
- servicemonitors |
|||
verbs: |
|||
- get |
|||
- create |
|||
- apiGroups: |
|||
- apps |
|||
resourceNames: |
|||
- ambassador-operator |
|||
resources: |
|||
- deployments/finalizers |
|||
verbs: |
|||
- update |
|||
- apiGroups: |
|||
- "" |
|||
resources: |
|||
- pods |
|||
verbs: |
|||
- get |
|||
- apiGroups: |
|||
- apps |
|||
resources: |
|||
- replicasets |
|||
- deployments |
|||
verbs: |
|||
- get |
|||
- apiGroups: |
|||
- getambassador.io |
|||
resources: |
|||
- '*' |
|||
verbs: |
|||
- create |
|||
- delete |
|||
- get |
|||
- list |
|||
- patch |
|||
- update |
|||
- watch |
@ -0,0 +1,12 @@ |
|||
--- |
|||
kind: RoleBinding |
|||
apiVersion: rbac.authorization.k8s.io/v1 |
|||
metadata: |
|||
name: ambassador-operator |
|||
subjects: |
|||
- kind: ServiceAccount |
|||
name: ambassador-operator |
|||
roleRef: |
|||
kind: Role |
|||
name: ambassador-operator |
|||
apiGroup: rbac.authorization.k8s.io |
@ -0,0 +1,9 @@ |
|||
--- |
|||
apiVersion: v1 |
|||
kind: ServiceAccount |
|||
metadata: |
|||
name: ambassador-operator |
|||
namespace: {{ ingress_ambassador_namespace }} |
|||
labels: |
|||
app.kubernetes.io/name: ambassador-operator |
|||
app.kubernetes.io/part-of: ambassador-operator |
Write
Preview
Loading…
Cancel
Save