快速开始istio

284 阅读4分钟
原文链接: zhuanlan.zhihu.com

前言

这篇文章主要是对istio官方Quick Start的实践的操作记录,大致内容与官方文档一致,但是可能会加入一些在部署中可能会遇到的问题;我进行操作的平台是k8s,所以如果你想照着此文章快速的开始部署istio,你先要确保已有一个k8s的集群,同事CNI插件与kube-dns也必须被正确的安装( 验证kube-dns是否被正确的部署);此次安装基于istio 0.6版本;

快速开始

  • 首先我们需要获取到最新的版本的istio release包,可以通过
curl -L https://git.io/getLatestIstio | sh -

命令快速的获取到istio的最新版本包,同时也可以通过istio github releases下载相关对应版本与操作系统的包并进行解压,最后我们会得到一个istio-0.6.0的文件夹;

  • 接下来我们需要进入到我们刚刚解压的文件夹中并将istioctl二进制文件添加到我们的PATH路径下方便之后我们调用
cd istio-0.6.0
# 如果我们希望以后都能够在任何目录使用istioctl命令
# 我们可以将下面一句添加到~/.bash_rc文件中
export PATH=$PWD/bin:$PATH
  • 此时我们需要将istio的相关服务部署到k8s中,通过以下命令我们可以方便快速的进行部署
kubectl apply -f install/kubernetes/istio.yaml
  • 验证部署是否成功
# 查看istio-system namespace下包含的service
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
# 查看istio-system namespace下包含的pod
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

注意:

  1. 正常情况下我们能够看到kubectl的反馈信息是一大堆东西已经被创建,但是在istio-0.6.0中可能会出现最后有一些资源没有被创建,但是这个不影响我们之后正常的使用istio;这个问题对应istio-issues-4189
  2. 还有一个问题就是可能我们我们创建之后,所有的情况都是看起来是正常的,但是istio-ingress pod会一直不断的重启,在istio-0.6.0中这种情况可能是你没有正确配置 kube-dns或者没有正确安装CNI插件导致的;这个问题对应istio-issues-173;

部署bookinfo验证

运行以下命令部署bookinfo实例应用

kubectl apply -f <(istioctl kube-inject --debug -f samples/bookinfo/kube/bookinfo.yaml)

验证部署:

kubectl get services

正确的输出应该想下面这样子的:

NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
details                    10.0.0.31    <none>        9080/TCP             6m
kubernetes                 10.0.0.1     <none>        443/TCP              7d
productpage                10.0.0.120   <none>        9080/TCP             6m
ratings                    10.0.0.15    <none>        9080/TCP             6m
reviews                    10.0.0.170   <none>        9080/TCP             6m

kubectl get pods

正确的输出应该想下面这样子的:

NAME                                        READY     STATUS    RESTARTS   AGE
details-v1-1520924117-48z17                 2/2       Running   0          6m
productpage-v1-560495357-jk1lz              2/2       Running   0          6m
ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
reviews-v3-1813607990-8ch52                 2/2       Running   0          6m

使用以下命令获取访问的服务地址:

export GATEWAY_URL=$(kubectl get po -l istio=ingress -n istio-system -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingress -n istio-system -o 'jsonpath={.spec.ports[0].nodePort}')

验证bookinfo实例应用是否正常运行:

curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
# 应该输出以下值,如果输出为000或者其他500以上数字为部署失败
200