教程 | Kubernetes上运行Istio Ingress Controller
Posted K8S技术社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教程 | Kubernetes上运行Istio Ingress Controller相关的知识,希望对你有一定的参考价值。
,文末二维码报名!
本教程演示了如何在Kubernetes集群中运行Istio Ingress Controller。
Istio项目承载多个组件,包括:Pilot、Mixer和Auth。这些组件组合起来提供了一个完整的平台来连接,管理和保障微服务的安全。 但是,采用Istio并不是0或1的命题。 你可以选用所需的部件。在本教程中,负责Envoy实例生命周期的Istio Pilot以及基于Envoy的Kubernetes Ingress Controller Istio Ingress将用于提供强大的Ingress解决方案。
Istio Pilot由Deployment管理
Istio Ingress Controller由DaemonSet管理
——在专用Istio Ingress节点池中的每个节点上运行
前端Load Balancer跨多个Istio入口控制器分配流量
先决条件
Google Cloud Platform
本教程利用Google Cloud Platform简化了Kubernetes集群的配置以及运行Istio Pilot和Ingress Controller所需的必要计算基础设施。
运行本教程的估计费用:每小时0.16美元(每天3.79美元)。
(本教程所需的计算资源超过Google Cloud Platform免费层。)
来源
Istio Ingress Tutorial存储库包含必须下载到用于实践本教程的机器上的配置文件和脚本的集合。使用git命令克隆此存储库:
git clone https://github.com/kelseyhightower/istio-ingress-tutorial.git
本教程的其余部分假定你的工作目录是克隆的存储库的根目录。进入istio-ingress-tutorial目录:
cd istio-ingress-tutorial
客户端工具
本教程需要与许多工具和服务进行交互,这些工具和服务需要一组特定的命令行实用程序才能安装在用于实践本教程的机器上。
安装以下客户端工具,并确保它们位于你的路径中:
gcloud 166.0.0
kubectl 1.7.3
istioctl 0.1.6
(使用gcloud安装kubectl:gcloud组件安装kubectl)
Kubernetes基础设施
配置一个Kubernetes集群
需要一个Kubernetes 1.7.3+集群来托管Istio Pilot和Ingress Controller。使用gcloud命令配置两个节点的Kubernetes集群:
gcloud container clusters create istio \
--machine-type n1-standard-1 \
--num-nodes 2 \
--cluster-version 1.7.
配置istio Kubernetes集群可能需要几分钟的时间。等待上述命令完成或使用gcloud命令来监视单个终端中的进度:
gcloud container clusters list
NAME ZONE MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
istio us-central1-f 1.7.3 XX.XXX.XXX.XX n1-standard-1 1.7.3 2 PROVISIONING
预计完成时间:5分钟。
配置Istio Ingress节点池
添加一个附加的节点池,以支持在一组专用机器上运行多个Istio Ingress控制器。
gcloud container node-pools create istio-ingress-pool \
--cluster istio \
--machine-type n1-standard-1 \
--num-nodes 2 \
--node-labels dedicated=istio-ingress
预计完成时间:2分钟。
列出istio Kubernetes集群的节点池:
gcloud container node-pools list --cluster istio
NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION
default-pool n1-standard-1 100 1.7.3
istio-ingress-pool n1-standard-1 100 1.7.3
在istio Kubernetes集群就绪之前可能需要几分钟的时间。使用gcloud命令来监视进度:
gcloud container clusters list
NAME ZONE MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
istio us-central1-f 1.7.3 XXX.XXX.XX.XX n1-standard-1 1.7.3 4 RECONCILING
预计完成时间:3分钟。
污染Istio Ingress节点池
通过污染节点来确保istio-ingress-pool节点池中的节点只接受Istio Ingress工作负载:
kubectl taint nodes \
$(kubectl get nodes -l dedicated=istio-ingress -o jsonpath='{.items[*].metadata.name}') \
dedicated=istio-ingress:NoSchedule
node "gke-istio-istio-ingress-pool-XXXXXXXX-XXXX" tainted
node "gke-istio-istio-ingress-pool-XXXXXXXX-XXXX" tainted
授予当前用户集群管理权限
需要管理员权限才能为Istio Pilot和Ingress Controller创建必要的RBAC规则:
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole=cluster-admin \
--user=$(gcloud config get-value core/account)
配置Istio Pilot
创建Istio-pilot服务帐户和集群角色
创建istio-pilot服务帐户
kubectl apply -f serviceaccounts/istio-pilot.yaml
创建istio-pilot集群角色:
kubectl apply -f clusterroles/istio-pilot.yaml
创建istio-pilot角色绑定:
kubectl apply -f rolebindings/istio-pilot.yaml
创建Istio ConfigMap
创建保存Istio配置的istio ConfigMap:
kubectl apply -f configmaps/istio.yaml
创建Istio Piolt部署
创建istio-pilot部署:
kubectl apply -f deployments/istio-pilot.yaml
暴露Istio Pilot部署
创建istio-pilot服务:
kubectl apply -f services/istio-pilot.yaml
此时,Istio Pilot服务可用:
kubectl get pods -l istio=pilot
NAME READY STATUS RESTARTS AGE
istio-pilot-XXXXXXXXX-XXXXX 2/2 Running 0 1m
Istio Ingress Controller
在本部分中,将使用DaemonSet把Istio Ingress Controller部署到
istio-ingress-pool节点池中的每个节点。这样做的原因是为Istio Ingress
控制器提供专用资源,并支持独立于默认节点池扩展istio Ingress
节点池的能力。使用两个不同的节点池也可以为Ingress Controllers和一般
工作负载使用不同的机器类型。
创建Istio Ingress服务帐户和集群角色
创建istio-ingress服务帐户:
kubectl apply -f serviceaccounts/istio-ingress.yaml
创建istio-ingress集群角色:
kubectl apply -f clusterroles/istio-ingress.yaml
创建istio-ingress角色绑定:
kubectl apply -f rolebindings/istio-ingress.yaml
创建Istio Ingress DaemonSet
使用DaemonSet来确保在istio-ingress-pool节点池中的每个节点上运行单
个Istio Ingress Controller。
kubectl apply -f daemonsets/istio-ingress.yaml
暴露Istio Ingress Controller
创建istio-ingress服务:
kubectl apply -f services/istio-ingress.yaml
istio-ingress服务将spec.externalTrafficPolicy设置为Local,以确保只有
运行Istio Ingress Controller的istio-ingress-pool节点池中的节点才能接
收流量。
此时,Istio入口控制器已准备好接收流量:
kubectl get pods -l istio=ingress
NAME READY STATUS RESTARTS AGE
istio-ingress-XXXXX 1/1 Running 0 5m
istio-ingress-XXXXX 1/1 Running 0 5m
Istio 路由规则
Istio Ingress Controller提供基于Envoy的独特流量管理功能的高级功能集。
本部分将演示如何使用Istio Pilot和istioclt命令行工具动态配置
Istio Ingress Controller。
istio-test HTTP服务将用于演示Istio的流量管理功能。
测试Istio Ingress Controller
部署v1的istio测试应用程序:
kubectl apply -f deployments/istio-test-v1.yaml
暴露istio-test-v1部署:
kubectl apply -f services/istio-test.yaml
创建istio-test Ingress对象:
ISTIO_INGRESS_IP=$(kubectl get svc istio-ingress \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl -i http://${ISTIO_INGRESS_IP}
HTTP/1.1 200 OK
date: Fri, 18 Aug 2017 16:26:40 GMT
content-length: 14
content-type: text/plain; charset=utf-8
x-envoy-upstream-service-time: 1
server: envoy
istio-test-v1
测试Istio路由规则
Isito Ingress控制器可以由Istio Pilot动态配置,以便在外部客户
端和Kubernetes集群中运行的服务之间提供更高级的路由。为了演示
这些功能,我们需要部署v2的istio-test HTTP服务:
kubectl apply -f deployments/istio-test-v2.yaml
此时,istio-test服务的v1和v2应该运行:
kubectl get pods -l app=istio-test
NAME READY STATUS RESTARTS AGE
istio-test-v1-XXXXXXXXX-XXXXX 1/1 Running 0 5m
istio-test-v2-XXXXXXXXX-XXXXX 1/1 Running 0 4m
将curl命令运行几次,观察Istio Ingress Controller的响应:
curl http://${ISTIO_INGRESS_IP}
istio-test-v1
curl http://${ISTIO_INGRESS_IP}
istio-test-v2
请注意,istio-test服务的v1和v2都在响应。
添加路由规则
Istio路由规则可用于强制所有客户端点击v2的istio-test服务。
创建路由规则并将其保存到名为istio-test-default.yaml的文件中:
cat > istio-test-default.yaml <<EOF
type: route-rule
name: istio-test-default
namespace: default
spec:
destination: istio-test.default.svc.cluster.local
route:
- tags:
version: v2
weight: 100
EOF
使用istioctl命令提交路由规则:
istioctl create -f istio-test-default.yaml
路由规则存储在Kubernetes ThirdPartyResources中。
kubectl get thirdpartyresources
NAME DESCRIPTION VERSION(S)
istio-config.istio.io Istio configuration v1alpha1
检查istio-test-default路由规则配置的详细信息:
kubectl get istioconfigs
NAME KIND
route-rule-istio-test-default IstioConfig.v1alpha1.istio.io
使用kubectl describe命令获取更多详细信息:
kubectl describe istioconfigs route-rule-istio-test-default
Name: route-rule-istio-test-default
Namespace: default
Labels: <none>
Annotations: <none>
API Version: istio.io/v1alpha1
Kind: IstioConfig
Metadata:
Creation Timestamp: 2017-08-18T16:29:34Z
Resource Version: 10775
Self Link: /apis/istio.io/v1alpha1/namespaces/default/istioconfigs/route-rule-istio-test-default
UID: 6b7530f4-8432-11e7-a05d-42010a80004f
Spec:
Destination: istio-test.default.svc.cluster.local
Route:
Tags:
Version: v2
Weight: 100
Events: <none>
也可以使用istioctl命令:
istioctl get route-rules istio-test-default
destination: istio-test.default.svc.cluster.local
route:
- tags:
version: v2
weight: 100
与Istio Ingress Controller进行交互
使用istio-test-default路由规则,重新运行curl命令几次并观察响应:
curl http://${ISTIO_INGRESS_IP}
istio-test-v2
curl http://${ISTIO_INGRESS_IP}
istio-test-v2
注意所有的流量都由istio-test服务的v2处理。
bash clean-up
译者:Jonathan Zhang
原文:https://github.com/kelseyhightower/istio-ingress-tutorial/blob/master/docs/06-istio-route-rules.md
以上是关于教程 | Kubernetes上运行Istio Ingress Controller的主要内容,如果未能解决你的问题,请参考以下文章
Istio实战-Istio 与 Kubernetes 行业主流?