การแปลบทความจัดทำขึ้นในวันเริ่มต้นหลักสูตร
หากคุณกำลังอ่านข้อความนี้ คุณคงเคยได้ยินบางอย่างเกี่ยวกับ Kubernetes มาก่อน (และถ้าไม่ คุณมาอยู่ที่นี่ได้อย่างไร) แต่จริงๆ แล้ว Kubernetes คืออะไร? นี้
พูดตามตรงฉันไม่มั่นใจ 100% แต่ฉันคิดว่ามันน่าสนใจที่จะเจาะลึกถึงข้อมูลภายในและดูว่าเกิดอะไรขึ้นใน Kubernetes ภายใต้นามธรรมหลายชั้น เพื่อความสนุก เรามาดูกันว่าจริงๆ แล้ว "คลัสเตอร์ Kubernetes" แบบขั้นต่ำมีลักษณะเป็นอย่างไร (จะง่ายกว่านี้มาก.
ฉันถือว่าคุณมีความรู้พื้นฐานเกี่ยวกับ Kubernetes, Linux และคอนเทนเนอร์ ทุกสิ่งที่เราพูดถึงมีจุดประสงค์เพื่อการวิจัย/การเรียนรู้เท่านั้น อย่านำไปใช้จริง!
ทบทวน
Kubernetes มีส่วนประกอบมากมาย ตาม
มีองค์ประกอบอย่างน้อยแปดรายการที่แสดงไว้ที่นี่ แต่เราจะเพิกเฉยต่อองค์ประกอบส่วนใหญ่ ฉันต้องการระบุว่าสิ่งขั้นต่ำที่สามารถเรียกได้อย่างสมเหตุสมผลว่า Kubernetes ประกอบด้วยองค์ประกอบหลักสามประการ:
- คูเบเลต
- kube-apiserver (ซึ่งขึ้นอยู่กับ ฯลฯ - ฐานข้อมูล)
- รันไทม์คอนเทนเนอร์ (นักเทียบท่าในกรณีนี้)
มาดูกันว่าเอกสารพูดถึงอะไรเกี่ยวกับแต่ละเอกสาร (
เอเจนต์ที่ทำงานบนแต่ละโหนดในคลัสเตอร์ ทำให้แน่ใจว่าคอนเทนเนอร์กำลังทำงานอยู่ในพ็อด
ฟังดูง่ายพอ แล้วไง รันไทม์ของคอนเทนเนอร์ (รันไทม์คอนเทนเนอร์)?
รันไทม์ของคอนเทนเนอร์คือโปรแกรมที่ออกแบบมาเพื่อรันคอนเทนเนอร์
ข้อมูลมาก แต่ถ้าคุณคุ้นเคยกับ Docker คุณก็ควรมีแนวคิดทั่วไปว่ามันทำอะไรได้บ้าง (รายละเอียดของการแยกความรับผิดชอบระหว่างคอนเทนเนอร์รันไทม์และคูเบเล็ตนั้นค่อนข้างละเอียดอ่อนจริงๆ และฉันจะไม่พูดถึงสิ่งเหล่านี้ที่นี่)
И เซิร์ฟเวอร์เอพีไอ?
API Server คือส่วนประกอบแผงควบคุม Kubernetes ที่เปิดเผย Kubernetes API เซิร์ฟเวอร์ API คือฝั่งไคลเอ็นต์ของแผงควบคุม Kubernetes
ใครก็ตามที่เคยทำอะไรกับ Kubernetes จะต้องโต้ตอบกับ API โดยตรงหรือผ่าน kubectl นี่คือหัวใจสำคัญของสิ่งที่ทำให้ Kubernetes Kubernetes - สมองที่เปลี่ยนภูเขา YAML ที่เราทุกคนรู้จักและชื่นชอบ (?) ให้เป็นโครงสร้างพื้นฐานในการทำงาน ดูเหมือนชัดเจนว่า API ควรมีอยู่ในการกำหนดค่าขั้นต่ำของเรา
เงื่อนไขเบื้องต้น
- เครื่องเสมือนหรือฟิสิคัล Linux พร้อมการเข้าถึงรูท (ฉันใช้ Ubuntu 18.04 บนเครื่องเสมือน)
- และทั้งหมดนี้!
การติดตั้งที่น่าเบื่อ
เราจำเป็นต้องติดตั้ง Docker บนเครื่องที่เราจะใช้ (ฉันจะไม่ลงรายละเอียดเกี่ยวกับวิธีการทำงานของ Docker และคอนเทนเนอร์ หากคุณสนใจก็มี apt
:
$ sudo apt install docker.io
$ sudo systemctl start docker
หลังจากนั้นเราจะต้องได้รับไบนารีของ Kubernetes ที่จริงแล้ว สำหรับการเปิดตัว “คลัสเตอร์” ของเราครั้งแรก เราต้องการเพียงเท่านั้น kubelet
เนื่องจากเพื่อเรียกใช้ส่วนประกอบเซิร์ฟเวอร์อื่น ๆ ที่เราสามารถใช้ได้ kubelet
. หากต้องการโต้ตอบกับคลัสเตอร์ของเราหลังจากที่คลัสเตอร์ทำงาน เราจะใช้เช่นกัน kubectl
.
$ curl -L https://dl.k8s.io/v1.18.5/kubernetes-server-linux-amd64.tar.gz > server.tar.gz
$ tar xzvf server.tar.gz
$ cp kubernetes/server/bin/kubelet .
$ cp kubernetes/server/bin/kubectl .
$ ./kubelet --version
Kubernetes v1.18.5
จะเกิดอะไรขึ้นถ้าเราเพียงแค่วิ่ง kubelet
?
$ ./kubelet
F0609 04:03:29.105194 4583 server.go:254] mkdir /var/lib/kubelet: permission denied
kubelet
จะต้องทำงานในฐานะรูท ค่อนข้างสมเหตุสมผล เนื่องจากเขาจำเป็นต้องจัดการโหนดทั้งหมด ลองดูที่พารามิเตอร์ของมัน:
$ ./kubelet -h
<слишком много строк, чтобы разместить здесь>
$ ./kubelet -h | wc -l
284
ว้าว ตัวเลือกเยอะมาก! โชคดีที่เราต้องการเพียงสองสามอันเท่านั้น นี่คือหนึ่งในพารามิเตอร์ที่เราสนใจ:
--pod-manifest-path string
เส้นทางไปยังไดเร็กทอรีที่มีไฟล์สำหรับพ็อดแบบคงที่ หรือเส้นทางไปยังไฟล์ที่อธิบายพ็อดแบบคงที่ ไฟล์ที่ขึ้นต้นด้วยจุดจะถูกละเว้น (เลิกใช้แล้ว: ตัวเลือกนี้จะต้องตั้งค่าในไฟล์การกำหนดค่าที่ส่งไปยัง Kubelet ผ่านตัวเลือก --config สำหรับข้อมูลเพิ่มเติม โปรดดูที่
ตัวเลือกนี้ทำให้เราสามารถทำงานได้
ขั้นแรกเราจะสร้างไดเร็กทอรีสำหรับพ็อดแบบคงที่และเรียกใช้ kubelet
:
$ mkdir pods
$ sudo ./kubelet --pod-manifest-path=pods
จากนั้นในหน้าต่างเทอร์มินัล/tmux/อะไรก็ตาม เราจะสร้างรายการพ็อด:
$ cat <<EOF > pods/hello.yaml
apiVersion: v1
kind: Pod
metadata:
name: hello
spec:
containers:
- image: busybox
name: hello
command: ["echo", "hello world!"]
EOF
kubelet
เริ่มเขียนคำเตือนและดูเหมือนไม่มีอะไรเกิดขึ้น แต่นั่นไม่เป็นความจริง! ลองดูที่นักเทียบท่า:
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c8a35e26663 busybox "echo 'hello world!'" 36 seconds ago Exited (0) 36 seconds ago k8s_hello_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_4
68f670c3c85f k8s.gcr.io/pause:3.2 "/pause" 2 minutes ago Up 2 minutes k8s_POD_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_0
$ sudo docker logs k8s_hello_hello-mink8s_default_ab61ef0307c6e0dee2ab05dc1ff94812_4
hello world!
kubelet
ฉันอ่านรายการพ็อดและให้คำสั่ง Docker เพื่อเปิดใช้คอนเทนเนอร์สองสามรายการตามข้อกำหนดของเรา (หากคุณสงสัยเกี่ยวกับคอนเทนเนอร์ "หยุดชั่วคราว" นั่นเป็นแฮ็ค Kubernetes - ดู busybox
ด้วยคำสั่งที่ระบุและจะรีสตาร์ทอย่างไม่มีกำหนดจนกว่าสแตติกพ็อดจะถูกลบ
ขอแสดงความยินดีกับตัวเอง เราเพิ่งคิดวิธีหนึ่งที่สับสนที่สุดในการแสดงข้อความไปยังเทอร์มินัล!
เปิดตัว ฯลฯ
เป้าหมายสูงสุดของเราคือการรัน Kubernetes API แต่การจะทำเช่นนั้นได้ เราต้องรันก่อน pods/etcd.yaml
):
apiVersion: v1
kind: Pod
metadata:
name: etcd
namespace: kube-system
spec:
containers:
- name: etcd
command:
- etcd
- --data-dir=/var/lib/etcd
image: k8s.gcr.io/etcd:3.4.3-0
volumeMounts:
- mountPath: /var/lib/etcd
name: etcd-data
hostNetwork: true
volumes:
- hostPath:
path: /var/lib/etcd
type: DirectoryOrCreate
name: etcd-data
หากคุณเคยทำงานกับ Kubernetes ไฟล์ YAML เหล่านี้น่าจะคุ้นเคยสำหรับคุณ มีเพียงสองประเด็นที่ควรสังเกตที่นี่:
เราได้ติดตั้งโฟลเดอร์โฮสต์แล้ว /var/lib/etcd
ในพ็อดเพื่อให้ข้อมูล ฯลฯ ยังคงอยู่หลังจากการรีสตาร์ท (หากไม่เสร็จสิ้น สถานะคลัสเตอร์จะถูกลบทุกครั้งที่รีสตาร์ทพ็อด ซึ่งจะไม่ดีสำหรับการติดตั้ง Kubernetes เพียงเล็กน้อย)
เราได้ติดตั้ง hostNetwork: true
. การตั้งค่านี้ไม่น่าแปลกใจเลยที่กำหนดค่า etcd ให้ใช้เครือข่ายโฮสต์แทนเครือข่ายภายในของพ็อด (ซึ่งจะทำให้เซิร์ฟเวอร์ API ค้นหาคลัสเตอร์ etcd ได้ง่ายขึ้น)
การตรวจสอบง่ายๆ แสดงให้เห็นว่า etcd ทำงานบน localhost และบันทึกข้อมูลลงดิสก์:
$ curl localhost:2379/version
{"etcdserver":"3.4.3","etcdcluster":"3.4.0"}
$ sudo tree /var/lib/etcd/
/var/lib/etcd/
└── member
├── snap
│ └── db
└── wal
├── 0.tmp
└── 0000000000000000-0000000000000000.wal
การเริ่มต้นเซิร์ฟเวอร์ API
การเรียกใช้เซิร์ฟเวอร์ Kubernetes API นั้นง่ายยิ่งขึ้น พารามิเตอร์เดียวที่ต้องส่งคือ --etcd-servers
ทำสิ่งที่คุณคาดหวัง:
apiVersion: v1
kind: Pod
metadata:
name: kube-apiserver
namespace: kube-system
spec:
containers:
- name: kube-apiserver
command:
- kube-apiserver
- --etcd-servers=http://127.0.0.1:2379
image: k8s.gcr.io/kube-apiserver:v1.18.5
hostNetwork: true
วางไฟล์ YAML นี้ลงในไดเร็กทอรี pods
และเซิร์ฟเวอร์ API จะเริ่มทำงาน กำลังตรวจสอบกับ curl
แสดงให้เห็นว่า Kubernetes API กำลังฟังพอร์ต 8080 พร้อมการเข้าถึงแบบเปิดโดยสมบูรณ์ - ไม่ต้องมีการตรวจสอบสิทธิ์!
$ curl localhost:8080/healthz
ok
$ curl localhost:8080/api/v1/pods
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/pods",
"resourceVersion": "59"
},
"items": []
}
(ขอย้ำอีกครั้งว่าอย่าใช้งานจริง! ฉันรู้สึกประหลาดใจเล็กน้อยที่การตั้งค่าเริ่มต้นไม่ปลอดภัยมาก แต่ฉันเดาว่านี่จะทำให้การพัฒนาและการทดสอบง่ายขึ้น)
และที่น่าประหลาดใจคือ kubectl ทำงานนอกกรอบโดยไม่ต้องตั้งค่าเพิ่มเติมใดๆ!
$ ./kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:39:24Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
$ ./kubectl get pod
No resources found in default namespace.
ปัญหา
แต่ถ้าคุณเจาะลึกลงไปอีกหน่อย ดูเหมือนว่ามีบางอย่างผิดปกติ:
$ ./kubectl get pod -n kube-system
No resources found in kube-system namespace.
พ็อดคงที่ที่เราสร้างหายไปแล้ว! จริงๆ แล้ว โหนด kubelet ของเราไม่ถูกค้นพบเลย:
$ ./kubectl get nodes
No resources found in default namespace.
เกิดอะไรขึ้น? หากคุณจำสองสามย่อหน้าที่ผ่านมาได้ เราได้เริ่ม kubelet ด้วยชุดพารามิเตอร์บรรทัดคำสั่งที่ง่ายมาก ดังนั้น kubelet จึงไม่รู้วิธีติดต่อกับเซิร์ฟเวอร์ API และแจ้งสถานะของเซิร์ฟเวอร์ หลังจากศึกษาเอกสารประกอบแล้ว เราพบแฟล็กที่เกี่ยวข้อง:
--kubeconfig string
เส้นทางไปยังไฟล์ kubeconfig
ซึ่งระบุวิธีเชื่อมต่อกับเซิร์ฟเวอร์ API ความพร้อมใช้งาน --kubeconfig
เปิดใช้งานโหมดเซิร์ฟเวอร์ API ไม่ใช่ --kubeconfig
เปิดใช้งานโหมดออฟไลน์
ตลอดเวลานี้ เรากำลังใช้งาน kubelet ใน "โหมดออฟไลน์" โดยที่เราไม่รู้ตัว (หากเราเป็นคนอวดรู้ เราอาจนึกถึง kubelet แบบสแตนด์อโลนว่าเป็น "Kubernetes ที่ใช้งานได้ขั้นต่ำ" แต่นั่นคงจะน่าเบื่อมาก) เพื่อให้การกำหนดค่า "ของจริง" ทำงานได้ เราต้องส่งไฟล์ kubeconfig ไปยัง kubelet เพื่อให้รู้วิธีพูดคุยกับเซิร์ฟเวอร์ API โชคดีที่มันค่อนข้างง่าย (เนื่องจากเราไม่มีปัญหาการรับรองความถูกต้องหรือใบรับรอง):
apiVersion: v1
kind: Config
clusters:
- cluster:
server: http://127.0.0.1:8080
name: mink8s
contexts:
- context:
cluster: mink8s
name: mink8s
current-context: mink8s
บันทึกสิ่งนี้เป็น kubeconfig.yaml
, ฆ่ากระบวนการ kubelet
และรีสตาร์ทด้วยพารามิเตอร์ที่จำเป็น:
$ sudo ./kubelet --pod-manifest-path=pods --kubeconfig=kubeconfig.yaml
(อย่างไรก็ตาม หากคุณพยายามเข้าถึง API ผ่านทาง curl เมื่อ kubelet ไม่ทำงาน คุณจะพบว่ามันยังคงทำงานอยู่! Kubelet ไม่ใช่ "พาเรนต์" ของพ็อดอย่าง Docker มันเป็นเหมือน "การควบคุม" มากกว่า daemon” คอนเทนเนอร์ที่จัดการโดย kubelet จะยังคงทำงานต่อไปจนกว่า kubelet จะหยุด)
ในไม่กี่นาที kubectl
ควรแสดงพ็อดและโหนดให้เราเห็นตามที่เราคาดหวัง:
$ ./kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default hello-mink8s 0/1 CrashLoopBackOff 261 21h
kube-system etcd-mink8s 1/1 Running 0 21h
kube-system kube-apiserver-mink8s 1/1 Running 0 21h
$ ./kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
mink8s Ready <none> 21h v1.18.5 10.70.10.228 <none> Ubuntu 18.04.4 LTS 4.15.0-109-generic docker://19.3.6
ครั้งนี้ขอแสดงความยินดีกับตัวเองจริงๆ (ฉันรู้ว่าฉันแสดงความยินดีกับตัวเองแล้ว) - เรามี "คลัสเตอร์" ของ Kubernetes ขั้นต่ำที่ทำงานด้วย API ที่ทำงานได้อย่างสมบูรณ์!
เราเปิดตัวภายใต้
มาดูกันว่า API มีความสามารถอะไรบ้าง เริ่มจากพ็อด nginx กันก่อน:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
ที่นี่เราได้รับข้อผิดพลาดที่ค่อนข้างน่าสนใจ:
$ ./kubectl apply -f nginx.yaml
Error from server (Forbidden): error when creating "nginx.yaml": pods "nginx" is
forbidden: error looking up service account default/default: serviceaccount
"default" not found
$ ./kubectl get serviceaccounts
No resources found in default namespace.
ที่นี่เราจะเห็นว่าสภาพแวดล้อม Kubernetes ของเราไม่สมบูรณ์เพียงใด - เราไม่มีบัญชีสำหรับบริการ ลองอีกครั้งโดยสร้างบัญชีบริการด้วยตนเองและดูว่าเกิดอะไรขึ้น:
$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: default
EOS
serviceaccount/default created
$ ./kubectl apply -f nginx.yaml
Error from server (ServerTimeout): error when creating "nginx.yaml": No API
token found for service account "default", retry after the token is
automatically created and added to the service account
แม้ว่าเราจะสร้างบัญชีบริการด้วยตนเอง แต่โทเค็นการตรวจสอบสิทธิ์ก็ไม่ถูกสร้างขึ้น ในขณะที่เราทดลองกับ "คลัสเตอร์" แบบเรียบง่ายของเราต่อไป เราจะพบว่าสิ่งที่มีประโยชน์ส่วนใหญ่ที่มักจะเกิดขึ้นโดยอัตโนมัติจะหายไป เซิร์ฟเวอร์ Kubernetes API ค่อนข้างเรียบง่าย โดยส่วนใหญ่จะมีการยกภาระหนักและการกำหนดค่าอัตโนมัติในตัวควบคุมและงานเบื้องหลังต่างๆ ที่ยังไม่ได้ทำงาน
เราสามารถแก้ไขปัญหานี้ได้โดยการตั้งค่าตัวเลือก automountServiceAccountToken
สำหรับบัญชีบริการ (เนื่องจากเราไม่ต้องใช้มันอยู่แล้ว):
$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: default
automountServiceAccountToken: false
EOS
serviceaccount/default configured
$ ./kubectl apply -f nginx.yaml
pod/nginx created
$ ./kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 13m
ในที่สุดพ็อดก็ปรากฏตัว! แต่ที่จริงแล้วมันจะไม่เริ่มเพราะเราไม่มี
ที่จริงแล้ว คุณไม่จำเป็นต้องมีเครื่องกำหนดเวลาในการเรียกใช้พ็อด คุณสามารถเพิ่มโหนดลงในรายการในพารามิเตอร์ได้ด้วยตนเอง nodeName
:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
nodeName: mink8s
(แทนที่ mink8s
เป็นชื่อของโหนด) หลังจากลบและนำไปใช้เราจะเห็นว่า nginx ได้เริ่มต้นแล้วและกำลังฟังที่อยู่ IP ภายใน:
$ ./kubectl delete pod nginx
pod "nginx" deleted
$ ./kubectl apply -f nginx.yaml
pod/nginx created
$ ./kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 30s 172.17.0.2 mink8s <none> <none>
$ curl -s 172.17.0.2 | head -4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
เพื่อให้แน่ใจว่าเครือข่ายระหว่างพ็อดทำงานอย่างถูกต้อง เราสามารถเรียกใช้ curl จากพ็อดอื่นได้:
$ cat <<EOS | ./kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: curl
spec:
containers:
- image: curlimages/curl
name: curl
command: ["curl", "172.17.0.2"]
nodeName: mink8s
EOS
pod/curl created
$ ./kubectl logs curl | head -6
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
มันค่อนข้างน่าสนใจที่จะเจาะลึกสภาพแวดล้อมนี้และดูว่าอะไรใช้ได้ผลและอะไรใช้ไม่ได้ ฉันพบว่า ConfigMap และ Secret ทำงานตามที่คาดไว้ แต่บริการและการปรับใช้ไม่ได้
ความสำเร็จ!
โพสต์นี้กินเวลานานดังนั้นฉันจะประกาศชัยชนะและบอกว่านี่คือการกำหนดค่าที่ใช้งานได้ซึ่งสามารถเรียกว่า "Kubernetes" เพื่อสรุป: ไบนารีสี่ตัว, พารามิเตอร์บรรทัดคำสั่งห้าพารามิเตอร์และ YAML "เท่านั้น" 45 บรรทัด (ไม่ใช่ มากขนาดนั้นตามมาตรฐาน Kubernetes) และเรามีบางสิ่งที่ใช้งานได้:
- พ็อดได้รับการจัดการโดยใช้ Kubernetes API ปกติ (พร้อมแฮ็กเล็กน้อย)
- คุณสามารถอัปโหลดและจัดการอิมเมจคอนเทนเนอร์สาธารณะได้
- พ็อดจะยังคงมีชีวิตอยู่และรีสตาร์ทโดยอัตโนมัติ
- การสร้างเครือข่ายระหว่างพ็อดภายในโหนดเดียวกันทำงานได้ค่อนข้างดี
- ConfigMap, Secret และการติดตั้งที่เก็บข้อมูลแบบธรรมดาทำงานได้ตามที่คาดไว้
แต่สิ่งที่ทำให้ Kubernetes มีประโยชน์อย่างแท้จริงส่วนใหญ่ยังคงขาดหายไป เช่น:
- ตัวกำหนดเวลาพ็อด
- การรับรองความถูกต้อง/การอนุญาต
- หลายโหนด
- เครือข่ายการให้บริการ
- DNS ภายในแบบคลัสเตอร์
- ตัวควบคุมสำหรับบัญชีบริการ การปรับใช้ การผสานรวมกับผู้ให้บริการระบบคลาวด์ และคุณสมบัติอื่นๆ ส่วนใหญ่ที่ Kubernetes นำมา
แล้วเราได้อะไรมาบ้าง? Kubernetes API ซึ่งทำงานด้วยตัวมันเองเป็นเพียงแพลตฟอร์มสำหรับจริงๆ ระบบอัตโนมัติของคอนเทนเนอร์. มันไม่ได้ช่วยอะไรมากนัก มันเป็นงานสำหรับคอนโทรลเลอร์และผู้ปฏิบัติงานต่างๆ ที่ใช้ API แต่จะให้สภาพแวดล้อมที่สอดคล้องกันสำหรับระบบอัตโนมัติ
อ่านเพิ่มเติม:
เหตุใดผู้ดูแลระบบ นักพัฒนา และผู้ทดสอบจึงควรเรียนรู้แนวทางปฏิบัติของ DevOps ธานอส - โพรมีธีอุสที่ปรับขนาดได้ วิธีที่ทีม GitLab QA ใช้เครื่องมือประสิทธิภาพ GitLab โลกิ - การรวบรวมบันทึกโดยใช้วิธีโพร วันหนึ่งในชีวิตของ DevOps
ที่มา: will.com