作为 k8s 小白的我,开始在 AWS 上折腾这玩意儿。

话不多说,这次的目标是:

  1. 用 eksctl 构建一个超级简单的 k8s 集群;
  2. 装备 kubernetes dashboard;
  3. 创立网络负载均衡器 NLB(Network LoadBalancer),用于分发流量;
  4. 发动 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 构建 EKS 集群

eksctl 会经过 cloudformation 创立出一系列资源堆栈。

学习使用 eksctl 构建 EKS 集群

在 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

学习使用 eksctl 构建 EKS 集群

完过后,咱们再创立办理员服务账户(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 里面了。

学习使用 eksctl 构建 EKS 集群

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

学习使用 eksctl 构建 EKS 集群

最终,布置 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 很快就启起来了。

学习使用 eksctl 构建 EKS 集群

然后还需要一个类型为 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 也现已启起来。

学习使用 eksctl 构建 EKS 集群

经过 LoadBalancer 供给的公网 DNS 称号,能够访问到 Nginx 服务。

学习使用 eksctl 构建 EKS 集群

成功完结了一个 EKS 集群建立。

小结

作为小白的我,测验到了 eksctl 带来的快捷。

经验告知咱们,出产环境的集群仅仅有此仍是远远不够的,咱们还需要面对许多问题。

或许需要 leader/follower 机制来确保服务的高可用;或许还要考虑 Stateless/Stateful 的问题,届时将会需要用到 EBS、EFS;如果有必要,还需要引入主动扩容机制,以提高服务并发处理才能,等等问题。

学习 AWS,负重致远!