查看“︁Deploy a deploy”︁的源代码
←
Deploy a deploy
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
=flow= <pre> Browser │ │ DNS lookup: k8s-default-helloapp-47ccac942d-1337560140.ap-east-1.elb.amazonaws.com ▼ AWS Public DNS → resolves to ALB's public IP │ ▼ AWS ALB (k8s-default-helloapp-47ccac942d) │ Listener: HTTP:80 │ │ Rule matching — Priority 1: path-pattern /* ▼ Target Group (k8s-default-helloapp-f07e0f7fc3) │ ├─→ 10.0.11.28:80 (healthy) ┐ │ ├ round-robin, pick one └─→ 10.0.11.117:80 (healthy) ┘ │ ▼ nginxdemos/hello Pod → HTTP response apps dig dig k8s-default-helloapp-47ccac942d-1337560140.ap-east-1.elb.amazonaws.com k8s-default-helloapp-47ccac942d-1337560140.ap-east-1.elb.amazonaws.com. 60 IN A 95.40.233.44 k8s-default-helloapp-47ccac942d-1337560140.ap-east-1.elb.amazonaws.com. 60 IN A 95.40.232.238 EIP 95.40.233.44 A 95.40.232.238 </pre> =enha alb-ingress= <pre> 可选:IngressGroup(多服务共享同一个 ALB) 如果多个服务都用独立 Ingress,每个都会创建一个新 ALB,成本较高。可以用 IngressGroup 共享: yamlmetadata: annotations: alb.ingress.kubernetes.io/group.name: my-shared-alb # 同一个 group 的 Ingress 共享一个 ALB alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip ********* **IngressGroup是什么** 默认情况下每个Ingress资源都会创建一个独立的ALB,成本较高。IngressGroup让多个Ingress共享同一个ALB,通过不同的path或host来区分流量。 --- **场景:两个服务共享一个ALB** ``` ALB (共享,只有一个) │ ┌──────────┴──────────┐ │ │ /api/* /web/* │ │ api-service web-service (api的Pod) (web的Pod) ``` --- **Deployment和Service(两个服务各自独立)** ```yaml # api-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: api-app spec: replicas: 2 selector: matchLabels: app: api-app template: metadata: labels: app: api-app spec: containers: - name: api-app image: nginxdemos/hello ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: api-svc spec: selector: app: api-app ports: - port: 80 targetPort: 80 type: ClusterIP ``` ```yaml # web-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: web-app spec: replicas: 2 selector: matchLabels: app: web-app template: metadata: labels: app: web-app spec: containers: - name: web-app image: nginxdemos/hello ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: web-svc spec: selector: app: web-app ports: - port: 80 targetPort: 80 type: ClusterIP ``` --- **关键:两个Ingress加上同一个group.name** ```yaml # api-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: api-ingress annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/group.name: my-shared-alb # ← 关键,两个Ingress写同一个值 alb.ingress.kubernetes.io/group.order: "10" # ← 规则优先级,数字越小越优先 spec: ingressClassName: alb rules: - http: paths: - path: /api pathType: Prefix backend: service: name: api-svc port: number: 80 ``` ```yaml # web-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/group.name: my-shared-alb # ← 和上面一样 alb.ingress.kubernetes.io/group.order: "20" spec: ingressClassName: alb rules: - http: paths: - path: /web pathType: Prefix backend: service: name: web-svc port: number: 80 ``` --- **Apply并验证** ```bash kubectl apply -f api-deployment.yaml kubectl apply -f web-deployment.yaml kubectl apply -f api-ingress.yaml kubectl apply -f web-ingress.yaml # 两个Ingress会共享同一个ALB地址 kubectl get ingress ``` 输出应该是: ``` NAME CLASS HOSTS ADDRESS PORTS AGE api-ingress alb * k8s-shared-mysharedalb-xxx.elb... 80 1m web-ingress alb * k8s-shared-mysharedalb-xxx.elb... 80 1m ``` **两个Ingress的ADDRESS完全一样**,说明共享同一个ALB。 --- **验证路由** ```bash ALB=<ADDRESS> # 打api路径 curl http://$ALB/api # 打web路径 curl http://$ALB/web ``` --- **也可以按host区分(更常见的生产用法)** ```yaml # api-ingress.yaml spec: ingressClassName: alb rules: - host: api.company.com # ← 按域名区分 http: paths: - path: / pathType: Prefix backend: service: name: api-svc port: number: 80 ``` ```yaml # web-ingress.yaml spec: ingressClassName: alb rules: - host: web.company.com # ← 不同域名,同一个ALB http: paths: - path: / pathType: Prefix backend: service: name: web-svc port: number: 80 ``` --- **对比:有无IngressGroup的成本差异** ``` 没有IngressGroup: 有IngressGroup: api-ingress → ALB-1 api-ingress ─┐ web-ingress → ALB-2 web-ingress ├→ ALB-1 (共享) foo-ingress → ALB-3 foo-ingress ─┘ 3个ALB × $0.008/hr 1个ALB × $0.008/hr = $0.024/hr = $0.008/hr = ~$17/月 = ~$6/月 ``` 服务越多,节省越明显。生产环境通常按团队或业务线划分group,比如 `group.name: team-a` 、`group.name: team-b`,每个team共享一个ALB。 ************ https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html 是同一个东西,官方文档和我给你讲的是完全一致的概念。对比一下几个关键点: **IngressGroup部分完全一致:** 官方文档: ```yaml alb.ingress.kubernetes.io/group.name: my-group alb.ingress.kubernetes.io/group.order: '10' ``` 我给你的示例: ```yaml alb.ingress.kubernetes.io/group.name: my-shared-alb alb.ingress.kubernetes.io/group.order: "10" ``` 一模一样。 **有几点官方文档补充的细节值得注意:** **1. group.name的命名规则有限制:** - 不超过63个字符 - 只能包含小写字母、数字、`-`、`.` - 必须以字母或数字开头和结尾 **2. 官方推荐ALB Controller版本 `2.7.2` 或更高**,你装的是 `v3.4.1`,比推荐版本新,没问题。 **3. 子网Tag这里官方有个重要说明:** 如果使用 `2.1.2` 或更高版本,子网Tag是可选的,但如果同一VPC里有多个集群,或者多个AWS服务共享子网,强烈建议还是打上Tag。ALB Controller不会检查路由表来判断子网是public还是private,它依赖Tag来做自动发现。 **4. 官方有个安全警告值得注意:** 只有当所有有权限创建或修改Ingress资源的Kubernetes用户都在同一个信任边界内时,才应该使用IngressGroup。否则其他用户可能把自己的Ingress加入同一个group,用更高优先级的规则覆盖已有规则,造成安全风险。 所以生产环境里一般按团队或业务线划分group,不要让所有服务共用同一个group name。 </pre> =have an eks cluster and install dashboard = [[EKS Fundamentals]] =install alb = install eksctl https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz <pre> aws eks update-kubeconfig --region <your region> --name <clustername> kubectl get nodes AWS Load Balancer Controller kubectl get deployment -n kube-system aws-load-balancer-controller if return Error from server (NotFound) # 1. 创建IAM policy(如果还没创建过) curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.13.0/docs/install/iam_policy.json aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json # 2. 创建IAM Service Account(需要先启用OIDC provider,如果没启用先跑这行) #eksctl utils associate-iam-oidc-provider --cluster=<集群名> --approve eksctl utils associate-iam-oidc-provider --region=ap-east-1 --cluster=my-eks --approve eksctl create iamserviceaccount \ --cluster=<集群名> \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::<你的account-id>:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve # 3. Helm安装controller helm repo add eks https://aws.github.io/eks-charts helm repo update helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=<集群名> \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller kubectl get deployment -n kube-system aws-load-balancer-controller kubectl get pods -n kube-system | grep aws-load-balancer NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s aws-load-balancer-controller-644668f56c-7nnkh 1/1 Running 0 84s aws-load-balancer-controller-644668f56c-qzhdl 1/1 Running 0 84s ➜ claude ls </pre> =ng demo= <pre> ALB Controller装好了,2个pod都Running。现在可以部署应用了。 **1. 创建Deployment** ```bash cat <<EOF > deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: hello-app spec: replicas: 2 selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: nginxdemos/hello ports: - containerPort: 80 EOF kubectl apply -f deployment.yaml ``` **2. 创建Service** ```bash cat <<EOF > service.yaml apiVersion: v1 kind: Service metadata: name: hello-app-svc spec: selector: app: hello-app ports: - port: 80 targetPort: 80 type: ClusterIP EOF kubectl apply -f service.yaml ``` **3. 创建Ingress(走ALB)** ```bash cat <<EOF > ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-app-ingress annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: hello-app-svc port: number: 80 EOF kubectl apply -f ingress.yaml ``` **4. 检查pod状态** ```bash kubectl get pods -w ``` 等pod都Running后,Ctrl+C退出,然后检查Ingress的ALB地址: ```bash kubectl get ingress hello-app-ingress ``` ADDRESS字段出现域名(通常要等1-2分钟)后,浏览器访问那个地址就能看到nginx的hello页面了。 有个小提醒:用ALB internet-facing需要确认你的public子网有打上 `kubernetes.io/role/elb` 标签,且Ingress Controller的IAM权限里要能访问对应的子网,不然ALB可能创建失败或者一直显示无ADDRESS。如果卡住了告诉我,我们一起排查。 </pre> =result= [[File:Alb-2d.png|frameless|50px]] [[category:EKS]] [[category:k8s]]
返回
Deploy a deploy
。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
我的导航
关于我
shell
python
ops
linuxchina.net
blog.linuxchina
最近更改
随机页面
帮助
工具
链入页面
相关更改
特殊页面
页面信息