Operator thường được sử dụng cho các ứng dụng stateful nhằm tự động hóa 1 số đầu việc như:
Triển khai ứng dụng theo yêu cầu
Lấy và khôi phục trạng thái của ứng dụng
Xử lý, nâng cấp code khi có sự thay đổi như thay đổi cơ sở dữ liệu, hoặc các cấu hình cài đặt
Tạo Service cho các ứng dụng ko hỗ trợ Kubernetes API
Mô phỏng lỗi ở 1 phần hoặc trên cả cluster để kiểm tra khả năng khôi phục của nó
Để tạo 1 operator, sẽ có nhiều cách, nó sử dụng Operator SDK để tạo cùng với biểu đồ Helm, Ansible, ... để tạo ra các file yaml
Với 1 app, nó sẽ có trạng thái hiện có và trạng thái mong muốn nó phải đạt được, thì operator chính là thứ giúp thực hiện được công việc này . Nó cung cấp khả năng tự động hóa mạnh mẽ cho những tài nguyên mà nó quản lý
Custom resource:
Là endpoint của Kubernetes API, dùng để lưu trữ 1 tập hợp các API thuộc 1 loại nhất định của Kubernetes. Là 1 tùy chỉnh cho mỗi phiên bản Kubernetes cụ thể
Muốn cho các tài nguyên tùy chỉnh có thể được hưởng các "đặc quyền" của kubectl, có thể hiểu là các câu lệnh áp dụng cho tài nguyên có sẵn của Kubernetes như thế nào thì của Custom resource cũng có thể được sử dung như vậy
Có thể tồn tại hoặc biến mất trong cluster thông qua dynamic registration, và người quản trị cluster có thể nâng cấp custom resource một cách độc lập mà không liên quan gì đến cụm. Khi custom resource được cài đặt, người dùng có thể tạo và access các đối tượng của nó thông qua kubectl, giống như cách làm đối với các đối tượng tích hợp sẵn như Pod, ...
Custom Controller
Custom Controller cho phép lưu trữ và lấy lại dữ liệu có cáu trúc. Khi kết hợp Custom Resource với Custom Controller, custom resource sẽ cung cấp 1 declarative API
Với Kubernetes declarative API, người dùng sẽ tự định nghĩa trạng thái tài nguyên mong muốn của mình. Kubernetes Controller giữ trạng thái hiện tại của các thành phần trong Kubernetes đồng bộ với trạng thái mà người dùng khai báo. Nó trái ngược với imperative API khi người dùng phải điều khiển, dạy cho server làn lượt phải làm gì
Người dùng có thể triển khai cập nhật Custom Controller trong khi vẫn đang chạy cluster, độc lập với vòng đời của cluster
Custom Controller có thể làm việc với bất kỳ loại tài nguyên nào, nhưng chúng đặc biệt hiệu quả khi kết hợp với Custom Resource
Operator pattern kết hợp cả custom controller và custom resource.
Sử dụng Custom Resource khi:
Khi muốn sử dụng thư viện Kubernetes và CLI để co thể tạo và cập nhật tài nguyên mới
Muốn sử dụng với sự hỗ trợ cao nhát từ kubectl
Xây dựng 1 bộ công cụ tự động để theo dõi và cập nhật trên 1 object, và sau đó CRUD object hoặc ngược lại
Muốn tạo 1 bản automation nhăm mục đích cập nhật object
Muốn object trở nên trừu tượng trên 1 tập hợp các tài nguyên được kiểm soát
CRD:
CRD ko có sẵn trong kubernetes
Muốn sử dụng CR thif trước tiên phải đặng ký CRDs với etcd, khi đã được đăng kỳ thì 1 endpoint mới sẽ đc tạo trong api server, tài nguyên mới sẽ là 1 phần của endpoint được tạo.
Bản thân CRD chỉ là các khối dữ liệu: Mục đích chính của chúng là cung cấp một cơ chế để tạo, lưu trữ và hiển thị các đối tượng API Kubernetes chứa dữ liệu phù hợp với bất kỳ yêu cầu nào không được đáp ứng theo mặc định.CRD không có bất kỳ logic nào kèm theo, cũng như không có bất kỳ hành vi đặc biệt nào; một khi chúng được tạo, sửa đổi hoặc xóa, chúng sẽ không tự thực hiện hành động nào.
Các thao tác CRD được xử lý bên trong kube-apiserver bởi mô-đun apiextensions-apiserver. Đây không phải là một quá trình riêng biệt, mà là một mô-đun được tích hợp vào kube-apiserver.
Khi tạo 1 CRD, Kubernetes API Server sẽ tạo 1 đường dẫn RESTful API đến với tài CR vừa được tạo
Ví dụ về 1 file CRD:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: blogposts.iximiuz.com
spec:
group: iximiuz.com
names:
kind: BlogPost
listKind: BlogPostList
plural: blogposts
singular: blogpost
scope: Namespaced
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
description: BlogPost is a custom resource exemplar
type: object
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: BlogPostSpec is the spec for a BlogPost resource
type: object
properties:
title:
type: string
author:
type: string
status:
description: BlogPostStatus is the status for a BlogPost resource
type: object
properties:
publishedAt:
type: string
served: true
storage: true
subresources:
status: {}
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
Các mức độ, khả năng của operator
Nó có các mức độ phát triển khác nhau liên quan đến khả năng quản lý vòng đời của nó đối với ứng dụng. Mô hình sau sẽ cung cấp khả năng, những tính năng mà người dùng có thể sử dụng ở 1 operator
Operator thường được sử dụng cho các ứng dụng stateful nhằm tự động hóa 1 số đầu việc như:
Triển khai ứng dụng theo yêu cầu
Lấy và khôi phục trạng thái của ứng dụng
Xử lý, nâng cấp code khi có sự thay đổi như thay đổi cơ sở dữ liệu, hoặc các cấu hình cài đặt
Tạo Service cho các ứng dụng ko hỗ trợ Kubernetes API
Mô phỏng lỗi ở 1 phần hoặc trên cả cluster để kiểm tra khả năng khôi phục của nó
Để tạo 1 operator, sẽ có nhiều cách, nó sử dụng Operator SDK để tạo cùng với biểu đồ Helm, Ansible, ... để tạo ra các file yaml![Demo GIF](https://iximiuz.com/kubernetes-operator-pattern/kube-operator-example-opt.gif)
Với 1 app, nó sẽ có trạng thái hiện có và trạng thái mong muốn nó phải đạt được, thì operator chính là thứ giúp thực hiện được công việc này . Nó cung cấp khả năng tự động hóa mạnh mẽ cho những tài nguyên mà nó quản lý
Custom resource:
Custom Controller
Sử dụng Custom Resource khi:
kubectl
CRD:
Ví dụ về 1 file CRD:
Các mức độ, khả năng của operator