環境:聯網環境、centos7
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 - Complete! [INFO] Creating /usr/local/bin/kubectl symlink to k3s [INFO] Creating /usr/local/bin/crictl symlink to k3s [INFO] Creating /usr/local/bin/ctr symlink to k3s [INFO] Creating killall script /usr/local/bin/k3s-killall.sh [INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh [INFO] env: Creating environment file /etc/systemd/system/k3s.service.env [INFO] systemd: Creating service file /etc/systemd/system/k3s.service [INFO] systemd: Enabling k3s unit Created symlink from /etc/systemd/system/multi-user.target.wants/k3s.service to /etc/systemd/system/k3s.service. [INFO] systemd: Starting k3s
通過如上只執行了一個命令即部署了一套all in one k3s單節點環境,相對k8s無需額外安裝如下組件:
- kubelet
- kube-proxy
- Docker
- etcd
- ingress,如ngnix
當然可以使用k3s agent添加更多的worker node,只需要添加K3S_URL和K3S_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軟鏈接到k3s alias kubectl='k3s kubectl' # 配置kubectl命令補全 source <(kubectl completion bash) [root@localhost ~]# tail -n 2 /etc/profile alias kubectl='k3s kubectl' source <(kubectl completion bash) [root@localhost ~]# source /etc/profile
配置完后,我們就可以通過kubectl查看kube-system運行的pod列表如下:
[root@localhost ~]# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-854c77959c-v65bq 1/1 Running 0 9m2s kube-system metrics-server-86cbb8457f-58dtv 1/1 Running 0 9m2s kube-system local-path-provisioner-5ff76fc89d-zr9w7 1/1 Running 0 9m2s kube-system helm-install-traefik-4dcfr 0/1 Completed 0 9m2s kube-system svclb-traefik-xdpqp 2/2 Running 0 8m28s kube-system traefik-6f9cbd9bd4-bh96w 1/1 Running 0 8m28s
我們發現並沒有運行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 #具體配置 [root@localhost ~]# tail -n 3 /etc/profile alias docker='k3s crictl' source <(docker completion) complete -F _cli_bash_autocomplete docker [root@localhost ~]# source /etc/profile
通過docker ps查看運行的容器:
[root@localhost ~]# docker ps -a CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID d9d4c339a5960 aa764f7db3051 9 minutes ago Running traefik 0 6b361c2430c9a 0214f1210f5dc 897ce3c5fc8ff 9 minutes ago Running lb-port-443 0 06c2ce2deaba9 ce1953ba893b5 897ce3c5fc8ff 9 minutes ago Running lb-port-80 0 06c2ce2deaba9 3195afeb29c23 3b0b04aa3473f 9 minutes ago Exited helm 0 1928fc8b40b1f c4570ee865459 9dd718864ce61 10 minutes ago Running metrics-server 0 0b03b5fbafcff 6bc9406727a93 148c192562719 10 minutes ago Running local-path-provisioner 0 761e8ecd8d1ee b68bc88f5ff06 296a6d5035e2d 10 minutes ago Running coredns 0 109929bb2385c
當然我們只是使用crictl模擬了docker命令,相對真正的docker我們發現多了ATTEMPT以及POD ID,這是CRI所特有的。
3.2 和使用k8s一樣創建k3s資源
我們使用k8s最喜歡拿來入門的bootcamp作為例子,Deployment聲明如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: kubernetes-bootcamp-v1
name: kubernetes-bootcamp-v1
spec:
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.yaml
deployment.apps/kubernetes-bootcamp-v1 created
# kubectl get pod
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-v1-c5ccf9784-m79vt 1/1 Running 0 3s
kubernetes-bootcamp-v1-c5ccf9784-5blct 1/1 Running 0 3s
創建Service:
# kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
labels:
app: kubernetes-bootcamp-v1
name: kubernetes-bootcamp-v1
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: kubernetes-bootcamp-v1
type: ClusterIP
# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 29m
kubernetes-bootcamp-v1 ClusterIP 10.43.132.97 <none> 8080/TCP 8m14s
# curl 10.43.132.97:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-v1-c5ccf9784-5blct | v=1
