💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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/查看诊断信息。