Điểm:2

Tại sao kube-proxy xác thực với máy chủ kube-api bằng tài khoản dịch vụ thay vì chứng chỉ tls

lá cờ tn

Tôi đang đào sâu vào Kubernetes PKI. Tôi nhận thấy rằng hầu hết tất cả các thành phần của mặt phẳng điều khiển, bao gồm cả kubelet đều xác thực với máy chủ api bằng chứng chỉ TLS.
Chỉ kube-proxy & flannel chạy dưới dạng daemonsets xác thực bằng tài khoản dịch vụ. Các tài liệu nêu rõ:

DaemonSet: Vì bản thân kubelet được tải trên mỗi nút và đủ để bắt đầu các dịch vụ cơ sở, nên bạn có thể chạy kube-proxy và các dịch vụ dành riêng cho nút khác không phải như một quy trình độc lập, mà là một bộ daemon trong không gian tên hệ thống kube. Vì nó nằm trong cụm nên bạn có thể cấp cho nó một tài khoản dịch vụ phù hợp với các quyền phù hợp để thực hiện các hoạt động của nó. Đây có thể là cách đơn giản nhất để cấu hình các dịch vụ đó.

Điều đặc biệt ở đây là gì daemonsets liên quan đến xác thực?
Điểm đằng sau là gì "Vì bản thân kubelet được tải trên mỗi nút và đủ để bắt đầu các dịch vụ cơ sở"?

Điểm:3
lá cờ cn

Để hiểu rõ hơn về câu hỏi này, đáng để nhắc lại những điều cơ bản Các thành phần Kubernetes.

Các thành phần Kubernetes

Về cơ bản chúng ta có thể chia cụm thành:

  • Nút chính: Mặt phẳng điều khiển, chịu trách nhiệm đưa ra các quyết định toàn cầu về cụm
  • Worker Node(s) - chịu trách nhiệm chạy các nhóm bằng cách cung cấp môi trường thời gian chạy Kubernetes.

Chúng ta hãy xem các thành phần của phần "Nút" (công nhân):

kubelet

Một đại lý chạy trên mỗi nút trong cụm. Nó đảm bảo rằng hộp đựng đang chạy trong một vỏ. Kubelet lấy một bộ PodSpec được cung cấp thông qua các cơ chế khác nhau và đảm bảo rằng các vùng chứa được mô tả trong các PodSpec đó đang chạy và khỏe mạnh. Kubelet không quản lý các thùng chứa không được tạo bởi Kubernetes.

kube-proxy

kube-proxy là một proxy mạng chạy trên mỗi nút trong cụm của bạn, triển khai một phần của Kubernetes Dịch vụ Ý tưởng. kube-proxy duy trì các quy tắc mạng trên các nút. Các quy tắc mạng này cho phép giao tiếp mạng với các Nhóm của bạn từ các phiên mạng bên trong hoặc bên ngoài cụm của bạn. kube-proxy sử dụng lớp lọc gói hệ điều hành nếu có và nó khả dụng. Mặt khác, kube-proxy tự chuyển tiếp lưu lượng truy cập.

thời gian chạy vùng chứa

Thời gian chạy vùng chứa là phần mềm chịu trách nhiệm chạy các vùng chứa. Kubernetes hỗ trợ một số thời gian chạy vùng chứa: docker, chứa đựng, CRI-Ovà bất kỳ triển khai nào của Kubernetes CRI (Giao diện thời gian chạy vùng chứa).

Như kubelet và Container runtime là hai thành phần chính chịu trách nhiệm chạy pod và thiết lập kết nối với Control Plane, chúng phải được cài đặt trực tiếp trên hệ điều hành của nút. Nó cũng có nghĩa là cho kubelet nó phải có chứng chỉ TLS mà bạn đã đề cập trong câu hỏi của mình để đảm bảo kết nối an toàn với Mặt phẳng điều khiển. Thế còn kube-proxy?

Nó có thể được cài đặt theo hai cách trong quá trình cung cấp cụm - trực tiếp trên hệ điều hành của nút (ví dụ: cách này được sử dụng trong Kubernetes Con đường khó khăn) hoặc dưới dạng DaemonSet (kubeadm).

Khi nào kube-proxycài đặt trực tiếp nó cũng sẽ có một cách riêng biệt chứng chỉ TLS được tạo, giống như kubelet.

Cách thứ hai, là "DeamonSet" được đề cập trong câu hỏi của bạn. Có nghĩa là, thay vì chạy dưới dạng OS deamon trực tiếp trên nút, nó sẽ được cấu hình thông qua DeamonSet triển khai và nó sẽ chạy dưới dạng nhóm trên mọi nút. Ưu điểm so với chạy trực tiếp trên hệ điều hành:

  • Sử dụng các tính năng của DeamonSet, chúng tôi đảm bảo rằng trong trường hợp xảy ra lỗi, nhóm này sẽ tự động được tạo lại trên nút
  • ít can thiệp trực tiếp hơn vào hệ điều hành nút - thay vì tạo chứng chỉ TLS cặp mới, chúng tôi sẽ chỉ sử dụng ServiceAccount

Trả lời câu hỏi của bạn:

Điều gì đặc biệt ở đây về Daemonsets liên quan đến xác thực?

Để hiểu rõ hơn chúng ta có thể xem xét sâu hơn về kube-proxy được định cấu hình qua DaemonSets bằng cách sử dụng cụm được cung cấp với kubeadm. Dựa trên Tài liệu Kubernetes:

Một ServiceAccount cho kube-proxy được tạo ra trong hệ thống kube không gian tên; sau đó kube-proxy được triển khai dưới dạng DaemonSet:

  • Thông tin đăng nhập (ca.crtmã thông báo) đến mặt phẳng điều khiển đến từ ServiceAccount
  • Vị trí (URL) của máy chủ API đến từ Bản đồ cấu hình
  • Các kube-proxy ServiceAccount bị ràng buộc với các đặc quyền trong hệ thống: nút-proxier CụmVai trò

Có ba điểm. Trước tiên hãy kiểm tra cái đầu tiên:

Thông tin xác thực - bí mật

Nhận tên tài khoản dịch vụ từ định nghĩa nhóm:

kubectl get daemonset kube-proxy -n kube-system -o yaml
  ...
  tài khoản dịch vụ: kube-proxy
  serviceAccountName: kube-proxy
  ...

Như, có thể thấy, nó có được chỉ định một Tài khoản dịch vụ gọi điện kube-proxy:

Hãy kiểm tra nó:

kubectl get sa kube-proxy -n kube-system -o yaml

Đầu ra:

phiên bản api: v1
loại: ServiceAccount
metadata:
  tạoDấu thời gian: "2021-08-16T14:14:56Z"
  tên: kube-proxy
  không gian tên: hệ thống kube
  resourceVersion: "259"
  người dùng: (UID)
bí mật:
- tên: kube-proxy-token-2qhph

Như có thể thấy, chúng ta đang đề cập đến bí mật có tên kube-proxy-token-2qhph:

kubectl lấy bí mật kube-proxy-token-2qhph -n kube-system -o yaml

Đầu ra:

phiên bản api: v1
dữ liệu:
  ca.crt: (ĐÃ MÃ HÓA CA BASE64 CỦA APISERVER)
  không gian tên: (NAMESPACE BASE64 ĐƯỢC MÃ HÓA)
  mã thông báo: (BEARER TOKEN BASE64 ĐƯỢC MÃ HÓA)
loại: Bí mật
metadata:
  chú thích:
    kubernetes.io/service-account.name: kube-proxy
    kubernetes.io/service-account.uid: ...
  tạoDấu thời gian: "2021-08-16T14:14:56Z"
  tên: kube-proxy-token-2qhph
  không gian tên: hệ thống kube
  resourceVersion: "256"
  người dùng: (UID)
gõ: kubernetes.io/service-account-token

Bí mật này chứa đựng:

Bí mật đã tạo chứa CA công khai của máy chủ API và Mã thông báo web JSON (JWT) đã ký.

Chúng tôi đang sử dụng mã thông báo mang "JSON Web Token" này để xác minh các yêu cầu:

Tài khoản dịch vụ là trình xác thực được bật tự động sử dụng mã thông báo mang đã ký để xác minh yêu cầu.

JWT đã ký có thể được sử dụng làm mã thông báo mang để xác thực là tài khoản dịch vụ đã cho. Nhìn thấy ở trên để biết cách mã thông báo được bao gồm trong một yêu cầu. Thông thường, những bí mật này được gắn vào các nhóm để truy cập trong cụm vào máy chủ API, nhưng cũng có thể được sử dụng từ bên ngoài cụm.

Để biết thêm thông tin về mã thông báo bootstrap, tôi khuyên bạn nên đọc các tài liệu Kubernetes sau: Xác thực bằng Bootstrap Tokens, mã thông báo kubeadmKubernetes RBAC 101: Xác thực.

Bản đồ cấu hình

Bằng cách làm theo các bước tương tự như để lấy tên ServiceAccount, chúng ta sẽ nhận được tên ConfigMap được gắn vào kube-proxy nhóm:

kubectl get daemonset kube-proxy -n kube-system -o yaml
...
khối lượng:
      - bản đồ cấu hình:
          chế độ mặc định: 420
          tên: kube-proxy
 ...

Bây giờ, hãy lấy định nghĩa ConfigMap:

kubectl get cm kube-proxy -n kube-system -o yaml
  kubeconfig.conf: |-
    phiên bản api: v1
    loại: Cấu hình
    cụm:
    - cụm:
        cơ quan cấp chứng chỉ: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        máy chủ: https://10.230.0.12:6443
      tên: mặc định
    bối cảnh:
    - bối cảnh:
        cụm: mặc định
        không gian tên: mặc định
        người dùng: mặc định
      tên: mặc định
    bối cảnh hiện tại: mặc định
    người dùng:
    - tên: mặc định
      người dùng:
        tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token

Địa chỉ IP này ở bên dưới người phục vụ: là địa chỉ API vậy kube-proxy biết nó và có thể giao tiếp với nó. Ngoài ra còn có tài liệu tham khảo đến xe đẩymã thông báo được gắn từ kube-proxy-token-2qhph bí mật.

CụmVai trò

Hãy kiểm tra ClusterRole đã đề cập trước đó - hệ thống: nút-proxier:

kubectl mô tả hệ thống clusterrole:node-proxier
Tên: hệ thống: nút-proxier
Nhãn: kubernetes.io/bootstrapping=rbac-defaults
Chú thích: rbac.authorization.kubernetes.io/autoupdate: true
Quy tắc chính sách:
  Tài nguyên URL phi tài nguyên Tên tài nguyên Động từ
  --------- ----------------- -------------- -----
  sự kiện [] [] [tạo cập nhật bản vá]
  event.events.k8s.io [] [] [tạo cập nhật bản vá]
  các nút [] [] [lấy danh sách xem]
  điểm cuối [] [] [xem danh sách]
  dịch vụ [] [] [danh sách xem]
  endpointslices.Discovery.k8s.io [] [] [xem danh sách]

Chúng tôi có thể rằng vai trò này có thể liệt kê và xem các điểm cuối của nút, enpoint, dịch vụ, v.v ...

Bằng cách mô tả ClusterRoleBinding kubeadm:nút-proxier chúng ta có thể khẳng định vai trò đó hệ thống: nút-proxier được sử dụng bởi kube-proxy Tài khoản dịch vụ:

kubectl mô tả liên kết cụm vai trò kubeadm:node-proxier
Tên: kubeadm:node-proxier
Nhãn: <không có>
Chú thích: <không có>
Vai trò:
  Loại: ClusterRole
  Tên: hệ thống: nút-proxier
Đối tượng:
  Loại Tên Không gian tên
  ---- ---- ---------
  ServiceAccount kube-proxy kube-system

Để biết thêm chi tiết, tôi khuyên bạn nên đọc kubeadm chi tiết thực hiện.

Trả lời câu hỏi thứ hai của bạn:

Điểm đằng sau là gì "Vì bản thân kubelet được tải trên mỗi nút và đủ để bắt đầu các dịch vụ cơ sở" ?

Nó chỉ có nghĩa là nút đã thiết lập kết nối với Mặt phẳng điều khiển (như kubelet là thành phần chịu trách nhiệm về điều đó), vì vậy Mặt phẳng điều khiển có thể bắt đầu lập lịch trình kube-proxy pod trên nút bằng cách sử dụng thời gian chạy bộ chứa được xác định trước.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.