Giới Thiệu
Trong bài viết này, chúng ta sẽ khám phá những gì xảy ra khi áp dụng các manifest một phần bằng cách sử dụng Server-Side Apply (SSA) của Kubernetes. Cụ thể, tôi sẽ điều tra thông qua các thí nghiệm về việc xảy ra điều gì khi bạn bỏ qua các trường đã được quản lý bởi một field manager trong các lần áp dụng tiếp theo.
Khi phát triển các controller, tôi đã tự hỏi: "Điều gì sẽ xảy ra với các trường mà tôi không đưa vào khi áp dụng các manifest một phần với SSA?" Nếu chỉ có các phần đã gửi được hợp nhất như một sự khác biệt, chúng ta có thể đơn giản hóa mã của mình bằng cách gửi chỉ các trường mà chúng ta muốn quản lý. Ngược lại, nếu chúng ta cần gửi tất cả các trường đã được quản lý mỗi lần, chúng ta cần phải chú ý đến điều này khi lập trình, nếu không chúng ta có thể vô tình tạo ra lỗi làm mất các trường.
Việc phát triển các controller với những giả định sai lệch có thể dẫn đến lỗi vô tình phá hủy tài nguyên. Mặc dù điều này liên quan đến việc hiểu các thông số kỹ thuật cơ bản của SSA, tôi cảm thấy điều quan trọng là phải có một hiểu biết rõ ràng, đó là lý do tôi viết bài này.
Mã thí nghiệm được đề cập trong bài viết này có sẵn trong kho lưu trữ sau:
Những Gì Bạn Sẽ Học Được
- Hành vi khi áp dụng các manifest một phần với Server-Side Apply
- Quyền sở hữu trường và vai trò của các field manager
- Cơ chế xóa bỏ xảy ra khi các trường quản lý bị bỏ qua
- Quản lý hợp tác bởi nhiều field manager
Mục Đích Của Thí Nghiệm
Mục tiêu của thí nghiệm này là hiểu điều gì xảy ra khi một field manager bỏ qua một trường trong một lần áp dụng tiếp theo mà đã được bao gồm trong một manifest đã áp dụng trước đó.
Trong phát triển controller thực tế, bạn có thể gặp những kịch bản như: "Ban đầu tôi đang quản lý trường breed, nhưng sau đó tôi chỉ muốn cập nhật trường color." Thì điều gì sẽ xảy ra với trường breed trong trường hợp này?
Thí Nghiệm 1: Điều Gì Xảy Ra Khi Bạn Bỏ Qua Các Trường Được Quản Lý Bởi Cùng Một Manager?
Trong thí nghiệm này, tôi sẽ sử dụng một tài nguyên tùy chỉnh gọi là Cat
. Tôi sẽ chỉ định cat-owner
làm "field manager" quản lý quyền sở hữu trường.
Bước 1: Lần Áp Dụng Đầu Tiên (chỉ trường breed)
Đầu tiên, tôi sẽ áp dụng một manifest một phần chỉ chứa spec.breed
vào tài nguyên Cat my-cat
.
go
cat := applycatv1.Cat("my-cat", "default").
WithSpec(applycatv1.CatSpec().
WithBreed("Maine Coon"))
err := cl.Apply(ctx, cat, client.FieldOwner("cat-owner"), client.ForceOwnership)
Sau thao tác này, trạng thái tài nguyên trông như sau. Bạn có thể thấy rằng cat-owner
đang quản lý spec.breed
được ghi lại trong managedFields
.
json
"spec": {
"breed": "Maine Coon"
},
"managedFields": [
{
"manager": "cat-owner",
...
"fieldsV1": {
"f:spec": {
"f:breed": {}
}
}
}
]
Bước 2: Lần Áp Dụng Thứ Hai (chỉ trường color, bỏ qua breed)
Tiếp theo, tôi sẽ áp dụng một manifest chỉ chứa spec.color
vào cùng tài nguyên my-cat
, sử dụng cùng một cat-owner
. Điểm quan trọng là manifest này không bao gồm spec.breed
.
go
cat := applycatv1.Cat("my-cat", "default").
WithSpec(applycatv1.CatSpec().
WithColor("Black")) // không có breed
err := cl.Apply(ctx, cat, client.FieldOwner("cat-owner"), client.ForceOwnership)
Quan Sát
Sau lần áp dụng thứ hai, trong khi spec.color
được thêm vào tài nguyên, trường spec.breed
đã hoàn toàn biến mất.
json
"spec": {
"color": "Black"
},
"managedFields": [
{
"manager": "cat-owner",
...
"fieldsV1": {
"f:spec": {
"f:color": {}
}
}
}
]
Nhìn vào managedFields
, chúng ta có thể thấy rằng mục tiêu được quản lý của cat-owner
đã được cập nhật từ spec.breed
sang spec.color
.
Tại Sao Trường Bị Xóa?
Hành vi này liên quan đến "quản lý quyền sở hữu khai báo" của Server-Side Apply. Tài liệu chính thức của Kubernetes giải thích chính xác trường hợp này:
Nếu bạn xóa một trường khỏi một manifest và áp dụng manifest đó, Server-Side Apply kiểm tra xem có bất kỳ field manager nào khác cũng sở hữu trường đó hay không. Nếu trường đó không được sở hữu bởi bất kỳ field manager nào khác, nó sẽ bị xóa khỏi đối tượng sống hoặc được đặt lại giá trị mặc định của nó, nếu có. Quy tắc tương tự cũng áp dụng cho các mục trong danh sách hoặc bản đồ liên kết.
-- Quản lý trường - Kubernetes
Giải thích này mô tả hoàn hảo kết quả thí nghiệm của chúng ta:
- Trong lần áp dụng đầu tiên,
cat-owner
trở thành chủ sở hữu duy nhất của trườngspec.breed
- Trong lần áp dụng thứ hai,
cat-owner
không bao gồmspec.breed
trong manifest. Điều này được hiểu là "Tôi không còn muốn quản lýspec.breed
nữa" - Vì không có chủ sở hữu khác của
spec.breed
, Server-Side Apply đã xóa trường này khỏi đối tượng sống
Đây là một tính năng dọn dẹp giúp ngăn chặn các trường không được quản lý tồn tại mãi mãi. Để tránh việc xóa trường một cách vô tình, bạn cần phải hiểu rằng bạn phải bao gồm tất cả các trường mà bạn muốn quản lý trong mỗi yêu cầu áp dụng.
Thí Nghiệm Bổ Sung: Điều Gì Xảy Ra Khi Một Field Manager Khác Xuất Hiện?
Vậy điều gì xảy ra khi một field manager khác xuất hiện? Hãy cùng xem khía cạnh quyền sở hữu của SSA.
Bước 3: Lần Áp Dụng Thứ Ba Bởi Một Manager Khác
Từ trạng thái trước đó (nơi chỉ có spec.color
tồn tại), một field manager mới có tên là age-controller
áp dụng một manifest chỉ chứa spec.age
.
Quan Sát
Sau khi áp dụng, tài nguyên có cả spec.color
và spec.age
. Trường spec.color
được quản lý bởi cat-owner
không bị ảnh hưởng.
json
"spec": {
"color": "Black",
"age": 3
},
"managedFields": [
{
"manager": "age-controller",
...
"fieldsV1": {
"f:spec": {
"f:age": {}
}
}
},
{
"manager": "cat-owner",
...
"fieldsV1": {
"f:spec": {
"f:color": {}
}
}
}
]
managedFields
ghi lại hai mục cho age-controller
và cat-owner
, rõ ràng theo dõi các trường mà mỗi người sở hữu.
age-controller
không bỏ qua bất kỳ trường nào mà nó đã từng sở hữu (không có trường nào tồn tại trong trường hợp này), vì vậy nó chỉ đơn giản là tuyên bố quyền sở hữu đối với spec.age
. Nó không can thiệp vào các trường do cat-owner
quản lý.
Tóm Tắt
Từ thí nghiệm này, chúng ta có thể hiểu hai khía cạnh chính của việc sử dụng Server-Side Apply:
-
Tính Toàn Vẹn của Manifest = Bao Gồm Tất Cả Các Trường: Khi một field manager bỏ qua một trường mà nó đang quản lý khỏi manifest áp dụng tiếp theo, trường đó sẽ bị xóa (nếu không có chủ sở hữu khác). Do đó, luôn bao gồm các trường dưới sự quản lý trong manifest của bạn để duy trì tính toàn vẹn của manifest.
-
Tính Toàn Vẹn Theo Chủ Sở Hữu: Nhiều field manager có thể an toàn quản lý các trường khác nhau của cùng một tài nguyên mà không làm ảnh hưởng đến nhau, vì vậy bạn không cần phải bao gồm các trường do người khác quản lý trong manifest của mình.
Server-Side Apply là một tính năng quan trọng trong môi trường Kubernetes nơi nhiều controller cần hợp tác quản lý một tài nguyên duy nhất. Hiện tượng các trường "biến mất" không phải là một lỗi—đó là một "tính năng" mạnh mẽ giúp quản lý cấu hình khai báo trở nên mạnh mẽ hơn. Hiểu được hành vi này cho phép quản lý tài nguyên an toàn hơn.
Cảm ơn bạn đã đọc đến cuối bài viết!