Kubernetes:第 3 部分 – AWS EKS 概述和手动 EKS 集群设置
[](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 之
[](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
更多推荐
所有评论(0)