首先这篇文章是基于jimmysong的文章Istio 教程
换句话说,站在巨人的肩膀上。

本文环境:
阿里云的k8s集群1.9.3;
Istio0.5.1。

该项目Github地址

废话不多说。

首先项目结构是这样的:

one ——> two

服务one调用服务two。
调用成功时会展示相应的访问次数,形似:

two from ‘two-57b9b5b5b8-jx8sn’: 3

在开始本文前,需要准备的环境就是k8s集群,以及istio安装。这个近期会整理出相关文章。

首先我们就在一个新建的命名空间进行这个项目,命名为“test-istio”

注意,这个命名空间可以不需要特意新建,在后面命令中加上对应参数即可,如果想要使用命令新建,使用k8s方式新建。(YAML文件)
或使用命令kubectl create ns test-istio

然后新建一个文件istio-test.yaml

---
#============one============
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: one
    version: v1
  name: one
spec:
  replicas: 1
  selector:
    matchLabels:
      app: one
      version: v1
  template:
    metadata:
      labels:
        app: one
        version: v1
    spec:
      containers:
      - image: yubotao/istio-one:test
        imagePullPolicy: IfNotPresent
        name: one
        ports:
        - containerPort: 8180
---
apiVersion: v1
kind: Service
metadata:
  name: one
  labels:
    app: one
spec:
  ports:
  - name: http
    port: 8180
    #nodePort: 30011
  #type: NodePort
  selector:
    app: one
---
#=============two===============
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: two
    version: v1
  name: two
spec:
  replicas: 1
  selector:
    matchLabels:
      app: two
      version: v1
  template:
    metadata:
      labels:
        app: two
        version: v1
    spec:
      containers:
      - image: yubotao/istio-two:test
        imagePullPolicy: IfNotPresent
        name: one
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: two
  labels:
    app: two
spec:
  ports:
  - name: http
    port: 8080
  selector:
    app: two
---
#=============ingress============
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-istio-ingress
  namespace: test-istio
  annotations:
     kubernetes.io/ingress.class: "istio"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: one
          servicePort: 8180
---

该YAML文件定义了两个Deployment,两个Service及一个Ingress;符合k8s规范。其中需要特别关注Ingress,因为Istio的Ingress与k8s略有不同,需要注意一点的就是:

 annotations:
     kubernetes.io/ingress.class: "istio"

这部分必不可少,更多细节请查看Istio Ingress

我们直接使用istio-test.yaml文件中已经定义好的内容来直接部署服务。在k8s集群中使用如下命令来部署。
在使用这个命令前,我们需要将istioctl命令添加到PATH环境变量中。

$ export ISTIO_HOME=~/istio-0.5.1(将这个换为自己的istio安装路径)
$ export PATH=$ISTIO_HOME/bin:$PATH
$ kubectl apply -f <(istioctl kube-inject -f istio-test.yaml) -n test-istio

上面那句命令是使用k8s的kubectl命令来部署项目,apply -f表示使用定义好的yaml文件,-n test-istio表示项目部署再命名空间test-istio中;最重要的一句就是<(istioctl kube-inject -f istio-test.yaml)了;首先 < 表示写入嘛,这是linux的文件流传输符号;然后就是()内部的命令了,istioctl是istio的控制命令,而kube-inject这个命令是手动插入istio sidecar配置的一种命令行方式。
这么说下来可能感觉晕晕的,那我们就看看具体内容吧。
我们使用命令

$ istioctl kube-inject -f istio-test.yaml >> truth.yaml
$ cat truth.yaml

对比之前的istio-test.yaml文件,就可以看到istio到底给我们动了什么手脚。

然后我们看一下服务部署完的情况

$ kubectl get pods -n test-istio
NAME                   READY     STATUS    RESTARTS   AGE
one-6c6fdb868f-bfnjk   2/2       Running   0          13m
two-57b9b5b5b8-jx8sn   2/2       Running   0          13m
$ kubectl get services -n test-istio
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
one       ClusterIP   172.21.11.131   <none>        8180/TCP   14m
two       ClusterIP   172.21.6.62     <none>        8080/TCP   14m
$ kubectl get deployment -n test-istio
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
one       1         1         1            1           14m
two       1         1         1            1           14m
$ kubectl get ingress -n test-istio
NAME                 HOSTS     ADDRESS        PORTS     AGE
test-istio-ingress   *         xx.xx.xx.xxx   80        15m

其中ADDRESS的值就是外部通过ingress访问istio内部服务的入口。
接下来我们访问该地址,可以看到结果:
这里写图片描述

刷新一次:
这里写图片描述

当然我们还可以通过另一种方式测试,不过这是在istio内部测试服务间是否互通:

使用命令:

$ kubectl exec -it one-6c6fdb868f-bfnjk /bin/bash -n test-istio

进入pod中

Defaulting container name to one.
Use ‘kubectl describe pod/one-6c6fdb868f-bfnjk -n test-istio’ to see all of the containers in this pod.
root@one-6c6fdb868f-bfnjk:/#

输入命令:

$ curl http://two:8080/

可以看到有结果打印:

two from ‘two-57b9b5b5b8-jx8sn’: 3

集群内部有服务注册与发现,所以访问时需要使用之前定义的service name,也就是two来访问对应服务。之后通过service与pod进行了映射,这部分是k8s的相关知识,暂不展开,是另一篇文章了。

最后Ctrl-d组合键退出。

上述内容是在阿里云的k8s集群中完成的,由于阿里云已经提供了负载均衡服务,所以启动ingress时,就自动分配了一个ip。如果是使用别的情况进行测试的话,目前还没做,后续会更新一下,比如在本地使用测试的k8s集群怎么做。

以上就是简单部署Istio服务并测试通过Ingress实现外部访问。当然Istio本身也带有丰富的示例。可以查看我翻译的Istio官网系列

感谢捧场~*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐