本文最后更新于 722 天前,其中的信息可能已经有所发展或是发生改变。
将 server + agent 的集群导入 Docker 安装的 Rancher 中以进行管理。
1、从面板导入现有集群
添加集群:

导入:

输入集群名词后创建:

复制命令前往集群执行:

我是在节点的主 server 节点执行的,执行完后返回的信息:
clusterrole.rbac.authorization.k8s.io/proxy-clusterrole-kubeapiserver created
clusterrolebinding.rbac.authorization.k8s.io/proxy-role-binding-kubernetes-master created
namespace/cattle-system created
serviceaccount/cattle created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding created
secret/cattle-credentials-5xxdxx7 created
clusterrole.rbac.authorization.k8s.io/cattle-admin created
deployment.apps/cattle-cluster-agent created
再回到页面上看见正在等待:

在这一步我等了 10 分钟左右还没有导入成功,看了下日志:
[root@server-01 ~]# kubectl -n cattle-system logs -l app=cattle-cluster-agent -f INFO: Environment: CATTLE_ADDRESS=10.42.2.3 CATTLE_CA_CHECKSUM= CATTLE_CLUSTER=true CATTLE_FEATURES= CATTLE_INTERNAL_ADDRESS= CATTLE_IS_RKE=false CATTLE_K8S_MANAGED=true CATTLE_NODE_NAME=cattle-cluster-agent-69b856b99c-rp874 CATTLE_SERVER=https://rancher.k3s.com INFO: Using resolv.conf: search cattle-system.svc.cluster.local svc.cluster.local cluster.local nameserver 10.43.0.10 options ndots:5 ERROR: https://rancher.k3s.com/ping is not accessible (Could not resolve host: rancher.k3s.com)
似乎是无法访问到域名,但是 curl 试一下:
[root@server-01 ~]# curl https://rancher.k3s.com/ping pong
又是能访问到的,猜测可能是 DNS 出了问题,回头看下日志有这么一段:
...nameserver 10.43.0.10...
果然是 DNS 的问题,节点不知道 rancher.k3s.com 指向了哪个 IP,于是开始着手修复。
官方关于这个错误的文档:Agent 无法连接 Rancher server
在你的主节点执行:kubectl -n cattle-system patch deployments cattle-cluster-agent --patch '{ "spec": { "template": { "spec": { "hostAliases": [ { "hostnames": [ "rancher.k3s.com" ], "ip": "10.0.8.6" } ] } } } }'
再回到 Rancher 页面应该就导入成功了:
2、创建一个容器应用
我这里选择了新建一个 Nginx 容器,也正好能测试下外网对容器内服务的访问情况。
选择命名空间:

部署服务:

填写对应的信息,这里的 Docker 镜像会默认从 hub.docker.com 下载,例如我这里填的是 nginx,那么后台会执行 docker pull nginx 这个操作。

下拉点击创建后,就可以看见这个服务因为没有容器而更新了:

稍等片刻更新完成:

3、容器的访问
点进刚刚创建的服务内,因为选择的是创建一个无状态服务,因此会随机在一个节点(服务器)上建立服务,这里看到是 server-02 这个节点:

用 server-02 节点的公网 IP 搭配映射的 30080 端口进行访问:

结束。
附加:
既然开始碰到内网 DNS 的问题,顺便说一下,一般情况下 K3s 都会在内网建立 DNS 服务器来保证各节点之间的访问,由于是练手我还是准备一步一步来,先手动确保各服务器之间的连接,总体分为两步你也可以参考:
- 修改 hosts,将域名和 IP 绑定,之前我是用外网做 Rancher 和集群的连接的,趁着这个机会也改到内网连接吧,集群中的每台服务器都执行:
echo "10.0.8.6 rancher.k3s.com" >> /etc/hosts /etc/init.d/network restart ping rancher.k3s.com
确认域名解析到 Rancher 面板所在服务器的内网地址之后此步完成。
- K3s 集群内部是通过 coreDNS 解析的关系,还需要在 coreDNS 中修改域名解析。
注意:在 server 主节点修改即可,会自动同步到其他节点。kubectl edit configmap coredns -n kube-system
在 NodeHosts 中新增解析:
... ... NodeHosts: | 10.0.8.12 server-01 10.0.8.17 server-02 # 此行解析为新增的 10.0.8.6 rancher.k3s.com kind: ConfigMap ... ....
在其他节点确认修改成功:
kubectl -n kube-system get configmap coredns -o yaml