K3s 学习(三)Rancher 导入现有 K3s 集群并创建第一个容器应用

将 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 分钟左右还没有导入成功,看了下日志:

[[email protected] ~]# 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 试一下:

[[email protected] ~]# 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 服务器来保证各节点之间的访问,由于是练手我还是准备一步一步来,先手动确保各服务器之间的连接,总体分为两步你也可以参考:

  1. 修改 hosts,将域名和 IP 绑定,之前我是用外网做 Rancher 和集群的连接的,趁着这个机会也改到内网连接吧,集群中的每台服务器都执行:
echo "10.0.8.6 rancher.k3s.com" >> /etc/hosts
/etc/init.d/network restart
ping rancher.k3s.com

确认域名解析到 Rancher 面板所在服务器的内网地址之后此步完成。
2. 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