一、初步感受istio

在docker中是通过container来部署业务的,在k8s里面是通过pod来部署业务的,那么在istio里面如何体现sidecar呢?

猜想:会不会在pod中除了业务需要的container之外还会有一个sidecar的container存在呢?

准备资源 vi first-istio.yaml

apiVersion: apps/v1 ## 定义了一个版本
kind: Deployment ##资源类型是Deployment
metadata:
    name: first-istio 
spec:
    selector:
       matchLabels:
         app: first-istio
    replicas: 1
    template:
       metadata:
         labels:
           app: first-istio
       spec:
         containers:
      - name: first-istio ##容器名字  下面容器的镜像
           image: registry.cn-hangzhou.aliyuncs.com/sixupiaofei/spring-docker-demo:1.0
           ports:
        - containerPort: 8080 ##容器的端口
---
apiVersion: v1
kind: Service ##资源类型是Service
metadata:
    name: first-istio ##资源名字first-istio
spec:
    ports:
  - port: 80 ##对外暴露80
       protocol: TCP ##tcp协议
       targetPort: 8080 ##重定向到8080端口
    selector:
       app: first-istio ##匹配合适的label,也就是找到合适pod
    type: ClusterIP ## Service类型ClusterIP

创建kubectl apply -f first-istio.yaml

Service mesh 学习05 istio初步使用_docker

Service mesh 学习05 istio初步使用_docker_02

查看pod的详细信息

kubectl describe pod first-istio-5bd4764d9b-2qswb

Service mesh 学习05 istio初步使用_docker_03

手动注入sidecar

Service mesh 学习05 istio初步使用_docker_04

istioctl kube-inject -f first-istio.yaml | kubectl apply -f -
kubectl get pods

发现pods数量变成了2个

Service mesh 学习05 istio初步使用_docker_05

kubectl describe pod first-istio-c5fb97cf-8dn76

下面这个代理proxy就是sidecar

Service mesh 学习05 istio初步使用_ide_06

Service mesh 学习05 istio初步使用_docker_07

查看yaml文件内容

kubectl get pod first-istio-c5fb97cf-8dn76 -o yaml

Service mesh 学习05 istio初步使用_docker_08

这个yaml文件已经不是我们原来的yaml文件了,会发现这个yaml文件还定义了一个proxy的image,这个image是我们提前就已经准备好了的,所以istio是通过改变yaml文件来实现注入一个代理

自动注入sidecar

首先自动注入是需要跟命名空间挂钩,所以需要创建一个命名空间,只需要给命名空间开启自动注入,后面创建的资源只要挂载到这个命名空间下,那么这个命名空间下的所有的资源都会自动注入sidecar了

创建命名空间

kubectl create namespace my-istio-ns

Service mesh 学习05 istio初步使用_ide_09

给命名空间开启自动注入

kubectl label namespace my-istio-ns istio-injection=enabled

Service mesh 学习05 istio初步使用_docker_10

创建资源,指定命名空间即可

# 查询  istio-demo命名空间下面是否存在资源
kubectl get pods -n my-istio-ns
# 在istio-demo命名空间创建资源
kubectl apply -f first-istio.yaml -n my-istio-ns
# 查询  istio-demo命名空间下面是否存在资源
kubectl get pods -n my-istio-ns

Service mesh 学习05 istio初步使用_ide_11

查看资源明细

kubectl describe pod pod-name -n my-istio-ns

Service mesh 学习05 istio初步使用_docker_12

查看service

kubectl get svc -n my-istio-ns

删除资源

kubectl delete -f first-istio.yaml -n my-istio-ns

不管是自动注入还是手动注入原理都是在yaml文件里面追加一个代理容器,这个代理容器就是sidecar,这里更推荐自动注入的方式来实现 sidecar 的注入