本篇文章是「DevOps云学堂」与你共同进步的第 62篇
如何在工作站上启动并运行轻量级 Kubernetes。K3s 是一种轻量级、经过认证的 Kubernetes 发行版,专为资源受限的环境(例如边缘设备、物联网设备和小规模部署)而设计。它由 Rancher Labs
开发,构建的目标是提供一个简约且易于使用的 Kubernetes 发行版,消耗更少的资源,同时保持与 Kubernetes API 的完全兼容性。
K3s 的一些主要功能和特性
轻量级且资源高效:与标准 Kubernetes 发行版相比,K3s 的设计占地面积小,消耗的资源更少。它具有更少的内存占用、更小的二进制大小和更低的 CPU 开销,使其适合资源有限的环境。
易于安装和管理:K3s 的设计宗旨是易于安装和管理。它可以安装在各种操作系统上,包括 Linux、macOS 和 Windows。安装过程得到简化,可以使用单个二进制文件完成。默认情况下,它还提供了一个轻量级容器运行时,containerd。
高可用性和弹性:K3s 支持与标准 Kubernetes 相同的高可用性功能,允许您部署高弹性集群。它提供自动 etcd 快照和备份、控制平面组件自动扩展以及集成服务负载平衡等功能。
安全性和兼容性:K3s 保持与 Kubernetes API 的完全兼容,确保现有的 Kubernetes 应用程序和工具无需修改即可与 K3s 一起使用。它还包括安全增强功能,例如内置 TLS 加密、RBAC(基于角色的访问控制)以及对 Seccomp 和 AppArmor 的容器安全支持。
K3 的用例
边缘计算:K3s非常适合资源有限、需要轻量级Kubernetes发行版的边缘计算场景。它支持在边缘设备上部署和管理容器化应用程序,使组织能够在更接近数据源的地方处理数据并减少延迟。
IoT 部署:K3 可用于需要 Kubernetes 功能但设备资源有限的物联网 (IoT) 部署。借助 K3s,您可以编排和管理 IoT 设备上的容器化工作负载,为 IoT 应用程序开发和部署提供可扩展且灵活的解决方案。
开发和测试环境:K3s可用于搭建轻量级的Kubernetes集群,用于开发和测试目的。它允许开发人员在笔记本电脑或台式机上轻松创建本地 Kubernetes 环境,而无需消耗过多资源,从而使他们能够高效地测试和迭代应用程序。
小规模部署:K3s 适用于小规模部署,在这种情况下,成熟的 Kubernetes 发行版可能会显得大材小用。它提供了简化的安装过程,并且需要更少的资源,使得在小规模生产环境或个人项目中部署和管理 Kubernetes 集群变得更加容易。
总体而言,K3s 提供了一个轻量级、易于使用且资源高效的 Kubernetes 发行版,在边缘计算、物联网、开发/测试和小规模部署场景中特别有用。
安装 k3d,k3s 的包装器
(base) skondla@Sams-MBP:Downloads $ brew search k3d
==> Formulae
k3d ✔ f3d
# k3d is already installed on my macbook
(base) skondla@Sams-MBP:Downloads $ brew update && brew install k3d
Updated 3 taps (weaveworks/tap, homebrew/core and homebrew/cask).
==> New Formulae
bbot erlang@25 trzsz-ssh
==> New Casks
whisky
==> Outdated Formulae
aws-iam-authenticator eksctl libuv
You have 3 outdated formulae installed.
You can upgrade them with brew upgrade
or list them with brew outdated.
Warning: k3d 5.5.1 is already installed and up-to-date.
To reinstall 5.5.1, run:
brew reinstall k3d
(base) skondla@Sams-MBP:Downloads $ which k3d
/usr/local/bin/k3d
(base) skondla@Sams-MBP:~ $ k3d cluster create devhacluster --servers 3 --agents 1
INFO[0000] Prep: Network
INFO[0000] Created network 'k3d-devhacluster'
INFO[0000] Created image volume k3d-devhacluster-images
INFO[0000] Starting new tools node...
INFO[0000] Creating initializing server node
INFO[0000] Creating node 'k3d-devhacluster-server-0'
INFO[0000] Starting Node 'k3d-devhacluster-tools'
INFO[0001] Creating node 'k3d-devhacluster-server-1'
INFO[0002] Creating node 'k3d-devhacluster-server-2'
INFO[0002] Creating node 'k3d-devhacluster-agent-0'
INFO[0002] Creating LoadBalancer 'k3d-devhacluster-serverlb'
INFO[0002] Using the k3d-tools node to gather environment information
INFO[0002] Starting new tools node...
INFO[0002] Starting Node 'k3d-devhacluster-tools'
INFO[0003] Starting cluster 'devhacluster'
INFO[0003] Starting the initializing server...
INFO[0004] Starting Node 'k3d-devhacluster-server-0'
INFO[0005] Starting servers...
INFO[0005] Starting Node 'k3d-devhacluster-server-1'
INFO[0027] Starting Node 'k3d-devhacluster-server-2'
INFO[0040] Starting agents...
INFO[0040] Starting Node 'k3d-devhacluster-agent-0'
INFO[0042] Starting helpers...
INFO[0042] Starting Node 'k3d-devhacluster-serverlb'
INFO[0049] Injecting records for hostAliases (incl. host.k3d.internal) and for 6 network members into CoreDNS configmap...
INFO[0051] Cluster 'devhacluster' created successfully!
INFO[0051] You can now use it like this:
kubectl cluster-info
(base) skondla@Sams-MBP:~ $ k get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k3d-devhacluster-agent-0 Ready <none> 76s v1.26.4+k3s1 172.23.0.6 <none> K3s dev 5.15.49-linuxkit-pr containerd://1.6.19-k3s1
k3d-devhacluster-server-0 Ready control-plane,etcd,master 109s v1.26.4+k3s1 172.23.0.3 <none> K3s dev 5.15.49-linuxkit-pr containerd://1.6.19-k3s1
k3d-devhacluster-server-1 Ready control-plane,etcd,master 92s v1.26.4+k3s1 172.23.0.4 <none> K3s dev 5.15.49-linuxkit-pr containerd://1.6.19-k3s1
k3d-devhacluster-server-2 Ready control-plane,etcd,master 79s v1.26.4+k3s1 172.23.0.5 <none> K3s dev 5.15.49-linuxkit-pr containerd://1.6.19-k3s1
(base) skondla@Sams-MBP:~ $ k get po -o wide -A --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-59b4f5bbd5-hkdm6 1/1 Running 0 5m34s 10.42.0.5 k3d-devhacluster-server-0 <none> <none>
kube-system helm-install-traefik-crd-gphwk 0/1 Completed 0 5m34s 10.42.0.2 k3d-devhacluster-server-0 <none> <none>
kube-system helm-install-traefik-r8w4p 0/1 Completed 1 5m34s 10.42.0.3 k3d-devhacluster-server-0 <none> <none>
kube-system local-path-provisioner-76d776f6f9-dlkfm 1/1 Running 0 5m34s 10.42.0.4 k3d-devhacluster-server-0 <none> <none>
kube-system metrics-server-7b67f64457-2mgv8 1/1 Running 0 5m34s 10.42.0.6 k3d-devhacluster-server-0 <none> <none>
kube-system svclb-traefik-cabd407d-jz4v5 2/2 Running 0 5m23s 10.42.1.3 k3d-devhacluster-server-1 <none> <none>
kube-system svclb-traefik-cabd407d-lpn5n 2/2 Running 0 5m23s 10.42.0.7 k3d-devhacluster-server-0 <none> <none>
kube-system svclb-traefik-cabd407d-rzqpb 2/2 Running 0 5m14s 10.42.3.2 k3d-devhacluster-agent-0 <none> <none>
kube-system svclb-traefik-cabd407d-zgs5m 2/2 Running 0 5m16s 10.42.2.2 k3d-devhacluster-server-2 <none> <none>
kube-system traefik-56b8c5fb5c-2mtmf 1/1 Running 0 5m23s 10.42.1.2 k3d-devhacluster-server-1 <none> <none>
rabbitmq-system rabbitmq-cluster-operator-54b4bf5cbf-ghrrr 1/1 Running 0 11s 10.42.3.3 k3d-devhacluster-agent-0 <none> <none>
Deploy operator
(base) skondla@Sams-MBP:~ $ curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.25.0/install.sh | bash -s v0.25.0
customresourcedefinition.apiextensions.k8s.io/catalogsources.operators.coreos.com created
customresourcedefinition.apiextensions.k8s.io/clusterserviceversions.operators.coreos.com created
customresourcedefinition.apiextensions.k8s.io/installplans.operators.coreos.com created
customresourcedefinition.apiextensions.k8s.io/olmconfigs.operators.coreos.com created
customresourcedefinition.apiextensions.k8s.io/operatorconditions.operators.coreos.com created
customresourcedefinition.apiextensions.k8s.io/operatorgroups.operators.coreos.com created
customresourcedefinition.apiextensions.k8s.io/operators.operators.coreos.com created
customresourcedefinition.apiextensions.k8s.io/subscriptions.operators.coreos.com created
customresourcedefinition.apiextensions.k8s.io/catalogsources.operators.coreos.com condition met
customresourcedefinition.apiextensions.k8s.io/clusterserviceversions.operators.coreos.com condition met
customresourcedefinition.apiextensions.k8s.io/installplans.operators.coreos.com condition met
customresourcedefinition.apiextensions.k8s.io/olmconfigs.operators.coreos.com condition met
customresourcedefinition.apiextensions.k8s.io/operatorconditions.operators.coreos.com condition met
customresourcedefinition.apiextensions.k8s.io/operatorgroups.operators.coreos.com condition met
customresourcedefinition.apiextensions.k8s.io/operators.operators.coreos.com condition met
customresourcedefinition.apiextensions.k8s.io/subscriptions.operators.coreos.com condition met
namespace/olm created
namespace/operators created
serviceaccount/olm-operator-serviceaccount created
clusterrole.rbac.authorization.k8s.io/system:controller:operator-lifecycle-manager created
clusterrolebinding.rbac.authorization.k8s.io/olm-operator-binding-olm created
olmconfig.operators.coreos.com/cluster created
deployment.apps/olm-operator created
deployment.apps/catalog-operator created
clusterrole.rbac.authorization.k8s.io/aggregate-olm-edit created
clusterrole.rbac.authorization.k8s.io/aggregate-olm-view created
operatorgroup.operators.coreos.com/global-operators created
operatorgroup.operators.coreos.com/olm-operators created
clusterserviceversion.operators.coreos.com/packageserver created
catalogsource.operators.coreos.com/operatorhubio-catalog created
Waiting for deployment "olm-operator" rollout to finish: 0 of 1 updated replicas are available...
deployment "olm-operator" successfully rolled out
deployment "catalog-operator" successfully rolled out
Package server phase: Succeeded
deployment "packageserver" successfully rolled out
查看namespace:
(base) skondla@Sams-MBP:~ $ k get ns
NAME STATUS AGE
default Active 21m
flaskapp1-namespace Active 12m
kube-node-lease Active 21m
kube-public Active 21m
kube-system Active 21m
olm Active 36s
operators Active 36s
rabbitmq-system Active 16m
部署Prometheus:
(base) skondla@Sams-MBP:~ $ kubectl create -f https://operatorhub.io/install/prometheus.yaml
subscription.operators.coreos.com/my-prometheus created
(base) skondla@Sams-MBP:~ $ kubectl get csv -n operators
NAME DISPLAY VERSION REPLACES PHASE
elastic-cloud-eck.v2.8.0 Elasticsearch (ECK) Operator 2.8.0 elastic-cloud-eck.v2.7.0 Succeeded
(base) skondla@Sams-MBP:~ $
(base) skondla@Sams-MBP:~ $
(base) skondla@Sams-MBP:~ $
(base) skondla@Sams-MBP:~ $ kubectl get csv -n operators
NAME DISPLAY VERSION REPLACES PHASE
elastic-cloud-eck.v2.8.0 Elasticsearch (ECK) Operator 2.8.0 elastic-cloud-eck.v2.7.0 Succeeded
prometheusoperator.v0.65.1 Prometheus Operator 0.65.1 prometheusoperator.0.47.0 Succeeded
(base) skondla@Sams-MBP:~ $ curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.25.0/install.sh | bash -s v0.25.0
OLM is already installed in olm namespace. Exiting...
(base) skondla@Sams-MBP:~ $ kubectl create -f https://operatorhub.io/install/grafana-operator.yaml
subscription.operators.coreos.com/my-grafana-operator created
(base) skondla@Sams-MBP:~ $ kubectl get csv -n operators
NAME DISPLAY VERSION REPLACES PHASE
elastic-cloud-eck.v2.8.0 Elasticsearch (ECK) Operator 2.8.0 elastic-cloud-eck.v2.7.0 Succeeded
prometheusoperator.v0.65.1 Prometheus Operator 0.65.1 prometheusoperator.0.47.0 Succeeded
(base) skondla@Sams-MBP:~ $ kubectl get csv -n operators
NAME DISPLAY VERSION REPLACES PHASE
elastic-cloud-eck.v2.8.0 Elasticsearch (ECK) Operator 2.8.0 elastic-cloud-eck.v2.7.0 Succeeded
prometheusoperator.v0.65.1 Prometheus Operator 0.65.1 prometheusoperator.0.47.0 Succeeded
部署Grafana
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: grafana
name: grafana
spec:
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
securityContext:
fsGroup: 472
supplementalGroups:
- 0
containers:
- name: grafana
image: grafana/grafana:9.1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
name: http-grafana
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /robots.txt
port: 3000
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 2
livenessProbe:
failureThreshold: 3
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 3000
timeoutSeconds: 1
resources:
requests:
cpu: 250m
memory: 750Mi
volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-pv
volumes:
- name: grafana-pv
persistentVolumeClaim:
claimName: grafana-pvc
---
apiVersion: v1
kind: Service
metadata:
name: grafana
spec:
ports:
- port: 3000
protocol: TCP
targetPort: http-grafana
selector:
app: grafana
sessionAffinity: None
type: LoadBalancer
启动代理
(base) skondla@Sams-MBP:grafana $ kubectl port-forward service/grafana 3000:3000
Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000
Handling connection for 3000
Grafana dashboard
文章翻译 https://kondlawork.medium.com/lightweight-kubernetes-k3s-on-local-machine-with-grafana-docker-5f5f8b514dfa
往期推荐
DevSecOps 管道: 使用Jenkins自动化CI/CD管道以实现安全的多语言应用程序
降低DevOps入门门槛,企业级实践,持续累计5年打造一套精品实践课程!邀共赏!
遇到devops工程实践问题无从下手,圈内提问,400+同行共同探讨!邀共享!