[](https://res.cloudinary.com/practicaldev/image/fetch/s--1omKf2Bs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://rtfm.co.ua/ wp-content/uploads/2017/06/kuber-1.png)让我们继续我们的 Kubernetes 之旅。

以前的部分:

  • Kubernetes:第 1 部分 - 架构和主要组件概述

  • Kubernetes:第 2 部分 – 使用 AWS 云提供商和 AWS LoadBalancer 在 AWS 上设置的集群

在这一部分中,我们将开始使用 AWS Elastic Kuberneters Service (EKS)——它的简短概述,然后将创建 Kubernetes 控制平面、带有工作节点的 CloudFormation 堆栈,将启动一个简单的 Web 服务并添加一个 LoadBalancer。

弹性 Kubernetes 服务 – 概述

AWS EKS 是一个 Kubernetes 集群,其核心 -控制平面- 将由 AWS 本身管理,从而使用户免于不必要的头痛。

  • 控制平面:由AWS管理,由三个不同可用区的EC2组成

  • Worker Nodes: AutoScaling 组中的常见 ЕС2,在客户的 VPC 中,由用户管理

网络概览:

对于网络 - 使用amazon-vpc-cni-k8s插件,它允许在集群内使用 AWS ENI(弹性网络接口)和 VPC 的网络空间。

对于授权 – 使用aws-iam-authenticator允许针对 AWS IAM 角色和策略对 Kubernetes 对象进行身份验证(请参阅管理用户或集群的 IAM 角色)

此外,AWS 将管理 Kubernetes 的次要升级,即 1.11.5 到 1.11.8,但主要升级仍然必须由用户完成。

准备AWS环境

要创建 EKS 集群,我们需要创建一个带有子网的专用 VPC,配置路由并添加 IAM 角色以进行集群授权。

IAM 角色

转到 IAM,使用 EKS 类型创建一个新角色:

Permissions 将由 AWS 自己填写:

保存:

VPC

接下来,必须创建具有 4 个子网的 VPC——两个公共子网用于 LoadBalacner,两个私有子网——用于工作节点。

创建 VPC:

安全组

转到_SecurityGroups_,为集群创建一个新的:

添加所需的规则,这里只是一个 Allow All to All 示例:

互联网网关

创建一个 IGW,用于路由来自公共子网的流量:

将其附加到 VPC:

子网

Pod 将使用分配的子网中的 IP(请参阅amazon-vpc-cni-k8s),因此这些子网必须有足够的地址空间。

使用 10.0.0.0/18 block(16384 个地址)创建第一个公共子网:

使用 10.0.64.0/18 块的第二个公共子网:

在公有子网中 – 启用将公有 IP 自动分配给 EC2:

同样,添加两个私有子网:

NAT网关

在公共子网中创建一个 NAT 网关——它将用于路由来自私有子网的流量:

并在这里配置路由:

路由表

现在,需要为公共子网和私有子网创建两个路由表。

公共路由表

创建公有子网路由表:

编辑路由——通过上面创建的 IGW 将路由设置为 0.0.0.0/0:

切换到_子网关联_——将两个公共子网附加到此 RTB:

私有路由表

同样,为私有子网创建 RTB:

0.0.0.0/0 添加另一条路由,但通过 NAT GW 而不是 IGW:

返回您的子网 - 编辑路由表关联:

将我们的私有 RTB 附加到私有子网,以便它们使用 NAT GW:

将我们的公共 RTB 附加到私有子网,以便它们使用 Internet GW:

检查

要测试此 VPC 是否正常工作 - 运行两个 EC2 实例。

首先在公共子网中:

设置安全组:

检查网络:

[setevoy@setevoy-arch-work ~] $ ssh -i setevoy-testing-eu-west-2.pem ubuntu@35.178.171.252 'ping -c 1 8.8.8.8'
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=51 time=1.33 ms
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.331/1.331/1.331/0.000 ms

在私有子网中添加另一个 EC2:

不要忘记SG。

并尝试从第一个实例 ping 它(因为我们无法从 Internet ping 私有网络中的实例):

[setevoy@setevoy-arch-work ~] $ ssh -i setevoy-testing-eu-west-2.pem ubuntu@35.178.171.252 'ping -c 1 10.0.184.21'
PING 10.0.184.21 (10.0.184.21) 56(84) bytes of data.
64 bytes from 10.0.184.21: icmp_seq=1 ttl=64 time=0.357 ms
--- 10.0.184.21 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.357/0.357/0.357/0.000 ms

如果没有回复 ping - 首先检查您的安全组和路由表。

我们到这里就完成了——是时候从 EKS 本身开始了。

弹性Kubernetes服务

创建控制平面

转到 EKS 并创建主节点 - 单击_创建集群_:

设置名称,选择一开始创建的 IAM 角色:

在子网中仅选择私有子网并设置上面创建的安全组:

如果需要,启用日志:

并创建集群:

创建工作节点

当控制平面处于配置状态时——让我们为工作节点创建一个 CloudFormation 堆栈。

可以从 AWS 获取现有模板 –https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-02-11/amazon-eks-nodegroup.yaml。

转到_CloudFormation > 创建堆栈_:

由于我们的工作节点将放置在私有子网中,因此在设计器中打开此模板:

找到AssociatePublicIpAddress参数并将其值从 true 更改为 false:

单击_创建堆栈_:

设置堆栈的名称,可以是任何名称,以及集群名称 - 与我们在创建主节点时所做的相同,例如_ eks-cluster-manual _ 在本例中,选择 SecurityGroup,填写 AutoScale 设置:

根据区域查找NodeImageId(查看文档以获取最新列表):

地区

Amazon X 优化 i

支持 GPU

美国东部(俄亥俄州) (us-east-2)

ami-0485258c2d1c3608f

ami-0ccac9d9b57864000

美国东部(弗吉尼亚北部) (us-east-1)

ami-0f2e8e5663e16b436

ami-0017d945a10387606

美国西部(俄勒冈) (us-west-2)

ami-03a55127c613349a7

ami-08335952e837d087b

亚太地区(香港) (ap-east-1)

ami-032850771ac6f8ae2

N/A*

亚太地区(孟买)(ap-south-1)

ami-0a9b1c1807b1a40ab

ami-005b754faac73f0cc

亚太地区(东京) (ap-northeast-1)

ami-0fde798d17145fae1

ami-04cf69bbd6c0fae0b

亚太地区(首尔) (ap-northeast-2)

ami-07fd7609df6c8e39b

ami-0730e699ed0118737

亚太地区(新加坡) (ap-southeast-1)

ami-0361e14efd56a71c7

ami-07be5e97a529cd146

亚太地区(悉尼) (ap-southeast-2)

ami-0237d87bc27daba65

ami-0a2f4c3aeb596aa7e

欧盟(法兰克福) (eu-central-1)

ami-0b7127e7a2a38802a

ami-0fbbd205f797ecccd

欧盟(爱尔兰)(eu-west-1)

ami-00ac2e6b3cb38a9b9

ami-0f9571a3e65dc4e20

欧盟(伦敦)(eu-west-2)

ami-0147919d2ff9a6ad5

ami-032348bd69c5dd665

欧盟(巴黎)(eu-west-3)

ami-0537ee9329c1628a2

ami-053962359d6859fec

欧盟(斯德哥尔摩)(eu-north-1)

ami-0fd05922165907b85

ami-0641def7f02a4cac5

目前,堆栈正在 London/eu-west-2 中创建,不需要 GPU,因此 – ami-147919d2ff9a6ad5 (Amazon Linux)。

设置此 AMI ID,选择 VPC 和两个子网:

点击_Next_,跳过下一页,点击_Create stack_:

堆栈创建完成后 - 检查 AutoScaling 组:

kubectl安装

当我们使用 Worker 节点时,我们的 EKS 集群已配置好,我们可以在工作机器上安装kubectl

下载一个可执行文件:

[setevoy@setevoy-arch-work ~] $ curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.7/2019-06-11/bin/linux/amd64/kubectl
[setevoy@setevoy-arch-work ~] $ chmod +x kubectl
[setevoy@setevoy-arch-work ~] $ sudo mv kubectl /usr/local/bin/

查看:

[setevoy@setevoy-arch-work ~] $ kubectl version --short --client
Client Version: v1.13.7-eks-fa4c70

要创建其配置文件 – 使用 AWS CLI:

[setevoy@setevoy-arch-work ~] $ aws eks --region eu-west-2 --profile arseniy update-kubeconfig --name eks-cluster-manual
Added new context arn:aws:eks:eu-west-2:534***385:cluster/eks-cluster-manual to /home/setevoy/.kube/config

添加别名只是为了使工作更简单:

[setevoy@setevoy-arch-work ~] $ echo "alias kk="kubectl"" >> ~/.bashrc
[setevoy@setevoy-arch-work ~] $ bash

核实:

[setevoy@setevoy-arch-work ~] $ kk get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   172.20.0.1   <none>        443/TCP   20m

AWS 身份验证器

尽管 CloudFormation for Worker Nodes 已经准备就绪,并且 EC2 实例已启动并运行——但我们仍然无法将它们视为 Kubernetes 集群中的节点:

[setevoy@setevoy-arch-work ~] $ kk get node
No resources found.

下载 AWS 身份验证器:

[setevoy@setevoy-arch-work ~] $ cd Temp/
[setevoy@setevoy-arch-work ~] $ curl -so aws-auth-cm.yaml https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-02-11/aws-auth-cm.yaml

转到 IAM > Roles,找到角色 (NodeInstanceRole) 的 ARN (Amazon Resource Name):

编辑文件aws-auth-cm.yaml,设置rolearn:

创建一个ConfigMap:

[setevoy@setevoy-arch-work ~/Temp]  $ kk apply -f aws-auth-cm.yaml
configmap/aws-auth created

核实:

[setevoy@setevoy-arch-work ~/Temp]  $ kubectl get nodes -o wide
NAME                                         STATUS   ROLES    AGE   VERSION              INTERNAL-IP    EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION                  CONTAINER-RUNTIME

ip-10-0-153-7.eu-west-2.compute.internal     Ready    <none>   47s   v1.13.7-eks-c57ff8   10.0.153.7     <none>        Amazon Linux 2   4.14.128-112.105.amzn2.x86_64   docker://18.6.1

ip-10-0-196-123.eu-west-2.compute.internal   Ready    <none>   50s   v1.13.7-eks-c57ff8   10.0.196.123   <none>        Amazon Linux 2   4.14.128-112.105.amzn2.x86_64   docker://18.6.1

ip-10-0-204-190.eu-west-2.compute.internal   Ready    <none>   52s   v1.13.7-eks-c57ff8   10.0.204.190   <none>        Amazon Linux 2   4.14.128-112.105.amzn2.x86_64   docker://18.6.1

节点被添加到集群中——太好了。

Web-app && LoadBalancer

出于测试目的——让我们创建一个简单的 Web 服务,例如,一个常见的 NGINX,如前一章中所示。

要访问 NGINX,我们还要在 Kubernetes 和 AWS 中创建一个 LoadBalancer,它将请求代理到工作节点:

kind: Service
apiVersion: v1
metadata:
  name: eks-cluster-manual-elb
spec:
  type: LoadBalancer
  selector:
    app: eks-cluster-manual-pod
  ports:
    - name: http
      protocol: TCP
      # ELB's port
      port: 80
      # container's port
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: eks-cluster-manual-deploy
spec:
  # ReplicaSet pods config
  replicas: 1
  # pods selector
  selector:
    matchLabels:
      app: eks-cluster-manual-pod
  # Pod template
  template:
    metadata:
      # a pod's labeles
      labels:
        app: eks-cluster-manual-pod
    spec:
      containers:
        - name: eks-cluster-manual-app

部署它们:

[setevoy@setevoy-arch-work ~/Temp]  $ kk apply -f eks-cluster-manual-elb-nginx.yml
service/eks-cluster-manual-elb created
deployment.apps/eks-cluster-manual-deploy created

检查服务:

[setevoy@setevoy-arch-work ~/Temp]  $ kk get svc
NAME                     TYPE           CLUSTER-IP     EXTERNAL-IP                                                               PORT(S)        AGE

eks-cluster-manual-elb   LoadBalancer   172.20.17.42   a05***405.eu-west-2.elb.amazonaws.com   80:32680/TCP   5m23s

一个豆荚:

[setevoy@setevoy-arch-work ~/Temp]  kk get po -o wide -l app=eks-cluster-manual-pod

NAME                                         READY   STATUS    RESTARTS   AGE     IP            NODE                                       NOMINATED NODE   READINESS GATES

eks-cluster-manual-deploy-698b8f6df7-jg55x   1/1     Running   0          6m17s   10.0.130.54   ip-10-0-153-7.eu-west-2.compute.internal   <none>           <none>

ConfigMap本身:

kubectl describe configmap -n kube-system aws-auth
Name:         aws-auth
Namespace:    kube-system
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","data":{"mapRoles":"- rolearn: arn:aws:iam::534***385:role/eks-cluster-manual-workers-stack-NodeInstanceRole-12DRN98...
Data
====
mapRoles:
----
- rolearn: arn:aws:iam::534***385:role/eks-cluster-manual-workers-stack-NodeInstanceRole-12DRN987QYB34
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
Events:  <none>

AWS 中的 LoadBalancer(需要等待大约 5 分钟才能启动 Pod 并将节点附加到 ELB):

它的标签:

并测试 AWS 提供的 URL 或kubectl get svc命令:

[setevoy@setevoy-arch-work ~/Temp]  $ curl a05***405.eu-west-2.elb.amazonaws.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

完毕。

有用的链接

  • 什么是 Amazon EKS?

  • Amazon EKS 入门

  • 管理集群的用户或 IAM 角色

  • Kubernetes 配置图

  • 亚马逊 EKS 研讨会

  • 关于 Kubernetes on Amazon (EKS) 的十件事

  • EKS 审查

  • 我的第一个 Kubernetes 集群:Amazon EKS 回顾

  • Kubernetes 部署故障排除

  • matchLabels、标签和选择器详细解释,适合初学者

类似职位

  • 08/10/2019Kubernetes:第 2 部分 – 在 AWS 上使用 AWS 云提供商和 AWS LoadBalancer 设置的集群

  • 07/25/2019Kubernetes:第 1 部分 - 架构和主要组件概述

  • 02/21/2019OpenVPN:OpenVPN 访问服务器设置和 AWS VPC 对等配置

  • 06/13/2018AWS:CloudFormation – VPC 对等 и Fn::ImportValue

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐