基于云原生的周边工具
kubectl 有自带的端口转发命令kubectl port-forward
可以将本地端口转发到指定 Pod 的端口
# Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in the pod
kubectl port-forward mypod 5000 6000
# Listen on port 8888 locally, forwarding to 5000 in the pod
kubectl port-forward mypod 8888:5000
# Listen on a random port locally, forwarding to 5000 in the pod
kubectl port-forward mypod :5000
# Listen on a random port locally, forwarding to 5000 in the pod
kubectl port-forward mypod 0:5000
也可以将本地端口转发到服务、复制控制器或者部署的端口。
# Forward to deployment
kubectl port-forward deployment/redis-master 6379:6379
# Forward to replicaSet
kubectl port-forward rs/redis-master 6379:6379
# Forward to service
kubectl port-forward svc/redis-master 6379:6379
kubefwd 是一个用于端口转发Kubernetes中指定namespace下的全部或者部分pod的命令行工具。 kubefwd 使用本地的环回IP地址转发需要访问的service,并且使用与service相同的端口。 kubefwd 会临时将service的域条目添加到 /etc/hosts
文件中
安装
brew install txn2/tap/kubefwd
kubefwd 默认你已经安装了 kubectl 工具并且也已经设置好了访问Kubernetes集群的配置文件。kubefwd 使用 kubectl 的上下文运行环境. kubectl 工具并不会用到,但是它的配置文件会被用来访问Kubernetes集群。
使用前首先确保上下文运行环境
kubectl config current-context
启动kubefwd后,在本地就能像在Kubernetes集群中一样使用service名字与端口访问对应的应用程序。
sudo kubefwd services -n the project
转发namespace the-project
下所有的带有label为system: wx
的service\
sudo kubefwd svc -l system=wx -n the-project
Kubeshark由2021年UP9公司开源的K8s API流量查看器 Mizu 发展而来,试图成为一款K8s全过程流量监控工具
Kubeshark 也被叫做 Kubernetes 的可观测性工具,可以对微服务进行动态分析,检测异常并在运行时出现某些模式时触发功能。
Kubeshark 由三个不同的软件组成,它们可以协同工作:CLI、Hub 和 Worker。
在底层实现当中,Kubeshark主要使用到了Linux内核中的各种内置方法和API,隐藏了对流量数据的加解密实现,可以直接收集到K8s集群中的加密和未加密流量。对网络数据的收集主要使用了直接抓包法和基于拓展伯克利包过滤(eBPF)的数据包获取。直接抓包法涉及libpcap、AF_PACKET和PF_RING获取集群TCP流量,eBPF的方法主要使用到了加密流量 (TLS),并挂钩到OpenSSL库和 Go 的crypto/tls包中某些函数的入口点和出口点。
Kubeshark具体功能
网络嗅探
Kubeshark 可以使用 Linux 内核中内置的各种方法和 API 嗅探集群中的加密和未加密流量。
查询
内核跟踪
Kubeshark 使用 🐝 eBPF(扩展伯克利数据包过滤器)提供跟踪内核空间和用户空间功能。
kubeshark tap --tls -n harbor
流量校验
服务地图
部署完成后,Kubeshark CLI 将在 http://localhost:8899 打开 UI 单击右上角名为 Service Map 的按钮打开服务依赖关系图。该图根据网络流量显示 Pod 以及它们之间的关系。
数据脱敏
Kubeshark 捕获的流量包含敏感信息。用户可以配置 Kubeshark 以隐藏某些关键字或数据片段将在 UI 中显示为 [REDACTED]。
默认的脱敏字段 “token”, “authorization”, “authentication”, “cookie”, “userid”, “password”, “username”,
“user”, “key”, “passcode”, “pass”, “auth”, “authtoken”, “jwt”, “bearer”, “clientid”,
“clientsecret”, “redirecturi”, “phonenumber”, “zip”, “zipcode”, “address”, “country”,
“firstname”, “lastname”, “middlename”, “fname”, “lname”, “birthdate”
Kubeshark Cli指南
命令
kubeshark tap catalogue-b87b45784-sxc8q
: 监控指定的Pod
kubeshark tap "(catalo*|front-ent*)"
: 使用正则表达式监控一组Pod
kubeshark tap -n sock-shop
:指定监控的Namespace
kubeshark tap -A
指定所有Namespace
K8s监控利器
https://github.com/keyval-dev/odigos
管理K8s集群上的虚拟化服务,介绍:https://moelove.info/2023/09/01/%E8%80%97%E6%97%B6-7-%E5%B9%B4%E7%BB%88%E5%B0%86%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%B8%A6%E5%85%A5-Kubernetes-%E4%B8%96%E7%95%8C/
随着云计算和容器技术的发展,Kubernetes 已经成为了业界的标准和领导者,为用户提供了一个强大,灵活和可扩展的平台,来部署和管理各种类型的应用。
然而,对于一些难以容器化的应用,例如传统的企业应用,遗留的系统,或者需要特殊硬件支持的应用,虚拟机仍然是一个必要和有效的解决方案。 如何在 Kubernetes 上运行和管理虚拟机,以及如何实现容器和虚拟机之间的互操作性和一致性,是一个亟待解决的问题。
这就是 KubeVirt 项目诞生的背景和目标。
KubeVirt 是一个开源项目,它使得虚拟机可以像容器一样被 Kubernetes 部署,消费和管理。它提供了一个统一的平台,让用户可以根据不同的需求,使用容器或者虚拟机来构建云原生应用。KubeVirt 项目于 2016 年启动,由 Red Hat, IBM, Google, Intel, SUSE 等多家公司和组织共同推动和贡献。经过 7 年的不懈努力,KubeVirt 于 2023 年 7 月发布了 v1.0.0 版本,标志着它已经达到了生产就绪的水平,并且有着健康的社区。(在此之前,它已经被很多公司用到了生产环境)
KubeVirt 的想法最早可以追溯到 2015 年,在第一届 KubeCon 上 Red Hat 的工程师 Fabian Deutsch 提出了一个问题:能否在 Kubernetes 上运行虚拟机?当时的回答是不确定的,但是这个问题引起了很多人的兴趣和讨论。在接下来的一年里,Fabian Deutsch 和他的同事开始了一些原型和实验性的工作,探索了不同的方案和技术。最终,他们选择了使用 libvirt 和 QEMU 来实现虚拟机在 Kubernetes 上的运行和管理。
在 2016 年底,KubeVirt 项目正式启动,并在 GitHub 上开源。项目的主要目标是提供一个 Kubernetes 原生的虚拟化 API 和运行时,让用户可以像使用 Pod 和 Deployment 一样使用 VirtualMachine 和 VirtualMachineInstance 来定义和管理虚拟机。项目的主要挑战是如何将虚拟机与 Kubernetes 的资源模型,调度器,网络,存储等组件进行集成和协调。
在接下来的几年里,KubeVirt 项目经历了多个阶段和版本的迭代和改进。其中一些重要的里程碑包括:
virtctl migrate
,并发布了 v0.21.0 版本。其实可以看到 KubeVirt 虽然一直没有发布 v1.0 版本,但是却一直保持着比较频繁的发布频率。 在这个过程中,KubeVirt 的社区也不断地壮大和活跃。截至目前,KubeVirt 的 GitHub 仓库已经有超过 270 个贡献者,超过 17k 提交,超过 4.5k star。
KubeVirt 的用户和合作伙伴也在不断地增加,包括 IBM, Google, Intel, SUSE, Red Hat, Huawei, VMware, Canonical, Rancher 等多家知名公司和组织
KubeVirt 的核心功能是在 Kubernetes 上运行和管理虚拟机。为了实现这个功能,KubeVirt 提供了以下几个方面的解决方案
KubeVirt 定义了一套 Kubernetes 原生的虚拟化 API,让用户可以像使用 Pod 和 Deployment 一样使用 VirtualMachine 和 VirtualMachineInstance 来定义和管理虚拟机。VirtualMachine 是一种声明式的资源类型,表示一个期望的虚拟机状态。VirtualMachineInstance 是一种实时的资源类型,表示一个正在运行的虚拟机实例。用户可以通过 YAML 文件或者 kubectl 命令来创建,更新,删除或者查询这些资源。
KubeVirt 实现了一套虚拟化运行时,让用户可以在 Kubernetes 集群中的任何节点上运行和管理虚拟机。KubeVirt 的运行时主要由以下几个组件构成:
KubeVirt 支持多种网络插件和方案,让用户可以根据不同的需求,为虚拟机提供合适的网络连接和配置。KubeVirt 的网络解决方案主要包括以下几种:
KubeVirt 支持多种存储插件和方案,让用户可以根据不同的需求,为虚拟机提供合适的存储空间和配置。KubeVirt 的存储解决方案主要包括以下几种:
KubeVirt 支持多种镜像插件和方案,让用户可以根据不同的需求,为虚拟机提供合适的镜像源和配置。KubeVirt 的镜像解决方案主要包括以下几种:
K8s日志工具
安装
$ brew tap boz/repo
$ brew install boz/repo/kail
使用
# match pods belonging to a replicaset named 'workers' in any namespace.
$ kail --rs workers
# match pods belonging to the replicaset named 'workers' only in the 'staging' namespace
$ kail --rs staging/workers
# match pods belonging to both the service "frontend" and the deployment "webapp"
$ kail --svc frontend --deploy webapp
Rainbond
遵循 以应用为中心 的设计理念,统一封装容器、Kubernetes和底层基础设施相关技术,让使用者专注于业务本身, 避免在业务以外技术上花费大量学习和管理精力。同时,Rainbond 深度整合应用开发、微服务架构、应用交付、应用运维、资源管理,管理高度自动化,实现统一管理所有应用、所有基础设施和所有IT流程。
Rainbond 通过“无侵入”技术,让传统应用不需要改动或少量改动就能快速变成云原生应用。 传统应用转成成云原生应用的方式:
Rainbond能将企业内部各种数字化能力一键发布成组件,并具备组件安装使用、组件编排、组件版本管理、组件升级和持续迭代等完整的管理流程,将企业内部可复用的能力积累到组件库,既避免重复建设,还能将这些组件变成数字资产,为企业创新提供动力。
Rainbond提供企业应用的业务集成、多云交付、私有交付、SaaS交付、离线交付、个性化交付、应用市场等能力,将交付过程最大限度自动化,提高企业应用交付效率,降低交付成本
https://www.rainbond.com/docs/
rust的kubernetes客户端
https://liangyuanpeng.com/post/fundation-rust/quick-start-kubernetes-client-rust/
KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的 IT 自动化运维能力,简化企业的 DevOps 工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用 (plug-and-play) 的集成。
作为全栈的多租户容器平台,KubeSphere 提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能丰富的容器云平台。KubeSphere 为用户提供构建企业级 Kubernetes 环境所需的多项功能,例如多云与多集群管理、Kubernetes 资源管理、DevOps、应用生命周期管理、微服务治理(服务网格)、日志查询与收集、服务与网络、多租户管理、监控告警、事件与审计查询、存储管理、访问权限控制、GPU 支持、网络策略、镜像仓库管理以及安全管理等。
KubeSphere 还开源了 KubeKey 帮助企业一键在公有云或数据中心快速搭建 Kubernetes 集群,提供单节点、多节点、集群插件安装,以及集群升级与运维。
KubeSphere 为用户屏蔽了基础设施底层复杂的技术细节,帮助企业在各类基础设施之上无缝地部署、更新、迁移和管理现有的容器化应用。通过这种方式,KubeSphere 使开发人员能够专注于应用程序开发,使运维团队能够通过企业级可观测性功能和故障排除机制、统一监控和日志查询、存储和网络管理,以及易用的 CI/CD 流水线等来加快 DevOps 自动化工作流程和交付流程等。
KubeSphere 作为开源的企业级全栈化容器平台,为用户提供了一个健壮、安全、功能丰富、具备极致体验的 Web 控制台。拥有企业级 Kubernetes 所需的最常见的功能,如工作负载管理,网络策略配置,微服务治理(基于 Istio),DevOps 项目 (CI/CD) ,安全管理,Source to Image/Binary to Image,多租户管理,多维度监控,日志查询和收集,告警通知,审计,应用程序管理和镜像管理、应用配置密钥管理等功能模块。
它还支持各种开源存储和网络解决方案以及云存储服务。例如,KubeSphere 为用户提供了功能强大的云原生工具负载均衡器插件 OpenELB,这是为 Kubernetes 集群开发的 CNCF 认证的负载均衡插件。
生态:https://kubesphere.io/zh/docs/v3.3/pluggable-components/app-store/
KubeKey 允许用户直接在基础架构上部署 Kubernetes,为 Kubernetes 集群提供高可用性。建议在生产环境至少配置三个主节点。
KubeKey 提供了一种简单的安装,管理和维护方式。它支持 Kubernetes 集群的滚动升级,以便集群服务在升级时始终可用。另外,也可以使用 KubeKey 将新节点添加到 Kubernetes 集群中以使用更多工作负载。
https://portworx.com/blog/choosing-a-kubernetes-operator-for-postgresql/
https://github.com/CrunchyData/postgres-operator/
https://github.com/zalando/postgres-operator
https://github.com/ankane/pgsync
KubeCube (https://kubecube.io) 是一个轻量化的企业级容器平台,为企业提供 kubernetes 资源可视化管理以及统一的多集群多租户管理功能,具有简化应用部署、管理应用的生命周期和丰富的监控和日志审计能力。Cube 有魔方之意,寓意通过 KubeCube 的能力组合,企业可以快速构建一个强大和功能丰富的云原生底座,并增强 DevOps 团队的能力。下面我们具体来看 KubeCube 这个魔方的六面,都提供了哪些能力
KubeCube 针对用户的使用场景提供了多种部署方式:适用于 POC 环境的 All In One 部署,适用于生产环境的多节点高可用部署。仅需要一条命令即可完成 Kubernetes+KubeCube 的部署,同时提供了开箱即用的多集群管理、多租户、可观测功能。
同时考虑到企业可能已有部分能力建设,如日志平台等,KubeCube 可以只部署核心服务,提供多集群多租户能力,可观测等组件可以通过热插拔的方式开启或关闭,同时通过热插拔配置完成用户已有系统对接,用户可以根据实际场景灵活选择。
Vault提供令牌管理,基于K8s的令牌管理系统
https://github.com/hashicorp/vault
自动构建镜像
k8s监控库
https://github.com/kubernetes/kube-state-metrics#kubernetes-version
https://github.com/kubernetes-sigs/metrics-server
https://github.com/kyverno/kyverno
https://github.com/open-policy-agent/gatekeeper
Kubernetes 的供应链安全需求中,有一个重要的镜像签署和校验的环节
这个工具的最基础功能有三个,分别是生成密钥对、镜像签名和校验签名。
生成密钥对
cosign generate-key-pair
Enter password for private key:
Enter again:
Private key written to cosign.key
Public key written to cosign.pub
执行命令之后,输入密码,就会生成密钥对文件,私钥和公钥分别是 consign.key
和 cosign.pub
签名
可以使用前边生成的密钥对进行签名,例如我的工具镜像
cosign sign -key cosign.key dustise/sleep:v0.9.6
Enter password for private key:
Pushing signature to: index.docker.io/dustise/sleep:sha256-92dad62e00d08157a3921b7d7b568a247a8b24e8a067ad5dc20b210d7b1c2ad1.cosign
这个功能是对仓库中镜像的哈希码生效的,因此签署过程无需本地镜像的参与,cosign 会直接在镜像仓库中获取对应 tag 的 sha256 内容,签署之后生成一个 OCI 镜像推送到该镜像的原有仓库之中,例如前面为 dustise/sleep:v0.9.6
进行签名,就生成了一个 dustise/sleep:sha256-92da.....1c2ad1.cosign
的镜像。如果被签名镜像在本地不存在,在完成操作之后,使用 docker images
命令查看,会发现被签署镜像和签署生成的镜像都不存在于本地。
另外一个就是,因为这里有 Push 操作,因此这个签署过程通常是有登录镜像库的需求的
校验过程很简单,使用 verify
指令,指定公钥即可
cosign verify -key cosign.pub dustise/sleep:v0.9.6
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
- Any certificates were verified against the Fulcio roots.
...
如果使用 cosign 来进行签署,过程基本上来说还算是愉快的,私钥放置在 CI 之中,而公钥则可以保存在集群里,入门方式可以使用客户端定期扫描;复杂的方式则可以实现一个简单的 admission controller 来根据 Selector 对负载进行校验,同样需要注意的是,cosign 只针对远程(镜像库)进行操作,对本地的同 Tag 替换是没什么防御力的,因此这里还要使用 Always Pull 的策略进行弥补(可以使用 Kyverno 或者 Gatekeeper 来强制实施)
将代码、可执行文件或者脚本进行签名,保障仅有受信内容才可运行,这是一个已知的最佳实践。软件签名不是什么新概念,有很多相关的供应商和方案,每个组织都有自己的方式来处理制品的签署和信任。然而如果把目光投向容器领域,可能会发现并没有那么多选择
Notary是一个基于 TUF 项目的用于软件制品签名的开源软件。
Notary 使用角色和元数据文件对受信集合内容进行签署,这些内容被称为全局唯一名称(GUN——Global Unique Name)
以 Docker 镜像为例,GUN 相当于 [registry]/[repository name]:[tag]
。
[registry]
是镜像的源仓库,[repository name]
是镜像的名称。[tag]
对镜像进行标记(通常代表版本)。
Notary 借助 TUF 的角色和密钥层级关系对镜像进行签名。有五种密钥类型用于对元数据文件进行签署,并用 .json
的方式保存到 Notary 数据库
Cluster AutoScaler 是一个自动扩展和收缩 Kubernetes 集群 Node 的扩展。当集群容量不足时,它会自动去 Cloud Provider (支持 GCE、GKE、Azure、AKS、AWS 等)创建新的 Node,而在 Node 长时间(超过 10 分钟)资源利用率很低时(低于 50%)自动将其删除以节省开支。
Cluster AutoScaler 定期(默认间隔 10s)检测是否有充足的资源来调度新创建的 Pod,当资源不足时会调用 Cloud Provider 创建新的 Node。
为了自动创建和初始化 Node,Cluster Autoscaler 要求 Node 必须属于某个 Node Group,比如
当集群中有多个 Node Group 时,可以通过 --expander=<option>
选项配置选择 Node Group 的策咯,支持如下四种方式
目前,Cluster Autoscaler 可以保证
Cluster AutoScaler 也会定期(默认间隔 10s)自动监测 Node 的资源使用情况,当一个 Node 长时间(超过 10 分钟其期间没有执行任何扩展操作)资源利用率都很低时(低于 50%)自动将其所在虚拟机从云服务商中删除(注意删除时会有 1 分钟的 graceful termination 时间)。此时,原来的 Pod 会自动调度到其他 Node 上面(通过 Deployment、StatefulSet 等控制器)。
配合hpa使用:https://blog.tienyulin.com/kubernetes-5_horizontal-pod-autoscaler-hpa/
https://kubernetes.feisky.xyz/setup/addon-list/cluster-autoscaler