-
新建一个busybox的客户端资源,与应用不在同一命名空间中,当然也可以在同一命名空间中;创建命名空间istioclient,并设置istio自动注入
sudo kubectl create namespace istioclient
sudo kubectl label namespace istioclient istio-injection=enabled
sudo kubectl get ns istioclient --show-labels # 查看注入状态
-
client文件busybox-client.yaml内容
apiVersion: apps/v1
kind: Deployment
metadata:
name: busyclient
# namespace: istioclient
spec:
replicas: 1
selector:
matchLabels:
app: busyclient
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: busyclient
version: v1
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent # 不存在才拉取镜像,默认值
command: [ "/bin/sh", "-c", "sleep 3600" ]
-
执行命令,创建Deployment:
sudo kubectl apply -f busybox-client.yaml -n istioclient
-
查看pod
sudo kubectl get pods -n istioclient
-
进入客户端容器中,访问springbootapp服务
sudo kubectl exec -it busyclient-5f6b7b954d-9wq5q /bin/sh -n istioclient
-
访问springbootapp服务
wget -q -O - http://springbootapp-svc.springistiodemo:8080/hello
说明:
1.上述服务格式[servicename].[namespace]:[port]/[action]
客户端与服务不在同一命名空间下,使用上述格式访问服务,参考k8s的namespace隔离机制
2.如在同一命名空间下,则直接使用[servicename]:[port]/[action]访问
for i in `seq 10`;do wget -q -O - http://springbootapp-svc:8080/hello;done
3.此处的port对应的是k8s的service(svc)节点的port端口值,不是nodePort端口设置值;
port是service端口,即k8s中服务之间的访问端口
targetport是pod(也就是容器)的端口
nodeport是容器所在node节点的端口,即外部机器可访问的端口。(通过nodeport类型的service暴露给集群节点)
4.busybox client客户端也必须经过 Istio 注入,因为只有客户端被 Istio 注入才可以接收到来自 Pilot 有关 Virtual Service 和 Destination Rule 的配置信息,才可以保证流量接管生效。
-
可以通过命令运行busybox,退出后pod自动删除释放
sudo kubectl run --namespace=springistiodemo busybox --rm -ti --image busybox /bin/sh