Sinh manifest Kubernetes: tám loại tài nguyên, các giá trị viết cứng và phần bạn phải bổ sung
Công cụ sinh khung tệp YAML cho tám loại tài nguyên Kubernetes hay dùng nhất, từ Deployment và Service tới ConfigMap, Secret, Ingress và bộ tự co giãn theo tải. Bạn điền tên, không gian tên, ảnh container, hạn mức tài nguyên và cổng, kết quả xuất ra để sao chép hoặc tải về dưới dạng tệp YAML.
Tính năng nổi bật
- Tám loại tài nguyên: Deployment, Service, ConfigMap, Secret, Ingress, StatefulSet, DaemonSet và bộ tự co giãn theo chiều ngang
- Điền tên tài nguyên, không gian tên, tên container, ảnh container và số bản sao
- Bốn ô hạn mức tài nguyên cho lượng yêu cầu và giới hạn của CPU cùng bộ nhớ
- Thêm nhiều cổng với tên, số cổng trong container và giao thức TCP hoặc UDP
- Thêm biến môi trường dạng giá trị trực tiếp hoặc dạng tham chiếu tới Secret
- Thêm ổ đĩa gắn vào container với bốn nguồn: ConfigMap, Secret, yêu cầu ổ đĩa lâu dài và đường dẫn trên máy chủ
- Nhập dữ liệu cho ConfigMap và Secret theo từng dòng khóa bằng giá trị, phần Secret tự mã hóa sang base64
- Nút sao chép toàn bộ và nút tải về tệp YAML đặt tên theo tên tài nguyên
Vì sao viết manifest từ đầu luôn mất nhiều thời gian hơn dự tính
Manifest Kubernetes không khó về mặt khái niệm nhưng rất khó nhớ về mặt chi tiết. Bạn phải nhớ đúng phiên bản giao diện lập trình cho từng loại tài nguyên, nhớ rằng phần chọn nhãn của Deployment phải khớp với nhãn trong khuôn mẫu pod, nhớ thứ tự và độ sâu thụt lề của mấy tầng lồng nhau. YAML lại là định dạng mà một dấu cách thừa cũng đủ làm hỏng cả tệp, và thông báo lỗi thường chỉ nói dòng nào sai chứ không nói vì sao. Với người mới, phần lớn thời gian không dành cho việc quyết định kiến trúc mà dành cho việc dò lại thụt lề và tra tài liệu xem trường này nằm ở đâu. Một khung sinh sẵn đúng cấu trúc giúp bạn bỏ qua khâu đó và tập trung vào phần thật sự cần suy nghĩ, tức là hạn mức tài nguyên, cách phơi dịch vụ ra ngoài và cách quản lý cấu hình.
Lợi ích khi sử dụng
- Không phải nhớ phiên bản giao diện lập trình và cấu trúc lồng nhau của từng loại tài nguyên
- Thụt lề đúng ngay từ đầu, tránh nhóm lỗi tốn thời gian nhất khi viết YAML
- Có sẵn phần chọn nhãn khớp với nhãn của khuôn mẫu pod, chỗ người mới hay làm sai
- Sinh nhanh nhiều tài nguyên cùng tên để ghép thành một bộ triển khai hoàn chỉnh
- Toàn bộ chạy trong trình duyệt, không cần quyền truy cập cụm và không gửi cấu hình đi đâu
Cách sinh một manifest và đưa vào cụm
- 1Chọn loại tài nguyên trước, vì mỗi loại hiện ra một bộ ô nhập khác nhau.
- 2Điền tên và không gian tên, nên đặt tên toàn chữ thường và dùng dấu gạch nối theo quy ước đặt tên của Kubernetes.
- 3Với Deployment và các loại chạy container, điền ảnh container kèm nhãn phiên bản cụ thể thay vì nhãn mới nhất.
- 4Rà lại bốn ô hạn mức tài nguyên, cổng và biến môi trường, rồi bấm sinh mã.
- 5Tải tệp về, kiểm tra bằng lệnh áp dụng ở chế độ chạy thử phía máy chủ trước, sau đó mới áp dụng thật.
Tám loại tài nguyên và khung mà công cụ sinh cho từng loại
Deployment sinh ra khung đầy đủ nhất, gồm số bản sao, phần chọn nhãn khớp với nhãn trong khuôn mẫu pod, một container với chính sách kéo ảnh chỉ khi chưa có sẵn, danh sách cổng, khối hạn mức tài nguyên, và các khối biến môi trường cùng ổ đĩa nếu bạn có thêm. StatefulSet và DaemonSet dùng khung tương tự với vài khác biệt phù hợp loại tài nguyên. Service sinh ra khối chọn nhãn theo tên tài nguyên cùng một cổng, với ba kiểu phơi dịch vụ là chỉ trong cụm, mở cổng trên mọi nút, và tạo bộ cân bằng tải bên ngoài. ConfigMap và Secret nhận dữ liệu theo từng dòng dạng khóa bằng giá trị rồi dựng thành khối dữ liệu. Ingress sinh sẵn quy tắc định tuyến theo tên miền và đường dẫn, kèm các chú thích dành cho bộ điều khiển Nginx. Bộ tự co giãn theo chiều ngang sinh khung với hai chỉ số theo dõi là tỷ lệ sử dụng CPU và bộ nhớ. Vì mỗi loại là một tệp riêng, muốn có bộ triển khai đầy đủ bạn cần sinh lần lượt rồi ghép lại, ngăn cách bằng dòng ba dấu gạch ngang.
Secret trong Kubernetes chỉ mã hóa base64, và đó không phải bảo mật
Đây là điều bắt buộc phải hiểu trước khi dùng phần sinh Secret. Khi bạn nhập mật khẩu hay khóa truy cập, công cụ chuyển chúng sang chuỗi base64 vì đó là định dạng mà Kubernetes yêu cầu. Base64 là phép mã hóa để biểu diễn dữ liệu, không phải phép mã hóa bảo mật: bất kỳ ai có tệp YAML đều giải ngược lại được trong một giây bằng một lệnh có sẵn trên mọi máy. Nghĩa là một tệp Secret nhìn thì có vẻ khó đọc nhưng thực chất tương đương văn bản thuần. Hai hệ quả thực tế. Thứ nhất, tuyệt đối không đưa tệp Secret có giá trị thật vào kho mã nguồn, kể cả kho riêng tư, vì lịch sử phiên bản giữ lại mãi mãi và việc xóa sau đó rất phiền. Thứ hai, ngay trong cụm, dữ liệu Secret cũng chỉ được mã hóa khi kho lưu trữ trạng thái của cụm được cấu hình mã hóa, và quyền đọc Secret phải được siết bằng phân quyền theo vai trò. Cách làm phổ biến trong thực tế là dùng một cơ chế Secret niêm phong, một bộ điều khiển đồng bộ từ kho bí mật bên ngoài, hoặc dịch vụ quản lý bí mật của nhà cung cấp hạ tầng.
Lượng yêu cầu và giới hạn tài nguyên: hai con số làm hai việc khác nhau
Lượng yêu cầu là con số bộ lập lịch dùng để chọn nút: nó tìm nút còn đủ phần tài nguyên chưa bị đặt trước và đặt pod vào đó. Giới hạn là trần cứng lúc chạy. Với CPU, vượt trần không làm container chết mà bị bóp lại, biểu hiện là ứng dụng chậm hẳn dù biểu đồ không báo lỗi gì, và đây là nguyên nhân của rất nhiều sự cố khó hiểu. Với bộ nhớ thì ngược lại, vượt trần khiến hệ điều hành kết liễu tiến trình và container bị khởi động lại. Về đơn vị, một nghìn phần nghìn đơn vị CPU tương đương một nhân, nên giá trị mặc định 100 phần nghìn là một phần mười nhân và 500 phần nghìn là nửa nhân. Đơn vị bộ nhớ có hậu tố hai chữ cái là bội của 1024, nên 128 đơn vị đó bằng đúng 134.217.728 byte. Quan hệ giữa hai con số còn quyết định mức ưu tiên khi nút thiếu tài nguyên: đặt hai con số bằng nhau cho mức ưu tiên cao nhất, đặt lượng yêu cầu thấp hơn giới hạn cho mức trung bình, không đặt gì cả cho mức thấp nhất và pod của bạn sẽ bị loại bỏ đầu tiên.
Những trường mà manifest chạy thật cần nhưng công cụ chưa sinh
Quan trọng nhất là hai loại thăm dò trạng thái. Thăm dò sẵn sàng quyết định khi nào pod được nhận lưu lượng, thiếu nó thì trong lúc triển khai bản mới, người dùng sẽ gặp lỗi vì lưu lượng được đẩy vào container chưa khởi động xong. Thăm dò sống quyết định khi nào container cần được khởi động lại vì treo. Với ứng dụng khởi động chậm còn nên thêm thăm dò khởi động để hai loại kia không kết luận sai. Thứ hai là ngữ cảnh bảo mật: chạy bằng người dùng không phải quản trị, cấm nâng quyền, đặt hệ thống tệp gốc ở chế độ chỉ đọc; đây là những thiết lập mà nhiều cụm có chính sách bắt buộc và thiếu chúng thì pod bị từ chối. Thứ ba là chiến lược cập nhật với số pod tối đa được vượt và số pod tối đa không sẵn sàng, cùng một quy định về số pod tối thiểu phải luôn hoạt động khi bảo trì nút. Ngoài ra còn tài khoản dịch vụ riêng thay vì tài khoản mặc định, bộ nhãn theo quy ước khuyến nghị, quy tắc phân tán pod để chúng không dồn hết lên một nút, và chính sách mạng để giới hạn ai được gọi vào.
Các giá trị viết cứng cần sửa và cách kiểm tra trước khi áp dụng
Có mấy chỗ công cụ điền sẵn để tệp chạy được ngay nhưng bạn phải xem lại. Khi chọn kiểu phơi dịch vụ mở cổng trên mọi nút, số cổng được đặt cố định là 30000; nếu bạn triển khai nhiều dịch vụ thì phải đổi vì mỗi cổng chỉ dùng cho một dịch vụ, và dải hợp lệ mặc định là từ 30000 tới 32767. Manifest Ingress được sinh kèm các chú thích riêng của bộ điều khiển Nginx và tên lớp Ingress cũng là nginx, nên nếu cụm của bạn dùng bộ điều khiển khác thì phải thay cả hai; ngoài ra khung này chưa có khối chứng chỉ bảo mật, muốn chạy giao thức mã hóa bạn phải thêm phần đó cùng tên Secret chứa chứng chỉ. Bộ tự co giãn được đặt sẵn tối thiểu một và tối đa mười bản sao với ngưỡng 70 phần trăm cho CPU và 80 phần trăm cho bộ nhớ, và nó chỉ hoạt động khi cụm đã cài dịch vụ thu thập chỉ số. Cuối cùng, trước khi áp dụng thật, hãy chạy lệnh áp dụng ở chế độ chạy thử phía máy chủ để máy chủ kiểm tra lược đồ mà không thay đổi gì, và dùng lệnh giải thích tài nguyên khi cần tra nhanh một trường.
Câu hỏi thường gặp (FAQ)
Secret sinh ra có an toàn để lưu trong kho mã nguồn không?
Không. Giá trị chỉ được mã hóa base64, tức là phép biểu diễn dữ liệu chứ không phải phép mã hóa bảo mật, ai có tệp đều giải ngược được trong một giây. Đừng đưa tệp Secret có giá trị thật vào kho mã nguồn kể cả kho riêng tư, vì lịch sử phiên bản giữ lại mãi mãi. Hãy dùng cơ chế Secret niêm phong hoặc kho bí mật bên ngoài.
Lượng yêu cầu và giới hạn tài nguyên khác nhau thế nào?
Lượng yêu cầu là con số bộ lập lịch dùng để chọn nút còn đủ chỗ, còn giới hạn là trần cứng lúc chạy. Vượt trần CPU thì container bị bóp tốc độ chứ không chết, biểu hiện là ứng dụng chậm bất thường. Vượt trần bộ nhớ thì tiến trình bị kết liễu và container khởi động lại.
Con số 100m và 128Mi nghĩa là gì?
Một nghìn phần nghìn đơn vị CPU tương đương một nhân, nên 100 phần nghìn là một phần mười nhân và 500 phần nghìn là nửa nhân. Hậu tố hai chữ cái của bộ nhớ là bội của 1024, nên 128 đơn vị đó bằng đúng 134.217.728 byte. Đừng nhầm với hậu tố một chữ cái vốn là bội của 1000.
Có nên đặt lượng yêu cầu bằng giới hạn không?
Với dịch vụ quan trọng thì nên, vì khi hai con số bằng nhau cho cả CPU lẫn bộ nhớ, pod nhận mức ưu tiên cao nhất và ít bị loại bỏ khi nút thiếu tài nguyên. Với dịch vụ ít quan trọng, đặt lượng yêu cầu thấp hơn giới hạn giúp dùng chung tài nguyên hiệu quả hơn, đổi lại rủi ro bị dừng khi nút quá tải.
Vì sao manifest thiếu phần thăm dò trạng thái?
Công cụ chưa sinh phần đó và bạn phải tự thêm. Thăm dò sẵn sàng quyết định khi nào pod được nhận lưu lượng, thiếu nó thì trong lúc triển khai bản mới người dùng sẽ gặp lỗi vì lưu lượng đi vào container chưa khởi động xong. Thăm dò sống quyết định khi nào cần khởi động lại container bị treo.
Kiểu phơi dịch vụ nào nên dùng?
Kiểu chỉ trong cụm là mặc định và đúng cho phần lớn dịch vụ nội bộ. Kiểu mở cổng trên mọi nút chủ yếu dùng khi thử nghiệm hoặc khi có bộ cân bằng tải bên ngoài trỏ vào. Kiểu tạo bộ cân bằng tải cấp một địa chỉ công khai và thường phát sinh chi phí trên hạ tầng đám mây, nên nhiều dịch vụ web dùng Ingress sẽ rẻ hơn.
Số cổng 30000 trong manifest Service có phải đổi không?
Có nếu bạn triển khai nhiều dịch vụ, vì mỗi số cổng chỉ dùng cho một dịch vụ trong cụm. Dải hợp lệ mặc định là từ 30000 tới 32767. Bạn cũng có thể xóa hẳn dòng đó để cụm tự cấp một số cổng còn trống, cách này an toàn hơn khi bạn không cần một số cổng cố định.
Manifest Ingress dùng được cho mọi cụm không?
Không. Khung sinh ra gắn với bộ điều khiển Nginx qua các chú thích riêng và qua tên lớp Ingress, nên nếu cụm của bạn dùng bộ điều khiển khác thì phải thay cả hai. Ngoài ra khung chưa có khối chứng chỉ bảo mật, muốn chạy giao thức mã hóa bạn phải thêm phần đó cùng tên Secret chứa chứng chỉ.
Bộ tự co giãn cần điều kiện gì mới hoạt động?
Cụm phải cài dịch vụ thu thập chỉ số thì bộ tự co giãn mới đọc được mức sử dụng CPU và bộ nhớ. Ngoài ra các container phải khai báo lượng yêu cầu tài nguyên, vì tỷ lệ phần trăm được tính trên con số đó; thiếu khai báo thì bộ tự co giãn không tính được và sẽ không hoạt động.
Nên gộp nhiều tài nguyên vào một tệp hay tách riêng?
Cả hai đều được. Trong một tệp, bạn ngăn các tài nguyên bằng dòng ba dấu gạch ngang. Cách thông dụng là gom các tài nguyên của cùng một ứng dụng vào một thư mục, mỗi loại một tệp, rồi áp dụng cả thư mục. Với dự án nhiều môi trường, nên dùng công cụ quản lý cấu hình theo lớp thay vì sao chép tệp cho từng môi trường.
Kiểm tra manifest trước khi áp dụng bằng cách nào?
Chạy lệnh áp dụng ở chế độ chạy thử phía máy chủ để chính máy chủ kiểm tra lược đồ và các quy tắc nhận vào mà không thay đổi gì trong cụm. Ngoài ra có thể dùng công cụ kiểm tra lược đồ ngoại tuyến trong quy trình tích hợp liên tục, và dùng lệnh giải thích tài nguyên khi cần tra nhanh một trường.
Có nên dùng nhãn ảnh mới nhất cho container không?
Không nên. Nhãn đó trỏ tới một bản ảnh thay đổi theo thời gian nên bạn không biết chính xác đang chạy phiên bản nào, việc quay lui khi có sự cố cũng khó. Hãy dùng nhãn phiên bản cụ thể hoặc mã băm của ảnh, kết hợp với chính sách kéo ảnh phù hợp để cụm không tải lại ảnh không cần thiết.
Từ khóa liên quan
- tạo file yaml kubernetes
- kubernetes yaml generator
- deployment yaml mẫu
- service yaml kubernetes
- ingress yaml mẫu
- kubernetes secret base64
- requests và limits trong kubernetes
- liveness và readiness probe
- horizontal pod autoscaler
- configmap trong kubernetes
- statefulset và deployment khác nhau
- daemonset là gì
- nodeport dải cổng
- kubectl apply dry run
- quality of service kubernetes
- oomkilled trong kubernetes
- cpu throttling container
- sealed secrets
- manifest kubernetes cho người mới
- công cụ devops miễn phí
