介绍
我们要部署的样例微服务架构如下图所示(包括一个前端和两个后端合计三个服务,前端使用负载均衡器做分发):
下载样例清单
cd ~/environment
git clone https://github.com/brentley/ecsdemo-frontend.git
git clone https://github.com/brentley/ecsdemo-nodejs.git
git clone https://github.com/brentley/ecsdemo-crystal.git
部署
部署NodeJS后端组件
通过如下方式部署后端 NodeJS 组件
cd ~/environment/ecsdemo-nodejs
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
kubectl get deployment ecsdemo-nodejs
约几秒钟即可Ready。
部署NodeJS后端组件
通过如下方式部署后端 NodeJS 组件
cd ~/environment/ecsdemo-nodejs
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
kubectl get deployment ecsdemo-nodejs
约几秒钟即可Ready。
部署Crystal后端组件
通过如下方式部署后端 Crystal 后端组件
cd ~/environment/ecsdemo-crystal
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
kubectl get deployment ecsdemo-crystal
约几秒钟即可Ready。
检查对外提供的服务内容
检查前端服务定义(此处的代码不用执行),注意此处的“LoadBalancer”表示使用 aws 的 elb 服务,如果是自己创建的话,此处可能是 ClusterIP
cat ~/environment/ecsdemo-frontend/kubernetes/service.yaml
......
apiVersion: v1
kind: Service
metadata:
name: ecsdemo-frontend
spec:
selector:
app: ecsdemo-frontend
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 3000
确认ELB的Role
确认 ELB 的Role存在并被正确使用(没有就会创建)
aws iam get-role --role-name "AWSServiceRoleForElasticLoadBalancing" || aws iam create-service-linked-role --aws-service-name "elasticloadbalancing.amazonaws.com"
部署前端服务
现在开始部署前端服务(会注册到 aws elb 服务)
cd ~/environment/ecsdemo-frontend
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
kubectl get deployment ecsdemo-frontend
服务Ready很快,但是注册到 elb 和 dns 广播,需要一段时间,从1分钟到几分钟不等(尤其是从国内访问的时候)
wangzan:~/environment/ecsdemo-frontend (main) $ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ecsdemo-crystal ClusterIP 10.100.78.196 <none> 80/TCP 9m48s
ecsdemo-frontend LoadBalancer 10.100.168.232 a83f2348f61054276b599d5264c5ec3c-2031264905.eu-west-1.elb.amazonaws.com 80:32382/TCP 6m14s
ecsdemo-nodejs ClusterIP 10.100.241.113 <none> 80/TCP 10m
kube-ops-view LoadBalancer 10.100.251.161 a441ece0dd2bf430d8cb8df6ab958ebd-6819833.eu-west-1.elb.amazonaws.com 80:30823/TCP 27h
kubernetes ClusterIP 10.100.0.1 <none>
打开负载均衡的地址,可以看到页面是一直刷新的,因为是单 pod,所以 IP 是不变化的。
扩容
弹性扩容后端服务
通过如下方式扩容后端的 NodeJS 和 Crystal 服务(由最开始的1个pod变成3个副本的pod)
kubectl scale deployment ecsdemo-nodejs --replicas=3
kubectl scale deployment ecsdemo-crystal --replicas=3
kubectl get deployments
扩容过程和结果(后端服务由1个pod变成了3个pod)
打开浏览器,可以看到服务依然只有3个,但是后端的IP地址其实在不停的更换(因为后端各有3个pod在提供服务)
弹性扩容前端服务
通过如下方式扩容前端的 Rails 服务(由最开始的1个pod变成3个副本的pod)
kubectl get deployments
kubectl scale deployment ecsdemo-frontend --replicas=3
kubectl get deployments
此时,如果去浏览器页面查看,会发现前端分发的 ip 地址也会在不停的变化,因为也有3个pod在提供服务,此处不再重复截图。
清理
清理环境
当你完成整个动手实验时,可以通过如下方式删除
cd ~/environment/ecsdemo-frontend
kubectl delete -f kubernetes/service.yaml
kubectl delete -f kubernetes/deployment.yaml
cd ~/environment/ecsdemo-crystal
kubectl delete -f kubernetes/service.yaml
kubectl delete -f kubernetes/deployment.yaml
cd ~/environment/ecsdemo-nodejs
kubectl delete -f kubernetes/service.yaml
kubectl delete -f kubernetes/deployment.yaml
kubectl get pods