作为 k8s 小白的我,开始在 AWS 上折腾这玩意儿。
话不多说,这次的目标是:
- 用 eksctl 构建一个超级简单的 k8s 集群;
- 装备 kubernetes dashboard;
- 创立网络负载均衡器 NLB(Network LoadBalancer),用于分发流量;
- 发动 3 个 Nginx Pod。
第一步,发动集群
运用 eksctl,能够协助咱们一键发动集群,并省去装备 VPC、子网、子网安全组的烦恼。
EKS 支持 EC2 运行和 Fargate 运行,这次我选用前者。
如下装备文件,声明了创立集群 coder418-basic-demo
,且没做其他声明,意味着 VPC 会选用默认装备,每个可用区都会创立一个公有子网、一个私有子网。
会创立 2 个 Node Group,每个包括 2 台 t2.small
规格的 EC2 实例,默认挂载的 EBS 硬盘容量 40G。这儿的 EC2 用了提前建好的 SSH Key。
区域挑选了 ap-southeast-1
,对于海外 AWS 来说,新加坡距离较近,是做试验不错的挑选。
# eks-cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: coder418-basic-demo
region: ap-southeast-1
nodeGroups:
- name: ng-1
instanceType: t2.small
desiredCapacity: 2
volumeSize: 40
ssh:
publicKeyName: coder418-ap-southeast-1
- name: ng-2
instanceType: t2.small
desiredCapacity: 2
volumeSize: 40
ssh:
publicKeyName: coder418-ap-southeast-1
一键布置!
$ eksctl create cluster -f eks-cluster.yaml
大约 10~20 分钟,所有资源创立完毕。
eksctl 会经过 cloudformation 创立出一系列资源堆栈。
在 EKS 界面,可检查刚建好的集群。
记得用 awscli 生成 kubectl 的装备文件,后续办理 k8s 集群会用到:
$ aws eks update-kubeconfig \
--region ap-southeast-1
--name coder418-basic-demo
kubectl 能够用本地装置的,或许 AWS Cloud Shell 供给的。
第二步,布置 Dashboard
这儿参阅 AWS 官方教程。
咱们直接用 k8s 官方引荐的 dashboard 装备文件,创立所需的 ServiceAccount、Service、Role 等资源。
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
dashboard 相关资源创立在 “kubernetes-dashboard” namespace 下面。
用 kubectl 检查 deployments 的情况:
$ kubectl get deployments -n kubernetes-dashboard
完过后,咱们再创立办理员服务账户(ServiceAccount)和集群人物(ClusterRole)的绑定,并添加一个 Secret,后边生成登录令牌(Token)会用到。
# eks-admin-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: eks-admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
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
---
apiVersion: v1
kind: Secret
metadata:
name: eks-admin-token
namespace: kube-system
annotations:
kubernetes.io/service-account.name: eks-admin
type: kubernetes.io/service-account-token
然后用 kubectl 应用这个装备。
$ kubectl apply -f eks-admin-service-account.yaml
dashboard 布置作业完毕。
生成令牌:
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')
发动 kubectl 署理:
$ kubectl proxy
届时,用咱们方才拿到的令牌访问 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#!/login
,就能够进到 dashboard 里面了。
dashboard 能够办理 K8S 集群,更新、删去资源。
第三步,创立 LoadBalancerController
关于负载均衡,我在之前的一篇博客中有整理——“当创立 Kubenetes ingress 的时分,AWS 会预置 ALB(应用层负载均衡器)。当创立类型为 LoadBalancer 的 Kubenetes 服务时,AWS 可供给 NLB(传输层负载均衡器)”。
coder418-basic-demo
中选用后者,也就是 LoadBalancer 服务配合 NLB 进行流量分发。
参阅 AWS 文档进行 k8s LoadBalancerController 装置(后边的 Nginx 布置也可参阅该文档)。
首先需要创立给 k8s LoadBalancerController 用的 IAM Policy 和 Role,以便负载均衡器有权限调用 AWS API。
下载 Policy 文件:
$ curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy.json
创立 Policy:
$ aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json
创立 IAM OIDC 供给方:
$ eksctl utils associate-iam-oidc-provider \
--region=ap-southeast-1 \
--cluster=coder418-basic-demo \
--approve
完结 IAM Role 的创立:
$ eksctl create iamserviceaccount \
--region=ap-southeast-1 \
--cluster=coder418-basic-demo \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::<此处略去 AWS Account ID>:policy/AWSLoadBalancerControllerIAMPolicy \
--approve
装置负载均衡器,需要用到一个包办理工具:helm。
更新仓库:
$ helm repo add eks https://aws.github.io/eks-charts &&
helm repo update
装置:
$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=coder418-basic-demo \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller
完过后能够用 kubectl 检查一下装置成功没。
$ kubectl get pod -n kube-system
最终,布置 Nginx Pods 和 LoadBalancer 服务
万事俱备,布置 Nginx Pods。
咱们先创立一个叫 coder418-app
的 namespace,用来放 Nginx 服务。
$ kubectl create namespace coder418-app
写一个 deployment 装备,用来部 3 个 Nginx Pods。
# eks-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: coder418-app
namespace: coder418-app
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: public.ecr.aws/nginx/nginx:1.21
ports:
- name: tcp
containerPort: 80
应用于集群:
$ kubectl apply -f eks-deployment.yaml
Pods 很快就启起来了。
然后还需要一个类型为 LoadBalancer 的服务,以便创立 NLB,将流量分发到 3 个 Nginx。
apiVersion: v1
kind: Service
metadata:
name: coder418-service
namespace: coder418-app
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: external
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: LoadBalancer
selector:
app: nginx
执行:
$ kubectl apply -f eks-service.yaml
现在,NLB 也现已启起来。
经过 LoadBalancer 供给的公网 DNS 称号,能够访问到 Nginx 服务。
成功完结了一个 EKS 集群建立。
小结
作为小白的我,测验到了 eksctl 带来的快捷。
经验告知咱们,出产环境的集群仅仅有此仍是远远不够的,咱们还需要面对许多问题。
或许需要 leader/follower 机制来确保服务的高可用;或许还要考虑 Stateless/Stateful 的问题,届时将会需要用到 EBS、EFS;如果有必要,还需要引入主动扩容机制,以提高服务并发处理才能,等等问题。
学习 AWS,负重致远!