在AWS EC2上,通过Rancher构建Kubernetes集群
这是在AWS EC2上使用Rancher(v2.2.3)搭建Kubernetes集群的笔记。
[1] 首先,什么是Rancher?
・可以集中进行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实例,共计两台实例。
基本上,所有的组件都是在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账户,并且如果设置了密码,就可以登录。
如果忘记管理员密码
如果忘记了管理员密码,可以在rencher服务器的主机上执行以下操作以重置密码(将会重新生成一个随机密码)。
docker exec -ti <rancher server container_id> reset-password
创建一个k8s集群
登录后的界面上的「添加集群」菜单
在Add Cluster中选择“Custom”。
由于有云服务选项可供选择,因此可以从零开始利用托管服务来创建集群,包括创建新节点等构建工作。
但是,如果是从已经建立了主机(如EC2)的状态开始的,本次情况为”Custom”。
在使用本地服务器进行构建时可能也是相同的情况。
然后输入集群名称,并选择k8s版本。
接着选择覆盖网络工具。简而言之,它是用于在k8s节点之间的容器间通信中构建虚拟网络的功能。
有很多选择,但选择Flannel。
最后,选择Custom Provider为None。
最后,生成在构建集群的主机服务器上运行的命令。
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
一旦State变为Active,就可以了。
Kubernetes操作验证
集群资源监控功能也可以在标准配置中查看。
从仪表板的「启动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,并查看详细的监控信息。
Grafana非常方便,因为它可以查看每个Pod的资源消耗量。
记录
可以设置用于收集k8s集群每个节点日志的一整套Rancher支持的日志工具。
添加工作节点
如何向之前的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 无法获得指标数据。
Prometheus从worker获取指标时出现错误的迹象。
当检查名为“k8s_prometheus_prometheus-cluster-monitoring-0_XXX”的容器的日志时,
出现了“上下文截止超时”、“最多允许512个连接,5分钟读取超时”、“http:代理错误:上下文被取消”等各种错误。
由于在重新启动和重新创建集群的过程中可能存在垃圾,因此按照以下步骤清理了主机并重新创建,问题暂时解决。
在以下步骤中清理和重新创建主机后,问题得以解决。