k8s 安装并试用Istio service mesh
本文根据官网的文档整理而成,步骤包括安装istio 0.5.1并创建一个bookinfo的微服务来测试istio的功能。
文中使用的yaml文件可以在kubernetes-handbook的manifests/istio
目录中找到,如果镜像pull失败,请根据官网的镜像自行修改。
安装环境
- CentOS 7.4.1708
- Docker 17.12.0-ce
- Kubernetes 1.8.5
部署结构
Istio 的控制平面部署在 Kubernetes 中的部署架构如下图所示。
图片 - Istio 在 Kubernetes 中的部署架构图
我们可以清楚的看到 Istio 控制平面的几个组件的部署运行的命令与开发的端口,以及端口与服务之间的映射的关系。
安装
1.下载安装包
下载地址:https://github.com/istio/istio/releases
下载Linux版本的当前最新版安装包
wget https://github.com/istio/istio/releases/download/0.5.1/istio-0.5.1-linux.tar.gz
2.解压
解压后,得到的目录结构如下:
├── bin
│ └── istioctl
├── install
│ ├── ansible
│ ├── consul
│ ├── eureka
│ ├── gcp
│ ├── kubernetes
│ ├── README.md
│ └── tools
├── istio.VERSION
├── LICENSE
├── README.md
├── samples
│ ├── bookinfo
│ ├── CONFIG-MIGRATION.md
│ ├── helloworld
│ ├── httpbin
│ ├── kubernetes-blog
│ ├── rawvm
│ ├── README.md
│ └── sleep
└── tools
├── cache_buster.yaml
├── deb
├── githubContrib
├── minikube.md
├── perf_istio_rules.yaml
├── perf_k8svcs.yaml
├── README.md
├── rules.yml
├── setup_perf_cluster.sh
├── setup_run
├── update_all
└── vagrant
从文件里表中可以看到,安装包中包括了kubernetes的yaml文件,示例应用和安装模板。
3.先决条件
以下说明要求您可以访问启用了RBAC(基于角色的访问控制)的Kubernetes1.7.3或更新的群集。您还需要安装1.7.3或更高版本。如果您希望启用automatic sidecar injection,则需要Kubernetes 1.9或更高版本。kubectl
注意:如果您安装了Istio 0.1.x,请在安装新版本之前彻底卸载它(包括适用于所有启用Istio的应用程序窗口的Istio支架)。 安装或升级Kubernetes CLIkubectl以匹配群集支持的版本(CRD支持版本为1.7或更高版本)。
根据您的Kubernetes提供者:
要在本地安装Istio,请安装最新版本的Minikube(版本0.22.1或更高版本)。
4.安装步骤
从0.2版本开始,Istio安装在它自己的istio-system命名空间中,并且可以管理来自所有其他命名空间的服务。
转至Istio发布页面以下载与您的操作系统相对应的安装文件。如果您使用的是MacOS或Linux系统,以下命令自动下载并提取最新版本:
curl -L https://git.io/getLatestIstio | sh -
解压缩安装文件并将目录更改为文件位置。
安装目录包含:
Installation .yaml Kubernetes的安装文件
Sample/ 示例应用程序
bin/istioctl 二进制bin/文件 在手动注入Envoy作为附属代理并创建路由规则和策略时使用.
istio.VERSION配置文件
例如,如果包是istio-0.5(初步)
cd istio-0.5 (preliminary)
将istioctl客户端添加到您的PATH。例如,在MacOS或Linux系统上运行以下命令:
export PATH=$PWD/bin:$PATH
安装Istio的核心组件。从下面两个互相排斥的选项中选择一个,或者用Helm Chart交替安装: a)安装Istio而不启用侧车间的相互TLS认证。为具有现有应用程序的群集,使用Istio辅助车的服务需要能够与其他非Istio Kubernetes服务以及使用活动性和准备就绪探测器,无头服务或StatefulSets的应用程序通信的应用程序选择此选项。
kubectl apply -f install/kubernetes/istio.yaml
要么
b)安装Istio并启用侧柜之间的相互TLS认证:
kubectl apply -f install/kubernetes/istio-auth.yaml
这两个选项都会创建istio-system命名空间以及所需的RBAC权限,并部署Istio-Pilot,Istio-Mixer,Istio-Ingress和Istio-CA(证书颁发机构)。
可选:如果您的群集的Kubernetes版本是1.9或更高,并且您希望启用自动代理注入,请安装sidecar injector webhook。 验证安装 请确保以下Kubernetes服务部署:istio-pilot,istio-mixer,istio-ingress。
kubectl get svc -n istio-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingress 10.83.245.171 35.184.245.62 80:32730/TCP,443:30574/TCP 5h
istio-pilot 10.83.251.173 <none> 8080/TCP,8081/TCP 5h
istio-mixer 10.83.244.253 <none> 9091/TCP,9094/TCP,42422/TCP 5h
注意:如果您的集群中不支持外部负载平衡(例如,Minikube)的环境中运行,该external-ip的istio-ingress会显示。您必须使用NodePort访问应用程序,或使用端口转发。
修改istio.yaml中的istio-ingress service的type为ClusterIP,并设置nodePort
,默认为32000。
确保相应Kubernetes容器都运行起来:istio-pilot-*
、istio-mixer-*
、istio-ingress-*
、istio-ca-*
,和可选的istio-sidecar-injector-*
。
kubectl get pods -n istio-system
istio-ca-3657790228-j21b9 1/1 Running 0 5h
istio-ingress-1842462111-j3vcs 1/1 Running 0 5h
istio-sidecar-injector-184129454-zdgf5 1/1 Running 0 5h
istio-pilot-2275554717-93c43 1/1 Running 0 5h
istio-mixer-2104784889-20rm8 2/2 Running 0 5h
部署您的应用程序
您现在可以部署您自己的应用程序或者像Bookinfo一样随安装提供的示例应用程序之一。注意:应用程序必须对所有HTTP通信使用HTTP/1.1或HTTP/2.0协议,因为HTTP/1.0不受支持。
如果您启动了Istio-sidecar-injector,如上所示,您可以直接使用应用程序部署应用程序kubectl create。
Istio Sidecar注入器会自动将Envoy容器注入到您的应用程序窗格中,假设运行在标有名称空间的名称空间中istio-injection=enabled
kubectl label namespace <namespace> istio-injection=enabled
kubectl create -n <namspace> -f <your-app-spec>.yaml
如果您没有安装Istio-sidecar-injector,则在部署它们之前,必须使用istioctl kube-inject将Envoy容器手动注入应用程序窗格中:
kubectl create -f <(istioctl kube-inject -f <your-app-spec>.yaml)
卸载
卸载Istio sidecar进样器:
如果您启用Istio-sidecar-injector,请将其卸载:
kubectl delete -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
卸载Istio核心组件。对于0.6(初始)发行版,卸载将删除RBAC权限,istio-system命名空间和分层下的所有资源。忽略不存在资源的错误是安全的,因为它们可能已被分层删除。
a)如果您在禁用相互TLS身份验证的情况下安装了Istio:
kubectl delete -f install/kubernetes/istio.yaml
要么
b)如果您在启用相互TLS身份验证的情况下安装了Istio:
kubectl delete -f install/kubernetes/istio-auth.yaml
7.安装监控插件
安装插件
kubectl apply -f install/kubernetes/addons/prometheus.yaml
kubectl apply -f install/kubernetes/addons/grafana.yaml
kubectl apply -f install/kubernetes/addons/servicegraph.yaml
kubectl apply -f install/kubernetes/addons/zipkin.yaml
在traefik ingress中增加增加以上几个服务的配置,同时增加istio-ingress配置。
- host: grafana.istio.io
http:
paths:
- path: /
backend:
serviceName: grafana
servicePort:
- host: servicegraph.istio.io
http:
paths:
- path: /
backend:
serviceName: servicegraph
servicePort:
- host: prometheus.istio.io
http:
paths:
- path: /
backend:
serviceName: prometheus
servicePort:
- host: zipkin.istio.io
http:
paths:
- path: /
backend:
serviceName: zipkin
servicePort:
- host: ingress.istio.io
http:
paths:
- path: /
backend:
serviceName: istio-ingress
servicePort:
测试
我们使用Istio提供的测试应用bookinfo微服务来进行测试。
该微服务用到的镜像有:
istio/examples-bookinfo-details-v1
istio/examples-bookinfo-ratings-v1
istio/examples-bookinfo-reviews-v1
istio/examples-bookinfo-reviews-v2
istio/examples-bookinfo-reviews-v3
istio/examples-bookinfo-productpage-v1
该应用架构图如下:
图片 - BookInfo Sample应用架构图
部署应用
kubectl create -f <(istioctl kube-inject -f samples/apps/bookinfo/bookinfo.yaml)
Istio kube-inject
命令会在bookinfo.yaml
文件中增加Envoy sidecar信息。参考:https://istio.io/docs/reference/commands/istioctl.html#istioctl-kube-inject
在本机的/etc/hosts
下增加VIP节点和ingress.istio.io
的对应信息,具体步骤参考:边缘节点配置,或者使用gateway ingress来访问服务,
如果将productpage
配置在了ingress里了,那么在浏览器中访问http://ingress.istio.io/productpage,如果使用了istio默认的gateway
ingress配置的话,ingress service使用nodePort
方式暴露的默认使用32000端口,那么可以使用http://任意节点的IP:32000/productpage来访问。
图片 - BookInfo Sample页面
多次刷新页面,你会发现有的页面上的评论里有星级打分,有的页面就没有,这是因为我们部署了三个版本的应用,有的应用里包含了评分,有的没有。Istio根据默认策略随机将流量分配到三个版本的应用上。
查看部署的bookinfo应用中的productpage-v1
service和deployment,查看productpage-v1
的pod的详细json信息可以看到这样的结构:
$ kubectl get pod productpage-v1-944450470-bd530 -o json
见productpage-v1-istio.json文件。从详细输出中可以看到这个Pod中实际有两个容器,这里面包括了initContainer
,作为istio植入到kubernetes deployment中的sidecar。
"initContainers": [
{
"args": [
"-p",
"15001",
"-u",
"1337"
],
"image": "docker.io/istio/init:0.1",
"imagePullPolicy": "Always",
"name": "init",
"resources": {},
"securityContext": {
"capabilities": {
"add": [
"NET_ADMIN"
]
}
},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"volumeMounts": [
{
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"name": "default-token-3l9f0",
"readOnly": true
}
]
},
{
"args": [
"-c",
"sysctl -w kernel.core_pattern=/tmp/core.%e.%p.%t \u0026\u0026 ulimit -c unlimited"
],
"command": [
"/bin/sh"
],
"image": "alpine",
"imagePullPolicy": "Always",
"name": "enable-core-dump",
"resources": {},
"securityContext": {
"privileged": true
},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"volumeMounts": [
{
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
"name": "default-token-3l9f0",
"readOnly": true
}
]
}
],
监控
不断刷新productpage页面,将可以在以下几个监控中看到如下界面。
Grafana页面
图片 - Istio Grafana界面
Prometheus页面
图片 - Prometheus页面
Zipkin页面
图片 - Zipkin页面
ServiceGraph页面
http://servicegraph.istio.io/dotviz
可以用来查看服务间的依赖关系。
访问 http://servicegraph.istio.io/graph 可以获得json格式的返回结果。
图片 - ServiceGraph页面
k8s 安装并试用Istio service mesh的更多相关文章
- 微服务之旅:从Netflix OSS到 Istio Service Mesh
在这篇文章中,我们从Netflix开始,通过Envoy和Istio的崛起,快速浏览微服务的历史. 微服务是具有边界上下文的松散耦合服务,使您能够独立开发,部署和扩展服务.它还可以定义为构建独立开发和部 ...
- 揭开服务网格~Istio Service Mesh神秘的面纱
目录 一.写在前面 二.微服务与K8S 三.服务网格与K8S 四.常见的产品 五.Istio架构 六.Istio的核心资源介绍 6.1.VirtualService 6.2.Destination R ...
- Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh
本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...
- Service Mesh(服务网格)
Service Mesh(服务网格) 什么是Service Mesh(服务网格)Service mesh 又译作 "服务网格",作为服务间通信的基础设施层.Buoyant 公司的 ...
- 蚂蚁金服 Service Mesh 渐进式迁移方案|Service Mesh Meetup 实录
小蚂蚁说: 本文是基于在 Service Mesher Meetup 上海站的主题分享<蚂蚁金服 Service Mesh 渐进式迁移方案>内容整理,完整的分享 PPT 获取方式见文章底部 ...
- 使用Docker Compose搭建Service Mesh
使用Docker Compose搭建Service Mesh 本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于 ...
- 腾讯云 K8S 集群实战 Service Mesh—Linkerd2 & Traefik2 部署 emojivoto 应用
Linkerd 是 Kubernetes 的服务网格. 它通过为您提供运行时调试(runtime debugging).可观察性(observability).可靠性(reliability)和安全性 ...
- Service Mesh服务网格新生代--Istio(转)
万字解读:Service Mesh服务网格新生代--Istio 官网地址:https://preliminary.istio.io/zh/docs/concepts/security/ Servic ...
- k8s 安装 istio 的坑
本文针对于二进制部署的k8s安装istio1.67版本 没有设置admin.conf的小伙伴请参考 https://www.cnblogs.com/Tempted/p/13469772.html 1. ...
随机推荐
- 全文检索引擎及工具 Lucene Solr
全文检索引擎及工具 lucence lucence是一个全文检索引擎. lucence代码级别的使用步骤大致如下: 创建文档(org.apache.lucene.document.Document), ...
- hibernate_08_关联映射_一对多
hibernate的映射关系 一对多.多对一.一对一.多对多. 常用的是一对多和多对一. 在数据库中可以通过添加主外键的关联,表现一对多的关系:在hibernate中通过在一方持有多方的集合实现,即在 ...
- 安卓系统使用摄像头API
原文链接:定制自己的安卓Camera 参考链接:http://blog.csdn.net/tankai19880619/article/details/9075839 ...
- 读书笔记「Python编程:从入门到实践」_9.类
9.1 创建和使用类 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想. OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 把 ...
- iproute2和tc的高级路由用法
#Linux advanced router ip link show #显示链路 ip addr show #显示地址(或ifconfig) ip route show #显示路由(route -n ...
- gitlab变更邮箱后发送邮件报SSLError错误
测试发送邮件: gitlab-rails console Notify.test_email('test666@example.com', 'Message Subject', 'Message Bo ...
- js数组操作find查找特定值结合es6特性
js数组操作find查找特定值结合es6特性
- 复习C语言基础知识(day02)
一.大型软件组织 定义规则,规则就是协议.用户和中介的接口. 软件开发的过程: 定义规则,定义协议.软件为用户提供的功能. 在C语言中使用接口实现.接口就是函数. 两种用户 函数的使用者 函数的实现者 ...
- 博弈论题目总结(二)——SG组合游戏及变形
SG函数 为了更一般化博弈问题,我们引入SG函数 SG函数有如下性质: 1.如果某个状态SG函数值为0,则它后继的每个状态SG函数值都不为0 2.如果某个状态SG函数值不为0,则它至少存在一个后继的状 ...
- vue 2.0 + elementUI 实现面包屑导航栏
Main.js 9种响应式面包屑导航和分步导航指示器UI设计 var routeList = []; router.beforeEach((to, from, next) => { var in ...