เชื่อมต่อ Kubernetes cluster ภายในกับ Operate
LOHA Operate ช่วยให้ workspace เห็น inventory แบบอ่านอย่างเดียวของ workload Kubernetes ที่ผู้ดูแลคลัสเตอร์อนุมัติอย่างชัดเจนเท่านั้น ใน pilot นี้รองรับ profile metadata-minimal: Deployment, ReplicaSet, StatefulSet, Pod, Job และ CronJob ใน namespace ที่ระบุชื่อ ไว้ ระบบไม่เก็บ logs หรือ Events และไม่แก้ไขคลัสเตอร์
Agent เชื่อมต่อ HTTPS ออกไปที่ LOHA operations gateway เท่านั้น LOHA ไม่เปิดการเชื่อมต่อขาเข้ามายังคลัสเตอร์ และขั้นตอนนี้ไม่ขอ kubeconfig, Kubernetes token, private key หรือรหัสผ่าน proxy ของคุณ
Workspace administrator เป็นผู้สร้างและยืนยัน connection ส่วน cluster administrator เป็นผู้เตรียมคลัสเตอร์ ตรวจ RBAC ที่ render แล้ว และติดตั้ง agent ควรเปิดทั้งสองหน้าต่างไว้ เพราะ enrollment token แสดงครั้งเดียวและเรียกคืนไม่ได้
ข้อกำหนดก่อนเริ่ม
ใช้คู่มือนี้เมื่อ Settings → Operate แสดงว่าสามารถติดตั้งได้แล้วเท่านั้น สถานะนี้ยืนยันว่า LOHA มี gateway ที่เข้าถึงได้, public CA bundle, chart version/checksum ที่เปลี่ยนแปลงไม่ได้, image repository/digest และ protocol version หากแสดงว่ายังติดตั้งไม่ได้ ให้กด ลองใหม่ ภายหลัง หรือติดต่อ platform administrator ผู้รับผิดชอบการเปิด Operate ห้ามเดา hostname, chart, image, CA bundle หรือใช้ tag latest จาก environment อื่น
Pilot นี้รองรับตาม qualification ที่พบด้านล่าง และไม่ใช่ข้อบังคับให้อัปเกรด Cluster installer จะไม่ตรวจพบ cluster โดยอัตโนมัติ และไม่อัปโหลด kubeconfig หรือ token
| ส่วนประกอบ | การรองรับที่ยืนยันสำหรับรีลีสนี้ |
|---|---|
| Kubernetes server | รองรับ 1.34.x เท่านั้น (>=1.34.0 <1.35.0) และผ่าน qualification บน UAT v1.34.8+rke2r2 แล้ว Kubernetes 1.25.x และ 1.35+ อยู่นอกช่วงที่ยืนยันสำหรับรีลีสนี้ หยุดติดตั้งเมื่ออยู่นอกช่วง ใช้ pilot cluster ที่รองรับหรือขอ validation ความเข้ากันได้ |
| Helm | ขั้นต่ำ 3.19.0 สำหรับ Kubernetes 1.34 และแนะนำ 3.19.x upstream Helm version-skew matrix ระบุว่า 3.19.x รองรับ Kubernetes 1.34.x–1.31.x แต่ช่วง upstream นี้ไม่ได้ขยายการรองรับ LOHA agent เกิน Kubernetes 1.34.x Helm 3 รุ่นอื่นต้องระบุชัดว่ารองรับ Kubernetes 1.34 ส่วน Helm 4 ยังไม่ผ่านการรับรองใน flow นี้ |
| kubectl | ใช้ 1.33.x–1.35.x กับ Kubernetes server 1.34 และแนะนำให้ตรงกับ 1.34.x ขั้นต่ำคือ 1.33.0 โดยขึ้นกับ HA server skew ตาม Kubernetes version-skew policy kubectl 1.35 ไม่ได้หมายความว่า Kubernetes server 1.35 ได้รับการรองรับ |
| Rancher / RKE2 | Agent ไม่ต้องใช้ Rancher และ LOHA ไม่มีเวอร์ชัน Rancher ขั้นต่ำที่รับรองแยกต่างหาก ให้ตรวจ Kubernetes downstream จริงและ combination ที่ผู้ขายรองรับ Rancher 2.7.4 ไม่ได้รับรอง Kubernetes 1.25.12 |
| Installer shell | Bash หรือ Zsh ที่มี helm, kubectl, mktemp และ sha256sum หรือ shasum โดยไม่กำหนดเวอร์ชัน shell เป็นตัวเลข |
| ต้องมี | สิ่งที่ตรวจ |
|---|---|
| Profile ที่รองรับ | metadata-minimal และชื่อ namespace อย่างน้อยหนึ่งชื่อที่ระบุชัด Events, logs, actions, production access, wildcard และ inventory ทั้งคลัสเตอร์อยู่นอก flow นี้ |
| เครื่อ งมือคลัสเตอร์ | Cluster administrator มี kubectl และ Helm 3 และเลือก context ของ non-production pilot cluster ได้ |
| ขอบเขต namespace | Namespace ที่อนุมัติมีอยู่แล้วทุกอัน ต้องจด UID ของแต่ละ namespace ก่อนติดตั้ง หากสร้าง namespace ชื่อเดิมใหม่แต่ UID เปลี่ยน ระบบจะ quarantine โดยตั้งใจ |
| เครือข่าย | Agent resolve ชื่อ gateway และออก HTTPS/443 ได้ ถ้าต้องผ่าน CONNECT proxy ให้ cluster administrator สร้าง Secret reference; URL และ credentials ต้องไม่อยู่ใน Helm values หรือคำสั่ง |
| Registry | Node ดึง agent image ที่ pin digest ได้ ถ้า registry ต้องใช้ credentials ให้ตั้ง image-pull mechanism ที่องค์กรอนุมัติแยกต่างหาก ห้ามใส่ registry credentials ลง values ของ agent |
| Trust และ storage | บันทึก public gateway CA bundle ที่ LOHA ให้ และเตรียม persistent storage ที่เข้ารหัสตามนโยบายผ่าน StorageClass หรือ PVC ที่มีอยู่แล้ว |
ก่อนทุกคำสั่งที่แก้คลัสเตอร์ ให้ตรวจ context ปัจจุบันและเวอร์ชัน server ควบคู่กับเวอร์ชัน client คำสั่งต่อไปนี้เป็น read-only:
kubectl config current-context
kubectl version --output=yaml
helm version --short
คำสั่งแรกต้องเป็นชื่อคลัสเตอร์ที่ตั้งใจใช้ ยืนยันว่า Kubernetes server อยู่ในช่วงที่ผ่านการรับรอง จากนั้นตรวจชื่อ namespace ด้วย kubectl get namespace หยุดทันทีหากผลลัพธ์ไม่ตรงกับที่คาดไว้
Operate connection กับ Delivery binding เป็นคนละสิ่งกัน Connection อาจ Active และส่ง inventory ได้ แต่โครงการยัง bind workload ไม่ได้ การ bind ต้องเปิด Delivery/Targets และมี Delivery binding ที่ระบุ managedWorkload.namespace ไว้อย่างชัดเจนด้วย
เตรียม scope และสร้าง connection
- ไปที่ Settings → Operate แล้วเลือก เชื่อมต่อ private cluster
- ตั้งชื่อที่จำง่าย เช่น
Payments stagingและใส่เฉพาะ namespace ที่ agent อ่านได้ หน้าจอจะตัดชื่อซ้ำและปฏิเสธชื่อ Kubernetes namespace ที่ไม่ถูกต้อง - ใช้ profile pilot เป็น metadata-minimal ซึ่งให้ inventory เท่านั้น
- คุณสามารถอ่าน UID ของทุก namespace ล่วงหน้าก่อนสร้าง connection ได้ ขั้นตอนนี้เป็น read-only ให้เก็บผลลัพธ์คู่กับชื่อ namespace แทนที่เฉพาะชื่อ namespace ของคุณในคำสั่งต่อไปนี้ทีละชื่อ:
kubectl get namespace 'YOUR_APPROVED_NAMESPACE' -o jsonpath='{.metadata.uid}'
printf '\n'
YOUR_APPROVED_NAMESPACE คือชื่อ namespace ที่คุณอนุมัติเอง ไม่ใช่ release coordinate Wizard จะแสดงช่อง UID หลังจากสร้าง connection แล้วเท่านั้น จึงให้เก็บคู่ชื่อกับ UID ไว้ใช้ในขั้นถัดไป
- สร้าง connection จากนั้น LOHA จะแสดง connection ID, installation profile, one-time enrollment token และช่อง UID สำหรับทุก namespace ที่อนุมัติ กรอกและตรวจ UID ที่เก็บไว้ในช่องเหล่านี้ก่อน wizard จะสร้าง
values.yaml, คำสั่ง render หรือคำสั่ง Helm install คัดลอกvalues.yamlที่ไม่มี secret จาก panel ลงไฟล์ local ไฟล์ประกอบด้วย connection ID, namespace UID, public gateway URL และชื่อ CA ConfigMap รวมถึง image digest ที่เปลี่ยนแปลงไม่ได้ แต่ไม่มี enrollment token
ห้ามใส่ enrollment token ลง ticket, chat, shell history, Helm values, Pod environment variable, Kubernetes Secret, ไฟล์ หรือ support request
เตรียมคลัสเตอร์
คำสั่งใน installation panel สร้างจาก installation profile ที่พร้อมใช้งาน ใช้คำสั่งที่สร้างจากหน้านั้นสำหรับ chart location, version, checksum, image digest และ gateway URL เอกสารสาธารณะตั้งใจไม่เผยแพร่ release coordinate ที่เดาหรือผูกกับ environment ใด environment หนึ่ง
สร้าง agent namespace และ public gateway CA ConfigMap ก่อน render chart บันทึก CA bundle ที่ LOHA แสดงไว้เป็นไฟล์ local ที่มีการป้องกัน แล้วใช้ path จริงของไฟล์นั้นในคำสั่ง PATH_TO_LOHA_PUBLIC_CA_BUNDLE เป็น placeholder สำหรับไฟล์ local เพียงจุดเดียว และต้องมี public certificate ที่ได้จาก installation panel เท่านั้น ห้ามมี private key
kubectl create namespace loha-operate-system --dry-run=client -o yaml | kubectl apply -f -
kubectl -n loha-operate-system create configmap loha-operate-gateway-ca \
--from-file=ca.crt='PATH_TO_LOHA_PUBLIC_CA_BUNDLE' \
--dry-run=client -o yaml | kubectl apply -f -
kubectl -n loha-operate-system get configmap loha-operate-gateway-ca
คำสั่งสุดท้ายต้องแสดง ConfigMap นี้เป็น public trust bundle เท่านั้น ห้ามแก้เป็น client certificate หรือ Secret
Identity storage และ proxy ที่เลือกใช้ได้
Agent สร้าง private key และเก็บ quarantine/active certificate ที่ /var/lib/loha/identity ให้เปิด persistent volume ค่าเริ่มต้นไว้ และเลือก StorageClass ที่เข้ารหัสตามนโยบาย หากใช้ customer-managed volume ที่สร้างไว้แล้ว ให้ตั้งเฉพาะ identity.persistence.existingClaim ใน values ที่คัดลอก ห้ามใช้ emptyDir สำหรับการติดตั้งแบบ durable เพราะหาก identity volume สูญหายต้อง revoke และ enroll ใหม่
values.yaml ที่คัดลอกคือ source of truth ให้ตรวจ field ต่อไปนี้ และห้ามแทนค่าที่ Settings สร้างจาก installation profile
| Field | ที่มาหรือตัวเลือกที่อนุญาต | หมายเหตุ |
|---|---|---|
image.repository | Settings installation profile | ชื่อ repository อย่างเดียว ห้ามใส่ tag หรือ digest ในช่องนี้ |
image.digest | Settings installation profile | immutable image digest แบบ sha256: ถ้าไม่มี chart จะ render ไม่ผ่าน |
gateway.url | Settings installation profile | HTTPS gateway URL ที่ไม่มี credentials |
gateway.caConfigMap | loha-operate-gateway-ca | ConfigMap ที่สร้างจาก public CA bundle |
connectionID | Settings connection detail | ระบุ connection นี้ ไม่ใช่ credential |
allowedNamespaces | รายชื่อ namespace ที่อนุมัติ | ทุกชื่อต้องระบุชัด ห้าม wildcard หรือ list ว่าง |
namespaceUIDs | UID ที่อ่านจาก live cluster | คู่ namespace=UID คั่นด้วย comma ต้องตรงกับ allowedNamespaces |
identity.persistence.enabled | true | ต้องเก็บ identity แบบ durable |
identity.persistence.storageClass | StorageClass local ที่อนุมัติ | เลือกได้เมื่อ cluster default ไม่เหมาะสม |
identity.persistence.existingClaim | ชื่อ PVC local ที่อนุมัติ | ใช้แทน PVC ที่ chart สร้าง ห้ามต ั้ง storage strategy ทั้งสองแบบ |
proxy.existingSecret | ชื่อ Secret local ที่อนุมัติ | เป็น reference เท่านั้น ห้ามเป็น proxy URL หรือ credential |
certificate.renewBefore และ resources | ใช้ chart defaults เว้นแต่มี policy ที่ review แล้ว | ห้ามเปลี่ยนเพื่อหลบปัญหา TLS หรือ resource |
หาก traffic ออกต้องผ่าน CONNECT proxy ให้ cluster administrator สร้าง Secret ใน loha-operate-system ที่มี HTTPS_PROXY และอาจมี NO_PROXY values ใส่ได้เฉพาะชื่อ Secret และชื่อ key:
proxy:
existingSecret: your-approved-proxy-reference
httpsProxyKey: HTTPS_PROXY
noProxyKey: NO_PROXY
your-approved-proxy-reference คือชื่อ Secret ที่ cluster administrator สร้างไว้แล้ว ห้ามใส่ proxy URL หรือ plaintext credential ใน values, Helm command, command history หรือ support request
ตรวจและติดตั้ง agent
ใช้ card Verify chart, Render และ Install ที่ Settings สร้างให้ตามลำดับ Card เหล่านั้นมี immutable values สำหรับ connection ของคุณ ขั้นตอน verified archive เป็นดังนี้:
set -eu
CHART_DIR="$(mktemp -d)"
trap 'rm -rf "$CHART_DIR"' EXIT
# วางคำสั่ง `helm pull ... --version ... --destination "$CHART_DIR"` ที่ Settings สร้างให้ตรงนี้
# วางคำสั่งเปรียบเทียบ expected SHA-256 ท ี่ Settings สร้างให้ตรงนี้ และต้องไม่มี mismatch
# `ARCHIVE` คือไฟล์ .tgz เพียงไฟล์เดียวที่คำสั่ง verify ยอมรับ
คำสั่งที่ระบบสร้างจะใช้ helm pull กับ OCI location และ version ที่ตรงกับ profile หา .tgz ได้เพียงหนึ่งไฟล์ แล้วเปรียบเทียบ digest sha256: ที่คำนวณได้กับ profile checksum หากไม่ตรงต้องหยุด: ทิ้ง archive และขอ installation profile ที่สร้างใหม่ ห้ามข้ามการตรวจ, retag image หรือแทน digest ด้วย latest
Profile ปัจจุบันตรวจ chart ด้วย SHA-256 checksum และตรวจ agent image ด้วย immutable digest หาก profile ในอนาคตมี release signature และคำสั่งตรวจ ให้ใช้คำสั่งที่ release นั้นให้มาเป็นการตรวจเพิ่ม ห้ามเดา signature URL, public key หรือคำสั่ง verify เอง
หลัง verify ให้ใช้ local archive เดิมสำหรับทั้งสองคำสั่ง:
# Card ที่ Settings สร้าง: helm template loha-operate-agent "$ARCHIVE" \
# --namespace loha-operate-system --values loha-operate-values.yaml
# Card ที่ Settings สร้าง: helm upgrade --install loha-operate-agent "$ARCHIVE" \
# --namespace loha-operate-system --create-namespace --values loha-operate-values.yaml
บรรทัดเหล่านี้เป็น comment โดยตั้งใจ ไม่ใช่ release placeholder ที่ copy ได้ ให้คัดลอก card ที่ตรงกันจาก Settings ซึ่ง $ARCHIVE ผ่านการ verify ใน shell เดียวกันแล้ว Chart ตั้งชื่อ Deployment เป็น loha-operate-agent-loha-operate-agent ใน namespace loha-operate-system เสมอ
ตรวจ manifest ที่ render ก่อนติดตั้ง สิทธิ์ที่ยอมรับมีเพียง get, list, watch แบบ namespaced สำหรับ Deployments, ReplicaSets, StatefulSets, Pods, Jobs และ CronJobs ใน namespace ที่อนุมัติ และ get namespaces แบบ cluster-scoped ที่จำกัดเฉพาะชื่อ namespace เหล่านั้น ต้องเห็น Deployment ที่ non-root, projected service-account token, identity PVC, gateway CA ConfigMap และ optional proxy Secret reference
ปฏิเสธ manifest ที่ให้สิทธิ์ Secrets, ConfigMaps, Nodes, namespace list, Events, logs, exec, attach, port-forward, write verbs, impersonation, wildcard RBAC, cluster-admin, privileged container, host network หรือ host path ห้ามติดตั้งจนกว่าจะเข้าใจความต่าง
รอ Pod และตรวจ Deployment ที่คาดไว้:
kubectl -n loha-operate-system rollout status deployment/loha-operate-agent-loha-operate-agent
kubectl -n loha-operate-system get pvc
Pod Ready หมายถึง Kubernetes เริ่ม process ได้เท่านั้น ไม่ได้ยืนยันว่า LOHA enroll, activate, รับ heartbeat หรือรับ observation แล้ว