快速开始
本页面在 Kubernetes 集群中快速安装 Istio service mesh 的说明。
前置条件
下面的操作说明需要您可以访问 Kubernetes 1.9 或更高版本的集群,并且启用了。RBAC (基于角色的访问控制)。您需要安装了 1.9 或更高版本的 kubectl
命令。
如果您希望启用自动注入 sidecar,您必须使用 Kubernetes 1.9 或更高版本。
如果您安装的是 Istio 0.2.x,在安装新版本之前请将其完全卸载(包括所有启用了 Istio 的 Pod 中的sidecar)。
- 安装或更新 Kubernetes 命令行工具
kubectl
以匹配集群的版本 (1.9 或者更高,支持 CRD 功能)
Minikube
要在本地安装 Istio,请安装最新版本的 Minikube(0.25.0 或更高版本)。
Kubernetes 1.9
$ 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
Kubernetes 1.10
$ minikube start \
--extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \
--extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key" \
--extra-config=apiserver.admission-control="NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" \
--kubernetes-version=v1.10.0
Google Kubernetes Engine
创建集群。
$ gcloud container clusters create <cluster-name> \
--cluster-version=1.9.7-gke.1 \
--zone <zone> \
--project <project-name>
获取 kubectl
使用的证书。
$ gcloud container clusters get-credentials <cluster-name> \
--zone <zone> \
--project <project-name>
为当前用户授权管理员权限(为 Istio 创建必需的 RBAC 规则需要使用管理员权限)。
$ kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole=cluster-admin \
--user=$(gcloud config get-value core/account)
IBM Cloud Kubernetes Service (IKS)
创建一个新的精简版集群。
$ bx cs cluster-create --name <cluster-name> --kube-version 1.9.7
或者创建一个新的付费集群:
$ bx cs cluster-create --location location --machine-type u2c.2x4 --name <cluster-name> --kube-version 1.9.7
获取 kubectl
使用的证书(使用您自己集群的名字替换下面的 <cluster-name>
):
$(bx cs cluster-config <cluster-name>|grep "export KUBECONFIG")
IBM Cloud Private
要访问 IBM Cloud Private Cluster,请按照这里的步骤配置 kubectl
CLI。
OpenShift Origin
默认情况下 OpenShift 不允许容器使用 UID 0 来运行。为 Istio 的 service account 启动容器以 UID 0 运行:
$ oc adm policy add-scc-to-user anyuid -z istio-ingress-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z default -n istio-system
$ oc adm policy add-scc-to-user anyuid -z prometheus -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-egressgateway-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-citadel-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-ingressgateway-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-cleanup-old-ca-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-mixer-post-install-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-mixer-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-pilot-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-sidecar-injector-service-account -n istio-system
以上列出了 Istio 中包含的所有默认的 service account。如果您想启用 Istio 的其他服务(例如 Grafana)需要使用类似的命令来涵盖那些服务。
运行应用程序 pod 的 service account 需要特权的安全上下文约束以作为 sidecar 注入的一部分。
$ oc adm policy add-scc-to-user privileged -z default -n <target-namespace>
检查该讨论中关于 Istio 的
SELINUX
问题,以防出现 Envoy 的问题。
AWS (w/Kops)
在安装 Kubernetes 1.9 版的新集群时,将涵盖启用 admissionregistration.k8s.io/v1beta1
的先决条件。
然而,准入控制器的列表需要更新。
$ kops edit cluster $YOURCLUSTER
在配置文件中增加以下内容:
kubeAPIServer:
admissionControl:
- NamespaceLifecycle
- LimitRanger
- ServiceAccount
- PersistentVolumeLabel
- DefaultStorageClass
- DefaultTolerationSeconds
- MutatingAdmissionWebhook
- ValidatingAdmissionWebhook
- ResourceQuota
- NodeRestriction
- Priority
执行更新
$ kops update cluster
$ kops update cluster --yes
启动滚动更新
$ kops rolling-update cluster
$ kops rolling-update cluster --yes
使用kube-api pod上的kubectl
客户端进行验证,您应该看到新的准入控制器:
$ for i in `kubectl get pods -nkube-system | grep api | awk '{print $1}'` ; do kubectl describe pods -nkube-system $i | grep "/usr/local/bin/kube-apiserver" ; done
输出应该是:
[...] --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,NodeRestriction,Priority [...]
Azure
你应该使用 ACS-Engine
来部署集群。按照这些说明来获取和安装 acs-engine
二进制包,使用下面的命令下载 Istio api model definition
:
$ wget https://raw.githubusercontent.com/Azure/acs-engine/master/examples/service-mesh/istio.json
使用 istio.json
模板和以下命令部署集群。您可以在官方文档中找到参数的参考。
参数 | 期望值 |
---|---|
subscription_id | Azure订阅ID |
dns_prefix | 集群DNS前缀 |
location | 集群位置 |
$ acs-engine deploy --subscription-id <subscription_id> --dns-prefix <dns_prefix> --location <location> --auto-suffix --api-model istio.json
几分钟后,您应该在名为<dns_prefix>-<id>
的资源组中找到您的Azure订阅集群。假设我的 dns_prifex
是 myclustername
,有效的资源组和唯一的集群 ID 是 mycluster-5adfba82
。使用这个 <dns_prefix>-<id>
集群 ID,您可以将 acs-engine
生成的 kubeconfig
文件从 _output
文件夹复制到您的机器中:
$ cp _output/<dns_prefix>-<id>/kubeconfig/kubeconfig.<location>.json ~/.kube/config
例如:
$ cp _output/mycluster-5adfba82/kubeconfig/kubeconfig.westus2.json ~/.kube/config
要检查是否部署了正确的 Istio 标志,请使用:
$ kubectl describe pod --namespace kube-system $(kubectl get pods --namespace kube-system | grep api | cut -d ' ' -f 1) | grep admission-control
您应该可以看到 MutatingAdmissionWebhook
和 ValidatingAdmissionWebhook
标志:
--admission-control=...,MutatingAdmissionWebhook,...,ValidatingAdmissionWebhook,...
下载和准备安装
从 0.2 版本开始,Istio 安装到 istio-system
namespace 下,即可以管理所有其它 namespace 下的微服务。
到 Istio release 页面上,根据您的操作系统下载对应的发行版。如果您使用的是 macOS 或者 Linux 系统,可以使用下面的额命令自动下载和解压最新的发行版:
$ curl -L https://git.io/getLatestIstio | sh -
解压安装文件,切换到文件所在目录。安装文件目录下包含:
install/
目录下是 Kubernetes 使用的.yaml
安装文件samples/
目录下是示例程序istioctl
客户端二进制文件在bin
目录下。istioctl
文件用户手动注入 Envoy sidecar 代理、创建路由和策略等istio.VERSION
配置文件
切换到 Istio 包的解压目录。例如 istio-1.0.0:
$ cd istio-1.0.0
将
istioctl
客户端二进制文件加到 PATH 中。 例如,在 macOS 或 Linux 系统上执行下面的命令:$ export PATH=$PWD/bin:$PATH
安装步骤
安装 Istio 的核心部分。从以下四种_非手动_部署方式中选择一种方式安装。然而,我们推荐您在生产环境时使用 Helm Chart 来安装 Istio,这样可以按需定制配置选项。
- 安装 Istio 而不启用 sidecar 之间的双向 TLS 验证。对于现有应用程序的集群,使用 Istio sidecar 的服务需要能够与其他非 Istio Kubernetes 服务以及使用存活和就绪探针、headless 服务或
StatefulSets
的应用程序通信的应用程序选择此选项。
$ kubectl apply -f install/kubernetes/istio.yaml
或者
- 默认情况下安装 Istio,并强制在 sidecar 之间进行双向 TLS 身份验证。仅在保证新部署的工作负载安装了 Istio sidecar 的新建的 Kubernetes 集群上使用此选项。
$ kubectl apply -f install/kubernetes/istio-demo-auth.yaml
或者
或者
确认安装
确认下列 Kubernetes 服务已经部署:
istio-pilot
、istio-ingressgateway
、istio-policy
、istio-telemetry
、prometheus
、istio-sidecar-injector
(可选)。$ kubectl get svc -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-citadel ClusterIP 30.0.0.119 <none> 8060/TCP,9093/TCP 7h istio-egressgateway ClusterIP 30.0.0.11 <none> 80/TCP,443/TCP 7h istio-ingressgateway LoadBalancer 30.0.0.39 9.111.255.245 80:31380/TCP,443:31390/TCP,31400:31400/TCP 7h istio-pilot ClusterIP 30.0.0.136 <none> 15003/TCP,15005/TCP,15007/TCP,15010/TCP,15011/TCP,8080/TCP,9093/TCP 7h istio-policy ClusterIP 30.0.0.242 <none> 9091/TCP,15004/TCP,9093/TCP 7h istio-statsd-prom-bridge ClusterIP 30.0.0.111 <none> 9102/TCP,9125/UDP 7h istio-telemetry ClusterIP 30.0.0.246 <none> 9091/TCP,15004/TCP,9093/TCP,42422/TCP 7h prometheus ClusterIP 30.0.0.253 <none> 9090/TCP 7h
如果您的集群在不支持外部负载均衡器的环境中运行(例如 minikube),
istio-ingressgateway
的EXTERNAL-IP
将会显示为<pending>
状态。您将需要使用服务的 NodePort 来访问,或者使用 port-forwarding。确保所有相应的Kubernetes pod都已被部署且所有的容器都已启动并正在运行:
istio-pilot-*
、istio-ingressgateway-*
、istio-egressgateway-*
、istio-policy-*
、istio-telemetry-*
、istio-citadel-*
、prometheus-*
、istio-sidecar-injector-*
(可选)。$ kubectl get pods -n istio-system NAME READY STATUS RESTARTS AGE istio-citadel-dcb7955f6-vdcjk 1/1 Running 0 11h istio-egressgateway-56b7758b44-l5fm5 1/1 Running 0 11h istio-ingressgateway-56cfddbd5b-xbdcx 1/1 Running 0 11h istio-pilot-cbd6bfd97-wgw9b 2/2 Running 0 11h istio-policy-699fbb45cf-bc44r 2/2 Running 0 11h istio-statsd-prom-bridge-949999c4c-nws5j 1/1 Running 0 11h istio-telemetry-55b675d8c-kfvvj 2/2 Running 0 11h prometheus-86cb6dd77c-5j48h 1/1 Running 0 11h
部署应用
您可以部署自己的应用或者示例应用程序如 Bookinfo。 注意:应用程序必须使用 HTTP/1.1 或 HTTP/2.0 协议来传递 HTTP 流量,因为 HTTP/1.0 已经不再支持。
如果您启动了 Istio-Initializer,如上所示,您可以使用 kubectl create
直接部署应用。Istio-Initializer 会向应用程序的 Pod 中自动注入 Envoy 容器,如果运行 Pod 的 namespace 被标记为 istio-injection=enabled
的话:
$ kubectl label namespace <namespace> istio-injection=enabled
$ kubectl create -n <namespace> -f <your-app-spec>.yaml
如果您没有安装 Istio-initializer-injector 的话,您必须使用 istioctl kube-inject
命令在部署应用之前向应用程序的 Pod 中手动注入 Envoy 容器:
$ kubectl create -f <(istioctl kube-inject -f <your-app-spec>.yaml)
卸载
卸载 Istio 核心组件。对于该版本,卸载时将删除 RBAC 权限、
istio-system
命名空间和该命名空间的下的各层级资源。不必理会在层级删除过程中的各种报错,因为这些资源可能已经被删除的。
如果您使用 istio.yaml
安装的 Istio:
$ kubectl delete -f install/kubernetes/istio.yaml
否则使用 Helm 卸载 Istio。
下一步
查看 Bookinfo 应用程序示例
See also
对 Google Kubernetes Engine(GKE)集群进行配置以便安装运行 Istio。
基于 GKE 的 Istio 多集群安装。
多 IBM Cloud Private 集群安装 Istio 示例。
安装支持多集群的 Istio。
这里讲述了 Istio 对 Kubernetes 中 Pod 和服务的要求。
对 Minikube 集群进行配置以便安装运行 Istio。