K3S是SUSE rancher出的一个k8s轻量版的项目,项目地址: https://github.com/rancher/k3s 。k3s比k8s少了五,代表的意思是去掉了一些k8s臃肿的可能不太用得着的组件,精简的后的k3s二进制文件只有40M左右。如果进行离线安装的话,加上离线镜像airgap一共也不到200M,安装所需的最小内存500M就够了,可以说是一个瑞士军刀级的应用了,对于边缘网络、IOT应用比较有优势,对标华为的kubeEdge项目。k3s精简的内容如下:
过时的功能和非默认功能 Alpha 功能 内置的云提供商插件 内置的存储驱动 Docker
一、安装使用
1、安装环境准备
需要先关闭下防火墙和selinxu,步骤这里就省略了,另外需要加载相关内核模块,在/etc/modules-load.d/ 目录下新建k3s.conf文件,内容如下:
ip_conntrack br_netfilter
重启OS后生效。
2、在线安装
在线安装比较简单,只需要执行一指令,即可完成一个单节点k3s集群的安装:
curl -sfL https://get.k3s.io | sh -
如果有新的node节点需要加入集群,执行如下指令即可:
curl -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/目录:
mkdir -p /var/lib/rancher/k3s/agent/images/ cp k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/ chmod +x k3s cp k3s /usr/local/bin/ INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
如果有多块网卡,此时也可以通过指定,给出用于集群管理的网卡名称。也可以给出可以使用的端口范围。例如:
k3s 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节点的安装为:
[root@node1 ~]# cp k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/ [root@node1 ~]# INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://192.168.1.102:6443 K3S_TOKEN=K10bc1b860845c709d9ca29a9997bb28abc9ae4baf51ae7a48e24cfa669f062f6fd::server:6985a3b11e7b4c38479ccd06ad9cf669 sh install.sh
如果需要指定网卡和相关参数,可以使用如下指令安装:
k3s agent --flannel-iface enp0s3 --server https://centos1:6443 --token mytoken
4、使用
安装完成后,可以使用如下命令查看k3s信息:
获取机器 (node) 信息: k3s kubectl get nodes 获取pods信息: k3s kubectl get pods –all-namespaces
在/usr/local/bin/ 目录会发现,kubelet和crictl命令都是k3s的软链接。由于默认k3s没有使用docker,而是使用的containerd,而对应的对容器管理使用的是crictl命令,如果不习惯,也可以使用k3s建一个docker命令的软链接,这里的大部分指令和docker是兼容的。具体如下:
二、发布一个Nginx应用测试
新建如下两个Yaml文件,内容如下:
[root@kube-master k3sservice]# cat nginx-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploy spec: replicas: 1 selector: matchLabels: app: nginx-cluster template: metadata: labels: app: nginx-cluster spec: containers: - name: nginx-cluster image: nginx imagePullPolicy: Always ports: - containerPort: 80 resources: requests: cpu: 0.1 memory: 500Mi limits: cpu: 0.3 memory: 1024Mi [root@kube-master k3sservice]# [root@kube-master k3sservice]# cat nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service labels: app: nginx-service spec: type: NodePort selector: app: nginx-cluster ports: - port: 8000 targetPort: 80 nodePort: 30246
使用使用kubectl create -f指令应用两个文件,使用kubectl get deployment和kubectl get svc查看状态。
[root@kube-master k3sservice]# kubectl get nodes NAME STATUS ROLES AGE VERSION kube-master Ready control-plane,master 5d13h v1.21.0+k3s1 kube-node1 Ready <none> 5d13h v1.21.0+k3s1 [root@kube-master k3sservice]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 5d13h nginx-service NodePort 10.43.98.77 <none> 8000:30246/TCP 5d12h [root@kube-master k3sservice]# [root@kube-master k3sservice]# ping kube-node1 PING kube-node1 (192.168.159.133) 56(84) bytes of data. 64 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的默认页面。