首先这篇文章是基于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官网系列。
感谢捧场~*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。