十一 Istio:向istio服务网格中引入虚拟机( 四 )

接下来,创建 Hello world 的部署和服务 。
apiVersion: apps/v1 kind: Deployment metadata:name: hello-worldlabels:app: hello-world spec:replicas: 1selector:matchLabels:app: hello-worldtemplate:metadata:labels:app: hello-worldspec:containers:- image: gcr.io/tetratelabs/hello-world:1.0.0imagePullPolicy: Alwaysname: svcports:- containerPort: 3000 --- kind: Service apiVersion: v1 metadata:name: hello-worldlabels:app: hello-world spec:selector:app: hello-worldports:- port: 80name: httptargetPort: 3000将上述文件保存为 hello-world.yaml,并使用 kubectl apply -f hello-world.yaml 进行部署 。
等待 Pod 准备好,然后回到虚拟机上,尝试访问 Kubernetes 服务:
$ curl http://hello-world.default Hello World你可以从虚拟机上访问在你的 Kubernetes 集群内运行的任何服务 。
4.6 在虚拟机上运行服务我们也可以在虚拟机上运行一个工作负载 。切换到实例上,运行一个简单的 Python HTTP 服务器:
$ sudo python3 -m http.server 80 Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...如果你试图直接 curl 到实例 IP,你会得到一个响应(目录列表) 。:
$ curl [INSTANCE_IP] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dt d"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Directory listing for /</title> </head> <body> <h1>Directory listing for /</h1> <hr> ...但我们要做的是将工作负载(Python HTTP 服务)添加到网格中 。出于这个原因,我们在前面创建了虚拟机命名空间 。所以让我们创建一个代表虚拟机工作负载的 Kubernetes 服务 。注意,名称和标签值等于我们之前设置的 VM_APP 环境变量的值 。不要忘记将服务部署到 VM_NAMESPACE
apiVersion: v1 kind: Service metadata:name: hello-vmlabels:app: hello-vm spec:ports:- port: 80name: http-vmtargetPort: 80selector:app: hello-vm将上述文件保存为 hello-vm-service.yaml,并使用 kubectl apply -f hello-vm-service.yaml -n vm-namespace 将其部署到 VM 命名空间 。
因为我们没有使用实验性的虚拟机自动注册,它将自动创建 WorkloadEntry 资源,我们需要手动创建它们 。
我们需要一个代表虚拟机工作负载的 WorkloadEntry 资源——该资源使用虚拟机服务账户(SERVICE_ACCOUNT)和标签中的应用程序名称(VM_APP) 。
请注意,我们还需要获得虚拟机的内部 IP 地址,这样 Istio 就知道在哪里可以到达虚拟机 。让我们把它存储在另一个环境变量中(确保用你的值替换 INSTANCE_NAMEZONE) 。
export VM_IP=$(gcloud compute instances describe [INSTANCE_NAME] --format='get(networkInterfaces[0].networkIP)' --zone=[ZONE])我们现在可以创建 WorkloadEntry 资源:
cat <<EOF > workloadentry.yaml apiVersion: networking.istio.io/v1alpha3 kind: WorkloadEntry metadata:name: ${VM_APP}namespace: ${VM_NAMESPACE} spec:serviceAccount: ${SERVICE_ACCOUNT}address: ${VM_IP}labels:app: ${VM_APP}instance-id: vm1 EOF将上述文件保存为 workloadentry.yaml,然后在 $VM_NAMESPACE 命名空间创建资源:
kubectl apply -n ${VM_NAMESPACE} -f workloadentry.yaml为了把虚拟机的工作负载加入到网格内,我们还需要定义 ServiceEntry:
cat <<EOF > serviceentry.yaml apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata:name: ${VM_APP} spec:hosts:- ${VM_APP}location: MESH_INTERNALports:- number: 80name: httpprotocol: HTTPtargetPort: 80resolution: STATICworkloadSelector:labels:app: ${VM_APP}

经验总结扩展阅读