1.注意事項及准備工作
- EKS分為EKS Master和EKS Node兩種角色;EKS Master為全托管,EKS Node為CloudFormation創建
- EKS Node若在NAT網絡里,一定要注意,NAT網絡一定要與外網聯通,因為EKS Node連接EKS Master使用外網去連接.(在小章節里會配置詳細配置圖片)
- EKS的VPC的DNS hostnames Enabled設置一定要打開,否則無法解析EKS的域名,導致EKS Node無法連接EKS Master.
- 需要准備的資源。
VPC,igw網絡和nat網絡都需要,dns設置打開.
安全組,創建EKS Master需要指定一個安全組
密鑰:創建EKS Master和Node時需要.
2.創建VPC以及子網
1.這里為手動創建vpc,所以和CloudFormation創建的vpc會少很多標簽,結果就是k8s的service模式無法使用 Local模式去訪問。
2.NAT網關,出網映射的子網一定要是在pub網絡里面,也就是說,這個子網必須可以使用igw連接互聯網。
子網規划,三個可用區三個子網組成一個服務類型子網,比如igw是public網絡,那么由三個可用區的三個子網組成.
子網網段/24 | 可用區 | 網絡類型 |
10.1.50.0 | ap-northeast-1a | igw |
10.1.51.0 | ap-northeast-1b | igw |
10.1.52.0 | ap-northeast-1c | igw |
10.1.53.0 | ap-northeast-1a | nat |
10.1.54.0 | ap-northeast-1b | nat |
10.1.55.0 | ap-northeast-1c | nat |
創建vpc等一些工作手動創建,這里不做講解.這里只講解創建igw和nat的網絡類型。
2.1 創建internet網關
1.打開aws vpc,點擊internet網關,並創建。
2.輸入名稱創建igw網關,這里只有創建
3.創建路由表關聯igw
4.路由表關聯子網
找到做好分類的子網,然后關聯
2.2 創建nat網關
1.創建NAT網關.
這里選擇的子網一定要在igw里面,否則還是無法出網。
2.創建路由表
3.關聯子網
3.創建EKS Master
創建EKS Master有圖形化方式和aws cli方式,截止2019年8月14日,圖形化創建會存在bug,bug為當前vpc下的所有子網,不管是否選擇都會全部提交,所以可能存在某些可用區無法創建EKS Master的問題.
3.1 圖形化創建
存在bug。
1.打開EKS創建按鈕,開始配置集群信息
輸入集群名稱,選擇版本,並且創建一個可以管理EKS的Role name。
2.選擇子網以及安全組以及是否對公網訪問
就是這里存在bug,不管選擇與否,都會提交所有子網。
這里的private access的意思就是必須vpc到aws內網才可以使用。
3.2 aws cli
以下只有命令,標紅的地方根據實際調整
aws eks --region ap-northeast-1 create-cluster --name ap-lcm-prod-k8sMaster \ --role-arn arn:aws:iam::858659433780:role/eks \ --resources-vpc-config subnetIds=subnet-07d73b9f0a2899ebb,subnet-0da4b758a0bb5709e,subnet-08114567a3be57a9c,subnet-0d3bb405d6755b74c,subnet-097f1b494870d1da2,subnet-0d38ee1c1f5cc7922,securityGroupIds=sg-0bd1f1fd24d388f89
創建完成會有成功提示
4.創建EKS Node
aws創建EKS Node只有CloudFormation。
1.創建堆棧,選擇安全組
2.選擇Node的名稱以及imageid
3.選擇磁盤大小以及子網
4.下面一頁直接下一步,到第三頁勾選確認.
這一步EKS Node創建完成了,EKS的Node安全組會自動創建,指定了master的安全組,它會自動創建一些規則在master的安全組里面並自動創建Node的安全組。
5.配置EKS Node連接 EKS Master
下載、編輯和應用AWS身份驗證器配置映射
curl -o aws-auth-cm.yaml https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-02-11/aws-auth-cm.yaml 文件內容如下 apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes
在cloudformation獲取ARN
5.EKS Node自動縮擴容
在EKS Node使用CloudFormation時會自動創建一個auto scaling組,但是該組里面沒有任何策略,並且如果設置也僅僅只能依據cpu的使用率來設置,因此,aws有一個專門針對cluster來設置的服務。
官方鏈接:https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-cluster-autoscaler-setup/
5.1 簡短描述
Cluster Autoscaler是一個工具,可在滿足下列任意一項條件時自動調整 Kubernetes 集群的大小:
-
- 有Pod因為資源不足而無法在集群中運行。
- 集群中有節點長時間利用率不足,並且其 Pod 可以放置到其他現有的節點。
AWS上的Cluster Autoscaler會擴展任何指定 Auto Scaling 組內的工作線程節點,並在您的集群中作為部署運行。
注意:以下解決方案假定您擁有一個活動的 Amazon EKS 集群,並且該集群與使用 AWS CloudFormation 模板創建的工作線程節點關聯。以下示例使用了自動發現設置。您還可以通過指定一個或多個 Auto Scaling 組來配置 Cluster Autoscaler。
5.2 部署
5.2.1 創建標簽
1.打開AWS CloudFormation 控制台,選擇您的堆棧,然后選擇資源選項卡
要查找您的堆棧創建的 Auto Scaling 組資源,請在邏輯 ID列查找 NodeGroup
這個組可以在EC2的Auto Scaling組里面找到對應的。
2.打開Amazon EC2 控制台,然后從導航窗格中選擇Auto Scaling 組。選擇標簽選項卡,然后選擇添加/編輯標簽。
Key: k8s.io/cluster-autoscaler/enabled
Key: k8s.io/cluster-autoscaler/awsExampleClusterName
將awsExampleClusterName替換為您的 EKS 集群的名稱
5.2.2 創建策略並關聯
1.創建IAM策略
根據如下示例創建IAM 策略並將該策略命名為ClusterAutoScaler,從而為運行 Cluster Autoscaler 的工作線程節點授予訪問所需資源和執行所需操作的權限
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:DescribeAutoScalingGroups", "autoscaling:DescribeAutoScalingInstances", "autoscaling:DescribeLaunchConfigurations",
"autoscaling:DescribeTags", "autoscaling:SetDesiredCapacity", "autoscaling:TerminateInstanceInAutoScalingGroup" ], "Resource": "*" } ] }
2.向Amazon EKS 工作節點的實例角色附加此新策略
可以從CloudFormation 來查看node的策略。
將剛才創建ClusterAutoScaler附加到這個策略上面來。
5.2.3 部署 Cluster Autoscaler
1.部署 Cluster Autoscaler
要在 GitHub 上下載 Cluster Autoscaler 項目提供的示例部署文件,請運行以下命令
wget https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
2.打開下載的 YAML 文件並根據下例設置 EKS 集群名稱 (awsExampleClusterName) 和環境變量 (us-east-1)。然后保存更改
然后執行命令
kubectl apply -f /k8s/cluster-autoscaler-autodiscover.yaml
kubectl logs -f deployment/cluster-autoscaler -n kube-system
5.3 測試
1.要查看當前的工作線程節點數量,請運行以下命令:
kubectl get nodes
2.要增加工作線程節點的數量,請運行以下命令:
kubectl create deployment autoscaler-demo --image=nginx kubectl set resources deployment.v1.apps/autoscaler-demo -c=nginx --limits=cpu=1000m kubectl scale deployment autoscaler-demo --replicas=20
注意:此命令會使用 NGINX 映像直接在 Kubernetes 集群上創建一個名為 autoscaler-demo 的部署,然后啟動 20 個 Pod。
3.要檢查部署的狀態並看到 Pod 的數量在增加,請運行以下命令:
kubectl get deployment autoscaler-demo --watch
4.當可用 Pod 的數量達到 50 時,請運行以下命令檢查工作線程的數量:
kubectl get nodes
清理測試部署
1.要通過刪除之前創建的部署 autoscaler-demo來收縮工作線程節點,請運行以下命令:
kubectl delete deployment autoscaler-demo
2.要查看工作線程節點的數量,請等待大約 30 分鍾,然后運行以下命令:
kubectl get nodes
6.連接EKS
6.1 更新kubeconfig
這樣會自動創建連接EKS的信息
aws eks --region region update-kubeconfig --name cluster_name
6.2 新增用戶及權限
如果新增用戶,依然可以使用6.1的方式去更新kubeconfig.
但是如果想動態添加用戶以及權限那么就要使用以下方式了(這個步驟是熱增加,其實在更新kubeconfig之前就應該做了)
[root@ip-10-5-2-39 tools]# cat /tools/aws-auth-cm.yaml apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: arn:aws:iam::858659433780:role/ap-lcm-test-k8sNode-NodeInstanceRole-TAZECTU1GNIJ username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes #這里開始全部為新增,userarn和username不做講解,主要是新增groups,這個是k8s默認的system:masters集群綁定了cluster-admin的權限,把用戶加入這個組,就會有集群管理員權限.system:masters是一個集群綁定,在集群里面不可見,但是可以翻閱官方文檔,看到它綁定了cluster-admin這個角色.如果需要把用戶賦予其它權限,可以深入去了解RBAC,這里不做講解 mapUsers: | - userarn: arn:aws:iam::858659433780:user/zexiong.li username: zexiong.li groups: - system:masters
默認用戶其實就是aws的登錄用戶,以下就是aws 官方文檔給出的答案,這里和上面的可以輔助觀看,這里的文檔和上面不是承上啟下關聯的
當您創建一個 Amazon EKS 集群時,將在集群的 RBAC 配置中自動為創建集群的 IAM 實體用戶或角色(例如,聯合身份用戶)授予 system:masters 權限。要授予其他 AWS 用戶或角色與您的集群進行交互的能力,您必須編輯 Kubernetes 內的 aws-auth ConfigMap [1]. 例如我們添加了 IAM 用戶 arn:aws:iam::858659433780:user/zexiong.li 在 mapUsers 部分
7.故障處理
7.1 dns hostname
VPC的dns hostname沒有打開就會有以下報錯