K3S是SUSE rancher出的一个k8s轻量版的项目,项目地址: https://github.com/rancher/k3s 。k3s比k8s少了五,代表的意思是去掉了一些k8s臃肿的可能不太用得着的组件,精简的后的k3s二进制文件只有40M左右。如果进行离线安装的话,加上离线镜像airgap一共也不到200M,安装所需的最小内存500M就够了,可以说是一个瑞士军刀级的应用了,对于边缘网络、IOT应用比较有优势,对标华为的kubeEdge项目。k3s精简的内容如下:

  • 过时的功能和非默认功能
  • Alpha 功能
  • 内置的云提供商插件
  • 内置的存储驱动
  • Docker
    k3s原理图
    k3s原理图

一、安装使用

1、安装环境准备

需要先关闭下防火墙和selinxu,步骤这里就省略了,另外需要加载相关内核模块,在/etc/modules-load.d/ 目录下新建k3s.conf文件,内容如下:

1ip_conntrack
2br_netfilter

重启OS后生效。

2、在线安装

在线安装比较简单,只需要执行一指令,即可完成一个单节点k3s集群的安装:

1curl -sfL https://get.k3s.io | sh -

如果有新的node节点需要加入集群,执行如下指令即可:

1curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -

上面安装过程中,无论是master节点还是Node节点,后面可以带的参数,可以参看官方install-options 页

3、离线安装

当没有外网访问权限时,可以通过离线方式进行安装,通过github页面需要下载三个安装文件:k3s、k3s-airgap-images-amd64.tar.gz,以及安装脚本install.sh。创建镜像目录并把镜像复制到 /var/lib/rancher/k3s/agent/images/目录:

1mkdir -p /var/lib/rancher/k3s/agent/images/
2cp  k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/
3chmod +x k3s
4cp k3s /usr/local/bin/
5INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh

如果有多块网卡,此时也可以通过指定,给出用于集群管理的网卡名称。也可以给出可以使用的端口范围。例如:

1k3s server  --flannel-iface enp0s3  --kube-apiserver-arg service-node-port-range=1-65535

默认状态下,K8S只能允许node port的端口绑定到 30000-32767 这个范围, 但是,对于简单的实验,有时需要简单的绑定到 80、443 等端口,这时就可以通过设置 apiserver 的参数来实现自定义绑定范围。 K3S_TOKEN来自于Master节点安装时,生成的token文件:/var/lib/rancher/k3s/server/node-token,所以node节点的安装为:

1[root@node1 ~]# cp k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
2[root@node1 ~]# INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://192.168.1.102:6443 K3S_TOKEN=K10bc1b860845c709d9ca29a9997bb28abc9ae4baf51ae7a48e24cfa669f062f6fd::server:6985a3b11e7b4c38479ccd06ad9cf669 sh install.sh

如果需要指定网卡和相关参数,可以使用如下指令安装:

1k3s agent --flannel-iface enp0s3  --server https://centos1:6443 --token mytoken

4、使用

安装完成后,可以使用如下命令查看k3s信息:

1获取机器 (node) 信息: k3s kubectl get nodes
2获取pods信息: k3s kubectl get pods –all-namespaces

在/usr/local/bin/ 目录会发现,kubelet和crictl命令都是k3s的软链接。由于默认k3s没有使用docker,而是使用的containerd,而对应的对容器管理使用的是crictl命令,如果不习惯,也可以使用k3s建一个docker命令的软链接,这里的大部分指令和docker是兼容的。具体如下:

二、发布一个Nginx应用测试

新建如下两个Yaml文件,内容如下:

 1[root@kube-master k3sservice]# cat nginx-deploy.yaml
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: nginx-deploy
 6spec:
 7  replicas: 1
 8  selector:
 9    matchLabels:
10      app: nginx-cluster
11  template:
12    metadata:
13      labels:
14        app: nginx-cluster
15    spec:
16      containers:
17      - name: nginx-cluster
18        image: nginx
19        imagePullPolicy: Always
20        ports:
21        - containerPort: 80
22        resources:
23          requests:
24            cpu: 0.1
25            memory: 500Mi
26          limits:
27            cpu: 0.3
28            memory: 1024Mi
29[root@kube-master k3sservice]#
30[root@kube-master k3sservice]# cat nginx-service.yaml
31apiVersion: v1
32kind: Service
33metadata:
34  name: nginx-service
35  labels:
36    app: nginx-service
37spec:
38  type: NodePort
39  selector:
40    app: nginx-cluster
41  ports:
42  - port: 8000
43    targetPort: 80
44    nodePort: 30246

使用使用kubectl create -f指令应用两个文件,使用kubectl get deployment和kubectl get svc查看状态。

 1[root@kube-master k3sservice]# kubectl get nodes
 2NAME          STATUS   ROLES                  AGE     VERSION
 3kube-master   Ready    control-plane,master   5d13h   v1.21.0+k3s1
 4kube-node1    Ready                     5d13h   v1.21.0+k3s1
 5[root@kube-master k3sservice]# kubectl get svc
 6NAME            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
 7kubernetes      ClusterIP   10.43.0.1             443/TCP          5d13h
 8nginx-service   NodePort    10.43.98.77           8000:30246/TCP   5d12h
 9[root@kube-master k3sservice]#
10[root@kube-master k3sservice]# ping kube-node1
11PING kube-node1 (192.168.159.133) 56(84) bytes of data.
1264 bytes from kube-node1 (192.168.159.133): icmp_seq=1 ttl=64 time=0.483 ms

这时候使用 http://kube-master:30246 或者 http://kube-node1:30246 都可以正常查看到nginx的默认页面。