# Deploying Ambassador to Kubernetes
在本教程中,我们将介绍在Kubernetes中部署Ambassador以进行入口路由的过程。Ambassador提供传统入口控制器的所有功能(即基于路径的路由),同时暴露许多其他功能,如身份验证,URL重写,CORS,速率限制和自动度量收集。
ambassador被设计允许服务所有者控制怎么样暴露他们的服务到公网上。我们通过允许大量的服务注释来实现这一点,ambassador读取这些注释以配置其Envoy代理。下面,我们将使用服务注释来配置ambassador映射`/httpbin/`到`httpbin.org`。
## 1.部署ambassador
要在您的默认命名空间中部署Ambassador,首先需要检查Kubernetes是否启用了RBAC:
```bash
kubectl cluster-info dump --namespace kube-system | grep authorization-mode
```
如果您`--authorization-mode=Node,RBAC`在输出中看到类似的内容,则启用RBAC。大多数当前托管的Kubernetes提供程序(例如GKE)创建默认情况下启用了RBAC的集群,遗憾的是上述命令可能不会返回任何指示此情况的信息。
注意:如果您使用带有RBAC的Google Kubernetes引擎,则需要向将要设置大使的帐户授予权限。为此,请获取您的官方GKE用户名,然后cluster-admin为该用户名授予角色权限:
```
$ kubectl create clusterrolebinding my-cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud info --format="value(config.account)")
```
如果启用了RBAC:
```
kubectl apply -f https://getambassador.io/yaml/ambassador/ambassador-rbac.yaml
```
没有RBAC,您可以使用:
```
kubectl apply -f https://getambassador.io/yaml/ambassador/ambassador-no-rbac.yaml
```
我们建议您下载YAML文件并浏览内容。您将看到`ambassador-admin`创建了NodePort服务(提供了 ambassador 诊断Web UI),以及ambassador ClusterRole,ServiceAccount和ClusterRoleBinding(如果启用了RBAC)。还创建了 ambassador 部署。
对于生产配置,我们建议您下载这些YAML文件作为起点,并相应地自定义它们(例如,您的命名空间)。
## 2. Defining the Ambassador Service
ambassador 部署为Kubernetes service,引用您之前部署的ambassador deployment。创建以下YAML并将其放在一个名为`ambassador-service.yaml`的文件中。
```yaml
---
apiVersion: v1
kind: Service
metadata:
name: ambassador
spec:
type: LoadBalancer
ports:
- port: 80
selector:
service: ambassador
```
部署此服务kubectl:
```
$ kubectl apply -f ambassador-service.yaml
```
上面的YAML为 ambassador 创建了Kubernetes服务LoadBalancer。将根据您创建的路由规则评估所有HTTP流量。请注意,如果您未在LoadBalancer支持类型的环境(例如minikube)中进行部署,则需要将其更改为其他类型的服务,例如NodePort。
暴漏服务有多种方式:LoadBalancer、NodePort、Ingress
如果这里我们使用NodePort暴漏服务,k8s默认的服务暴漏端口范围是30000~32767,当然这个端口的范围可以在启动apiserver的时候进行修改,指定--service-node-port-range=1-65535,修改为需要的端口范围,最好是不要将常见服务的端口包含在内,否则容易冲突。
```yaml
---
apiVersion: v1
kind: Service
metadata:
labels:
service: ambassador
name: ambssador
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30009
selector:
service: ambassador
```
这里采用NodePort方式暴漏到服务器的30009端口。可以根据需要自己制定。
## 3. Creating your first route
Create the following YAML and put it in a file called httpbin.yaml.
```yaml
---
apiVersion: v1
kind: Service
metadata:
name: httpbin
annotations:
getambassador.io/config: |
---
apiVersion: ambassador/v0
kind: Mapping
name: httpbin_mapping
prefix: /httpbin/
service: httpbin.org:80
host_rewrite: httpbin.org
spec:
ports:
- name: httpbin
port: 80
```
Then, apply it to the Kubernetes with kubectl:
```bash
$ kubectl apply -f httpbin.yaml
```
部署服务时,Ambassador将注意到getambassador.io/config服务上的注释,并使用其中Mapping包含的注释来配置路由。(对于注释中可以使用哪种ambassador配置没有限制,但重要的是要注意 ambassador 只关注Kubernetes Service的注释。)
在这种情况下,映射会创建一条路由,将路由从`/httpbin/`端点路由到公共`httpbin.org`服务。请注意,我们使用的`host_rewrite`属性`httpbin_mapping-` 这会强制HTTP Host标头,并且在映射到外部服务时通常是个好主意。
## 4.测试映射
为了测试一下,我们需要 ambassador 的外部IP(可能需要一些时间才能使用):
```
kubectl get svc -o wide ambssador
```
Eventually, this should give you something like:
```
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ambassador 10.11.12.13 35.36.37.38 80:31656/TCP 1m
```
You should now be able to use curl to httpbin (don't forget the trailing /):
如果是LoadBalancer
```
$ curl 35.36.37.38/httpbin/
```
如果是NodePort访问的url:http://ip:30009/httpbin/,ip为kubernetes服务器的ip
## 5. Adding a Service
您可以通过使用适当的Ambassador注释部署它来添加服务路由。例如,我们可以在此群集中本地部署QoTM服务,并通过qotm.yaml使用以下配置创建,通过Ambassador自动映射它:
```yaml
---
apiVersion: v1
kind: Service
metadata:
name: qotm
annotations:
getambassador.io/config: |
---
apiVersion: ambassador/v0
kind: Mapping
name: qotm_mapping
prefix: /qotm/
service: qotm
spec:
selector:
app: qotm
ports:
- port: 80
name: http-qotm
targetPort: http-api
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: qotm
spec:
replicas: 1
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: qotm
spec:
containers:
- name: qotm
image: datawire/qotm:1.1
ports:
- name: http-api
containerPort: 5000
resources:
limits:
cpu: "0.1"
memory: 100Mi
```
然后应用它:
```bash
kubectl apply -f qotm.yaml
```
在QoTM服务运行几秒钟后,应该为它配置大使。尝试一下
```bash
$ curl http://${AMBASSADOR_IP}/qotm/
```
## 6. Kubernetes的诊断服务
Ambassador包括一个集成的诊断服务,以帮助进行故障排除 默认情况下,这不会暴露给Internet。要查看它,我们需要获得其中一个ambassador pod的名称:
```bash
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ambassador-3655608000-43x86 1/1 Running 0 2m
ambassador-3655608000-w63zf 1/1 Running 0 2m
```
将本地端口8877转发到其中一个pod:
```bash
kubectl port-forward ambassador-3655608000-43x86 8877
```
然后让我们在http//localhost8877/ambassador/v0/diag/查看诊断信息。