【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

鄭立賽 發表於 2021-11-26
k8s

本教程適用範圍

  • 在AWS上使用EKS服務部署k8s Dashboard,並通過ALB訪問
  • EKS叢集計算節點採用託管EC2,並使用啟動模板。
  • 使用AWS海外賬號,us-west-2區域
  • 使用賬號預設vpc(172.31.0.0/16)和子網
  • 使用awscli建立而不是eksctl
  • 對AWS有一定了解,不適用於AWS小白
  • 文中程式碼,漢字部分需要修改成自己的資訊

涉及到知識點

  • AWS服務:EC2,IAM,EKS,VPC,ACM,ALB,SecurityGroup, awscli, eksctl
  • K8s: Service, Pod, Ingress, Node

必備條件

  • 有一臺用於操作的伺服器(本教程使用ec2: ubuntu 18,EKS預設將叢集最大許可權賦予建立叢集的使用者,所以不建議使用控制檯建立叢集,尤其是對於SSO登入使用者)
  • 擁有AWS administrator許可權(本教程將許可權賦予伺服器)
  • 擁有域名管理許可權(能夠建立並解析域名)
  • 擁有域名證書(本教程使用ACM證書)

詳細步驟

安裝kubectl,awscli

# install kubectl
wget https://dl.k8s.io/release/v1.22.0/bin/linux/amd64/kubectl
chmod 755 kubectl
mv kubectl /usr/bin
# install awscli
pip3 install awscli
# install eksctl
wget https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz
tar -xvf eksctl_Linux_amd64.tar.gz
chmod 755 eksctl
mv eksctl /usr/bin

輸入如下表示安裝完成
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

在EKS上啟動一個叢集

使用aws控制檯,建立eks-cluster角色,策略如下:

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

建立eks-cluster安全組

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

將需要使用的子網新增如下標籤(有了此標籤,才能使用alb)

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

建立叢集

aws eks create-cluster \
   --region us-west-2 \
   --name zhenglisai \
   --kubernetes-version 1.21 \
   --role-arn arn:aws:iam::你的賬號ID:role/eks-cluster \
   --resources-vpc-config subnetIds=subnet-cf36ca92,subnet-75866b0d,subnet-19ef9b32,securityGroupIds=sg-0daa7eabdc1f845fd

從控制檯可以看到叢集建立中
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程
檢視叢集狀態
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

建立叢集計算節點例項啟動模板

在控制檯EC2中建立啟動模板,使用映象AMI:ami-0cb182e3037115aa0,根據自己需要選擇例項型別,安全組,伺服器金鑰對,啟動模板中不要設定網路介面和IAM 例項配置檔案,最重要的一步是在啟動模板最後的使用者資料中填寫:
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

指令碼後引數為EKS叢集名

建立叢集計算節點例項角色

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

建立叢集計算節點組

aws eks create-nodegroup \
  --cluster-name zhenglisai \
  --nodegroup-name zls-node \
  --scaling-config minSize=1,maxSize=3,desiredSize=2 \
  --subnets subnet-cf36ca92 subnet-75866b0d subnet-19ef9b32 \
  --node-role arn:aws:iam::你的賬號ID:role/eks-demo \
  --launch-template version=4,id=lt-020949e5e604df89c

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

配置kubectl以訪問EKS

# --name 後為叢集名
aws eks --region us-west-2 update-kubeconfig --name zhenglisai

配置完成後,訪問EKS叢集
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程
表示完成配置,可以訪問叢集了。

檢視所有正在執行的pod

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

可以看到,有兩個pod沒有起來,我們看一下為什麼沒有起來
執行

kubectl get pods coredns-85d5b4454c-rkccb --namespace kube-system --output yaml

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

看輸出是沒有可用的計算節點,說明我們上一步建立的計算節點還沒執行起來,檢視可用節點,確實沒有
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

等大約兩分鐘以後,再次執行,可以看到例項已經註冊到叢集了
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

再次檢視pod狀態,都已經執行起來了。
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

安裝Metric Server

這個東西主要用於叢集的彈性擴容指標和dashboard指標,不是用於監控資源!
執行部署

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

輸出
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程
驗證部署是否成功
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

部署Dashboard

執行

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.5/aio/deploy/recommended.yaml

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

預設情況下,Kubernetes 控制皮膚使用者的許可權是有限的,我們建立一個超級使用者

建立一個名為eks-admin.yaml的檔案,內容為

apiVersion: v1
kind: ServiceAccount
metadata:
  name: eks-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: eks-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: eks-admin
  namespace: kube-system

執行此檔案

kubectl apply -f eks-admin.yaml

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

獲取Dashboard的token令牌,用於訪問Dashboard

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

到此為止,已完成叢集的搭建和Dashboard的部署,但是此時只能在叢集內部訪問Dashboard,無法通過外網訪問。下一步將Dashboard介面暴露給ALB

安裝AWS負載均衡器控制器到EKS叢集

下載IAM策略

wget  https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/install/iam_policy.json

建立策略

aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam_policy.json

建立叢集IAM OIDC身份提供商

eksctl utils associate-iam-oidc-provider --cluster zhenglisai --approve

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

建立k8s賬戶並關聯策略

eksctl create iamserviceaccount \
  --cluster=zhenglisai \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --attach-policy-arn=arn:aws:iam::你的賬號ID:policy/AWSLoadBalancerControllerIAMPolicy \
  --override-existing-serviceaccounts \
  --approve    

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

安裝負載均衡器控制器

kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller \
  --set clusterName=zhenglisai \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller \
  -n kube-system

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

驗證安裝是否完成
【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

部署Ingress

建立部署檔案,dashboard-ingress.yaml,內容如下(需要修改漢字部分內容):

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  namespace: kubernetes-dashboard
  name: ingress-dashboard
  annotations:
    alb.ingress.kubernetes.io/load-balancer-name: zhenglisai
    alb.ingress.kubernetes.io/backend-protocol: HTTPS
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    alb.ingress.kubernetes.io/certificate-arn: 你證書的ARN,在ACM中檢視
spec:
  rules:
    - host: 你的域名
      http:
        paths:
        - path: /*
          backend:
            serviceName: kubernetes-dashboard
            servicePort: 443

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

執行檔案,建立ingress

kubectl apply -f dashboard-ingress.yaml

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

去域名解析網站,建立域名,並指向ALB的DNS

使用https協議訪問域名

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

輸入上一章節中獲取Dashboard的token令牌即可登入

【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程

到此,完成EKS叢集的搭建,Dashobard部署,Ingress部署,並實現了外網訪問Dashboard。