如何在 Amazon EKS 中的自定义路径上访问 Kubernetes 控制面板?
我想要在 Amazon Elastic Kubernetes Service(Amazon EKS)中的自定义路径上访问 Kubernetes 控制面板。
简短描述
要访问 Kubernetes 控制面板,您必须完成以下操作:
1. 创建或使用现有自签名证书,然后将证书上传到 AWS Certificate Manager (ACM)。
2. 部署 NGINX 入口控制器,然后将其公开用作 NodePort 服务。
3. 为 Application Load Balancer 入口控制器创建入口对象。让入口对象将来自应用程序负载均衡器的所有请求转发到您使用清单文件部署的 NGINX 入口控制器。
4. 部署 Kubernetes 控制面板。
5. 为 NGINX 入口控制器创建一个入口。
此解决方案的原理如下:
1. 应用程序负载均衡器将所有传入流量转发到至 NGINX 入口控制器。
2. NGINX 入口控制器评估传入请求的路径模式(例如,/custom-path/additionalcustompath)。
3. NGINX 入口控制器将 URL 重写到 /additionalcustompath 中,然后再将请求转发至 kubernetes-dashboard 服务。
注意:此解决方案不适用于运行 1.19 之前版本 Kubernetes 的集群。
解决方案
创建或使用现有自签名证书,然后将证书上传到 ACM
如果您的 Application Load Balancer 使用现有 ACM 证书,请跳至“部署 NGINX 入口控制器并将其公开为 NodePort 服务”。
**注意:**以下步骤适用于 Amazon Linux Amazon Machine Image (AMI) 版本 2018.03。
1. 使用 OpenSSL 生成自签名证书:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout kube-dash-private.key -out kube-dash-public.crt
**重要提示:**为 Common Name(通用名)提供完全限定的域。应用程序负载均衡器只允许将具有完全限定域名的 ACM 证书附加到侦听器 443。
输出与以下内容类似:
Country Name (2 letter code) [XX]: State or Province Name (full name) []: Locality Name (eg, city) [Default City]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:kube-dashboard.com ==>This is important Email Address []:
3. 安装 AWS Command Line Interface (AWS CLI) 并设置凭证。
注意:如果您在运行 AWS CLI 命令时遇到错误,请确保使用的是最新版本的 AWS CLI。
4. 将私有密钥和证书上传到您的 AWS 区域中的 ACM:
aws acm import-certificate --certificate fileb://kube-dash-public.crt --private-key fileb://kube-dash-private.key --region us-east-1
注意:请将 us-east-1 替换为您的 AWS 区域。
输出应与以下类似:
{ "CertificateArn": "arn:aws:acm:us-east-1:your-account:certificate/your-certificate-id" }
5. 打开 ACM console(ACM 控制台),然后验证域名是否在您导入的 ACM 证书中显示。
**注意:**如果域名没有在 ACM 控制台中显示,则最佳实践是使用有效的完全限定域名重新创建证书。
部署 NGINX 入口控制器并将其公开用作 NodePort 服务
1. 创建命名空间 ingress-nginx:
kubectl create ns ingress-nginx
2. 安装 Helm 版本 3。
3. 使用 Helm 部署 NGINX 入口控制器:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm install nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --set controller.service.type=NodePort
**注意:**要在 Fargate 节点上运行 nginx-ingress 控制器,请在“nginx-ingress-nginx-controller”部署中设置 allowPrivilegeEscalation: false
为应用程序负载均衡器入口控制器创建入口对象
使用清单文件创建入口对象。让入口对象将来自应用程序负载均衡器入口控制器的所有请求转发到您之前部署的 NGINX 入口控制器。
1. 部署 Application Load Balancer 入口控制器。
2. 基于以下 alb-ingress.yaml 文件为 Application Load Balancer 入口控制器创建一个入口对象:
--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: "alb-ingress" namespace: "ingress-nginx" annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:your-region:your-account-id:certificate/XXXX-XXXX-XXXX-XXXX-XXXXX alb.ingress.kubernetes.io/healthcheck-path: /dashboard/ alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}' labels: app: dashboard spec: ingressClassName: alb rules: - http: paths: - path: / pathType: Prefix backend: service: name: ssl-redirect port: name: use-annotation - path: / pathType: Prefix backend: service: name: "nginx-ingress-nginx-controller" port: number: 80
**注意:**将 alb.ingress.kubernetes.io/certificate-arn 替换为 ACM 证书的 Amazon 资源名称(ARN)。对于 Fargate,在注释中添加“alb.ingress.kubernetes.io/target-type: ip”
前述清单文件使用以下注释:
"alb.ingress.kubernetes.io/scheme" 注释创建面向互联网的 Application Load Balancer。"alb.ingress.kubernetes.io/certificate-arn" 注释将 ACM 证书的 ARN 与 Application Load Balancer 的 443 侦听器关联。"alb.ingress.kubernetes.io/listen-ports" 注释为端口 80 和 443 创建侦听器。"alb.ingress.kubernetes.io/actions.ssl-redirect" 注释将传入端口 80 的所有请求至 443。“alb.ingress.kubernetes.io/healthcheck-path”注释将运行状况检查路径设置为 /dashboard/。
3. 应用前述步骤 2 中的清单文件:
kubectl apply -f alb-ingress.yaml
部署 Kubernetes 控制面板
要部署 Kubernetes 控制面板,请参阅教程:部署 Kubernetes 控制面板(Web UI)。
为 NGINX 入口控制器创建一个入口
1. 基于以下 ingress-dashboard.yaml 文件为 NGINX 入口控制器创建一个入口:
--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dashboard namespace: kubernetes-dashboard annotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/configuration-snippet: | rewrite ^(/dashboard)$ $1/ redirect; spec: ingressClassName: nginx rules: - http: paths: - path: /dashboard(/|$)(.*) pathType: Prefix backend: service: name: kubernetes-dashboard port: number: 443
注意:"nginx.ingress.kubernetes.io/rewrite-target" 注释会在转发请求至后端容器组 (pod) 之间重写 URL。在路径的 /dashboard(/|$)(.*) 中,(.*) 会存储访问 Kubernetes 控制面板时生成的动态 URL。"nginx.ingress.kubernetes.io/rewrite-target" 注释会在转发请求至 kubernetes-dashboard 服务之前替换 URL 中捕获的数据。只有在访问 ALB-URL/dashboard 时,"nginx.ingress.kubernetes.io/configuration-snippet" 注释才会重写 URL 以添加结尾斜杠 ("/")。
2. 应用清单文件 ingress-dashboard.yaml:
kubectl apply -f ingress-dashboard.yaml
3. 检查您早前创建的 alb-ingress 的 ADDRESS 中的应用程序负载均衡器 URL:
kubectl get ingress alb-ingress -n ingress-nginx
您现在可以使用 ALB-URL/dashboard/ 访问 Kubernetes 控制面板。如果您访问 ALB-URL/dashboard,则结尾斜杠(“/”)会自动添加到 URL 中。
清理您先前创建的资源
1. 删除 NGINX 入口控制器的入口:
helm uninstall nginx -n ingress-nginx
2. 删除 Kubernetes 控制面板组件和指标服务器:
kubectl delete -f eks-admin-service-account.yaml kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml>
3. 删除 alb-Ingress:
kubectl delete -f alb-ingress.yaml
**注意:**如果您创建了 AWS Identity and Access Management (IAM) 资源,则可以删除 IAM 角色和 IAM 策略。
4. 删除 AWS Load Balancer 控制器:
helm uninstall aws-load-balancer-controller -n kube-system
5. 删除 ingress-nginx 命名空间:
kubectl delete ns ingress-nginx
6. 要删除您创建的 ACM 证书,请运行以下命令:
aws acm delete-certificate \ --certificate-arn arn:aws:acm:us-east-1:your-account-id:certificate/XXXX-XXXX-XXXX-XXXX-XXXXX \ --region us-east-1
**注意:**请将 certificate-arn 替换为您的证书 ARN。使用您的 AWS 区域替换 us-east-1。将 your-account-id 替换为您的账户 ID。
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前