我想创建一个带有AWS内部NLB的nginx入口控制器,要求修复NLB端点的IP地址,例如,目前nginx入口服务的NLB dns是abc.elb.eu-centrral-1.amazonaws.com,解析为IP地址192.168.1.10,如果我删除并重新创建nginx入站控制器,我希望NLB dns必须与以前相同。在kubernetes服务注释中,我没有看到任何重用现有NLB的方法,但是,我在链接中找到了注释服务。beta.kubernetes.io/aws-load-balancer-privateipv4-地址,据我所知,它允许我为NLB设置ip地址,但它并没有像我预期的那样工作,每次我重新创建nginx控制器时,ip地址都是不同的,下面是K8s服务yaml文件。
# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-private-ipv4-addresses: "10.136.103.251"
service.beta.kubernetes.io/aws-load-balancer-subnets: "subnet-00df069133b22"
labels:
helm.sh/chart: ingress-nginx-3.23.0
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 0.44.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
spec:
type: LoadBalancer
externalTrafficPolicy: Local
我知道这个要求是werid,有可能做到吗?
如果您的Kubernetes集群运行在具有多个子网的VPC上(可能是这样(,则必须为每个子网提供一个专用ip地址。
我安装了带有舵图的AWS负载平衡器控制器,然后我安装了带舵图的nginx入口控制器:
helm install nginx-ingress ingress-nginx/ingress-nginx --namespace nginx-ingress -f internal-ingress-values.yaml
这里是内部进展的内容-values.yaml
controller:
ingressClass: nginx
service:
enableHttp: false
enableHttps: true
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: external
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
service.beta.kubernetes.io/aws-load-balancer-scheme: internal
service.beta.kubernetes.io/aws-load-balancer-private-ipv4-addresses: 10.136.103.251, 10.136.104.251
service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-00a1a7f9949aa0ba1, subnet-12ea9f1df24aa332c
ingressClassResource:
enabled: true
default: true
根据文档,服务测试版kubernetes.io/aws-load-balancer-privatev4-地址注释长度/顺序必须匹配子网
因此,您必须以相同的顺序提供IP地址和子网(不要不匹配(。如果你以我上面的例子为例,你必须确保:
- 10.136.103.251包含在子网-00a1a7f9949aa0ba1中
- 10.136.104.251包含在子网-12ea9f1df24aa332c中
根据文档标记子网是个好主意:
密钥:kubernetes.io/cluster/my-cluster-name价值:共享
密钥:kubernetes.io/role/internal-elb值:1
我在1.20上测试了这个K8S,它适用于我的项目。不提供";ingressClassResource";如果您在K8S<=1.17.
将被管理的LB(至少在AWS LB控制器的当前版本2.3(是";nlb-ip";以及";外部";类型这是在以下位置指定的:https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.3/guide/service/annotations/#legacy-云提供商
注释服务.beta.kubernetes.io/aws-load-balancer-type用于确定哪个控制器协调服务。如果注释值为nlb-ip或外部,则传统云提供商会忽略服务资源(前提是它有正确的补丁(,以便AWS负载均衡器控制器可以接管。对于注释的所有其他值,遗留云提供商将处理该服务。请注意,此注释应在创建服务期间指定,以后不进行编辑。