如何透過 Amazon EKS 的自訂路徑存取 Kubernetes 儀表板?
我想要透過 Amazon Elastic Kubernetes Service (Amazon EKS) 的自訂路徑存取 Kubernetes 儀表板。
簡短說明
如要存取 Kubernetes 儀表板,您必須完成下列操作:
1. 建立或使用現有的自我簽署憑證,然後將憑證上傳到 AWS Certificate Manager (ACM)。
2. 部署 NGINX 輸入控制器,然後以 NodePort 服務公開。
3. 為 Application Load Balancer 輸入控制器建立輸入物件。讓輸入物件將所有來自 Application Load Balancer 的請求轉送至您使用清單檔案部署的 NGINX 輸入控制器。
4. 部署 Kubernetes 儀表板。
5. 為 NGINX 輸入控制器建立輸入。
以下是解決方法的運作方式:
1. Application Load Balancer 會將所有傳入流量轉送至 NGINX 輸入控制器。
2. NGINX 輸入控制器會評估傳入要求的路徑模式 (例如 /custom-path/additionalcustompath)。
3. NGINX 輸入控制器會將網址重新寫入為 /additionalcustompath,再轉送請求至 kubernetes-dashboard 服務。
**注意:**此解決方法不適用於執行 Kubernetes 1.19 之前版本的叢集。
解決方法
建立或使用現有的自我簽署憑證,然後將憑證上傳到 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
重要事項:為一般名稱提供完整網域名稱。Application Load Balancer 僅允許完整網域名稱的 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 主控台,然後確認網域名稱出現在您匯入的 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
為 Application Load Balancer 輸入控制器建立輸入物件
使用清單檔案建立輸入物件。讓輸入物件將所有來自 Application Load Balancer 輸入控制器的請求轉送至您稍早部署的 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 Resource Name (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。在路徑的 /dashboard(/|$)(.*) 中,(.*) 會儲存存取 Kubernetes 儀表板時產生的動態網址。"nginx.ingress.kubernetes.io/rewrite-target" 註釋會替換網址中擷取的資料,再轉送請求至 kubernetes-dashboard 服務。只有在存取 ALB-URL/dashboard 的情況下,"nginx.ingress.kubernetes.io/configuration-snippet" 註釋會重新寫入網址,以在尾端新增斜線 ("/")。
2. 套用清單檔案 ingress-dashboard.yaml:
kubectl apply -f ingress-dashboard.yaml
3. 在您稍早建立的 alb-ingress 地址中,檢查 Application Load Balancer 網址:
kubectl get ingress alb-ingress -n ingress-nginx
您現在可以使用 ALB-URL/dashboard/ 存取 Kubernetes 儀表板。如果您存取 ALB-URL/dashboard,則網址尾端會自動新增斜線 ("/")。
清理您稍早建立的資源
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 負載平衡器控制器:
helm uninstall aws-load-balancer-controller -n kube-system
5. 刪除 ingress-ngix 命名空間:
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。將 us-east-1 替換為您的 AWS 區域。將 your-account-id 替換為您的帳戶 ID。
相關內容
- 已提問 1 年前lg...
- 已提問 13 天前lg...
- AWS 官方已更新 4 個月前
- AWS 官方已更新 8 個月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前