What If… Kube-Apiserver Could be Extended Via WebAssembly?
created : 2022-08-10T16:58:52+00:00
modified : 2022-08-10T17:00:01+00:00
What is Web Assembly?
- Polyglot
- Many langugages can be compiled to Wasm(Web assembly)
- Small
- Like Container
- Portable
- Can run on any architecture and any OS
- Secure
- In sandbox
- Memory safety
- Control-flow integrity
- Runtime isolation
WebAssembly Outside of the Browser
- A new way to build and distribute applications
- Implement plugin systems
Kubernetes Control Plan Extensibility
- Authentication and Autorization
- Scheduler
- Dynamic Admission Controllers
Dynamic Admission Controller
- Authentication, Authorization
- Mutating admission
- Schema Validation
- Validating admission
Introducting Kubewarden
- A policy engine for Kubernetes
- Its mission is to simplify the adoption of Policy As Code.
Kubewarden Policies
- Written using:
- Rust, Go, AssemblyScript, Swift
- Rego
- Compiled to WebAssembly
- Distributed using container registries
- Signed and verified using Sigstore
The Idea
- Define admission rules using WebAssembly modules
- Extend the API server to make use of WebAssembly-based rules
What do we gain?
Remove Uncertainty
- Webhooks rely on the network
- The network introduces many types of failures
- The network increase attack surface
Limit Resource Usage
- A set of Kubernetes Cusom Resource Definitions
The Webhook serverThe Controller that reconciles the Custom Resources
→ Great for Edge environments!
The POC
- Leverage Kubewarden policies
- Introduce a new Kubernetes Feature Gate capable of running them
The Biggest Challenge
- Major WebAssembly runtimes are not written in pure Go
- Initial approach: patch Kubernetes build system
- Iteration: custom build of wasmtime-go with musl libc
- Final solution, rely on the wazero runtime : pure Go, no usage of CGO
POC: the Missing Details
- No support for Mutating policies
- Not implemented Kubewarden features offered to policy authors:
- Policy tracing
- Context aware information
- Interactions with ocntainer registries
- Sigstore primitives
- Execute Rego policies built as WebAssembly modules
- Verify pulled policies using Sigstore
- Performance testing
What’s Next?
개인 생각
- Kubewarden이 Kubernetes 에서 Policy를 관리하기 위한 프로젝트라는 것을 알게 되었다. (CRD 활용)
- 그리고 공식 홈페이지에서부터 Kubewarden 은 Kubernetes Dynamic Admission Controller 이고 WebAssembly 로 쓰여진 정책들로 요청을 검증한다고 나와있다.
- 와 이거 좀.. 어지럽다. 이게 맞나? 그러니까 다양한 언어로 policy를 구성하는걸 지원하기 위해서 wasm을 선택했고 kwctl 로 wasm 으로 compile 된 policy 를 제어하는거야?
- 강연만 들었을때는 잘 안 와닿았는데 문서를 읽어보니까 쉽지 않다. 이게 맞는 방향인지도 잘 모르겠다.
- 아.. 그래서 제목이 kube-apiserver 가 wasm으로 확장된다면이구나.. 아니 이거 런타임 구조가 어떻게 되는거지? wasm이 browser 가 아니라 standalone 으로 동작하는건가? standalone program 이 있어?
- 일단 다시 강연을 요약하자면, wasm을 선택한건 단순히 언어 확장성, 아키텍트에 영향을 덜받는것 뿐만 아니라 sandbox 가 된다는것도 중요한 요소라고 설명하고 있다. policy 를 관리하는 거니말이다.
- 뿐만 아니라 Webhook 으로 동작하는 것은 Network 를 사용하기에 불확정적인 성질이 있었는데 이런 점들이 제거되었다고 한다. 아직까진 많은 해결해야할 문제들이 남아있다곤 한다.