从零搭建一个基于Istio的服务网格

作者 | Emac

640?wx_fmt=png

杏仁医生架构师兼平台组负责人,关注为服务、DevOps领域。

上篇文章从微服务1.0时代的三大痛点(技术门槛高,多语言支持不足和代码侵入性强)说起,由此引出服务网格的起源和演化历史。但古语有云纸上得来终觉浅,绝知此事要躬行,不亲自撸一遍命令,怎敢跟人提服务网格?本篇我将教大家如何在本地从零搭建一个基于Istio的服务网格,从而对服务网格有一个更直观的认识。

1 通关密码:上上下下左左右右ABAB

  • 原料:Mac一台,VPN账号一枚

  • 做法:依序安装和运行 Kubernetes ( https://kubernetes.io/ ),Minikube ( https://github.com/kubernetes/minikube ),Istio


从零搭建一个基于Istio的服务网格_第1张图片

2 穿墙大法:Shadowsocks

无论是 Kubernetes、Minikube 还是 Istio,官方提供的安装文档都非常详尽,只要英文过关,依葫芦画瓢基本上都能跑通。但如果你在国内,还得加一个必要条件,学会如何突破网络审查,俗称fan墙。

Mac下的穿墙软件我首推 Shadowsocks ( https://s.org/en/index.html ),同时支持 Socks5 代理和 HTTP 代理,最新版本可以从 GitHub 下载。

3 小Boss: kubectl!

3.1 安装

Kubernetes 是 Istio 首推的运行平台,因此作为第一步,我们首先来安装kubectl,Kubernetes 的命令行工具,用来控制 Kubernetes 集群。根据官方文档,Mac下安装 kubectl 只需要一行命令,brew install kubectl,这简单、极致的用户体验让你感动的想哭。But wait...

3.2 穿墙1: Brew

你敲完命令,踌躇满志的按下回车之后,可能会发现,屏幕迟迟没有输出,10秒,30秒,1分钟,3分钟,10分钟。。。恭喜你,你被墙了!

Brew 默认的镜像源是 GitHub,而 GitHub 时不时会被墙,即使不被墙访问速度有时也慢的令人发指,导致Brew命令也常常超时甚至失败。解决办法要么换源,要么给 GitHub 配上 Socks5 代理。对码农而言,我更推荐后一种,方法如下:

1) 打开~/.gitconfig文件,如果不存在则新建

2) 在文件末尾添加如下配置并保存:

[http "https://github.com"]
  proxy = socks5://127.0.0.1:1086
[https "https://github.com"]
  proxy = socks5://127.0.0.1:1086

注:socks5://127.0.0.1:1086是 Shadowsocks 默认开启的 Socks5 代理地址。

配上Socks5代理之后,一般就可以妥妥的运行Brew命令了。

3.3 验证

安装好 kubectl 之后,直接运行kubectl version查看版本号。完整的kubectl命令列表在这里 ( https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands )可以找到。如果想进一步学习常见的kubectl命令,可以访问 Kubernetes Playground ( https://www.katacoda.com/courses/kubernetes/playground )完成在线练习。

4 中Boss: Minikube!

4.1 安装

安装完kubectl,接下来就是在本地搭建Kubernetes集群,Minikube是最简单的一种搭建方式,它通过VM模拟了一个单节点的Kubernetes集群。官方文档给出了Mac下的安装命令。

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && \
chmod +x minikube && \
sudo mv minikube /usr/local/bin/

Minikube默认使用的VM Driver是 VirutalBox,因此启动Minikube之前,还要安装VirtualBox。

4.2 启动

安装好 Minikube 和 VirutalBox 之后,可运行如下命令第一次启动Minikube:

minikube start --docker-env HTTP_PROXY=http://<本机IP>:1087 --docker-env HTTPS_PROXY=http://<本机IP>:1087

注:官方文档给出的启动命令带有--vm-driver=xhyve,而事实上最新版本的Minikube已经废弃了 xhyve driver,应去除。

4.3 穿墙2: Docker

你可能已经注意到,上面的启动命令中带了两个--docker-env参数,都指向了Shadowsocks 开启的 HTTP 代理,为啥呢?还是因为墙。Minikube 默认使用Docker 作为容器运行时,并在 VM 中内置了一个Docker 守护进程,使用的镜像源是 DockerHub ( https://hub.docker.com/ )。如果你经常使用Docker,那你一定知道在国内使用 Docker 一般都要修改镜像源(比如阿里云的容器镜像服务 )或者使用代理,否则拉取速度也是慢的令人发指。由于 Minikube 使用的是内置的 Docker 守护进程,使用代理更为方便,但要注意,开启 Shadowsocks HTTP 代理时,需要修改代理的侦听地址为本机 IP,而不是默认的127.0.0.1,否则在 VM 中的 Docker 守护进程是无法访问到这个代理的。

注:--docker-env参数只有在第一次启动 Minikube 时需要,之后启动直接运行minikube start即可。如果需要修改代理地址,可编辑~/.minikube/machines/minikube/config.json文件。

4.4 验证

安装完 Minikube 之后,就可以试着创建第一个 Kubernetes 服务了,具体步骤参考官方文档。

5 大Boss: Istio!

5.1 安装

拿到了 kubectl 和 Minikube 两大神器,搭建 Istio 可以说是水到渠成了。基本步骤如下,

1) 启动 Minikube

minikube start \


--extra-config =controller-manager.ClusterSigningCertFile = "/var/lib/localkube/certs/ca.crt" \ --extra-config =controller-manager.ClusterSigningKeyFile = "/var/lib/localkube/certs/ca.key" \ --extra-config =apiserver.Admission.PluginNames =NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota \ --kubernetes-version =v1.9.0

2) 下载并解压Istio安装包

curl -L https://git.io/getLatestIstio | sh -

3) 进入安装目录(假设为istio-0.7),将bin/目录添加到PATH环境变量

cd
istio-0.7export PATH=$PWD/bin:$PATH

4) 部署 Istio 的核心组件(包括外部流量网关 Ingress, 管理Envoy实例生命周期的 Pilot 以及执行访问控制和使用策略的 Mixer)到Kubernetes

kubectl apply -f install/kubernetes/istio.yaml

注:如果你需要启用Istio的 Mutual TLS Authentication(服务身份验证)功能,可以改为运行kubectl apply -f install/kubernetes/istio-auth.yaml

至此,一个基于Istio的服务网格就算安装完成了。One more thing,还记得上篇文章提到的服务网格所独有的边车模式吗?为了将一个具体的服务接入Istio,需要为每一个服务实例创建一个配套的边车进程。根据官方文档,Istio提供手动和自动两种方式来创建边车进程,前者发生于部署阶段,而后者发生于Pod创建阶段,推荐使用后者,具体步骤参考官方文档,限于篇幅,这里就不再赘述。

5.2 验证

安装完 Istio 之后,可运行kubectl get pods -n istio-system查看所有Istio相关的 Pods,确保这些 Pods 都处于Running状态。然后,你就可以开始Istio的探索之旅了,建议从官方提供的 Bookinginfo 示例应用起步,这里就不再展开。

NAME                                      READY     STATUS    RESTARTS   AGE
istio-ca-59f6dcb7d9-5mll5                 1/1       Running   18         42d
istio-ingress-779649ff5b-x2qmn            1/1       Running   26         42d
istio-mixer-7f4fd7dff-6l5g5               3/3       Running   54         42d
istio-pilot-5f5f76ddc8-6867m              2/2       Running   36         42d
istio-sidecar-injector-7947777478-gzcfz   1/1       Running   9          41d

6 参考

  • Istio - Overview:  https://istio.io/docs/concepts/what-is-istio/overview.html

  • 数人云|万字解读:Service Mesh服务网格新生代--Istio: https://zhuanlan.zhihu.com/p/29586032



全文完


以下文章您可能也会感兴趣:

  • 微服务环境下的集成测试探索(一) —— 服务 Stub & Mock

  • 微服务环境下的集成测试探索(二)—— 契约式测试

  • 乐高式微服务化改造(上)

  • 乐高式微服务化改造(下)

  • 一个创业公司的容器化之路(一) - 容器化之前

  • 一个创业公司的容器化之路(二) - 容器化

  • 一个创业公司的容器化之路(三) - 容器即未来

  • 响应式编程(上):总览

  • 响应式编程(下):Spring 5

  • 复杂业务状态的处理:从状态模式到 FSM

  • 后端的缓存系统浅谈

  • 谈谈到底什么是抽象,以及软件设计的抽象原则

  • 所谓 Serverless,你理解对了吗?

  • Linux 的 IO 通信 以及 Reactor 线程模型浅析

  • 函数扩展

  • Apache Common Pool2 对象池应用浅析

  • 服务网格:微服务进入2.0时代

  • 技术选型的艺术

  • 理解 RabbitMQ Exchange

  • 容器管理利器:Web Terminal 简介


我们正在招聘 Java 工程师,欢迎有兴趣的同学投递简历到 [email protected]

从零搭建一个基于Istio的服务网格_第2张图片


杏仁技术站

长按左侧二维码关注我们,这里有一群热血青年期待着与您相会。



你可能感兴趣的:(从零搭建一个基于Istio的服务网格)