AWS创建EKS集群
# 基础条件
# 安装AWS CLI
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
# 下载
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# 解压
unzip awscliv2.zip
# 运行
sudo ./aws/install
# 检查
aws --version
# 安装kubectl
阿里镜像站
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubectl
2
3
4
5
6
7
# 创建管理员 IAM 用户和用户组
- 为您将创建的 IAM 管理员用户启用对账单数据的访问权限,如下所示:
- 在导航栏上,选择您的账户名称,然后选择Account。
- 在IAM User and Role Access to Billing Information旁边,选择Edit。您必须以 root 用户身份登录,此部分才能显示在帐户页面上。
- 选中复选框以激活 IAM 访问并选择 更新。
- 在导航栏上,选择服务,然后 选择IAM以返回到 IAM 控制台。
- 在导航窗格中,选择用户,然后选择 添加用户。
- 在详细信息页面上,执行以下操作:
- 对于用户名,键入
Administrator
。 - 选中AWS 管理控制台访问复选框,选择 自定义密码,然后在文本框中键入您的新密码。
- 选择下一步:权限。
- 对于用户名,键入
- 在“权限”页面上,执行以下操作:
- 选择将用户添加到组。
- 选择创建组。
- 在创建组对话框中,对于组名称类型
Administrators
。 - 选中AdministratorAccess 策略的复选框。
- 选择创建组。
- 返回包含用户组列表的页面,选中新用户组的复选框。如果您在列表中看不到新用户组,请选择刷新。
- 选择下一步:标签。
- 选择下一步:查看。验证要添加到新用户的用户组成员身份。当您准备好继续时,选择Create user。
# 配置AWS CLI
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config
# 创建密钥对
为 IAM 用户创建访问密钥
登录 AWS 管理控制台并在https://console.aws.amazon.com/iam/打开 IAM 控制台 (opens new window).
在导航窗格中,选择用户。
选择您要为其创建访问密钥的用户的名称,然后选择安全凭据选项卡。
在访问密钥部分中,选择创建访问密钥。
要查看新的访问密钥对,请选择Show。此对话框关闭后,您将无法再次访问秘密访问密钥。您的凭据将如下所示:
- 访问密钥 ID:A************************3
- 秘密访问密钥:H***************************************G
要下载密钥对,请选择下载 .csv 文件。将密钥存储在安全位置。此对话框关闭后,您将无法再次访问秘密访问密钥。
下载
.csv
文件后,选择Close。创建访问密钥时,密钥对默认处于活动状态,您可以立即使用该对。
# 快速配置aws configure
# aws configure
AWS Access Key ID [None]: A************************3
AWS Secret Access Key [None]: H***************************************G
Default region name [None]: eu-central-1
Default output format [None]: json
2
3
4
5
# AWS CLI 创建入门EKS
https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html
# 步骤 1:创建您的 Amazon EKS 集群
创建集群
创建具有满足 Amazon EKS 要求的公有和私有子网的 Amazon VPC。 替换
eu-central-1
为 Amazon EKS 支持的任何 AWS 区域。有关 AWS 区域的列表,请参阅AWS 一般参考指南中的Amazon EKS 终端节点和配额 (opens new window)。创建完成后确认已经启用DNS解析aws cloudformation create-stack \ --region eu-central-1 \ --stack-name birenchong-eks-vpc-stack \ --template-url https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml
1
2
3
4手动创建的VPC
VPC 可用区 子网 路由表 互联网网关 NAT网关 172.32.0.0/16 公a 172.32.0.0/20 Public Subnets birenchong-igw 公b 172.32.16.0/20 Public Subnets birenchong-igw 公c 172.32.32.0/20 Public Subnets birenchong-igw 私a 172.32.64.0/18 Private Subnet AZ1 birenchong-eks-vpc-stack-NatGatewayAZ1 私b 172.32.128.0/18 Private Subnet AZ2 birenchong-eks-vpc-stack-NatGatewayAZ2 私c 172.32.192.0/18 Private Subnet AZ3 birenchong-eks-vpc-stack-NatGatewayAZ3 vpc(启用 DNS 解析、启用 DNS 主机名) birenchong-eks-vpc-stack 172.32.0.0/16 子网 公网(启用自动分配公有 IPv4 地址) 1a birenchong-eks-vpc-stack-PublicSubnet01 172.32.0.0/20 1b birenchong-eks-vpc-stack-PublicSubnet02 172.32.16.0/20 1c birenchong-eks-vpc-stack-PublicSubnet03 172.32.32.0/20 私网 1a birenchong-eks-vpc-stack-PrivateSubnet01 172.32.64.0/18 1b birenchong-eks-vpc-stack-PrivateSubnet02 172.32.128.0/18 1c birenchong-eks-vpc-stack-PrivateSubnet03 172.32.192.0/18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25路由表 Public Subnets 0.0.0.0/0 --> birenchong-igw Private Subnet AZ1 0.0.0.0/0 --> birenchong-eks-vpc-stack-NatGatewayAZ1 Private Subnet AZ2 0.0.0.0/0 --> birenchong-eks-vpc-stack-NatGatewayAZ2 Private Subnet AZ3 0.0.0.0/0 --> birenchong-eks-vpc-stack-NatGatewayAZ3
1
2
3
4
5
6
7
8
9互联网网关 birenchong-igw
1
2NAT网关(绑定到私网,但是子网选择公网) birenchong-eks-vpc-stack-NatGatewayAZ1 birenchong-eks-vpc-stack-NatGatewayAZ2 birenchong-eks-vpc-stack-NatGatewayAZ3
1
2
3
4创建一个集群 IAM 角色并将所需的 Amazon EKS IAM 托管策略附加到它。由 Amazon EKS 管理的 Kubernetes 集群代表您调用其他 AWS 服务,以管理您用于该服务的资源。
将以下内容复制到名为
cluster-role-trust-policy.json
.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "eks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
1
2
3
4
5
6
7
8
9
10
11
12创建角色。
aws iam create-role \ --role-name birenchongAmazonEKSClusterRole \ --assume-role-policy-document file://"cluster-role-trust-policy.json"
1
2
3将所需的 Amazon EKS 托管 IAM 策略附加到角色。
aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy \ --role-name birenchongAmazonEKSClusterRole
1
2
3
打开 Amazon EKS (opens new window)控制台,检查控制台右上角显示的 AWS 区域
选择添加集群,然后选择 创建。
在配置集群页面上,执行以下操作:
- 输入集群的名称,例如
birenchong-k8s-cluster
. - 对于集群服务角色,选择
birenchongAmazonEKSClusterRole
。 - 将其余设置保留为默认值,然后选择 Next。
- 输入集群的名称,例如
在指定网络页面上,执行以下操作:
- 从VPC下拉列表中选择您在上一步中创建的 VPC 的 ID 。有点像
vpc-00x0000x000x0x000
|birenchong-eks-vpc-stack-VPC
. - 将其余设置保留为默认值,然后选择 Next。
- 从VPC下拉列表中选择您在上一步中创建的 VPC 的 ID 。有点像
在配置日志记录页面上,选择 下一步。
在Review and create页面上,选择 Create。
在集群名称的右侧,集群状态会 持续几分钟,直到集群供应过程完成。在状态为Active之前不要继续下一步。
# 步骤 2:配置您的计算机以与您的集群通信
在本部分中,您将为集群创建一个kubeconfig
文件。此文件中的设置使kubectl
CLI 能够与您的集群进行通信。
配置您的计算机以与您的集群通信
为您的集群创建或更新
kubeconfig
文件。aws eks update-kubeconfig --region eu-central-1 --name birenchong-k8s-cluster
1默认情况下,该
config
文件是在 中创建的, 或者~/.kube
新集群的配置被添加到.config``~/.kube
测试您的配置。
kubectl get svc
1笔记
如果您收到任何授权或资源类型错误,请参阅故障排除部分中的未授权或拒绝访问 (kubectl) (opens new window)。记得配置安全组
输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 7m18s
1
2
# 步骤 3:创建Devops节点
创建托管节点组,指定您在前面步骤中创建的子网和节点 IAM 角色。
创建 Amazon EC2 Linux 托管节点组
创建节点 IAM 角色并将所需的 Amazon EKS IAM 托管策略附加到它。Amazon EKS 节点
kubelet
守护程序代表您调用 AWS API。节点通过 IAM 实例配置文件和相关策略接收这些 API 调用的权限。将以下内容复制到名为
node-role-trust-policy.json
.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
1
2
3
4
5
6
7
8
9
10
11
12创建节点 IAM 角色。
aws iam create-role \ --role-name birenchongAmazonEKSDevopsNodeRole \ --assume-role-policy-document file://"node-role-trust-policy.json"
1
2
3将所需的托管 IAM 策略附加到角色。
aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \ --role-name birenchongAmazonEKSDevopsNodeRole aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name birenchongAmazonEKSDevopsNodeRole aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --role-name birenchongAmazonEKSDevopsNodeRole
1
2
3
4
5
6
7
8
9
在https://console.aws.amazon.com/eks/home#/clusters (opens new window)打开 Amazon EKS 控制台.
选择您在第 1 步中创建的集群的名称:创建您的 Amazon EKS 集群 (opens new window),例如
birenchong-k8s-cluster
.在**
birenchong-k8s-cluster
** 页面上,执行以下操作:- 选择配置选项卡。
- 选择计算选项卡。
- 选择添加节点组。
在配置节点组页面上,执行以下操作:
- 对于Name,输入受管节点组的唯一名称,例如
birenchong-nodegroup
。 - 对于Node IAM role name,选择
birenchongAmazonEKSDevopsNodeRole
您在上一步中创建的角色。我们建议每个节点组使用自己唯一的 IAM 角色。 - Kubernetes 标记添加键env值devops
- 选择下一步。
- 对于Name,输入受管节点组的唯一名称,例如
在Set compute and scaling configuration 页面上,接受默认值并选择 Next。
在指定网络页面上,配置ssh登陆安全组选择默认安全组,并选择下一步。
在Review and create页面上,查看您的托管节点组配置并选择 Create。
几分钟后,Node Group 配置部分中 的Status将从Creating变为 Active。在状态为Active之前不要继续下一步。
# 步骤 4:配置EFS持久性存储
https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html#efs-install-driver
# 创建 IAM 策略和角色
创建 IAM 策略并将其分配给 IAM 角色。该策略将允许 Amazon EFS 驱动程序与您的文件系统进行交互。
将 Amazon EFS CSI 驱动程序部署到 Amazon EKS 集群
创建允许 CSI 驱动程序的服务账户代表您调用 AWS API 的 IAM 策略。
从 GitHub 下载 IAM 策略文档。
curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/v1.3.7/docs/iam-policy-example.json
1创建策略。
aws iam create-policy \ --policy-name BiRenchong_EKS_EFS_CSI_Driver_Policy \ --policy-document file://iam-policy-example.json
1
2
3
创建一个 IAM 角色并将 IAM 策略附加到它。使用 IAM 角色 ARN 注释 Kubernetes 服务账户,并使用 Kubernetes 服务账户名称注释 IAM 角色。使用AWS CLI创建角色 。
确定集群的 OIDC 提供程序 URL。
aws eks describe-cluster --name birenchong-k8s-cluster --query "cluster.identity.oidc.issuer" --output text
1示例输出:
https://oidc.eks.eu-central-1.amazonaws.com/id/8***************************9
1创建 IAM 角色,向 Kubernetes 服务帐户授予
AssumeRoleWithWebIdentity
操作。将以下内容复制到名为
trust-policy.json
.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::124117760613:oidc-provider/oidc.eks.eu-central-1.amazonaws.com/id/8***************************9" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.eu-central-1.amazonaws.com/id/8***************************9:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa" } } } ] }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17创建角色。
aws iam create-role \ --role-name BiRenchong_EKS_EFS_CSI_DriverRole \ --assume-role-policy-document file://"trust-policy.json"
1
2
3
将 IAM 策略附加到角色。
aws iam attach-role-policy \ --policy-arn arn:aws:iam::124117760613:policy/BiRenchong_EKS_EFS_CSI_Driver_Policy \ --role-name BiRenchong_EKS_EFS_CSI_DriverRole
1
2
3创建一个使用您创建的 IAM 角色的 ARN 注释的 Kubernetes 服务账户。
将以下内容保存到名为
efs-service-account.yaml
.--- apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/name: aws-efs-csi-driver name: efs-csi-controller-sa namespace: kube-system annotations: eks.amazonaws.com/role-arn: arn:aws:iam::124117760613:role/BiRenchong_EKS_EFS_CSI_DriverRole
1
2
3
4
5
6
7
8
9
10在集群上创建 Kubernetes 服务帐户。命名的 Kubernetes 服务账户使用您创建的 IAM 角色
BiRenchong_EKS_EFS_CSI_DriverRole
进行注释,命名为efs-csi-controller-sa
。kubectl apply -f efs-service-account.yaml
1
# 为您的集群创建 IAM OIDC 提供程序
https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html
使用 AWS 管理控制台为您的集群创建 IAM OIDC 身份提供商
- 在https://console.aws.amazon.com/eks/home#/clusters (opens new window)打开 Amazon EKS 控制台.
- 选择集群的名称,然后选择配置选项卡。
- 在详细信息部分,记下OpenID Connect 提供者 URL的值。
- 在https://console.aws.amazon.com/iam/ (opens new window)打开 IAM 控制台 .
- 在左侧导航窗格中,选择Access management下的Identity Providers。如果列出的提供程序与您的集群的 URL 匹配,则您的集群已经有一个提供程序。如果未列出与您的集群的 URL 匹配的提供程序,则您必须创建一个。
- 要创建提供者,请选择Add Provider。
- 对于Provider Type,选择OpenID Connect。
- 对于Provider URL,粘贴集群的 OIDC 颁发者 URL,然后选择Get thumbprint。
- 对于Audience,输入
sts.amazonaws.com
并选择Add provider。
# 安装 Amazon EFS 驱动程序
使用存储在私有 Amazon ECR 注册表中的映像安装驱动程序
下载清单。
kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/ecr?ref=release-1.3" > private-ecr-driver.yaml
1运行命令
sed -i.bak -e 's|us-west-2|eu-central-1|' private-ecr-driver.yaml
1查看集群所在的 AWS 区域的Amazon 容器映像注册表 (opens new window)中的账户,然后运行修改后的命令。
sed -i.bak -e 's|602401143452|602401143452|' private-ecr-driver.yaml
1编辑该
private-ecr-driver.yaml
文件并删除以下创建 Kubernetes 服务帐户的行。不需要这些行,因为服务帐户是在上一步中创建的。apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/name: aws-efs-csi-driver name: efs-csi-controller-sa namespace: kube-system ---
1
2
3
4
5
6
7
8应用清单。
kubectl apply -f private-ecr-driver.yaml
1
# 创建 Amazon EFS 文件系统
Amazon EFS CSI 驱动程序支持Amazon EFS 访问点 (opens new window),这些访问点是 Amazon EFS 文件系统中特定于应用程序的入口点,可以更轻松地在多个 pod 之间共享文件系统。访问点可以为通过访问点发出的所有文件系统请求强制执行用户身份,并为每个 pod 强制执行根目录。有关更多信息,请在 GitHub 上参阅Amazon EFS 访问点 (opens new window)
重要的
您必须在同一终端中完成以下步骤,因为在这些步骤中设置和使用了变量。
为您的 Amazon EKS 集群创建 Amazon EFS 文件系统
检索集群所在的 VPC ID 并将其存储在变量中以供后续步骤使用。替换
birenchong-k8s-cluster
为您的集群名称。vpc_id=$(aws eks describe-cluster \ --name birenchong-k8s-cluster \ --query "cluster.resourcesVpcConfig.vpcId" \ --output text)
1
2
3
4检索集群 VPC 的 CIDR 范围并将其存储在变量中以供后续步骤使用。
cidr_range=$(aws ec2 describe-vpcs \ --vpc-ids $vpc_id \ --query "Vpcs[].CidrBlock" \ --output text)
1
2
3
4创建一个具有入站规则的安全组,该规则允许您的 Amazon EFS 挂载点的入站 NFS 流量。
创建安全组。
security_group_id=$(aws ec2 create-security-group \ --group-name BiRenchongEfsSecurityGroup \ --description "BiRenchong EFS security group" \ --vpc-id $vpc_id \ --output text)
1
2
3
4
5创建一个入站规则,允许来自集群 VPC 的 CIDR 的入站 NFS 流量。
aws ec2 authorize-security-group-ingress \ --group-id $security_group_id \ --protocol tcp \ --port 2049 \ --cidr $cidr_range
1
2
3
4
5
为您的 Amazon EKS 集群创建一个 Amazon EFS 文件系统。
创建文件系统。
file_system_id=$(aws efs create-file-system \ --region eu-central-1 \ --performance-mode generalPurpose \ --query 'FileSystemId' \ --output text)
1
2
3
4
5创建挂载目标。
确定集群节点的 IP 地址。
kubectl get nodes
1示例输出:
NAME STATUS ROLES AGE VERSION ip-172-32-219-84.eu-central-1.compute.internal Ready <none> 3m23s v1.22.17-eks-49d8fe8 ip-172-32-22-252.eu-central-1.compute.internal Ready <none> 11m v1.22.17-eks-49d8fe8 ip-172-32-221-78.eu-central-1.compute.internal Ready <none> 10m v1.22.17-eks-49d8fe8
1
2
3
4确定您的 VPC 中子网的 ID 以及子网所在的可用区。
aws ec2 describe-subnets \ --filters "Name=vpc-id,Values=$vpc_id" \ --query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \ --output table
1
2
3
4
示例输出:
--------------------------------------------------------------------- | DescribeSubnets | +------------------+-------------------+----------------------------+ | AvailabilityZone | CidrBlock | SubnetId | +------------------+-------------------+----------------------------+ | eu-central-1c | 172.32.32.0/20 | subnet-0b07e97ac7bc7dcd8 | | eu-central-1c | 172.32.192.0/18 | subnet-03bfc4a127e454901 | | eu-central-1a | 172.32.64.0/18 | subnet-07170f619a98db512 | | eu-central-1b | 172.32.16.0/20 | subnet-0bc974c68c9705800 | | eu-central-1a | 172.32.0.0/20 | subnet-0136dddddc9fac4e7 | | eu-central-1b | 172.32.128.0/18 | subnet-0baf275b11bdcb2b9 | +------------------+-------------------+----------------------------+
为您的节点所在的子网添加挂载目标。根据前两步的输出,集群有一个 IP 地址为
172.32.56.0
. 该 IP 地址位于CidrBlock
具有 ID 的子网中subnet-EXAMPLEe2ba886490
。因此,以下命令会为节点所在的子网创建挂载目标。如果集群中有更多节点,您将为每个 AZ 中的子网运行一次命令,将其替换为subnet-EXAMPLEe2ba886490
具有适当的子网 ID。aws efs create-mount-target \ --file-system-id $file_system_id \ --subnet-id subnet-07fb4416d4aae3d5d \ --security-groups $security_group_id
1
2
3
4
# 部署示例应用程序
静止的
部署使用您创建的持久卷的示例应用程序
此过程使用Multiple Pods Read Write Many (opens new window)来自Amazon EFS 容器存储接口 (CSI) 驱动程序的示例 (opens new window)GitHub 存储库,用于使用静态预置的 Amazon EFS 持久卷并使用访问模式从多个 pod 访问它ReadWriteMany
。
克隆Amazon EFS 容器存储接口 (CSI) 驱动程序 (opens new window)GitHub 存储库到您的本地系统。
git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
1导航到
multiple_pods
示例目录。cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
1检索您的 Amazon EFS 文件系统 ID。您可以在 Amazon EFS 控制台中找到它,或使用以下 AWS CLI 命令。
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text
1输出:
fs-0xxxxxxxxxxxxx3
1编辑
specs/pv.yaml
文件并将volumeHandle
值替换为您的 Amazon EFS 文件系统 ID。apiVersion: v1 kind: PersistentVolume metadata: name: efs-pv spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: efs-sc csi: driver: efs.csi.aws.com volumeHandle: fs-0xxxxxxxxxxxxx3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15从目录部署
efs-sc
存储类、efs-claim
持久卷声明和efs-pv
持久卷specs
。kubectl apply -f specs/pv.yaml kubectl apply -f specs/claim.yaml kubectl apply -f specs/storageclass.yaml
1
2
3列出默认命名空间中的持久卷。查找带有
default/efs-claim
声明的持久卷。kubectl get pv -w
1输出:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE efs-pv 5Gi RWX Retain Bound default/efs-claim efs-sc 80s
1
2在
STATUS
变成Bound
之前不要进行下一步。从
specs
目录部署app1
和app2
示例应用程序。kubectl apply -f specs/pod1.yaml kubectl apply -f specs/pod2.yaml
1
2观察默认命名空间中的 pod 并等待pods
app1
和app2
的STATUS
变为Running
.kubectl get pods --watch
1笔记
pod 可能需要几分钟才能达到该
Running
状态。
描述持久卷。
kubectl describe pv efs-pv
1输出:
Name: efs-pv Labels: <none> Annotations: pv.kubernetes.io/bound-by-controller: yes Finalizers: [kubernetes.io/pv-protection] StorageClass: efs-sc Status: Bound Claim: default/efs-claim Reclaim Policy: Retain Access Modes: RWX VolumeMode: Filesystem Capacity: 5Gi Node Affinity: <none> Message: Source: Type: CSI (a Container Storage Interface (CSI) volume source) Driver: efs.csi.aws.com FSType: VolumeHandle: fs-0xxxxxxxxxxxxx3 ReadOnly: false VolumeAttributes: <none> Events: <none>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Amazon EFS 文件系统 ID 列为
VolumeHandle
.验证
app1
pod 是否成功将数据写入卷。kubectl exec -ti app1 -- tail /data/out1.txt
1输出:
Mon May 16 05:22:22 UTC 2022 Mon May 16 05:22:27 UTC 2022 Mon May 16 05:22:32 UTC 2022 Mon May 16 05:22:37 UTC 2022 Mon May 16 05:22:42 UTC 2022 Mon May 16 05:22:47 UTC 2022 Mon May 16 05:22:52 UTC 2022 Mon May 16 05:22:57 UTC 2022 Mon May 16 05:23:02 UTC 2022 Mon May 16 05:23:07 UTC 2022
1
2
3
4
5
6
7
8
9
10验证
app2
pod 在写入卷的卷中显示的数据是否相同app1
。kubectl exec -ti app2 -- tail /data/out1.txt
1输出:
Mon May 16 05:22:22 UTC 2022 Mon May 16 05:22:27 UTC 2022 Mon May 16 05:22:32 UTC 2022 Mon May 16 05:22:37 UTC 2022 Mon May 16 05:22:42 UTC 2022 Mon May 16 05:22:47 UTC 2022 Mon May 16 05:22:52 UTC 2022 Mon May 16 05:22:57 UTC 2022 Mon May 16 05:23:02 UTC 2022 Mon May 16 05:23:07 UTC 2022
1
2
3
4
5
6
7
8
9
10完成试验后,删除此示例应用程序的资源以进行清理。
kubectl delete -f specs/
1您也可以手动删除您创建的文件系统和安全组。
排错:https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-troubleshoot-oidc-and-irsa/
# 设置EFS为默认SC
创建动态sc
cat <<EOF | kubectl apply -f -
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: efs-sc-dynamic
annotations:
storageclass.beta.kubernetes.io/is-default-class: 'true'
storageclass.kubernetes.io/is-default-class: 'true'
provisioner: efs.csi.aws.com
parameters:
provisioningMode: efs-ap
fileSystemId: fs-0xxxxxxxxxxxxx3
directoryPerms: "700"
gidRangeStart: "1000" # optional
gidRangeEnd: "2000" # optional
basePath: "/dynamic_provisioning" # optional
EOF
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
修改gp2的默认值
kubectl edit sc gp2
storageclass.kubernetes.io/is-default-class: 'true'
改为false
# 在 EKS 上安装 KubeSphere
使用 kubectl 安装 KubeSphere,以下命令仅用于默认的最小安装。
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/kubesphere-installer.yaml kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/cluster-configuration.yaml
1
2
3
4开启devops:https://kubesphere.io/zh/docs/pluggable-components/devops/
检查安装日志:
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f
1安装完成后,您会看到以下消息:
************************************************** Collecting installation results ... ##################################################### ### Welcome to KubeSphere! ### ##################################################### Console: http://172.32.202.229:30880 Account: admin Password: P@88w0rd NOTES: 1. After you log into the console, please check the monitoring status of service components in "Cluster Management". If any service is not ready, please wait patiently until all components are up and running. 2. Please change the default password after login. ##################################################### https://kubesphere.io 2023-02-09 03:37:46 #####################################################
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 访问 KubeSphere 控制台
现在已经安装了 KubeSphere,您可以按照以下步骤访问 KubeSphere 的 Web 控制台。
查看 ks-console 服务。
kubectl get svc -n kubesphere-system
1执行
kubectl edit svc ks-console -n kubesphere-system
将 service 类型NodePort
更改为LoadBalancer
,完成后保存文件。# Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: v1 kind: Service metadata: annotations: meta.helm.sh/release-name: ks-core meta.helm.sh/release-namespace: kubesphere-system creationTimestamp: "2022-05-08T10:21:08Z" labels: app: ks-console app.kubernetes.io/managed-by: Helm tier: frontend version: v3.1.0 name: ks-console namespace: kubesphere-system resourceVersion: "2339" uid: 320a7b7c-5060-41d1-8768-be876b43ecd6 spec: clusterIP: 10.100.207.124 clusterIPs: - 10.100.207.124 externalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: nginx nodePort: 30880 port: 80 protocol: TCP targetPort: 8000 selector: app: ks-console tier: frontend sessionAffinity: None type: LoadBalancer status: loadBalancer: {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41执行
kubectl get svc -n kubesphere-system
获取您的 EXTERNAL-IP。# kubectl get svc -n kubesphere-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ks-apiserver ClusterIP 10.100.108.212 <none> 80/TCP 6m28s ks-console LoadBalancer 10.100.160.240 ad107c54ee456744c91c8da0b9321f2c-1235661477.ap-east-1.elb.amazonaws.com 80:30880/TCP 6m25s ks-controller-manager ClusterIP 10.100.126.96 <none> 443/TCP 6m28s openldap ClusterIP None <none> 389/TCP 6m54s redis ClusterIP 10.100.218.34 <none> 6379/TCP 6m59s
1
2
3
4
5
6
7使用 EKS 生成的 external-ip 访问 KubeSphere 的 Web 控制台。
使用默认帐户和密码(
admin/P@88w0rd
)登录控制台。
# (未完)修改KubeSphere所在的node
https://www.modb.pro/db/378501
# 使用命令找到所有的deployment和statefulset:
kubectl get all -A | grep -i -E "deployment|statefulset" | grep -i kubesphere | awk '{print $1" "$2}'
找到:第一列是namespace,第二列是deployment/statefulset。
kubesphere-monitoring-system pod/notification-manager-deployment-78664576cb-tr8f9
kubesphere-controls-system deployment.apps/default-http-backend
kubesphere-controls-system deployment.apps/kubectl-admin
kubesphere-devops-system deployment.apps/devops-apiserver
kubesphere-devops-system deployment.apps/devops-controller
kubesphere-devops-system deployment.apps/devops-jenkins
kubesphere-logging-system deployment.apps/fluentbit-operator
kubesphere-logging-system deployment.apps/ks-events-exporter
kubesphere-logging-system deployment.apps/ks-events-operator
kubesphere-logging-system deployment.apps/ks-events-ruler
kubesphere-logging-system deployment.apps/kube-auditing-operator
kubesphere-logging-system deployment.apps/kube-auditing-webhook-deploy
kubesphere-logging-system deployment.apps/logsidecar-injector-deploy
kubesphere-monitoring-system deployment.apps/kube-state-metrics
kubesphere-monitoring-system deployment.apps/notification-manager-deployment
kubesphere-monitoring-system deployment.apps/notification-manager-operator
kubesphere-monitoring-system deployment.apps/prometheus-operator
kubesphere-system deployment.apps/ks-apiserver
kubesphere-system deployment.apps/ks-console
kubesphere-system deployment.apps/ks-controller-manager
kubesphere-system deployment.apps/ks-installer
kubesphere-system deployment.apps/minio
kubesphere-system deployment.apps/redis
kubesphere-monitoring-system replicaset.apps/notification-manager-deployment-78664576cb
kubesphere-devops-system statefulset.apps/s2ioperator
kubesphere-logging-system statefulset.apps/elasticsearch-logging-data
kubesphere-logging-system statefulset.apps/elasticsearch-logging-discovery
kubesphere-monitoring-system statefulset.apps/alertmanager-main
kubesphere-monitoring-system statefulset.apps/prometheus-k8s
kubesphere-monitoring-system statefulset.apps/thanos-ruler-kubesphere
kubesphere-system statefulset.apps/openldap
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
使用命令输出完整的kubectl edit命令:
kubectl get all -A | grep -i -E "deployment|statefulset" | grep -i kubesphere | awk '{print "kubectl edit -n "$1" "$2}'
获得:
kubectl edit -n kubesphere-monitoring-system pod/notification-manager-deployment-78664576cb-tr8f9
kubectl edit -n kubesphere-controls-system deployment.apps/default-http-backend
kubectl edit -n kubesphere-controls-system deployment.apps/kubectl-admin
kubectl edit -n kubesphere-devops-system deployment.apps/devops-apiserver
kubectl edit -n kubesphere-devops-system deployment.apps/devops-controller
kubectl edit -n kubesphere-devops-system deployment.apps/devops-jenkins
kubectl edit -n kubesphere-logging-system deployment.apps/fluentbit-operator
kubectl edit -n kubesphere-logging-system deployment.apps/ks-events-exporter
kubectl edit -n kubesphere-logging-system deployment.apps/ks-events-operator
kubectl edit -n kubesphere-logging-system deployment.apps/ks-events-ruler
kubectl edit -n kubesphere-logging-system deployment.apps/kube-auditing-operator
kubectl edit -n kubesphere-logging-system deployment.apps/kube-auditing-webhook-deploy
kubectl edit -n kubesphere-logging-system deployment.apps/logsidecar-injector-deploy
kubectl edit -n kubesphere-monitoring-system deployment.apps/kube-state-metrics
kubectl edit -n kubesphere-monitoring-system deployment.apps/notification-manager-deployment
kubectl edit -n kubesphere-monitoring-system deployment.apps/notification-manager-operator
kubectl edit -n kubesphere-monitoring-system deployment.apps/prometheus-operator
kubectl edit -n kubesphere-system deployment.apps/ks-apiserver
kubectl edit -n kubesphere-system deployment.apps/ks-console
kubectl edit -n kubesphere-system deployment.apps/ks-controller-manager
kubectl edit -n kubesphere-system deployment.apps/ks-installer
kubectl edit -n kubesphere-system deployment.apps/minio
kubectl edit -n kubesphere-system deployment.apps/redis
kubectl edit -n kubesphere-monitoring-system replicaset.apps/notification-manager-deployment-78664576cb
kubectl edit -n kubesphere-devops-system statefulset.apps/s2ioperator
kubectl edit -n kubesphere-logging-system statefulset.apps/elasticsearch-logging-data
kubectl edit -n kubesphere-logging-system statefulset.apps/elasticsearch-logging-discovery
kubectl edit -n kubesphere-monitoring-system statefulset.apps/alertmanager-main
kubectl edit -n kubesphere-monitoring-system statefulset.apps/prometheus-k8s
kubectl edit -n kubesphere-monitoring-system statefulset.apps/thanos-ruler-kubesphere
kubectl edit -n kubesphere-system statefulset.apps/openldap
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
依次修改kubesphere的所有deployment和statefulset的nodeselector
nodeSelector:
devops: "yes"
2
alertmanager特殊,它是由Alertmanager组件控制的,所以先要修改它的nodeSelector
notification-manager特殊,它是由NotificationManager组件控制,所以要先修改它的nodeSelector
prometheus特殊,它是由Prometheus组件控制,所以要先修改它的nodeSelector
因为prometheus是statefulset,且replica=1,需要将devops的某台机器加一个标签,并将这个标签也加入nodeSelector:
kubectl label nodes ip-192-168-214-117.eu-central-1.compute.internal kubesphere-prometheus=yes
1