参考: http://dockone.io/article/9384
准备工作
假定下载到的文件已经上传到服务器节点的~/packages目录下面。
将k3s-amd64二进制文件放置到/usr/local/bin目录下,并赋予可执行权限:
# cp ~/packages/k3s-amd64 /usr/local/bin/
# chmod +x /usr/local/bin/k3s-amd64
将离线镜像包放置到指定的位置:
# mkdir -p /var/lib/rancher/k3s/agent/images/
# cp ~/packages/k3s-airgap-images-arm64.tar /var/lib/rancher/k3s/agent/images/
可执行文件和离线镜像不是很好下载,有需要的可以在这里下载k3s-airgap-images-arm64.tar,k3s-arm64。
需要在k3s集群所有节点上都放置上面的离线文件。
如果没有专门的域名服务器提供主机名解析服务,那么在每一台节点的/etc/hosts文件中。写入本节点的IP与主机名映射。
至此,准备工作完成。
部署k3s Server节点
k3s server节点安装时,可以选在同时在本地安装一个k3s Agent节点用以承载工作负载,如果选择不在Server节点上安装Agent节点,则除了k3s集成的Kubernetes组件(如kubelet、API Server)之外,其余的插件、应用均不会被调度到Server节点上。
k3s支持使用多种容器运行时环境,Server默认以containerd作为运行时,不支持更改。Agent节点可以使用contained也可以使用Docker,推荐使用Docker,因为Docker人机更友好,可以方便的管理镜像和容器以及查错。所以如果选择Agent节点以Docker作为容器运行时,那么必须要提前安装并配置好Docker服务。
现在,我们可以启动k3s Server节点:
# k3s-amd64 server \
--docker \
--bind-address=10.0.0.201 \
--cluster-cidr=10.128.0.0/16 \
--service-cidr=10.129.0.0/16 \
--kube-apiserver-arg service-node-port-range=1000-65000 \
--write-kubeconfig=/root/.kube/config \
--write-kubeconfig-mode=644 \
--node-label asrole=worker
参数说明:
–docker:k3s server组件以containerd作为容器运行时。可以顺便在k3s server节点上启动一个Agent节点,Agent节点可以使用Docker作为容器运行时,这样k3s server节点也可以当做工作节点用。当然也可以不在server节点上启动Agent节点(添加参数–disable-agent即可)。
–bind-address:k3s监听的IP地址,非必选,默认是localhost。
–cluster-cidr:与Kubernetes一样,也就是Pod所在网络平面,非必选,默认是10.42.0.0/16。
–service-cidr:与Kubernetes一样,服务所在的网络平面,非必选,默认是10.43.0.0/16。
–kube-apiserver-arg:额外的API Server配置参数,具体可以参考Kuberntes官方网站了解支持的配置选项,非必选。
–write-kubeconfig:安装时顺便写一个Kubeconfig文件,方便使用kubectl工具直接访问。如果不加此参数,则默认的配置文件路径为/etc/rancher/k3s/k3s.yaml,默认只有root用户能读。
–write-kubeconfig-mode:与–write-kubeconfig一起使用,指定Kubeconfig文件的权限。
–node-label:顺便给节点打上一个asrole=worker的label,非必选。
k3s支持众多的安装参数和选型,详细请参考官方文档:https://rancher.com/docs/k3s/l … tion/。
完成之后,检查集群状态:
$ k3s-arm64 kubectl get nodes
WARN[2020-05-14T09:29:22.540598968+08:00] Unable to read /etc/rancher/k3s/k3s.yaml, please start server with --write-kubeconfig-mode to modify kube config permissions
error: error loading config file "/etc/rancher/k3s/k3s.yaml": open /etc/rancher/k3s/k3s.yaml: permission denied
提示权限不够,给 /etc/rancher/k3s/k3s.yaml添加可读权限:
$ sudo chmod a+r /etc/rancher/k3s/k3s.yaml
然后检查集群状态:
#$ k3s-arm64 kubectl get nodes
NAME STATUS ROLES AGE VERSION
face-desktop Ready master 2d19h v1.17.5+k3s1
可见节点已经呈就绪状态。
检查Pod的状态:
$ k3s-arm64 kubectl get po --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system helm-install-traefik-jtlq8 0/1 Completed 0 2d19h
default dummy-web-test-7c8f8847cb-jxg4l 1/1 Running 3 2d19h
default dummy-web-test-7c8f8847cb-zxtqj 1/1 Running 3 2d19h
kube-system metrics-server-6d684c7b5-7mbhb 1/1 Running 3 2d19h
kube-system svclb-traefik-kh7p2 2/2 Running 6 2d19h
kube-system traefik-7b8b884c8-lp8ck 1/1 Running 3 2d19h
kube-system coredns-6c6bb68b64-htrh9 1/1 Running 3 2d19h
kube-system local-path-provisioner-58fb86bdfd-2rlzg 1/1 Running 4 2d19h
可以看到,系统命名空间下所有的应用都已经启动了,server节点已经就绪,接下来可以部署k3s agent工作节点了。
在上面的命令中,我们均是以k3s kubectl开头的命令,是否可以直接使用kubectl客户端呢?当然可以,只需要下载一个对应版本的kubectl二进制文件放到系统的Path中,赋予可执行权限即可,使用起来与使用Kubernetes集群一模一样!
由于上面的命令是在前台执行的,一旦断开SSH链接或者终止shell进程,k3s server就停止运行了,因此我们给他配置一个systemd服务,用以像管理系统服务一样管理k3s server节点。
创建文件/lib/systemd/system/k3s-server.service,内容为:
[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
After=network-online.target
[Service]
Type=notify
EnvironmentFile=/etc/systemd/system/k3s.service.env
ExecStart=/usr/local/bin/k3s-arm64 server --docker
KillMode=process
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
然后设置服务开机自启:
# systemctl enable k3s-server
CTRL+C结束在前台执行的命令,我们看到服务文件中引用了一个环境变量文件/etc/systemd/system/k3s.service.env,这个文件并不存在需要先创建一个然后才能启动服务:
# touch /etc/systemd/system/k3s.service.env
# systemctl start k3s-server
查看服务状态:
$ systemctl status k3s-server
● k3s-server.service - Lightweight Kubernetes
Loaded: loaded (/lib/systemd/system/k3s-server.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-05-14 09:27:15 CST; 31min ago
Docs: https://k3s.io
Main PID: 6827 (k3s-server)
Tasks: 0
CGroup: /system.slice/k3s-server.service
└─6827 /usr/local/bin/k3s-arm64 server --docker
5月 14 09:48:47 face-desktop k3s-arm64[6827]: I0514 09:48:47.461392 6827 controller.go:107] OpenAPI Aggregatio
5月 14 09:49:47 face-desktop k3s-arm64[6827]: I0514 09:49:47.493009 6827 controller.go:107] OpenAPI Aggregatio
5月 14 09:50:47 face-desktop k3s-arm64[6827]: I0514 09:50:47.511674 6827 controller.go:107] OpenAPI Aggregatio
5月 14 09:51:47 face-desktop k3s-arm64[6827]: I0514 09:51:47.543578 6827 controller.go:107] OpenAPI Aggregatio
5月 14 09:52:47 face-desktop k3s-arm64[6827]: I0514 09:52:47.566575 6827 controller.go:107] OpenAPI Aggregatio
5月 14 09:53:47 face-desktop k3s-arm64[6827]: I0514 09:53:47.589274 6827 controller.go:107] OpenAPI Aggregatio
5月 14 09:54:47 face-desktop k3s-arm64[6827]: I0514 09:54:47.623797 6827 controller.go:107] OpenAPI Aggregatio
5月 14 09:55:47 face-desktop k3s-arm64[6827]: I0514 09:55:47.650076 6827 controller.go:107] OpenAPI Aggregatio
5月 14 09:56:47 face-desktop k3s-arm64[6827]: I0514 09:56:47.668509 6827 controller.go:107] OpenAPI Aggregatio
5月 14 09:57:47 face-desktop k3s-arm64[6827]: I0514 09:57:47.698423 6827 controller.go:107] OpenAPI Aggregatio
lines 1-19/19 (END)
提醒:如果出现错误,可以通过journalctl -u k3s-server查看日志。
部署k3s agent节点
在server节点部署完成之后,在server节点的/var/lib/rancher/k3s/server/目录下面生成一个node-token文件,该文件存储了k3s agent节点加入集群时所需的token。
在Server节点上,获取token:
# cat node-token
K106c55585781217aa70d30fc30bad4ad5db27863a7849a5380107b4e0210866f51::server:7cc3052b9957cb3d34e3c4f5753b7d37
在作为k3s agent节点的系统中,以root用户执行下面的命令启动k3s agent节点,但是,因为我们采用了Docker作为Agent节点的容器运行时,所以我们先将离线镜像导入到Docker中:
# docker load -i k3s-airgap-images-arm64.tar
225df95e717c: Loading layer [==================================================>] 336.4kB/336.4kB
8b229224d9be: Loading layer [==================================================>] 42.13MB/42.13MB
Loaded image: rancher/coredns-coredns:1.6.3
dadbfa900fbf: Loading layer [==================================================>] 20.73MB/20.73MB
53e5ec09abb1: Loading layer [==================================================>] 104MB/104MB
5a274a584f7e: Loading layer [==================================================>] 5.632kB/5.632kB
Loaded image: rancher/klipper-helm:v0.2.3
Loaded image: rancher/klipper-lb:v0.1.2
d357e9c10ce8: Loading layer [==================================================>] 236kB/236kB
5b52354aa0b8: Loading layer [==================================================>] 2.008MB/2.008MB
27ca7adf84a7: Loading layer [==================================================>] 81.39MB/81.39MB
Loaded image: rancher/library-traefik:1.7.19
5e0d81111355: Loading layer [==================================================>] 5.59MB/5.59MB
290c5da5dffb: Loading layer [==================================================>] 29.39MB/29.39MB
Loaded image: rancher/local-path-provisioner:v0.0.11
932da5156413: Loading layer [==================================================>] 3.062MB/3.062MB
e3b5c4b90500: Loading layer [==================================================>] 36.49MB/36.49MB
Loaded image: rancher/metrics-server:v0.3.6
Loaded image: rancher/pause:3.1
然后在作为agent的Tx2上执行下面的命令安装k3s-agent节点。
# k3s-arm64 agent \
--docker \
--server https://192.168.111.177:6443 \
--token K106c55585781217aa70d30fc30bad4ad5db27863a7849a5380107b4e0210866f51::server:7cc3052b9957cb3d34e3c4f5753b7d37 \
--node-label asrole=worker
参数说明:
–docker:k3s agent以docker作为容器运行时。
–server:k3s server节点监听的url,必选参数。
–token:k3s server安装时生成的token,必选参数。
–node-ip:k3s agent节点的IP地址,非必选参数。
–node-label:同样给k3s agent节点打上一个asrole=worker的标签,非必选参数。
稍等一会儿,在server节点上查看agent节点是否已经加入到了集群中:
# k3s-arm64 kubectl get node
NAME STATUS ROLES AGE VERSION
face-desktop Ready master 3d v1.17.5+k3s1
ubuntu-tx2 Ready <none> 11m v1.17.5+k3s1
可以看到节点已经成功加入到了集群中。
如果想Agent节点配置成systemd可以管理的系统服务,可以参照配置server节点作为系统服务的过程。
rancher导入k3s
登陆rancher页面
点击导入
,输入集群名称然后点击创建
复制第三条命令,在server的终端中运行即可将节点加入rancher。
如果没有在系统中安装kubectl,则要在命令的kubectl前加上k3s-arm64
大约过了10s就能在rancher中看到导入的集群信息了。