一、初步感受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
查看pod的详细信息
kubectl describe pod first-istio-5bd4764d9b-2qswb
手动注入sidecar
istioctl kube-inject -f first-istio.yaml | kubectl apply -f -
kubectl get pods
发现pods数量变成了2个
kubectl describe pod first-istio-c5fb97cf-8dn76
下面这个代理proxy就是sidecar
查看yaml文件内容
kubectl get pod first-istio-c5fb97cf-8dn76 -o yaml
这个yaml文件已经不是我们原来的yaml文件了,会发现这个yaml文件还定义了一个proxy的image,这个image是我们提前就已经准备好了的,所以istio是通过改变yaml文件来实现注入一个代理
自动注入sidecar
首先自动注入是需要跟命名空间挂钩,所以需要创建一个命名空间,只需要给命名空间开启自动注入,后面创建的资源只要挂载到这个命名空间下,那么这个命名空间下的所有的资源都会自动注入sidecar了
创建命名空间
kubectl create namespace my-istio-ns
给命名空间开启自动注入
kubectl label namespace my-istio-ns istio-injection=enabled
创建资源,指定命名空间即可
# 查询 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
查看资源明细
kubectl describe pod pod-name -n my-istio-ns
查看service
kubectl get svc -n my-istio-ns
删除资源
kubectl delete -f first-istio.yaml -n my-istio-ns
不管是自动注入还是手动注入原理都是在yaml文件里面追加一个代理容器,这个代理容器就是sidecar,这里更推荐自动注入的方式来实现 sidecar 的注入