k8s简化版k3s安装使用
环境:联网环境、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
做一个决定,并不难,难的是付诸行动,并且坚持到底。