首先须要搭建docker+k8s环境,如何搭建这里就再也不赘述,能够自行搜索。git
打开命令行,运行命令:redis
curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.1.3 sh -
获取最新版本istio并解压,docker
接着进入istio目录:api
cd istio-1.1.3
该目录下包含:安全
install/
目录中包含了 Kubernetes 安装所需的 .yaml
文件samples/
目录中是示例应用istioctl
客户端文件保存在 bin/
目录之中。istioctl
的功能是手工进行 Envoy Sidecar 的注入。istio.VERSION
配置文件将istioctl加入PATH环境变量,这样就能够在任何地方运行该命令:app
export PATH=$PWD/bin:$PATH
此时须要安装helm,来安装istio到kubernetes集群:curl
brew install kubernetes-helm
安装完成以后,进一步安装tiller:tcp
先给tiller新建一个serviceaccount:分布式
kubectl apply -f install/kubernetes/helm/helm-service-account.yaml
而后使用helm安装tiller:ide
helm init --service-account tiller
tiller安装完成以后,安装istio-init来对istio进行初始化,主要是一些CRD的建立:
helm install install/kubernetes/helm/istio-init --name istio-init --namespace istio-system
等一段时间以后,使用以下命令查看,是否有53个CRD被建立:
kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l
53
接着建立istio相关组件,因为istio的ingressgateway的Service默认配置为LoadBalancer,集群环境没有在云提供商的平台上,因此须要改为NodePort对外提供访问。因此要用如下命令进行安装:
helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set gateways.istio-ingressgateway.type=NodePort
若是你的机器内存不足,能够将pilot的内存下降,在上面命令再加一个参数:
--set pilot.resources.requests.memory="512Mi"
当上面命令成功运行以后,能够经过kubectl命令查看pod和svc的状态:
kubectl get svc -n istio-system
结果以下:
kubectl get pods -n istio-system
结果以下:
此时,istio已经成功安装到集群。
若是想要使用istio的sidecar自动注入功能,咱们还须要如下配置:
首先,查看kubernetes的apiserver启动参数:--admission-control是否包含MutatingAdmissionWebhook和ValidatingAdmissionWebhook两项,若是没有须要添加。
而后,要给须要使用自动注入功能的namespace加label
kubectl label namespace default istio-injection=enabled
这时,部署到default中的pod都会自动加上sidecar。
这时,istio的环境就已经搭建完成。
官方针对使用istio的Kubernetes环境还有几项要求:
一、针对建立的Service,启动的ports下得全部name都要遵循命名规则:<协议>[-<后缀>-],其中<协议>
部分可选择范围包括 grpc
、http
、http2
、https
、mongo
、redis
、tcp
、tls
以及 udp
,Istio 能够经过对这些协议的支持来提供路由能力。例如 name: http2-foo
和 name: http
都是有效的端口名,但 name: http2foo
就是无效的。若是没有给端口进行命名,或者命名没有使用指定前缀,那么这一端口的流量就会被视为普通 TCP 流量(除非显式的用 Protocol: UDP
声明该端口是 UDP 端口)
二、全部部署相关的Pod必须在containers.ports中使用containerPort明确指定监听的端口列表,未列出的端口将不会通过istio的Proxy。若是是Deployment、StatefulSet、ReplicationController、DaemonSet等也同样。
三、全部的Pod不管是否公开端口,都必须关联到至少一个Service上,若是一个 Pod 绑定多个Service,这些服务不能在同一端口上使用不一样协议,例如 HTTP 和 TCP。
四、Deployment 、StatefulSet、ReplicationController、DaemonSet等应带有 app
以及 version
标签:在使用其进行 Pod 部署的时候,建议显式的为其加上 app
以及 version
标签。每一个部署都应该有一个有意义的 app
标签和一个用于标识其版本的 version
标签。app
标签在分布式追踪的过程当中会被用来加入上下文信息。Istio 还会用 app
和 version
标签来给遥测指标数据加入上下文信息。
五、Application UID:不能使用RunAsUser: 1337用户运行Pod
六、NET_ADMIN
功能: 若是集群中实施了 Pod 安全策略,除非使用 Istio CNI 插件,不然 Pod 必须具备NET_ADMIN
功能。请参阅必需的 Pod 功能。