安装与部署:如何安装Istio?它都支持哪些环境和部署方式?
首先,我们需要准备一个Kubernetes环境:
- 基于kubeadm搭建k8s高可用集群
- 搭建k8s高可用集群 - 二进制方式
- minikube start
下载Istio
在当前版本Istio的安装与部署已经变得非常简单了,只需要几个简单的步骤就能将Istio环境搭建起来。首先要做的是下载Istio(在文档中核对Istio支持的k8s版本):
- https://istio.io/latest/docs/setup/getting-started/#download
获取下载脚本并执行:
代码语言:javascript复制[root@m1 ~]# curl -L https://istio.io/downloadIstio | sh -
将下载好的istio目录移动到合适的位置下:
代码语言:javascript复制[root@m1 ~]# mv istio-1.8.1/ /usr/local
配置环境变量:
代码语言:javascript复制[root@m1 ~]# vim /etc/profile
export ISTIO_HOME=/usr/local/istio-1.8.1
export PATH=$PATH:$ISTIO_HOME/bin
[root@m1 ~]# source /etc/profile
验证 istioctl
命令是否可正常工作:
[root@m1 ~]# istioctl version
no running Istio pods in "istio-system"
1.8.1
[root@m1 ~]#
安装Istio
配置档案(configuration profile):
- 安装时选择不同的 profile 会安装不同的组件,官方文档
使用 istioctl 的安装方式:
安装方式 | 示例 |
---|---|
默认安装 | istioctl manifest apply |
选择profile | istioctl manifest apply --set profile=demo |
自定义安装选项 | istioctl manifest apply --set addonComponents.grafana.enabled=true |
自定义安装清单 | istioctl manifest apply --set installPackagePath=<发布路径>/install/kubernetes/operator/charts |
在学习、实验环境我们可以选择 demo 这个 profile 进行安装,如下示例:
代码语言:javascript复制[root@m1 ~]# istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete
[root@m1 ~]#
查看istio相应的 namespace 和 pod 是否已经正常创建:
代码语言:javascript复制[root@m1 ~]# kubectl get ns |grep istio
istio-system Active 7m10s
[root@m1 ~]# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-d84f95b69-dmpzf 1/1 Running 0 6m28s
istio-ingressgateway-75f6d79f48-5lr5b 1/1 Running 0 6m28s
istiod-c9f6864c4-5kjz7 1/1 Running 0 7m50s
[root@m1 ~]#
检查 istio 的 CRD 和 API 资源:
代码语言:javascript复制[root@m1 ~]# kubectl get crd |grep istio
authorizationpolicies.security.istio.io 2020-12-21T02:53:41Z
destinationrules.networking.istio.io 2020-12-21T02:53:41Z
envoyfilters.networking.istio.io 2020-12-21T02:53:41Z
gateways.networking.istio.io 2020-12-21T02:53:41Z
istiooperators.install.istio.io 2020-12-21T02:53:41Z
peerauthentications.security.istio.io 2020-12-21T02:53:41Z
requestauthentications.security.istio.io 2020-12-21T02:53:41Z
serviceentries.networking.istio.io 2020-12-21T02:53:41Z
sidecars.networking.istio.io 2020-12-21T02:53:41Z
virtualservices.networking.istio.io 2020-12-21T02:53:41Z
workloadentries.networking.istio.io 2020-12-21T02:53:41Z
workloadgroups.networking.istio.io 2020-12-21T02:53:41Z
[root@m1 ~]# kubectl api-resources |grep istio
istiooperators iop,io install.istio.io true IstioOperator
destinationrules dr networking.istio.io true DestinationRule
envoyfilters networking.istio.io true EnvoyFilter
gateways gw networking.istio.io true Gateway
serviceentries se networking.istio.io true ServiceEntry
sidecars networking.istio.io true Sidecar
virtualservices vs networking.istio.io true VirtualService
workloadentries we networking.istio.io true WorkloadEntry
workloadgroups wg networking.istio.io true WorkloadGroup
authorizationpolicies security.istio.io true AuthorizationPolicy
peerauthentications pa security.istio.io true PeerAuthentication
requestauthentications ra security.istio.io true RequestAuthentication
[root@m1 ~]#
添加一个命名空间标签,让Istio在之后部署应用程序时自动注入 Envoy 的 SideCar 代理:
代码语言:javascript复制[root@m1 ~]# kubectl label namespace default istio-injection=enabled
namespace/default labeled
[root@m1 ~]#
安装 dashboard 组件。命令如下:
代码语言:javascript复制[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons -n istio-system
启用 kiali 作为 istio 的 dashboard:
代码语言:javascript复制[root@m1 ~]# istioctl dashboard kiali --address 192.168.243.138 -p 20001
http://localhost:20001/kiali
使用浏览器访问:
在 “Application” 页面可以查看 istio 组件信息:
部署 Bookinfo 应用
接下来我们部署官方提供的 demo应用 来验证 istio 的功能:
部署命令如下:
代码语言:javascript复制[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
[root@m1 ~]#
确认服务、Pod 已启动:
代码语言:javascript复制[root@m1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-79c697d759-qmtpn 2/2 Running 0 19m
productpage-v1-65576bb7bf-wqt7v 2/2 Running 0 19m
ratings-v1-7d99676f7f-jhcv6 2/2 Running 0 19m
reviews-v1-987d495c-4jlcv 2/2 Running 0 19m
reviews-v2-6c5bf657cf-n7hmw 2/2 Running 0 19m
reviews-v3-5f7b9f4f77-fpcvc 2/2 Running 0 19m
[root@m1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.102.20.100 <none> 9080/TCP 20m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 112d
productpage ClusterIP 10.97.68.248 <none> 9080/TCP 20m
ratings ClusterIP 10.109.205.171 <none> 9080/TCP 20m
reviews ClusterIP 10.108.11.178 <none> 9080/TCP 20m
[root@m1 ~]#
创建 Ingress 网关,否则外部无法访问该服务:
代码语言:javascript复制[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
[root@m1 ~]#
确认网关和访问地址:
代码语言:javascript复制[root@m1 ~]# kubectl get gateways.networking.istio.io
NAME AGE
bookinfo-gateway 1m
[root@m1 ~]# kubectl get virtualservices.networking.istio.io
NAME GATEWAYS HOSTS AGE
bookinfo ["bookinfo-gateway"] ["*"] 1m
[root@m1 ~]# kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP AGE
istio-ingressgateway LoadBalancer 10.111.237.225 <pending> 15021:32730/TCP,80:30383/TCP,443:30555/TCP,31400:30963/TCP,15443:32634/TCP 4h5m
[root@m1 ~]#
根据官方文档的描述,当 istio-ingressgateway
服务的 EXTERNAL-IP
为 pending
时,需要通过如下方式获取访问地址和端口号:
[root@m1 ~]# kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}'
192.168.243.140
[root@m1 ~]# kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'
30383
然后就可以使用浏览器访问应用页面了:
此时尝试多刷新几次页面,可以发现请求会被轮询到不同版本的 reviews 服务上: