0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Kubernetes: Hiểu Về Partial Server-Side Apply

Đăng vào 1 ngày trước

• 7 phút đọc

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:

Kho lưu trữ mã thí nghiệm

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 Copy
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 Copy
"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 Copy
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 Copy
"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:

  1. Trong lần áp dụng đầu tiên, cat-owner trở thành chủ sở hữu duy nhất của trường spec.breed
  2. Trong lần áp dụng thứ hai, cat-owner không bao gồm spec.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"
  3. 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.colorspec.age. Trường spec.color được quản lý bởi cat-owner không bị ảnh hưởng.

json Copy
"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-controllercat-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:

  1. 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.

  2. 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!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào