#AWS EKS 创建k8s生产环境实例


  • 在AWS部署海外节点, 图简单使用web控制台创建VPC和k8s集群出错(k8s), 使用cli命令行工具创建成功
  • 本实例为复盘, 记录aws命令行工具创建eks, 安装efs驱动、LBS、ingress-nginx,使用ECR镜像储存等

#安装命令行工具


#安装aws cli
cd /tmp
curl -kL "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
#配置aws key
aws configure
#查看配置
aws configure list
#安装kubectl
curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.22.6/2022-03-09/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv kubectl /usr/local/bin
kubectl version --short --client
#安装eksctl
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version

#创建VPC网络和子网

#创建VPC网络和子网已单独发帖
aws命令行cli创建VPC网络、公有子网、私有子网、nat网关+EIP - Elvin™ - 博客园

#创建k8s集群


#env
k8s_name=aws-k8s
Region=ap-southeast-1 #新加坡
#获取aws账户id
OwnerId=$(aws ec2 describe-vpcs --region ${Region} |jq -r ".Vpcs[0].OwnerId")
#使用已有子网
private-subnets-id="subnet-lan-a-xxx,subnet-lan-b-xxx"
public-subnets-id="subnet-public-a-xxx,subnet-public-b-xxx"

# k8s cluster
eksctl create cluster \
--region ${Region} \
--name ${k8s_name} \
--version 1.22 \
--vpc-private-subnets ${private-subnets-id} \
--vpc-public-subnets ${public-subnets-id} \
--managed \
--without-nodegroup \
--dry-run
# 查看
eksctl get cluster --name ${k8s_name} --region ${Region}
# 出错或不要了,可删除
# eksctl delete cluster --name=${k8s_name}
# --dry-run 试运行,正式创建时去掉
# --without-nodegroup 不创建node节点
# --vpc-xx 添加已有网络,若不指定会自动创建
# 建议使用多个可用区网络,k8s集群创建后无法更改
# eksctl create cluster --help #查看帮助

#创建k8s计算节点组


#创建b区k8s节点
#k8s nodegroup test
eksctl create nodegroup \
--region ${Region} \
--cluster ${k8s_name} \
--name k8s-work-test \
--node-type m5.large \
--nodes 1 \
--nodes-min 1 \
--nodes-max 10 \
--instance-name test-node-b \
--node-ami-family Ubuntu2004 \
--node-private-networking \
--node-zones ${Region}b \
--node-security-groups sg-xxxxxxx \
--ssh-access \
--ssh-public-key aws-bastion \
--full-ecr-access \
--managed \
--dry-run
# --nodes 1 创建1个node节点, 规格 m5.large 2核8G
# --node-ami-family Ubuntu2004 操作系统Ubuntu20.04
# --node-private-networking 使用私有子网
# --node-zones 可用区
# --node-security-groups 使用已创建的安全组
# --full-ecr-access ECR镜像仓库权限,一定要
# eksctl create nodegroup --help #查看帮助
#节点扩容
eksctl scale nodegroup --region ${Region} \
--cluster ${k8s_name} --nodes=2 --name k8s-work-test
# 测试正常就可以删除, 创建配置更高的正式节点
# delete node
# eksctl delete nodegroup --cluster=${k8s_name} --name=k8s-work-test

#创建b区正式节点组
eksctl create nodegroup \
--region ${Region} \
--cluster ${k8s_name} \
--name k8s-work-b \
--node-type m5.4xlarge \
--nodes 2 \
--nodes-min 1 \
--nodes-max 10 \
--instance-name k8s-node-b \
--max-pods-per-node 110 \
--node-ami-family Ubuntu2004 \
--node-private-networking \
--node-zones ${Region}b \
--node-security-groups sg-xxxxxxx \
--ssh-access \
--ssh-public-key aws-bastion \
--full-ecr-access \
--external-dns-access \
--managed \
--dry-run
#规格m5.4xlarge 16核64G
#node-zones创建多区,可用于高可用

#为k8s集群创建IAM OIDC提供商


# IAM OIDC即 AWS Identity and Access Management (IAM) OpenID Connect (OIDC)
# 创建IMA权限角色时,需要此功能开启
#查看是否有OIDC,没有则创建
oidc_id=$(aws eks describe-cluster --name ${k8s_name} --query "cluster.identity.oidc.issuer" --output text |cut -d'/' -f 5)
if [ $(aws iam list-open-id-connect-providers | grep $oidc_id | wc -l ) -eq 0 ]; then
eksctl utils associate-iam-oidc-provider --cluster ${k8s_name} --approve
fi

#eks安装efs csi驱动

  • k8s使用AWS EFS储存时用到csi驱动
  • efs可使用nfs协议挂载,但k8s节点默认没安装nfs客户端

#创建IAM policy和角色
curl -o iam-policy-efs.json \
https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
aws iam create-policy \
--policy-name EKS_EFS_CSI_Driver_Policy \
--policy-document file://iam-policy-efs.json
#创建权限
eksctl create iamserviceaccount \
--cluster ${k8s_name} \
--namespace kube-system \
--name efs-csi-controller-sa \
--attach-policy-arn arn:aws:iam::${OwnerId}:policy/EKS_EFS_CSI_Driver_Policy \
--approve \
--region ${Region}
# 更新kubeconfig ~/.kube/config
aws eks update-kubeconfig --region ${Region} --name ${k8s_name}
#下载yaml文件
kubectl kustomize \
"github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.4" > aws-eks-efs-csi.1.4.yaml
# vim aws-eks-efs-csi.1.4.yaml
# 手动删除如下部分
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/name: aws-efs-csi-driver
name: efs-csi-controller-sa
namespace: kube-system
---
#部署efs csi
kubectl apply -f aws-eks-efs-csi.1.4.yaml

#使用efs创建pvc实例


apiVersion: v1
kind: PersistentVolume
metadata:
name: aws-efs-test
spec:
capacity:
storage: 2000Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: efs.csi.aws.com
volumeHandle: fs-xxx:/data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: aws-efs-test
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2000Gi
# fs-xxx 为efs实例id,需要单独创建
# 创建efs后需添加子网和安全组,否则无法访问

#安装AWS LB Controller

  • AWS LoadBalancer默认使用Classic Load Balancer模式
  • 使用NLB、ALB模式的负载均衡器,和绑定EIP(绑定固定IP),必须安装LB controller

#创建IAM角色
curl -o iam_lbs_v2.4.2.json \
https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.2/docs/install/iam_policy.json
aws iam create-policy \
--policy-name iam_lbs_v2.4.2 \
--policy-document file://iam_lbs_v2.4.2.json
eksctl create iamserviceaccount \
--cluster=${k8s_name} \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name "AmazonEKSLoadBalancerControllerRole" \
--attach-policy-arn=arn:aws:iam::${OwnerId}:policy/iam_lbs_v2.4.2 \
--approve
#安装cert-manager
kubectl apply \
--validate=false \
-f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
#下载yaml
curl -Lo aws-load-balancer-controller_2.4.2.yaml \
https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.2/v2_4_2_full.yaml
#更改k8s集群名称
sed -i.bak -e "s|your-cluster-name|${k8s_name}|" aws-load-balancer-controller_2.4.2.yaml
#手动删除如下部分
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: aws-load-balancer-controller
name: aws-load-balancer-controller
namespace: kube-system
---
#部署lbs
kubectl apply -f aws-load-balancer-controller_2.4.2.yaml
#查看
kubectl get deployment -n kube-system aws-load-balancer-controller

#安装ingress-nginx-controller


#下载yaml
curl -o aws-ingress-nginx.nlb.v1.3.0.yml \
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/aws/deploy.yaml
#增加spec.ipFamilyPolicy: SingleStack

#修改LoadBalancer部分的Service如下


---
apiVersion: v1
kind: Service
metadata:
annotations:
#负载均衡器自定义名称
service.beta.kubernetes.io/aws-load-balancer-name: k8s-ingress-slb
#负载均衡 NLB模式
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
#使用EIP,互联网模式
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
#public子网
service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-axxx, subnet-bxxx
#弹性IP地址
service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-axxx, eipalloc-bxxx
#获取客户端真事IP
service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.3.0
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
type: LoadBalancer
# externalTrafficPolicy: Local
ipFamilyPolicy: SingleStack
ipFamilies:
- IPv4
ports:
- appProtocol: http
name: http
port: 80
protocol: TCP
targetPort: http
- appProtocol: https
name: https
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx

#部署
kubectl apply -f aws-ingress-nginx.nlb.v1.3.0.yml
#查看,获得得到EXTERNAL-IP地址
kubectl get svc ingress-nginx-controller -n ingress-nginx
#ping测试EXTERNAL-IP地址ip是否为自己的EIP地址
ping k8s-ingress-slb-xxx.elb.${Region}.amazonaws.com
#访问测试
curl -I k8s-ingress-slb-xxx.elb.${Region}.amazonaws.com

#使用私有镜像仓库,并部署服务测试


#创建存储库nginx
aws ecr create-repository \
--repository-name nginx \
--region $Region
#登录储存库(缓存的登录凭证有效期12小时)
aws ecr get-login-password --region $Region \
| docker login --username AWS --password-stdin ${OwnerId}.dkr.ecr.${Region}.amazonaws.com
#下载公共镜像, 改tag为私有储存库地址
docker pull public.ecr.aws/nginx/nginx:alpine
docker tag public.ecr.aws/nginx/nginx:alpine \
${OwnerId}.dkr.ecr.${Region}.amazonaws.com/nginx:alpine
#push镜像到新建的储存库
docker push ${OwnerId}.dkr.ecr.${Region}.amazonaws.com/nginx:alpine
#deploy test
kubectl create deployment nginx --port=80 \
--image=${OwnerId}.dkr.ecr.${Region}.amazonaws.com/nginx:alpine
#查看
kubectl get pod
#生命周期策略示例,保持5个镜像版本(tag)
cat >aws-ecr-policy.json <<EOF
{
"rules": [
{
"rulePriority": 1,
"description": "Keep only 3 image",
"selection": {
"tagStatus": "any",
"countType": "imageCountMoreThan",
"countNumber": 3
},
"action": {
"type": "expire"
}
}
]
}
EOF
#创建策略
aws ecr put-lifecycle-policy --region $Region \
--repository-name nginx \
--lifecycle-policy-text file://aws-ecr-policy.json
#删除清理pod
kubectl delete deploy/nginx
#删除存储库
aws ecr delete-repository \
--region $Region --force \
--repository-name nginx
  • k8s有pull私有镜像仓库权限,是因为创建参数--full-ecr-access
  • AWS ECR镜像储存服务不支持目录,只能分别给每个镜像创建储存库
  • aws ecr get-login-password生成的凭证有效期12小时,可使用定时任务每天登录2次解决

AWS EKS 创建k8s生产环境实例相关推荐

  1. 上 k8s 生产环境的一些准备!

    来源:公众号 | 运维开发故事(mygsdcsf) 在生产中运行应用程序可能很棘手.这篇文章提出了一个自以为是的清单,用于在 Kubernetes 上使用 Web 服务(即应用程序公开 HTTP AP ...

  2. 思科静态路由生产环境实例

    最近公司好多员工自己私接路由,由于员工配置的路由全是192.168.1.0段的最终导致了部分人无法连接打印机同时还产生了ARP风暴造成了大面积人通过无线无法连接打印机,思考了一下这是一个典型的基于串联 ...

  3. JVM系列:生产环境参数实例及分析【生产环境实例增加中】

    java application项目(非web项目) 改进前: -Xms128m -Xmx128m -XX:NewSize=64m -XX:PermSize=64m -XX:+UseConcMarkS ...

  4. 生产环境容器落地最佳实践 - JFrog 内部 K8s 落地旅程

    引言 Kubernetes 已经成为市场上事实上领先的编配工具,不仅对技术公司如此,对所有公司都是如此,因为它允许您快速且可预测地部署应用程序.动态地伸缩应用程序.无缝地推出新特性,同时有效地利用硬件 ...

  5. 通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本...

    通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本   版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 ...

  6. aws上创建eks集群

    在aws上创建eks集群前,需要先创建vpc和subnet以及role,因为在创建集群时会用到. 1.创建VPC 对于创建vpc,进入create vpc界面创建即可,这里用的都是默认值. 2.创建s ...

  7. 使用AWS 管理控制台和 AWS CLI创建EKS集群

    Amazon Elastic Kubernetes Service (Amazon EKS) 是一种托管服务,用户可以使用它在 AWS 上运行 Kubernetes,而无需安装.操作和维护Kubern ...

  8. 搭建 K8S 环境:Centos7安装生产环境可用的K8S集群图文教程指南

    搭建 K8S 环境:Centos7安装生产环境可用的K8S集群图文教程指南 一. K8S 简介 二. K8S 学习的几大拦路虎 2.1 K8S 安装对硬件要求比较高 2.2. K8S 对使用者来说要求 ...

  9. AWS上创建的notebook实例提示没有导入pytorch模块的解决办法 直接在编辑块中执行如下命令,最后重启kernel问题解决

    AWS上创建的notebook实例提示没有导入pytorch模块的解决办法 直接在编辑块中执行如下命令,最后重启kernel问题解决 conda install pytorch torchvision ...

最新文章

  1. C++知识点57——类模板(2、类模板的局部特化与默认模板实参)
  2. android TextView 文本里面设置超链接
  3. MySQL添加服务、设置密码、修改密码
  4. php动态生成链接,PHP动态生成javascript文件的2个例子
  5. 2006年软件500强
  6. java中怎么进行字符串替换?
  7. 2021年1月19日工作日志 - Cypress regression tests build error
  8. 2015-11-16
  9. Java的jdk1.6与jre1.8中存在的差异
  10. python编译成汇编语言_查看C语言/C++编译器生成的汇编语言代码
  11. python如何跳出函数_python如何跳出函数
  12. 应用密码学笔记第五章-第六章
  13. Linux下好用的类似QQ截图工具
  14. 51单片机电路原理图_(51单片机)课设项目2-超声波测距(SRF04、LCD1602、蜂鸣器报警电路)...
  15. 电话机器人成骚扰机器?程序员可不背锅
  16. python编译器入门教程_一篇让你直接入门的 Python 教程
  17. 常见的python连接数据库包
  18. Winbond W25Q128JVSIQ 串行闪存
  19. GIS教程之Cesium 基础入门教程
  20. C语言实现天生棋局案例

热门文章

  1. 软件测试web自动化项目实战——TPshop开源商城系统
  2. 原生html页面弹窗_javascript原生弹出框
  3. 1.1 密码学哈希函数
  4. 【论文写作】之LaTeX中插入Visio图文件
  5. swing实现qq登入
  6. 特斯拉FSD HW 4.0下一代自动驾驶硬件泄露
  7. WinForm控件属性大全
  8. 暗黑3发布!又有多少人为之疯狂
  9. spring切面注解失效
  10. python 开课了_解答你学习Python的困惑,《Python小白成长记》开课啦