new chart stable/gce-ingress (#7688)

* new chart stable/gce-ingress

This chart implements gce-ingress for non-gke clusters that are running
on GCE or otherwise want to utilize GCE load balancing services for
Ingress resources.

Signed-off-by: Paul Czarkowski <username.taken@gmail.com>

* fix newlines add home key to chart.yaml

Signed-off-by: Paul Czarkowski <username.taken@gmail.com>

* use correct api version and use rbac best practices

Signed-off-by: Paul Czarkowski <username.taken@gmail.com>
This commit is contained in:
Paul Czarkowski
2018-09-23 11:50:41 -07:00
committed by k8s-ci-robot
parent a99b192557
commit a158ba574e
12 changed files with 518 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*~
# Various IDEs
.project
.idea/
*.tmproj
+15
View File
@@ -0,0 +1,15 @@
apiVersion: v1
appVersion: "1.1.1"
description: A GCE Ingress Controller
name: gce-ingress
version: 1.0.0
keywords:
- ingress
- gce
sources:
- https://github.com/kubernetes/ingress-gce
maintainers:
- name: paulczar
email: username.taken@gmail.com
engine: gotpl
home: https://github.com/kubernetes/ingress-gce
+2
View File
@@ -0,0 +1,2 @@
approvers:
- paulczar
+82
View File
@@ -0,0 +1,82 @@
# gce-ingress
[gce-ingress](https://github.com/kubernetes/gce-gce) is an Ingress controller that configures GCE loadbalancers
To use, add the `kubernetes.io/ingress.class: "gce"` annotation to your Ingress resources.
## TL;DR;
```console
$ helm install stable/gce-ingress
```
## Introduction
This chart bootstraps a gce-ingress deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
## Prerequisites
- Kubernetes 1.9+
## Installing the Chart
To install the chart with the release name `my-release` into the `kube-system` namespace:
```console
$ helm install --namespace kube-system --name my-release stable/gce-ingress
```
The command deploys gce-ingress on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation.
> **Tip**: List all releases using `helm list`
## Uninstalling the Chart
To uninstall/delete the `my-release` deployment:
```console
$ helm delete my-release
```
The command removes all the Kubernetes components associated with the chart and deletes the release.
## Configuration
The following table lists the configurable parameters of the gce-ingress chart and their default values.
Parameter | Description | Default
--- | --- | ---
`controller.name` | name of the controller component | `controller`
`controller.image.repository` | controller container image repository | `k8s.gcr.io/ingress-gce-glbc-amd64`
`controller.image.tag` | controller container image tag | `v1.1.1`
`controller.image.pullPolicy` | controller container image pull policy | `IfNotPresent`
`controller.config` | gce ConfigMap entries | none
`controller.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]`
`controller.affinity` | node/pod affinities (requires Kubernetes >=1.6) | `{}`
`controller.nodeSelector` | node labels for pod assignment | `{}`
`controller.replicaCount` | desired number of controller pods | `1`
`controller.resources` | controller pod resource requests & limits | `{}`
`defaultBackend.name` | name of the default backend component | `default-backend`
`defaultBackend.image.repository` | default backend container image repository | `k8s.gcr.io/defaultbackend`
`defaultBackend.image.tag` | default backend container image tag | `1.4`
`defaultBackend.image.pullPolicy` | default backend container image pull policy | `IfNotPresent`
`defaultBackend.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]`
`defaultBackend.affinity` | node/pod affinities (requires Kubernetes >=1.6) | `{}`
`defaultBackend.nodeSelector` | node labels for pod assignment | `{}`
`defaultBackend.replicaCount` | desired number of default backend pods | `1`
`defaultBackend.resources` | default backend pod resource requests & limits | `{}`
`rbac.enabled` | use RBAC ? | `true`
```console
$ helm install stable/gce-ingress --name my-release
```
Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
```console
$ helm install stable/gce-ingress --name my-release -f values.yaml
```
```console
$ helm install stable/gce-ingress --set controller.extraArgs.v=2
```
+51
View File
@@ -0,0 +1,51 @@
GCE Ingress has been deployed. You should be able to create Ingress resources.
Example:
```yaml
apiVersion: extensions/v1
kind: Deployment
metadata:
name: example
labels:
run: example
spec:
selector:
matchLabels:
run: example
template:
metadata:
labels:
run: example
spec:
containers:
- image: nginx:1.13.5-alpine
imagePullPolicy: IfNotPresent
name: example
---
apiVersion: v1
kind: Service
type: NodePort
metadata:
name: example
labels:
run: example
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: example
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example
annotations:
kubernetes.io/ingress.class: "gce"
spec:
backend:
# This assumes http-svc exists and routes to healthy endpoints.
serviceName: example
servicePort: 80
```
+43
View File
@@ -0,0 +1,43 @@
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "gce-ingress.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "gce-ingress.fullname" -}}
{{- if .Values.fullnameOverride -}}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- if contains $name .Release.Name -}}
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "gce-ingress.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Create the name of the service account to use
*/}}
{{- define "gce-ingress.serviceAccountName" -}}
{{- if .Values.serviceAccount.create -}}
{{ default (include "gce-ingress.fullname" .) .Values.serviceAccount.name }}
{{- else -}}
{{ default "default" .Values.serviceAccount.name }}
{{- end -}}
{{- end -}}
@@ -0,0 +1,18 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "gce-ingress.fullname" . }}
labels:
app: {{ include "gce-ingress.name" . }}
chart: {{ include "gce-ingress.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
data:
gce.conf: |
[global]
token-url = {{ .Values.config.tokenUrl }}
project-id = {{ .Values.config.projectID }}
network = {{ .Values.config.network }}
subnetwork = {{ .Values.config.subnetwork }}
node-instance-prefix = {{ .Values.config.nodeInstancePrefix }}
node-tags = {{ .Values.config.nodeTags }}
@@ -0,0 +1,57 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "gce-ingress.fullname" . }}-backend
labels:
app: {{ include "gce-ingress.name" . }}-backend
chart: {{ include "gce-ingress.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
kubernetes.io/name: "GLBC"
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
spec:
replicas: {{ .Values.defaultBackend.replicaCount }}
selector:
matchLabels:
app: {{ include "gce-ingress.name" . }}-backend
release: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ include "gce-ingress.name" . }}-backend
release: {{ .Release.Name }}
spec:
containers:
- name: backend
image: "{{ .Values.defaultBackend.image.repository }}:{{ .Values.defaultBackend.image.tag }}"
imagePullPolicy: {{ .Values.defaultBackend.image.pullPolicy }}
livenessProbe:
httpGet:
path: /healthz
port: http
scheme: HTTP
readinessProbe:
httpGet:
path: /healthz
port: http
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
ports:
- name: http
containerPort: 8080
resources:
{{ toYaml .Values.defaultBackend.resources | indent 12 }}
{{- with .Values.defaultBackend.nodeSelector }}
nodeSelector:
{{ toYaml . | indent 8 }}
{{- end }}
{{- with .Values.defaultBackend.affinity }}
affinity:
{{ toYaml . | indent 8 }}
{{- end }}
{{- with .Values.defaultBackend.tolerations }}
tolerations:
{{ toYaml . | indent 8 }}
{{- end }}
@@ -0,0 +1,84 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "gce-ingress.fullname" . }}
labels:
app: {{ include "gce-ingress.name" . }}
chart: {{ include "gce-ingress.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
replicas: {{ .Values.controller.replicaCount }}
selector:
matchLabels:
app: {{ include "gce-ingress.name" . }}
release: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ include "gce-ingress.name" . }}
release: {{ .Release.Name }}
spec:
{{- if .Values.rbac.enabled }}
serviceAccountName: {{ include "gce-ingress.fullname" . }}
{{- end }}
terminationGracePeriodSeconds: 600
hostNetwork: true
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.controller.image.repository }}:{{ .Values.controller.image.tag }}"
imagePullPolicy: {{ .Values.controller.image.pullPolicy }}
livenessProbe:
httpGet:
path: /healthz
port: 8086
scheme: HTTP
initialDelaySeconds: 30
# healthz reaches out to GCE
periodSeconds: 30
timeoutSeconds: 15
successThreshold: 1
failureThreshold: 5
volumeMounts:
- name: gce-config-volume
mountPath: /etc/gce/
{{- if .Values.secret }}
- name: google-cloud-key
mountPath: /var/secrets/google
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /var/secrets/google/key.json
{{- end }}
command:
- sh
- -c
- 'exec /glbc --gce-ratelimit=ga.Operations.Get,qps,10,100 --gce-ratelimit=alpha.Operations.Get,qps,10,100 --gce-ratelimit=ga.BackendServices.Get,qps,1.8,1 --gce-ratelimit=ga.HealthChecks.Get,qps,1.8,1 --gce-ratelimit=alpha.HealthChecks.Get,qps,1.8,1 --verbose --default-backend-service={{ .Release.Namespace }}/{{ include "gce-ingress.fullname" . }} --sync-period=600s --running-in-cluster=true --use-real-cloud=true --config-file-path=/etc/gce/gce.conf --healthz-port=8086 2>&1'
resources:
{{ toYaml .Values.controller.resources | indent 12 }}
volumes:
{{- if .Values.secret }}
- name: google-cloud-key
secret:
secretName: {{ .Values.secret }}
items:
- key: key.json
path: key.json
{{- end }}
- name: gce-config-volume
configMap:
name: {{ include "gce-ingress.fullname" . }}
items:
- key: gce.conf
path: gce.conf
{{- with .Values.controller.nodeSelector }}
nodeSelector:
{{ toYaml . | indent 8 }}
{{- end }}
{{- with .Values.controller.affinity }}
affinity:
{{ toYaml . | indent 8 }}
{{- end }}
{{- with .Values.controller.tolerations }}
tolerations:
{{ toYaml . | indent 8 }}
{{- end }}
+36
View File
@@ -0,0 +1,36 @@
{{ if .Values.rbac.create -}}
{{ if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "gce-ingress.serviceAccountName" . }}
{{ end -}}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "gce-ingress.fullname" . }}
rules:
- apiGroups: [""]
resources: ["secrets", "endpoints", "services", "pods", "nodes", "namespaces", "configmaps", "events"]
verbs: ["get", "list", "watch", "update", "create", "patch"]
- apiGroups: ["extensions"]
resources: ["ingresses"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["extensions"]
resources: ["ingresses/status"]
verbs: ["update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "gce-ingress.fullname" . }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "gce-ingress.fullname" . }}
subjects:
- kind: ServiceAccount
name: {{ include "gce-ingress.serviceAccountName" . }}
namespace: {{ .Release.Namespace }}
{{ end -}}
+31
View File
@@ -0,0 +1,31 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "gce-ingress.fullname" . }}
labels:
app: {{ include "gce-ingress.name" . }}
chart: {{ include "gce-ingress.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
k8s-app: glbc
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: "GLBCDefaultBackend"
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
app: {{ include "gce-ingress.name" . }}
release: {{ .Release.Name }}
name: default-http-backend
namespace: kube-system
labels:
k8s-app: glbc
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: "GLBCDefaultBackend"
+78
View File
@@ -0,0 +1,78 @@
# Default values for gce-ingress.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
nameOverride: ""
fullnameOverride: ""
rbac:
# Specifies whether RBAC resources should be created
create: true
serviceAccount:
# Specifies whether a ServiceAccount should be created
create: true
# The name of the ServiceAccount to use.
# If not set and create is true, a name is generated using the fullname template
name:
# gce-ingress needs credentials to log into GCE. Create a secret with the key
# of key.json with the contents of a GCE service account that has permissions to create
# and modify load balancers. The key should be in the JSON format.
# Example:
# Your secret should look like:
# apiVersion: v1
# kind: Secret
# metadata:
# name: gce-key
# type: Opaque
# data:
# key.json: < base64 encoded JSON service account key>
secret: ~
# gce config, replace values to match your environment
config:
projectID:
network:
subnetwork:
nodeInstancePrefix:
nodeTags:
# tokenUrl should probably be left as nil
tokenUrl: "nil"
controller:
replicaCount: 1
image:
repository: k8s.gcr.io/ingress-gce-glbc-amd64
tag: v1.1.1
pullPolicy: IfNotPresent
resources: {}
# requests:
# cpu: 10m
# memory: 50Mi
nodeSelector: {}
tolerations: []
affinity: {}
defaultBackend:
replicaCount: 1
image:
repository: k8s.gcr.io/defaultbackend
tag: "1.4"
pullPolicy: IfNotPresent
resources: {}
# limits:
# cpu: 10m
# memory: 20Mi
# requests:
# cpu: 10m
# memory: 20Mi
nodeSelector: {}
tolerations: []
affinity: {}
service:
type: NodePort
port: 80