本教程適用范圍
- 在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
輸入如下表示安裝完成

在EKS上啟動一個集群
使用aws控制台,創建eks-cluster角色,策略如下:

創建eks-cluster安全組

將需要使用的子網添加如下標簽(有了此標簽,才能使用alb)

創建集群
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
從控制台可以看到集群創建中

查看集群狀態

創建集群計算節點實例啟動模板
在控制台EC2中創建啟動模板,使用鏡像AMI:ami-0cb182e3037115aa0,根據自己需要選擇實例類型,安全組,服務器密鑰對,啟動模板中不要設置網絡接口和IAM 實例配置文件,最重要的一步是在啟動模板最后的用戶數據中填寫:

腳本后參數為EKS集群名
創建集群計算節點實例角色

創建集群計算節點組
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

配置kubectl以訪問EKS
# --name 后為集群名
aws eks --region us-west-2 update-kubeconfig --name zhenglisai
配置完成后,訪問EKS集群

表示完成配置,可以訪問集群了。
查看所有正在運行的pod

可以看到,有兩個pod沒有起來,我們看一下為什么沒有起來
執行
kubectl get pods coredns-85d5b4454c-rkccb --namespace kube-system --output yaml

看輸出是沒有可用的計算節點,說明我們上一步創建的計算節點還沒運行起來,查看可用節點,確實沒有

等大約兩分鍾以后,再次執行,可以看到實例已經注冊到集群了

再次查看pod狀態,都已經運行起來了。

安裝Metric Server
這個東西主要用於集群的彈性擴容指標和dashboard指標,不是用於監控資源!
執行部署
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
輸出

驗證部署是否成功

部署Dashboard
執行
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.5/aio/deploy/recommended.yaml

默認情況下,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

獲取Dashboard的token令牌,用於訪問Dashboard
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')

到此為止,已完成集群的搭建和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賬戶並關聯策略
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

安裝負載均衡器控制器
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

驗證安裝是否完成

部署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

執行文件,創建ingress
kubectl apply -f dashboard-ingress.yaml

去域名解析網站,創建域名,並指向ALB的DNS
使用https協議訪問域名

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

