如何透過 Amazon EKS 的自訂路徑存取 Kubernetes 儀表板?

4 分的閱讀內容
0

我想要透過 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。


AWS 官方
AWS 官方已更新 2 年前