K8S集群部署istio
简介
Istio 提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控等功能,而不需要对服务的代码做任何改动。
istio 适用于容器或虚拟机环境(特别是 k8s),兼容异构架构。
istio 使用 sidecar(边车模式)代理服务的网络,不需要对业务代码本身做任何的改动。
HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡。
istio 通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度控制;支持访问控制、速率限制和配额。
istio 对出入集群入口和出口中所有流量的自动度量指标、日志记录和跟踪。
对比国内阿里云和K8S官方维护的Nginx Ingress Controller及 Istio Gateway 比较
部署istio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 1、下载istio官方的部署包网址:https: //github.com/istio/istio/releases/tag/1.6.7 wget https: //github.com/istio/istio/releases/download/1.6.7/istio-1.6.7-linux-amd64.tar.gz 2、解压安装包并加入环境变量中 mkdir /application/ tar xvf istio-1.6.7-linux-amd64.tar.gz -C /application / echo "export PATH=$PATH:/application/istio-1.6.7/bin" >>/etc/profile && source /etc/profile 3、安装istio(ps:一定要保证k8s集群正常运行) [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 7d2h v1.18.0 node-1 Ready <none> 7d2h v1.18.0 node-2 Ready <none> 7d2h v1.18.0 [root@k8s-master ~]# 4、安装 [root@k8s-master bin]# istioctl manifest apply -- set profile=demo Detected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https: //istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details. ✔ Istio core installed ✔ Istiod installed ✔ Ingress gateways installed ✔ Egress gateways installed ✔ Addons installed ✔ Installation complete [root@k8s-master bin]# |
查询部署完成情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [root@k8s-master bin]# kubectl get svc -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.100.91.88 <none> 3000/TCP 2m5s istio-egressgateway ClusterIP 10.106.229.1 <none> 80/TCP,443/TCP,15443/TCP 2m6s istio-ingressgateway LoadBalancer 10.111.48.40 <pending> 15021:30045/TCP,80:31929/TCP,443:31560/TCP,31400:31134/TCP,15443:31166/TCP 2m6s istiod ClusterIP 10.101.173.49 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP,853/TCP 2m30s jaeger-agent ClusterIP None <none> 5775/UDP,6831/UDP,6832/UDP 2m5s jaeger-collector ClusterIP 10.103.41.41 <none> 14267/TCP,14268/TCP,14250/TCP 2m5s jaeger-collector-headless ClusterIP None <none> 14250/TCP 2m5s jaeger-query ClusterIP 10.97.12.213 <none> 16686/TCP 2m5s kiali ClusterIP 10.105.102.92 <none> 20001/TCP 2m5s prometheus ClusterIP 10.98.88.198 <none> 9090/TCP 2m5s tracing ClusterIP 10.97.49.170 <none> 80/TCP 2m5s zipkin ClusterIP 10.111.114.233 <none> 9411/TCP 2m5s [root@k8s-master bin]# kubectl get pods -n istio-system NAME READY STATUS RESTARTS AGE grafana-b54bb57b9-4ncvl 1/1 Running 0 2m28s istio-egressgateway-64bc874f5c-bxqb8 1/1 Running 0 2m29s istio-ingressgateway-6b947b8c5d-xdttt 1/1 Running 0 2m29s istio-tracing-9dd6c4f7c-vljvl 1/1 Running 0 2m28s istiod-654b4b468b-lfhgf 1/1 Running 0 2m54s kiali-d45468dc4-q6wbn 1/1 Running 0 2m28s prometheus-77566c9987-285jt 2/2 Running 0 2m28s [root@k8s-master bin]# |
设置可视化界面kiali为外部访问模式并查询nodeport号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [root@k8s-master bin]# kubectl patch svc -n istio-system kiali -p '{"spec": {"type": "NodePort"}}' service/kiali patched [root@k8s-master bin]# kubectl describe svc -n istio-system kiali Name: kiali Namespace: istio-system Labels: app=kiali install. operator .istio.io/owning-resource=installed-state install. operator .istio.io/owning-resource- namespace =istio-system operator .istio.io/component=AddonComponents operator .istio.io/managed=Reconcile operator .istio.io/version=1.6.7 release=istio Annotations: Selector: app=kiali Type: NodePort IP: 10.105.102.92 Port: http-kiali 20001/TCP TargetPort: 20001/TCP NodePort: http-kiali 31822/TCP #节点访问的端口 Endpoints: 10.244.247.6:20001 Session Affinity: None External Traffic Policy: Cluster Events: <none> [root@k8s-master bin]# |
访问node节点加上端口 192.168.10.112:31822
默认登陆账户和密码为admin/admin
在istio上部署测试应用bookinfo
1 2 3 4 5 6 7 8 | 1、开启sidecar自动注入 kubectl label namespace default istio-injection=enabled 2、使用kubectl部署bookinfo并创建网关 kubectl apply -f /application/istio-1.6.7/samples/bookinfo/platform/kube/bookinfo.yaml kubectl apply -f /application/istio-1.6.7/samples/bookinfo/networking/bookinfo-gateway.yaml 3、设置访问网关的 INGRESS_HOST 和 INGRESS_PORT 变量,查询是否有外部负载均衡器 kubectl get svc istio-ingressgateway -n istio-system<br> EXTERNAL-IP是none或是pending说明没有问题 |
修改istio的网关为nodeport模式
1 | kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}' |
采用nodeport方式暴露istio-ingressgateway
1 2 3 4 | export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath= '{.spec.ports[?(@.name=="http2")].nodePort}' ) export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath= '{.spec.ports[?(@.name=="https")].nodePort}' ) #获取 ingress IP 地址: export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}' ) |
查询URL
1 2 | echo $INGRESS_HOST:$INGRESS_PORT 192.168.10.112:30637 |
使用浏览器访问bookinfo
http://192.168.10.112:30637/productpage
重复刷新可以发现星星发生变化说明部署成功
1 2 3 | 参考地址: https: //blog.csdn.net/weixin_44144334/article/details/107788292 https: //developer.aliyun.com/article/636511 |
如有侵权请及时联系删除
|
Istio Gateway |
阿里云Ingress Controller |
NGINX Ingress Controller |
根据HTTP Header选择路由规则 |
支持 |
支持 |
仅支持单个Header,不支持多个Header组合 |
Header规则支持正则表达式 |
支持 |
支持 |
支持 |
服务之间设置权重拆分流量 |
支持 |
支持 |
支持 |
Header和权重规则组合使用 |
支持 |
支持 |
支持 |
路由规则检查 |
支持 |
不支持 |
不支持 |
路由规则粒度 |
service下的不同pod |
service |
service |
支持的协议 |
HTTP1.1/HTTP2/gRPC/TCP/Websockets/MongoDB |
HTTP1.1/HTTP2/gRPC/TCP/Websockets |
HTTP1.1/HTTP2/gRPC/TCP/Websockets |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)