k3s

CNCF Landspace

Why k3s

  1. production-ready,完全通过CNCF认证的Kubernetes产品
  2. 完全实现了k8s的接口,意味着仍旧可以使用kubectl控制集群,学习成本低
  3. 移除了k8s中一些只有在大型集群才用得到的组件,比如默认使用SQLite替代ETCD,同时将这些driver做成可配置的
  4. 安装包只有40mb,并且包含所有需要的底层组件,例如containerdrunc
  5. CPU/Mem资源占用低,适合边缘设备(例如IOT/RPI等)运行

k3s的名字怎么来的:We wanted an installation of Kubernetes that was half the size in terms of memory footprint. Kubernetes is a 10-letter word stylized as K8s. So something half as big as Kubernetes would be a 5-letter word stylized as K3s. There is no long form of K3s and no official pronunciation.

安装k3s

开启内核的container特性,编辑/boot/cmdline.txt,在文件末尾(注意不要换行)增加如下配置,然后重启

cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

执行curl -sfL https://get.k3s.io | sh -,开始安装。

安装成功后:

  1. K3s 服务将配置为在节点重新启动后或者进程崩溃或被终止时自动重新启动(通过systemd)
  2. 将安装其他实用程序,包括 kubectl、crictl、ctr、k3s-killall.sh 和 k3s-uninstall.sh
  3. kubeconfig 文件将被写入 /etc/rancher/k3s/k3s.yaml,K3s 安装的 kubectl 将自动使用它

如果遇到执行k get nodes,可能会报如下错误,通过sudo chmod 600 /etc/rancher/k3s/k3s.yaml解决。

使用其他工具比如openfaas、kubectl可能会报错Error: Kubernetes cluster unreachable: Get "http://localhost:8080/version?timeout=32s": dial tcp [::1]:8080: connect: connection refused。这是因为默认使用的是~/.kube/config文件,所以需要修改KUBECONFIG环境变量值为/etc/rancher/k3s/k3s.yaml的路径,可以在zshrc中配置export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

$ k get nodes
WARN[2021-09-13T01:38:43.154515572+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
$ k get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7448499f4d-9jdsr 1/1 Running 0 13m
kube-system local-path-provisioner-5ff76fc89d-zqd69 1/1 Running 0 13m
kube-system metrics-server-86cbb8457f-kp6ml 1/1 Running 0 13m
kube-system helm-install-traefik-crd-vnggw 0/1 Completed 0 13m
kube-system helm-install-traefik-kl4kv 0/1 Completed 1 13m
kube-system svclb-traefik-ph5n4 2/2 Running 0 11m
kube-system traefik-97b44b794-48kjb 1/1 Running 0 11m

加入其他agent节点

在另一台服务器上(运行在笔者小主机PVE上的一台Ubuntu虚拟机),执行 curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -,作为agent加入k3s集群。

设置K3S_URL参数会导致安装程序将 K3s 配置为代理,而不是服务器。 K3s 代理将向监听提供的 URL 的 K3s 服务器注册。用于 K3S_TOKEN 的值存储在服务器节点上的/var/lib/rancher/k3s/server/node-token中。

执行成功后,执行k get node

$ k get node
NAME STATUS ROLES AGE VERSION
leo-cluster-1 Ready control-plane,master 2y52d v1.21.4+k3s1
leo-cluster-2 Ready <none> 2m34s v1.27.7+k3s1

部属个微服务试试

现在我们成功的创建了一个集群,下面我们来部署一个figlet服务,这个服务可以将HTTP请求体中的字符串转成ASCII格式的。

apiVersion: apps/v1
kind: Deployment
metadata:
name: openfaas-figlet
labels:
app: openfaas-figlet
spec:
replicas: 1
selector:
matchLabels:
app: openfaas-figlet
template:
metadata:
labels:
app: openfaas-figlet
spec:
containers:
- name: openfaas-figlet
image: functions/figlet:latest-armhf
imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: openfaas-figlet
labels:
app: openfaas-figlet
spec:
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: 8080
nodePort: 31111
selector:
app: openfaas-figlet
# leosocy @ leo-cluster-1 in ~/workspace/k8s [2:15:54] 
$ echo -n "I like $(users)" | curl --data-binary @- http://127.0.0.1:31111
___ _ _ _ _
|_ _| | (_) | _____ | | ___ ___ ___ ___ ___ _ _
| | | | | |/ / _ \ | |/ _ \/ _ \/ __|/ _ \ / __| | | |
| | | | | < __/ | | __/ (_) \__ \ (_) | (__| |_| |
|___| |_|_|_|\_\___| |_|\___|\___/|___/\___/ \___|\__, |
|___/

Arkade

arkade提供了一个便携式的marketplace,通过单个命令就可以下载想要的CLI和helm charts。

安装arkade

可能是被墙的原因,在树莓派上使用官方的安装方式一致pending,所以我直接把安装的shell脚本源码贴到机器上执行

# 安装脚本的源码
https://raw.githubusercontent.com/alexellis/arkade/master/get.sh

sudo sh get_arkada.sh
aarch64
Downloading package https://github.com/alexellis/arkade/releases/download/0.8.2/arkade-arm64 as /tmp/arkade-arm64
Download complete.

Running with sufficient permissions to attempt to move arkade to /usr/local/bin
New version of arkade installed to /usr/local/bin
Creating alias 'ark' for 'arkade'.
_ _
__ _ _ __| | ____ _ __| | ___
/ _` | '__| |/ / _` |/ _` |/ _ \
| (_| | | | < (_| | (_| | __/
\__,_|_| |_|\_\__,_|\__,_|\___|

Get Kubernetes apps the easy way

Version: 0.8.2
Git Commit: 8b3fbc0994129f6c14daef467593ae02799409c0

安装常用cli和app

# 安装helm cli
ark get helm

OpenFaaS

Why OpenFaaS

  1. 用任何语言编写函数并将其打包到 Docker/OCI 格式的容器中
  2. 易于使用 - 内置 UI、强大的 CLI 和一键安装
  3. 随时扩展 - 处理流量高峰,并在空闲时缩小规模
  4. 生态系统 - 函数和语言模板的社区市场

安装OpenFaaS

安装 faas-cli 来管理OpenFaaS并部署functions

ark get faas-cli

安装 OpenFaaS CE,并配置

ark install openfaas

# If basic auth is enabled, you can now log into your gateway:
PASSWORD=$(kubectl get secret -n openfaas basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode; echo)
echo -n $PASSWORD | faas-cli login --username admin --password-stdin

faas-cli store deploy figlet
faas-cli list

# For Raspberry Pi
faas-cli store list \
--platform armhf

faas-cli store deploy figlet \
--platform armhf

部署一个Function

可以使用openfaas的gateway-external service对应的NodePort访问UI,也可以通过port-forward gateway ClusterIP访问UI。

$ k get svc -n openfaas
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus ClusterIP 10.43.44.77 <none> 9090/TCP 173m
gateway ClusterIP 10.43.10.152 <none> 8080/TCP 173m
gateway-external NodePort 10.43.112.150 <none> 8080:31112/TCP 173m
alertmanager ClusterIP 10.43.229.238 <none> 9093/TCP 173m
nats ClusterIP 10.43.89.8 <none> 4222/TCP 173m