QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

轻量级 Kubernetes k3s 初探

  • 2020-04-12
  • 本文字数:6428 字

    阅读完需:约 21 分钟

轻量级Kubernetes k3s初探

1 k3s 简介–5 less than K8s

k3s[1] 是 rancher®开源的一个 Kubernetes 发行版,从名字上就可以看出 k3s 相对 k8s 做了很多裁剪和优化,二进制程序不足 50MB,占用资源更少,只需要 512MB 内存即可运行。


而之所以称为 k3s 是因为相对 k8s 裁剪了如下 5 个部分:


  • 过时的功能和非默认功能

  • Alpha 功能

  • 内置的云提供商插件

  • 内置的存储驱动

  • Docker


官方称 k3s 是:


★ k3s 是史上最轻量级 Kubernetes.”


相对 k8s 最主要的优化如下:


  • 使用内嵌轻量级数据库 SQLite 作为默认数据存储替代 etcd,当然 etcd 仍然是支持的。

  • 内置了 local storage provider、service load balancer、helm controller、Traefik ingress controller,开箱即用。

  • 所有 Kubernetes 控制平面组件如 api-server、scheduler 等封装成为一个精简二进制程序,控制平面只需要一个进程即可运行。

  • 删除内置插件(比如 cloudprovider 插件和存储插件)。

  • 减少外部依赖,操作系统只需要安装较新的内核以及支持 cgroup 即可,k3s 安装包已经包含了 containerd、Flannel、CoreDNS,非常方便地一键式安装,不需要额外安装 Docker、Flannel 等组件。


k3s 的四大使用场景为:


  • Edge

  • IoT

  • CI

  • ARM


当然如果想学习 k8s,而又不想折腾 k8s 的繁琐安装部署,完全可以使用 k3s 代替 k8s,k3s 包含了 k8s 的所有基础功能,而 k8s 附加功能其实大多数情况也用不到。

2 一键式安装 k3s

k3s 安装确实非常简单,只需要一个命令即可完成:


curl -sfL https://get.k3s.io | sh -
复制代码


通过如上只执行了一个命令即部署了一套 all in one k3s 单节点环境,相对 k8s 无需额外安装如下组件:


  • kubelet

  • kube-proxy

  • Docker

  • etcd

  • ingress,如 ngnix


当然可以使用 k3s agent 添加更多的 worker node,只需要添加K3S_URLK3S_TOKEN参数即可,其中K3S_URL为 api-server URL,而k3S_TOKEN为 node 注册 token,保存在 master 节点的/var/lib/rancher/k3s/server/node-token路径。

3 和使用 k8s 一样使用 k3s

3.1 和使用 k8s 一样使用 k3s 命令工具

k3s 内置了一个 kubectl 命令行工具,通过k3s kubectl调用,为了与 k8s 的 kubectl 命令一致,可以设置 alias 别名:



# 该步骤可以省略,在/usr/local/bin中已经添加了一个kubectl软链接到k3salias kubectl='k3s kubectl`
# 配置kubectl命令补全source <(kubectl completion bash)
复制代码


配置完后,我们就可以通过kubectl查看 kube-system 运行的 pod 列表如下:



# kubectl get pod -n kube-systemNAME READY STATUS RESTARTS AGEmetrics-server-6d684c7b5-4qppl 1/1 Running 0 70mlocal-path-provisioner-58fb86bdfd-8l4hn 1/1 Running 0 70mhelm-install-traefik-pltbs 0/1 Completed 0 70mcoredns-6c6bb68b64-b9qcl 1/1 Running 0 70msvclb-traefik-2ttg2 2/2 Running 0 70mtraefik-7b8b884c8-xkm77 1/1 Running 0 70m
复制代码


我们发现并没有运行 apiserver、controller-manager、scheduler、kube-proxy 以及 flannel 等组件,因为这些都内嵌到了 k3s 进程。另外 k3s 已经给我们默认部署运行了 traefik ingress、metrics-server 等,不需要再额外安装了。


k3s 默认没有使用 Docker 作为容器运行环境,而是使用了内置的 contained,可以使用crictl子命令与 CRI 交互。


当然如果习惯使用 docker 命令行可以设置如下别名:


alias docker='k3s crictl'
# 配置docker命令补全source <(docker completion)complete -F _cli_bash_autocomplete docker
复制代码


通过docker ps查看运行的容器:



# docker psCONTAINER IMAGE CREATED STATE NAME ATTEMPT POD IDdeedde06105b5 8fafd8af70e9a 6 minutes ago Running kubernetes-bootcamp-v1 0 b59bdf9ed7b2a5464873f8064a 8fafd8af70e9a 6 minutes ago Running kubernetes-bootcamp-v1 0 51d2058a38262d8ae5df73ee95 aa764f7db3051 About an hour ago Running traefik 0 a7990965f71c31ecdf0ce98ebf 897ce3c5fc8ff About an hour ago Running lb-port-443 0 4057796b8eddd021a4d7bcc391 897ce3c5fc8ff About an hour ago Running lb-port-80 0 4057796b8eddd089ee47dd3de0 c4d3d16fe508b About an hour ago Running coredns 0 5e54975c3ae1e3c97b40b9beed 9d12f9848b99f About an hour ago Running local-path-provisioner 0 5a4e666f9c8f7ac020ab1621c0 9dd718864ce61 About an hour ago Running metrics-server 0 f69f6812b7a66
复制代码


当然我们只是使用crictl模拟了docker命令,相对真正的docker我们发现多了ATTEMPT以及POD ID,这是 CRI 所特有的。

3.2 和使用 k8s 一样创建 k3s 资源

我们使用 k8s 最喜欢拿来入门的bootcamp作为例子,Deployment 声明如下:


apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: kubernetes-bootcamp-v1  name: kubernetes-bootcamp-v1spec:  replicas: 2  selector:    matchLabels:      app: kubernetes-bootcamp-v1  template:    metadata:      labels:        app: kubernetes-bootcamp-v1    spec:      containers:      - image: jocatalin/kubernetes-bootcamp:v1        name: kubernetes-bootcamp-v1
复制代码


使用kubectl apply创建 Deployment 资源:


# kubectl  apply -f kubernetes-bootcamp-v1.yamldeployment.apps/kubernetes-bootcamp-v1 created# kubectl  get podNAME                                     READY   STATUS        RESTARTS   AGEkubernetes-bootcamp-v1-c5ccf9784-m79vt   1/1     Running       0          3skubernetes-bootcamp-v1-c5ccf9784-5blct   1/1     Running       0          3s
复制代码


创建 Service:


# kubectl apply -f -apiVersion: v1kind: Servicemetadata:  labels:    app: kubernetes-bootcamp-v1  name: kubernetes-bootcamp-v1spec:  ports:  - port: 8080    protocol: TCP    targetPort: 8080  selector:    app: kubernetes-bootcamp-v1  type: ClusterIP# kubectl  get serviceNAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGEkubernetes               ClusterIP   10.43.0.1      <none>        443/TCP    29mkubernetes-bootcamp-v1   ClusterIP   10.43.132.97   <none>        8080/TCP   8m14s# curl 10.43.132.97:8080Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-v1-c5ccf9784-5blct | v=1
复制代码


我们不需要再单独安装其他 ingress controller,因为 k3s 已经内置了 Traefik,直接创建 Ingress:


# kubectl apply -f -apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: "int32bit-test-ingress"  labels:    app: int32bit-test-ingressspec:  rules:    - host: test.int32bit.me      http:        paths:        - path: /v1          backend:            serviceName: "kubernetes-bootcamp-v1"            servicePort: 8080# kubectl  get ingress int32bit-test-ingressNAME                    HOSTS              ADDRESS           PORTS   AGEint32bit-test-ingress   test.int32bit.me   192.168.193.197   80      5m54s
复制代码


其中192.168.193.197为 master 节点的 IP,由于我们没有 DNS 解析,因此可以通过配置/etc/hosts文件进行静态配置:


192.168.193.197 test.int32bit.me
复制代码


此时我们就可以直接通过 ingress 地址 test.int32bit.me 访问我们的服务了,ingress 直接通过ClusterIP转发,不需要NodePort


# curl http://test.int32bit.me/v1Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-v1-c5ccf9784-5blct | v=1
复制代码


我们发现 k3s 和 k8s 的 Resource 声明完全兼容,没有任何区别。

4 k3s 网络

4.1 CNI 网络

k3s 内置了 Flannel 网络插件,默认使用 VXLAN 后端,默认 IP 段为10.42.0.0/16


# ip -o -d link show flannel.114: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8951 \    qdisc noqueue state UNKNOWN mode DEFAULT group default \    link/ether 46:61:15:1f:1e:3f brd ff:ff:ff:ff:ff:ff promiscuity 0 \    vxlan id 1 local 192.168.193.197 dev ens5 \    srcport 0 0 dstport 8472 nolearning ttl inherit ageing 300 \    udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 \    numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
复制代码


内置的 Flannel 除了 VXLAN 还支持 ipsec、host-gw 以及 wireguard。


当然除了默认的 Flannel,k3s 还支持其他 CNI,如 Canal、Calico 等。

4.2 其他网络组件

k3s 除了内置 Flannel 网络插件以外,还内置了 CoreDNS、Traefik Ingress Controller、Service Load Balancer,如果不使用默认的组件,用户也可以自己部署其他组件,比如使用 MetalLB 替代内置的 load balancer。

5 k3s 存储

5.1 内置本地存储插件

k3s 删除了 k8s 内置 cloud provider 以及 storage 插件(当然这不会影响使用通过手动安装的外部插件),内置了 Local Path Provider。


比如我们创建一个 2G 的 PVC:


# kubectl apply -f -apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: local-path-pvc  namespace: defaultspec:  accessModes:    - ReadWriteOnce  storageClassName: local-path  resources:    requests:      storage: 2Gi
复制代码


创建一个 Pod 使用新创建的 PVC:


# kubectl apply -f -apiVersion: v1kind: Podmetadata:  name: volume-testspec:  containers:  - name: volume-test    image: jocatalin/kubernetes-bootcamp:v1    volumeMounts:    - name: volv      mountPath: /data  volumes:  - name: volv    persistentVolumeClaim:      claimName: local-path-pvc
复制代码


查看创建的 Pod 以及 PVC:


# kubectl get pod volume-testNAME          READY   STATUS    RESTARTS   AGEvolume-test   1/1     Running   0          116s# kubectl get pvcNAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGElocal-path-pvc   Bound    pvc-6bd15859-540f-4ade-94dc-821e29cacdba   2Gi        RWO            local-path     4m8s# kubectl get pvNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   REASON   AGEpvc-6bd15859-540f-4ade-94dc-821e29cacdba   2Gi        RWO            Delete           Bound    default/local-path-pvc   local-path              106s
复制代码


查看 PV:


# kubectl describe  pvName:              pvc-6bd15859-540f-4ade-94dc-821e29cacdbaLabels:            <none>Annotations:       pv.kubernetes.io/provisioned-by: rancher.io/local-pathFinalizers:        [kubernetes.io/pv-protection]StorageClass:      local-pathStatus:            BoundClaim:             default/local-path-pvcReclaim Policy:    DeleteAccess Modes:      RWOVolumeMode:        FilesystemCapacity:          2GiNode Affinity:  Required Terms:    Term 0:        kubernetes.io/hostname in [ip-192-168-193-197]Message:Source:    Type:          HostPath (bare host directory volume)    Path:          /var/lib/rancher/k3s/storage/pvc-6bd15859-540f-4ade-94dc-821e29cacdba    HostPathType:  DirectoryOrCreateEvents:            <none>
复制代码


可见其实就类似 k8s 的 HostPath 存储卷类型。

5.2 使用外部存储 Longhorn

前面提到的内置 local path 存储,只能单机使用,不支持跨主机使用,也不支持存储的高可用。


可以通过使用外部的存储插件解决 k3s 存储问题,比如 Longhorn[2]


Longhorn 是专门针对 Kubernetes 设计开发的云原生分布式块存储系统,可以直接使用kubectl apply或者helm安装:


kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml
复制代码


为了能够访问 Longhorn Dashboard,我创建如下 ingress:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: "longhorn-ui"  namespace: longhorn-system  labels:    app: longhorn-uispec:  rules:    - host: longhorn-frontend.int32bit.me      http:        paths:        - path: /          backend:            serviceName: "longhorn-frontend"            servicePort: 80    - host: longhorn-backend.int32bit.me      http:        paths:        - path: /          backend:            serviceName: "longhorn-backend"            servicePort: 9500
复制代码


通过http://longhorn-frontend.int32bit.me/dashboard即可访问 Dashboard:



longhorn


安装 Longhorn storageclass:


kubectl create -f \https://raw.githubusercontent.com/longhorn/longhorn/master/examples/storageclass.yaml
复制代码


创建 PVC:


# kubectl apply -f -apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: longhorn-volv-pvcspec:  accessModes:    - ReadWriteOnce  storageClassName: longhorn  resources:    requests:      storage: 2Gi
复制代码


创建 Pod 使用新创建的 PVC:


# kubectl apply -f -apiVersion: v1kind: Podmetadata:  name: test-volume-longhornspec:  containers:  - name: test-volume-longhorn    image: jocatalin/kubernetes-bootcamp:v1    volumeMounts:    - name: volv      mountPath: /data  volumes:  - name: volv    persistentVolumeClaim:      claimName: longhorn-volv-pvc
复制代码


通过 Longhorn Dashboard 查看 volume:



longhorn-pvc


可见 PV 已经挂载到 Pod test-volume-longhorn中。

6 加上 k9s,全了

最后,附上 k9s,这样 k3s、k8s、k9s 全了 : )


https://github.com/derailed/k9s/releases/download/v0.19.0/k9s_Linux_x86_64.tar.gztar xvzf k9s_Linux_x86_64.tar.gzmv k9s /usr/local/bin/kubectl-k9s
复制代码



k9s

写在最后

k3s 在去年的 2 月就已经推出并开源,现在不算是新东西,周末正好没啥事于是安装体验下,主要还是想使用下 mdnice[3] 体验下公众号文章排版效果。


使用后一次后发现,mdnice 真的是特别适合技术类公众号文章编辑:


  • Markdown 语法,支持在线编辑,写完后即排版成功,复制即可粘贴到微信公众号;

  • 支持零配置图床、脚注、代码、公式;

  • 内置 18 种风格主题,支持自定义 CSS 样式;

  • 内容在浏览器中实时保存;

  • 支持 chrome 插件,可直接在微信公众平台上编辑。


尤其是代码块,代码高亮和滚屏是刚需。目前很多公众号编辑器支持得都不是很好,比如秀米就对代码块的支持效果非常不好。而 midnice 直接使用 Markdown 语法嵌入代码块,并且支持 Atom、Monokai、github、vs2015、xcode 等多种代码风格。

参考资料

[1] k3s: https://rancher.com/docs/k3s/latest/en/


[2] Longhorn: https://github.com/longhorn/longhorn


[3] mdnice: https://docs.mdnice.com/#/


本文转载自公众号 int32bit(ID:int32bit)。


原文链接


https://mp.weixin.qq.com/s/gtw6k-jmtatlk8LSkMzGiA


2020-04-12 14:1314594

评论

发布
暂无评论
发现更多内容

GitHub上开源24小时获星96K的,从零到实战Java架构师成长手册

Java你猿哥

架构 架构师 高可用架构 高性能架构 高可扩展

一次错误的解码处理导致Netty堆外内存泄漏问题的分析

Java你猿哥

Java Netty ssm RSS 逻辑

MatrixOne 助力开启分布式计算格局新征程

MatrixOrigin

分布式数据库 HTAP MatrixOrigin MatrixOne 矩阵起源

大语言模型技术原理

NineData

AIGC ChatGPT AI大语言模型 大语言模型 技术原理

Spring Boot实现第一次启动时自动初始化数据库

做梦都在改BUG

Java spring Spring Boot

创建矢量图形:Patternodes 3 免激活版

真大的脸盆

Mac Mac 软件 矢量图形创作 创建矢量图形

刚入职的后端开发问我SpringBoot如何跨域配置?我表示

Java你猿哥

Java Spring Boot ssm 跨域

从7天到1天,Kyligence 和亚马逊云科技助力欣和提高数据应用价值

Kyligence

数字化转型 指标平台

量子程序设计基础 | 从经典计算到量子计算

TiAmo

量子计算 经典计算

4 种 MySQL 同步 ES 方案,yyds!

Java你猿哥

Java MySQL sql elasticsearch Binlog

阿里架构组分布式架构技术使用心得:全在这一份文档里面了

Java你猿哥

架构 分布式 ssm 分布式架构 安全架构

Health Kit文档大变样,一起尝鲜!

HarmonyOS SDK

HMS Core

华为云UniXcoder-VESO-v1问鼎CodeXGLUE榜单第一名

华为云PaaS服务小智

算法 代码 华为云 代码语义

使用 Node.js、Socket.IO 和 GPT-4 构建 AI 聊天机器人

devpoint

node.js websocket GPT-4

深度理解:Redis Hash(散列表)实现原理

Java你猿哥

redis 开源 ssm hash 散列表

解锁人机交互新技术 华为开发者联创日·全栈AI黑客松大赛等你来

说山水

如何科学地利用MTTR优化软件交付流程?

SEAL安全

DevOps MTTR 企业号 5 月 PK 榜

如何将千亿文件放进一个文件系统,EuroSys'23 CFS 论文背后的故事

百度Geek说

数据库 云计算 百度 企业号 5 月 PK 榜

引领下一代云计算技术的变革:无服务器架构

xfgg

云计算 severless

GitHub发布即百万!字节内网超实用 java性能优化手册,star超十万

Java你猿哥

Java ssm jvm调优 Java性能优化

5月书讯 | 《这就是ChatGPT》来了!

图灵教育

数学 书单 GPT

5月书讯 | 《这就是ChatGPT》来了!

图灵社区

数学 书单 书单推荐 GPT

kafka集群是如何选择leader,你知道吗?

JAVA旭阳

kafka

一块显存为 12GB 的 GPU 卡能够在CST 时域求解器仿真的最大网格数是多少?

思茂信息

cst cst使用教程 cst操作 cst电磁仿真 cst仿真软件

前端开发如何更好的避免样式冲突?级联层(CSS@layer)

vivo互联网技术

CSS 级联 @layer

500行代码手写docker-实现硬件资源限制cgroups

蓝胖子的编程梦

容器 k8s ,docker Cgroups #k8s

如何避免写重复代码:善用抽象和组合

阿里技术

Java 代码实战

硬核!阿里2023版Spring全家桶进阶笔记流出,堪称Java跳槽神器

Java你猿哥

spring Spring Boot spring security Spring全家桶 Spring Cloud Aliababa

2023数博会丨软通智慧发布“一屏统揽”TongView 数字政府慧治平台解决方案

说山水

Solaris Network:BSC上首个链上合成资产解决方案

鳄鱼视界

Kafka集群是如何选择leader,你知道吗?

做梦都在改BUG

Java kafka 集群

轻量级Kubernetes k3s初探_开源_付广平_InfoQ精选文章