k3s CNCF Landspace
Why k3s
production-ready,完全通过CNCF认证的Kubernetes
产品
完全实现了k8s的接口,意味着仍旧可以使用kubectl控制集群,学习成本低
移除了k8s中一些只有在大型集群才用得到的组件,比如默认使用SQLite替代ETCD,同时将这些driver做成可配置的
安装包只有40mb,并且包含所有需要的底层组件,例如containerd
、runc
等
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 -
,开始安装。
安装成功后:
K3s 服务将配置为在节点重新启动后或者进程崩溃或被终止时自动重新启动(通过systemd)
将安装其他实用程序,包括 kubectl、crictl、ctr、k3s-killall.sh 和 k3s-uninstall.sh
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
OpenFaaS Why OpenFaaS
用任何语言编写函数并将其打包到 Docker/OCI 格式的容器中
易于使用 - 内置 UI、强大的 CLI 和一键安装
随时扩展 - 处理流量高峰,并在空闲时缩小规模
生态系统 - 函数和语言模板的社区市场
安装OpenFaaS 安装 faas-cli 来管理OpenFaaS并部署functions
安装 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