4.1 参考 eksworkshop的样例,部署微服务
- [eksworkshop的样例微服务] (https://eksworkshop.com/beginner/050_deploy/)
4.1.1 下载样例
## Ruby Frontend
git clone https://github.com/brentley/ecsdemo-frontend.git
## NodeJS Backend and crystal backend
git clone https://github.com/brentley/ecsdemo-nodejs.git
git clone https://github.com/brentley/ecsdemo-crystal.git
4.1.2 部署后台
cd ecsdemo-nodejs
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
# 检查部署是否正确
kubectl get deployment ecsdemo-nodejs
cd ../ecsdemo-crystal
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
# 检查部署是否正确
kubectl get deployment ecsdemo-crystal
4.1.3 部署前台
# 检查ELB Service Role以及在您的账号下创建,如果没有创建,请参考AWS文档进行创建
aws iam get-role --role-name "AWSServiceRoleForElasticLoadBalancing" --region ${AWS_REGION}
# 部署
cd ../ecsdemo-frontend
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
kubectl get deployment ecsdemo-frontend
# 检查状态
kubectl get service ecsdemo-frontend -o wide
# 访问前端服务
ELB=$(kubectl get service ecsdemo-frontend -o json | jq -r '.status.loadBalancer.ingress[].hostname')
echo ${ELB}
# 浏览器访问或者通过curl命令进行验证
curl -m3 -v $ELB
微服务部署扩展 我们发现集群并不是跨多节点的高可用的架构,因此我们需要对部署进行扩展
# 每一个微服务目前都只有一个部署单元
kubectl get deployments
# NAME READY UP-TO-DATE AVAILABLE AGE
# ecsdemo-crystal 1/1 1 1 19m
# ecsdemo-frontend 1/1 1 1 7m51s
# ecsdemo-nodejs 1/1 1 1 24m
# scale 到3个replicas
kubectl scale deployment ecsdemo-nodejs --replicas=3
kubectl scale deployment ecsdemo-crystal --replicas=3
kubectl scale deployment ecsdemo-frontend --replicas=3
kubectl get deployments
# NAME READY UP-TO-DATE AVAILABLE AGE
# ecsdemo-crystal 3/3 3 3 21m
# ecsdemo-frontend 3/3 3 3 9m51s
# ecsdemo-nodejs 3/3 3 3 26m
清除资源
cd ../ecsdemo-frontend
kubectl delete -f kubernetes/service.yaml
kubectl delete -f kubernetes/deployment.yaml
cd ../ecsdemo-crystal
kubectl delete -f kubernetes/service.yaml
kubectl delete -f kubernetes/deployment.yaml
cd ../ecsdemo-nodejs
kubectl delete -f kubernetes/service.yaml
kubectl delete -f kubernetes/deployment.yaml
4.2 使用ALB Ingress Controller
参考文档
https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html
https://aws.amazon.com/cn/blogs/opensource/kubernetes-ingress-aws-alb-ingress-controller/
4.2.1 创建ALB Ingress Controller所需要的IAM policy , EKS OIDC provider, service account
4.2.1.1 创建EKS OIDC Provider (这个操作每个集群只需要做一次)
eksctl utils associate-iam-oidc-provider --cluster=${CLUSTER_NAME} --approve --region ${AWS_REGION}
[ℹ] eksctl version 0.15.0-rc.1
[ℹ] using region cn-northwest-1
[ℹ] will create IAM Open ID Connect provider for cluster "gcr-zhy-eksworkshop" in "cn-northwest-1"
[✔] created IAM Open ID Connect provider for cluster "gcr-zhy-eksworkshop" in "cn-northwest-1"
4.2.1.2 创建所需要的IAM policy https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.5/docs/examples/iam-policy.json
- 请注意官方的policy里面包含了WAF等服务,中国区没有所以需要手动删除,修改好的已经放在resource/alb-ingress-controller目录下
# 方案1: 官方文件
# All Regions other than China Regions.
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
# Beijing and Ningxia China Regions.
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_cn.json
aws iam create-policy --policy-name ALBIngressControllerIAMPolicy \
--policy-document file://iam-policy.json
# 方案2: 也可以使用本项目修改好的文件
cd resource/alb-ingress-controller
aws iam create-policy --policy-name ALBIngressControllerIAMPolicy \
--policy-document file://./ingress-iam-policy.json --region ${AWS_REGION}
# 记录返回的Plociy ARN
POLICY_NAME=$(aws iam list-policies --query 'Policies[?PolicyName==`ALBIngressControllerIAMPolicy`].Arn' --output text --region ${AWS_REGION})
echo ${POLICY_NAME}
4.2.1.3 请使用上述返回的policy ARN创建service account
eksctl create iamserviceaccount --cluster=${CLUSTER_NAME} --namespace=kube-system \
--name=aws-load-balancer-controller --attach-policy-arn=${POLICY_NAME} \
--override-existing-serviceaccounts --region ${AWS_REGION} --approve
[ℹ] eksctl version 0.15.0-rc.1
[ℹ] using region cn-northwest-1
[ℹ] 1 iamserviceaccount (kube-system/aws-load-balancer-controller) was included (based on the include/exclude rules)
[!] metadata of serviceaccounts that exist in Kubernetes will be updated, as --override-existing-serviceaccounts was set
[ℹ] 1 task: { 2 sequential sub-tasks: { create IAM role for serviceaccount "kube-system/aws-load-balancer-controller", create serviceaccount "kube-system/aws-load-balancer-controller" } }
[ℹ] building iamserviceaccount stack "eksctl-gcr-zhy-eksworkshop-addon-iamserviceaccount-kube-system-aaws-load-balancer-controller"
[ℹ] deploying stack "eksctl-gcr-zhy-eksworkshop-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
[ℹ] created serviceaccount "kube-system/aws-load-balancer-controller"
# Check to see if the controller is currently installed.
kubectl get deployment -n kube-system aws-load-balancer-controller
4.2.1.4 (可选)eksctl 0.15-rc.0 已知issue 处理 eksctl-io/eksctl#1871, 需要手动修复。eksctl 0.15-rc.1已经修复这个问题
在IAM找到eksctl创建的role , 关键词iamserviceaccount
选择Trust relationship, 点击Edit trust relationship
将"Federated":"arn:aws:iam::" 修改为: "Federated": "arn:aws-cn:iam::"
4.3 部署 ALB Ingress Controller
相关文件已经resource/alb-ingress-controller目录下,并且修改好,下面步骤为你全新Step-by-Step操作
4.3.1 创建 ALB Ingress Controller 所需要的RBAC
curl -LO https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.5/docs/examples/rbac-role.yaml
kubectl apply -f rbac-role.yaml
4.2.2 创建 ALB Ingress Controller 配置文件
修改alb-ingress-controller.yaml 以下配置,参考示例 resource/alb-ingress-controller/alb-ingress-controller.yaml (eksctl 自动创建的 vpc 默认为 eksctl-<集群名字>-cluster/VPC)
特别注意,如果你在中国区使用最新版本1.1.7会有WAF,WAFV2 issue
aws-samples/eks-workshop-greater-china#31
需要添加--feature-gates=waf=false,wafv2=false 参数
# alb-ingress-controller 1.1.6 以上版本
wget -O resource/alb-ingress-controller/alb-ingress-controller.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.6/docs/examples/alb-ingress-controller.yaml
#修改以下内容
- --cluster-name=<步骤2 创建的集群名字>
- --aws-vpc-id=<eksctl 创建的vpc-id>
- --aws-region=cn-northwest-1
#1.1.7 waf,wafv2修复方式
# 如果你使用alb-ingress-controller 1.1.7 需要禁用waf,wafv2
- --feature-gates=waf=false,wafv2=false
# alb-ingress-controller 1.1.6 以下版本,还需要额外添加环境变量,作为 https://github.com/kubernetes-sigs/aws-alb-ingress-controller/issues/1180 的workaround
env:
- name: AWS_REGION
value: cn-northwest-1
#部署ALB Ingress Controller
kubectl apply -f alb-ingress-controller.yaml
#确认ALB Ingress Controller是否工作
kubectl logs -n kube-system $(kubectl get po -n kube-system | egrep -o "alb-ingress[a-zA-Z0-9-]+")
-------------------------------------------------------------------------------
AWS ALB Ingress controller
Release: v1.1.6
Build: git-95ee2ac8
Repository: https://github.com/kubernetes-sigs/aws-alb-ingress-controller.git
-------------------------------------------------------------------------------
4.4 使用ALB Ingress
4.4.1 为nginx service创建ingress
cd resource/alb-ingress-controller
kubectl apply -f nginx-alb-ingress.yaml
4.4.2 验证
ALB=$(kubectl get ingress -o json | jq -r '.items[0].status.loadBalancer.ingress[].hostname')
curl -m3 -v $ALB
# 如果遇到问题,请查看日志
kubectl logs -n kube-system $(kubectl get po -n kube-system | egrep -o alb-ingress[a-zA-Z0-9-]+)
4.4.3 清理
kubectl delete -f nginx-alb-ingress.yaml
4.5 使用ALB Ingress,部署2048 game
注意,默认已经使用2.4章节自动修改image mirror的webhook,否则请修改Image地址为国内可以访问的。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-deployment.yaml
kubectl get pods -n 2048-game
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-service.yaml
kubectl get service service-2048 -o wide -n 2048-game
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-ingress.yaml
# 获取访问地址,在浏览器中访问2048游戏
kubectl get ingress/2048-ingress -n 2048-game
kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-deployment.yaml
kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-service.yaml
kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-ingress.yaml
kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.0.0/docs/examples/2048/2048-namespace.yaml