在AWS EC2上,通过Rancher构建Kubernetes集群

这是在AWS EC2上使用Rancher(v2.2.3)搭建Kubernetes集群的笔记。

[1] 首先,什么是Rancher?

スクリーンショット 2019-05-27 18.08.56.png

・可以集中进行Kubernetes集群和其他各种OSS的构建和运营的管理工具
・由美国Rancher Labs公司开发的OSS
・据说免费的OSS版本可以使用所有功能,并提供额外的付费企业支持服务。
・该工具首次发布于2014年,最初支持多个容器编排工具,但在2017年的Rancher 2.0中,它专注于基于Kubernetes的多云支持。
・国内已经在NTT Com公司、LINE公司、CyberAgent公司、Recruit Technologies公司等许多企业中推广使用。

K8s集群搭建的服务和工具还有很多其他选择。
例如,如果在GCP上可以选择GKE,AWS上可以选择EKS,如果是PaaS类别的话可以选择PKS,而工具类别则可以选择Kubeadm或KOPS等等,有很多种选择。
在这样的背景下,Rancher作为我个人的感受来说,它的“目录”功能让它非常具有吸引力,因为它不仅能在实际运维中轻松设置和管理相关的工具组合,比如Prometheus、Grafana和Helm等等,而且也能很容易地进行设置和管理。
由于K8s以各种工具组成的生态系统,单独设置和管理所有工具是相当困难的。
此外,它还可以轻松地集成etcd和k8s的主节点冗余性(考虑HA结构),这也是它的重要魅力之一。

农场主公式
https://rancher.com/

GitHub是一个网站,网址是https://github.com/rancher/rancher。

参考( )

[2] 首先在Rancher上建立一个k8s集群。

首先

Rancher有一个带有图形界面的Rancher服务器,以及一个k8s集群服务器。本次构建使用了一台用于Rancher服务器的EC2实例和一台用于k8s集群(master/worker兼容)的EC2实例,共计两台实例。

スクリーンショット 2019-05-27 13.47.50.png

基本上,所有的组件都是在Docker容器中构建的,因此只要有基本的Docker安装,EC2就可以了。
Rancher在集群节点上运行的是与Rancher服务器进行通信的代理。此外,k8s也是使用Hyperkube以容器为基础启动的。

环境信息

EC2:亚马逊 Linux2 m5.large
Rancher:版本2.2.3
docker:版本18.06.1-ce

②牧场主的设置

※Docker安装方式将被省略

只需在已安装有Docker的实例中执行以下操作。

sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher

请参考以下链接以进行Rancher的安装:
https://rancher.com/docs/rancher/v2.x/zh/quick-start-guide/deployment/quickstart-manual-setup/#2-安装-rancher

当你使用浏览器访问时,可以进入Rancher的GUI界面。
初次访问时,会生成admin账户,并且如果设置了密码,就可以登录。

スクリーンショット 2019-05-27 13.55.56.png
スクリーンショット 2019-05-27 13.55.18.png

如果忘记管理员密码

如果忘记了管理员密码,可以在rencher服务器的主机上执行以下操作以重置密码(将会重新生成一个随机密码)。

docker exec -ti <rancher server container_id> reset-password

创建一个k8s集群

登录后的界面上的「添加集群」菜单

在Add Cluster中选择“Custom”。

スクリーンショット 2019-05-27 13.59.03.png

由于有云服务选项可供选择,因此可以从零开始利用托管服务来创建集群,包括创建新节点等构建工作。
但是,如果是从已经建立了主机(如EC2)的状态开始的,本次情况为”Custom”。
在使用本地服务器进行构建时可能也是相同的情况。

スクリーンショット 2019-05-27 14.02.07.png

然后输入集群名称,并选择k8s版本。
接着选择覆盖网络工具。简而言之,它是用于在k8s节点之间的容器间通信中构建虚拟网络的功能。
有很多选择,但选择Flannel。
最后,选择Custom Provider为None。

スクリーンショット 2019-05-27 14.05.08.png

最后,生成在构建集群的主机服务器上运行的命令。
Rancher通过在Rancher服务器上生成命令,并在希望将其集成到k8s集群中的主机服务器上运行,启动Rancher代理并将节点注册到Rancher服务器,以构建可集中管理的k8s集群的便利工具。

在「节点选项」中选择「显示高级选项」,以便详细显示并设置用于K8s集群的EC2私有IP(内部地址)。
在节点角色中,勾选所有的「etcd」、「控制平面」和「Worker」。
如果要将每个角色分开,请生成并执行分开的命令,这样可以实现主机分散的效果。

会生成如下命令:
此时,–server默认指定了Rancher服务器的全局IP,但也可以手动更改为私有IP。

sudo docker run -d 
--privileged 
--restart=unless-stopped 
--net=host 
-v /etc/kubernetes:/etc/kubernetes 
-v /var/run:/var/run rancher/rancher-agent:v2.2.3 
--server https://172.16.0.10 
--token xxxxxxxx 
--ca-checksum xxxxxxxx 
--internal-address 172.16.0.20 
--etcd 
--controlplane 
--worker

只需要一个选择,原文的中文释义如下:
在保持屏幕显示的情况下,在k8s集群的EC2上执行此命令,当Rancher服务器识别时。

「有1个新节点已注册」

由于显示为「完成」,请点击「完成」按钮以完成。

在用于集群的主机服务器上,通过docker ps命令确认可以看到如下已运行的容器。

a1896a96de66        rancher/hyperkube:v1.13.5-rancher1                "/opt/rke-tools/entr…"   About an hour ago   Up About an hour                        kube-proxy
df7f65730a93        rancher/hyperkube:v1.13.5-rancher1                "/opt/rke-tools/entr…"   About an hour ago   Up About an hour                        kubelet
356dc597c277        rancher/hyperkube:v1.13.5-rancher1                "/opt/rke-tools/entr…"   About an hour ago   Up About an hour                        kube-scheduler
478128e7a70a        rancher/hyperkube:v1.13.5-rancher1                "/opt/rke-tools/entr…"   About an hour ago   Up About an hour                        kube-controller-manager
04577fca9103        rancher/hyperkube:v1.13.5-rancher1                "/opt/rke-tools/entr…"   About an hour ago   Up About an hour                        kube-apiserver
2f0087e09a03        rancher/coreos-etcd:v3.2.24-rancher1              "/usr/local/bin/etcd…"   About an hour ago   Up About an hour                        etcd
747414e88256        rancher/rancher-agent:v2.2.3                      "run.sh --server htt…"   About an hour ago   Up About a minute                       jovial_brahmagupta
5770e05cc24b        rancher/rancher-agent:v2.2.3                      "run.sh --server htt…"   About an hour ago   Up About an hour                        boring_clarke

スクリーンショット 2019-05-27 13.55.18.png

一旦State变为Active,就可以了。

Kubernetes操作验证

スクリーンショット 2019-05-27 14.20.49.png

集群资源监控功能也可以在标准配置中查看。

スクリーンショット 2019-05-27 14.42.43.png

从仪表板的「启动kubectl」或「Kubeconfig文件」下载的配置文件设置的客户端上,可以执行kubectl命令。

$ kubectl get nodes
NAME             STATUS   ROLES                      AGE   VERSION
ip-172-16-0-20   Ready    controlplane,etcd,worker   96m   v1.13.5

尝试部署一个nginx pod

$ kubectl create deployment --image nginx my-nginx
deployment.apps/my-nginx created

$ kubectl get pod 
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-6cc48cd8db-f4nd6   1/1     Running   0          9s

[3] 功能的扩展与目录

监测

只需启用“工具” – “监控”设置,即可使用k8s监控的事实上标准工具“Grafana”,无需复杂的设置。虽然Rancher仪表板也会生成概要报告,但通过Grafana图标可以单独启动Grafana,并查看详细的监控信息。

スクリーンショット 2019-05-27 17.56.43.png
スクリーンショット 2019-05-27 17.56.54.png

Grafana非常方便,因为它可以查看每个Pod的资源消耗量。

スクリーンショット 2019-05-28 11.39.51.png

记录

可以设置用于收集k8s集群每个节点日志的一整套Rancher支持的日志工具。

スクリーンショット 2019-05-27 15.20.26.png

添加工作节点

如何向之前的1节点k8s集群添加worker节点。

将安装了Docker的EC2实例放置在相同的网络段中,
只需要在主机上执行与之前相同的命令。
不同之处是,
–internal-address选项是对应主机的IP地址,
且节点角色要附加–worker选项。

sudo docker run -d 
--privileged 
--restart=unless-stopped 
--net=host 
-v /etc/kubernetes:/etc/kubernetes 
-v /var/run:/var/run rancher/rancher-agent:v2.2.3 
--server https://172.16.0.10 
--token xxxxxxxx 
--ca-checksum xxxxxxxx 
--internal-address [追加するノードのIP] 
--worker

[5] 进展之处

情况一:Etcd集群不健康。

尝试了几次构建类别集,结果出现了以下错误。

[etcd] Failed to bring up Etcd Plane: [etcd] Etcd Cluster is not healthy

看起来需要好好清理垃圾才行啊。
按照下方网站的”手动清理节点”步骤进行操作后,再次创建集群问题得到解决。

情况2: 牛群代理 CrashLoopBackOff

牛群群集代理和牛节点代理这两个Pod一直在重启。

NAMESPACE       NAME                                                      READY   STATUS             RESTARTS   AGE
cattle-system   cattle-cluster-agent-xxxxx                     0/1     CrashLoopBackOff   40         4h31m
cattle-system   cattle-node-agent-xxxxx                                   1/1     Running            17         98m
cattle-system   cattle-node-agent-xxxxx                                   0/1     CrashLoopBackOff   40         4h31m

查看日志后发现,k8s节点向Rancher服务器的全局IP发起通信时超时的情况。默认情况下,Rancher服务器的全局IP似乎作为各种控制的终端点,并且需要允许每个节点对443端口(HTTPS)进行访问控制。

$ kubectl -n cattle-system logs cattle-cluster-agent-6fbc6f6b68-68l8l

INFO: Environment: CATTLE_ADDRESS=X.X.X.X CATTLE_CA_CHECKSUM=xxxxx CATTLE_CLUSTER=true CATTLE_INTERNAL_ADDRESS= CATTLE_K8S_MANAGED=true CATTLE_NODE_NAME=cattle-cluster-agent-xxxxx CATTLE_SERVER=https://[RancherサーバのグローバルIP]
INFO: Using resolv.conf: nameserver X.X.X.X search cattle-system.svc.cluster.local svc.cluster.local cluster.local ap-northeast-1.compute.internal options ndots:5
ERROR: https://[RancherサーバのグローバルIP]/ping is not accessible (Failed to connect to [RancherサーバのグローバルIP] port 443: Connection timed out)

通过允许来自k8s的每个worker连接Rancher服务器的全局IP(端点),可以解决此问题。

案例3:监控API尚未准备就绪。

尽管已在Tools的“集群监控配置”中启用,但仪表盘上却显示“监控API尚未就绪”的警告。

与案例2相同的原因。采取相同的处理措施来解决问题。

案例4:kubectl关闭错误代码:1006

当尝试从Rancher的仪表盘上执行 “Launch kubectl” 命令时,没有任何反应,出现”Closed Code: 1006″等错误。

与k8s节点的连接存在问题。

与案例2相同的原因。采取相同的对策来解决问题。

Case5 管理员用户忘记密码。

管理员用户密码可以通过下列方式重置。

docker exec [RancherサーバのコンテナID] reset-password

将会生成随机字符串作为密码输出。

Case6 无法获得指标数据。

スクリーンショット 2019-05-28 11.15.47.png

Prometheus从worker获取指标时出现错误的迹象。
当检查名为“k8s_prometheus_prometheus-cluster-monitoring-0_XXX”的容器的日志时,
出现了“上下文截止超时”、“最多允许512个连接,5分钟读取超时”、“http:代理错误:上下文被取消”等各种错误。

由于在重新启动和重新创建集群的过程中可能存在垃圾,因此按照以下步骤清理了主机并重新创建,问题暂时解决。

在以下步骤中清理和重新创建主机后,问题得以解决。

广告
将在 10 秒后关闭
bannerAds