From 50ff433fd0a946b0151026c1208cba1d3f11db0d Mon Sep 17 00:00:00 2001 From: Geoff Bourne Date: Sat, 26 May 2018 14:03:04 -0500 Subject: [PATCH] docs: document auto service discovery example --- .goreleaser.yml | 3 +- README.md | 18 ++- docs/example-deployment-auto.drawio.png | Bin 0 -> 62437 bytes docs/k8s-example-auto.yaml | 167 ++++++++++++++++++++++++ docs/k8s-example.yaml | 38 +++++- 5 files changed, 213 insertions(+), 13 deletions(-) create mode 100644 docs/example-deployment-auto.drawio.png create mode 100644 docs/k8s-example-auto.yaml diff --git a/.goreleaser.yml b/.goreleaser.yml index 42cdbf0..f755ba4 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -44,4 +44,5 @@ dockers: changelog: filters: exclude: - - '^ci:' \ No newline at end of file + - '^ci:' + - '^docs:' \ No newline at end of file diff --git a/README.md b/README.md index 277ff4d..60866e3 100644 --- a/README.md +++ b/README.md @@ -31,22 +31,20 @@ Flags: ## Example kubernetes deployment -[These deployments](docs/k8s-example.yaml) declare an `mc-router` that exposes a node port service -on the standard Minecraft server port 25565. Two "backend" Minecraft servers are declared as example -where users can choose stable/vanilla or snapshot simply based on the hostname they used. +[This example deployment](docs/k8s-example-auto.yaml) +* Declares an `mc-router` service that exposes a node port 25565 +* Declares a service account with access to watch and list services +* Declares `--in-kube-cluster` in the `mc-router` container arguments +* Two "backend" Minecraft servers are declared each with an + `"mc-router.itzg.me/externalServerName"` annotation that declares their external server name ```bash -kubectl apply -f https://raw.githubusercontent.com/itzg/mc-router/master/docs/k8s-example.yaml +kubectl apply -f https://raw.githubusercontent.com/itzg/mc-router/master/docs/k8s-example-auto.yaml ``` -![](docs/example-deployment.drawio.png) +![](docs/example-deployment-auto.drawio.png) #### Notes * This deployment assumes two persistent volume claims: `mc-stable` and `mc-snapshot` * I extended the allowed node port range by adding `--service-node-port-range=25000-32767` to `/etc/kubernetes/manifests/kube-apiserver.yaml` - -## Coming Soon - -* Make `mc-router` kubernetes service aware. It would watch for backend instances with well known annotations - and dynamically create/remove routes accordingly \ No newline at end of file diff --git a/docs/example-deployment-auto.drawio.png b/docs/example-deployment-auto.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb11a023b0c2d1700322c2961876c95ba662e45 GIT binary patch literal 62437 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

US2W&^E5uQHzPblbUe&WRov`~1V60@X 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≻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 literal 0 HcmV?d00001 diff --git a/docs/k8s-example-auto.yaml b/docs/k8s-example-auto.yaml new file mode 100644 index 0000000..00dacab --- /dev/null +++ b/docs/k8s-example-auto.yaml @@ -0,0 +1,167 @@ +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: mc-router +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: services-watcher +rules: +- apiGroups: [""] + resources: ["services"] + verbs: ["watch","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: mc-router-services-watcher +subjects: +- kind: ServiceAccount + name: mc-router + namespace: default +roleRef: + kind: ClusterRole + name: services-watcher + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: v1 +kind: Service +metadata: + name: mc-router +spec: + type: NodePort + ports: + - targetPort: web + name: web + port: 8080 + nodePort: 25580 + - targetPort: proxy + name: proxy + port: 25565 + nodePort: 25565 + selector: + run: mc-router +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + run: mc-router + name: mc-router +spec: + selector: + matchLabels: + run: mc-router + strategy: + type: Recreate + template: + metadata: + labels: + run: mc-router + spec: + serviceAccountName: mc-router + containers: + - image: itzg/mc-router:1.1.1 + name: mc-router + args: ["--api-binding", ":8080", "--in-kube-cluster"] + ports: + - name: proxy + containerPort: 25565 + - name: web + containerPort: 8080 +--- +apiVersion: v1 +kind: Service +metadata: + name: mc-stable + annotations: + "mc-router.itzg.me/externalServerName": "mc.your.domain" +spec: + ports: + - port: 25565 + selector: + run: mc-stable +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + run: mc-stable + name: mc-stable +spec: + selector: + matchLabels: + run: mc-stable + template: + metadata: + labels: + run: mc-stable + spec: + securityContext: + runAsUser: 1000 + fsGroup: 1000 + containers: + - image: itzg/minecraft-server + name: mc-stable + env: + - name: EULA + value: "TRUE" + ports: + - containerPort: 25565 + volumeMounts: + - name: data + mountPath: /data + volumes: + - name: data + persistentVolumeClaim: + claimName: mc-stable +--- +apiVersion: v1 +kind: Service +metadata: + name: mc-snapshot + annotations: + "mc-router.itzg.me/externalServerName": "snapshot.your.domain" +spec: + ports: + - port: 25565 + selector: + run: mc-snapshot +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + run: mc-snapshot + name: mc-snapshot +spec: + selector: + matchLabels: + run: mc-snapshot + template: + metadata: + labels: + run: mc-snapshot + spec: + securityContext: + runAsUser: 1000 + fsGroup: 1000 + containers: + - image: itzg/minecraft-server + name: mc-snapshot + env: + - name: EULA + value: "TRUE" + - name: VERSION + value: "SNAPSHOT" + ports: + - containerPort: 25565 + volumeMounts: + - name: data + mountPath: /data + volumes: + - name: data + persistentVolumeClaim: + claimName: mc-snapshot diff --git a/docs/k8s-example.yaml b/docs/k8s-example.yaml index ec10cee..60931a6 100644 --- a/docs/k8s-example.yaml +++ b/docs/k8s-example.yaml @@ -1,5 +1,32 @@ --- apiVersion: v1 +kind: ServiceAccount +metadata: + name: mc-router +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: services-watcher +rules: +- apiGroups: [""] + resources: ["services"] + verbs: ["watch","list"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: mc-router-services-watcher +subjects: +- kind: ServiceAccount + name: mc-router + namespace: default +roleRef: + kind: ClusterRole + name: services-watcher + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: v1 kind: Service metadata: name: mc-router @@ -27,15 +54,18 @@ spec: selector: matchLabels: run: mc-router + strategy: + type: Recreate template: metadata: labels: run: mc-router spec: + serviceAccountName: mc-router containers: - - image: itzg/mc-router:1.0.1 + - image: itzg/mc-router:1.1.1 name: mc-router - args: ["--api-binding", ":8080"] + args: ["--api-binding", ":8080", "--in-kube-cluster"] ports: - name: proxy containerPort: 25565 @@ -46,6 +76,8 @@ apiVersion: v1 kind: Service metadata: name: mc-stable + annotations: + "mc-router.itzg.me/externalServerName": "mc.your.domain" spec: ports: - port: 25565 @@ -90,6 +122,8 @@ apiVersion: v1 kind: Service metadata: name: mc-snapshot + annotations: + "mc-router.itzg.me/externalServerName": "mc-snapshot.your.domain" spec: ports: - port: 25565