Giới thiệu về Kubernetes, kiến trúc và hướng dẫn cài đặt chi tiết
Kubernetes là một mã nguồn mở được dùng để tự động triển khai hệ thống, scaling, quản lý các container. Nó thực sự là một hệ thống mạnh mẽ, được phát triển bởi Google. Google sử dụng Kubernetes để quản lý hàng tỉ docker container mà họ đang quản lý.
Ai cần Kubernetes?
- Các doanh nghiệp lớn, có nhu cầu thực sự phải scaling hệ thống nhanh chóng, và đã sử dụng container (Docker).
- Các dự án cần chạy >= 5 container CÙNG LOẠI cho 1 dịch vụ. (Ví dụ dùng >=5 máy cùng để chạy code website XYZ). Còn nhỏ hơn thì tốt nhất không dùng - đừng mang dao mổ trâu đi giết gà.
- Các startup hiện đại, chịu đầu tư vào công nghệ, để nhỡ về sau có to ra, thì to rất dễ 🙄
- Các sysadmin/DevOps muốn tăng lương, nhảy việc, vọc công nghệ mới.
K8s là gì?
Lúc mới đầu mình cũng thắc mắc không biết K8s là gì? Tuy nhiên nó đơn giản chỉ là viết tắt của Kubernetes (K-8 chữ cái-s). Trang chủ của Kubernetes là https://k8s.io hay https://kubernetes.io/
Kubernetes đọc thế nào?
Các bạn biết từ trên đọc thế nào không? Tôi đã thử tra từ điển nhưng cũng đành bó tay. Sau khi nhận được comment từ mọi người thì có vẻ tôi đã hiểu được đôi chút về ý nghĩa và cách đọc của Kubernetes
Ý nghĩa: "người lái tàu" trong tiếng Hy Lạp Cách đọc: Cu-ba-ni-tê-sờ
Các hệ thống cung cấp Kubernetes cài đặt sẵn:
Google container engine (GKE): https://cloud.google.com/container-engine/ (free 300$ cho tài khoản mới - dùng hết thì thôi cũng được) CoreOS techtonic: https://coreos.com/tectonic/ RedHat Openshift: https://www.openshift.com/
Các sản phẩm dựa trên Kubernetes
Cũng là nơi ta có thể nhìn rõ hơn K8s làm được gì, hay tìm tài liệu nếu trang chủ là không đủ:
- RedHat Openshift 3: https://www.openshift.org/
- Deis Workflow - opensource platform as a service (PaaS): https://deis.com/paas/
- Rancher - container management platform: http://rancher.com/rancher/
Các cách để cài đặt K8s
K8s là một hệ thống, gồm nhiều thành phần tương tác với nhau. Tuy không tới nỗi phức tạp như cài một hệ thống cloud IaaS như OpenStack, nhưng cũng không phải chỉ gõ 3, 5 cái là xong. Vậy là người ta đẻ ra hàng chục cách khác nhau để cài K8s, đang kể nhất có:
- Minikube để cài 1 cluster test chơi chơi trên máy của bạn
- Kubeadm đang trong giai đoạn phát triển, để cài trên hệ thống máy vật lý / máy ảo dùng Ubuntu 16.04 hay CentOS 7
- Kargo là phần mềm dựa trên Ansible để cài trên rất nhiều nơi bao gồm cả máy vật lý/máy ảo/AWS/GCE
- Dùng SaltStack để cài https://github.com/kubernetes/kubernetes/tree/master/cluster/saltbase/
- Cài bằng tay trên CoreOS Container Linux
- Kops để cài trên AWS (Amazon cloud)
- Và rất nhiều các giải pháp khác nữa xem tại đây
Các đối thủ cạnh tranh
- Docker Swarm https://docs.docker.com/engine/swarm/
- Apache Mesos https://mesos.apache.org/
- Google để được so sánh, ở đây không làm việc ấy
Kiến trúc K8S
K8s cluster bao gồm nhiều node, trên mỗi node sẽ cần chạy một "kubelet", đây là chương trình để chạy k8s. Cần một máy để làm "chủ" cluster, trên đó sẽ cài API server, scheduler ... Các máy còn lại sẽ chạy kubelet để sinh ra các container.
Master server
Etcd
Có thể liên kết cài đặt với từng node thông qua etcd.
API Server
Đúng theo tên gọi, đây chính là server cung cấp Kubernetes API. Nó có nhiệm vụ đặt Pod vào Node, đồng bộ hoá thông tin của Pod bằng REST API tiếp nhận cài đặt của pod/service/replicationController.
Controller Manager Service
Được hiểu giống như “kube-controller manager”, nó quản lý tất cả các bộ điều khiển xử lý các tác vụ thông thường trong cluster. Chúng bao gồm Node Controller, Replication Controller, Endpoints Controller, and Service Account and Token Controllers. Chi tiết của các hoạt động này được ghi vào etcd, nơi controller manager theo dõi sự thay đổi thông qua API Server.
Scheduler Service
Scheduler Service có trách nhiệm giám sát việc sử dụng tài nguyên trên mỗi máy chủ để đảm bảo rằng hệ thống không bị quá tải. Scheduler Service phải biết tổng số tài nguyên có sẵn trên mỗi máy chủ, cũng như các tài nguyên được phân bổ cho các khối lượng công việc hiện có được gán trên mỗi máy chủ.
Dashboard (optional)
Giao diện web Kubernetes giúp đơn giản hóa các tương tác của người dùng Kubernetes cluster với máy chủ API.
Node Server
Pod
Pod là 1 nhóm (1 trở lên) các container thực hiện một mục đích nào đó, như là chạy software nào đó. Nhóm này chia sẻ không gian lưu trữ, địa chỉ IP với nhau. Pod thì được tạo ra hoặc xóa tùy thuộc vào yêu cầu của dự án.
Nếu k8s chỉ có mỗi khái niệm pod, thì dùng k8s giống như dùng docker bình thường. Tức muốn thêm tính năng gì thì ta phải tự kiến trúc/ thiết kế/ thực hiện. Các thông tin bạn cần về pod, nằm trong output của lệnh : describe pod PODNAME
$ kubectl get pods --selector='app=audit' NAME READY STATUS RESTARTS AGE audit-deployment-3585156150-mlcv3 1/1 Running 0 14d $ kubectl describe pod audit-deployment-3585156150-mlcv3 Name: audit-deployment-3585156150-mlcv3 Namespace: default
Service (svc)
Vì các Pod có tuổi thọ ngắn, do vậy nó không đảm bảo về địa chỉ ip luôn cố định. Điều này khiến cho việc giao tiếp giữa các microservice trở nên khó khăn. Do đó, K8s giới thiệu về một dịch vụ, nó là một lớp nằm trên một số nhóm Pod. Nó được được gắn địa chỉ IP tĩnh và có thể trỏ domain vào dịch vụ này. Tại đây chúng ta có thể thực hiện cân bằng tải. Mỗi service sẽ được gán 1 domain do người dùng lựa chọn, khi ứng dụng cần kết nối đến service, ta chỉ cần dùng domain là xong. Domain được quản lý bởi hệ thống name server SkyDNS nội bộ của k8s - một thành phần sẽ được cài khi ta cài k8s.
kubectl get svc --namespace=kube-system | grep dns kube-dns 10.3.240.10 <none> 53/UDP,53/TCP 38d
Tất nhiên, nếu chỉ có 1 máy chạy 1 dịch vụ, thì service chả có nghĩa lý gì. Vậy nên khi dùng k8s, hãy nhớ rằng nó được thiết kế và đưa vào các khái niệm để phục vụ cho hàng trăm, ngàn service/container, chứ không phải 1 cái. Nó phức tạp vì nó có lý do để phức tạp. Và bạn/công ty của bạn không phải Google (ở đây không hạ thấp bạn hay công ty của bạn), không phải công ty nào cũng chạy dịch vụ software cung cấp cho cả thế giới.
Persistent Volumes
Bất kỳ ai làm container cũng cần hiểu rằng, ta không lưu dữ liệu trên container mà phải lưu nó vào một chỗ nào đó. Bởi khi container restart / bị die thì dữ liệu cũng sẽ mất theo nó. Đây là chuyện dù dùng docker trực tiếp hay giải pháp khác K8s thì bạn vẫn phải tính. Việc lưu dữ liệu của app trên container trực tiếp trên máy host là một giải pháp nhỏ lẻ. Vì nếu ta cho dữ liệu của pod của app A vào /var/lib/app/A, mà có 2 pod cho app A cùng được chạy trên máy đó thì chuyện gì xảy ra? Giải pháp k8s sử dụng là các hệ thống lưu trữ "network". Tức lưu vào một hệ thống storage khác. Như NFS, GlusterFS, Ceph ... PV, là khái niệm để đưa ra một dung lượng lưu trữ THỰC TẾ 1GB, 10GB ... PVC là khái niệm ảo, đưa ra một dung lượng CẦN THIẾT, mà ứng dụng yêu cầu. Khi 1 PV thoả mãn yêu cầu của 1 PVC thì chúng "match" nhau, rồi "bound" (buộc / kết nối) lại với nhạu. Nếu tự cài K8s, hãy chuẩn bị sẵn giải pháp lưu trữ của bạn. Nếu dùng sẵn Google cloud hay AWS, sẵn sàng để trả tiền. Kubernetes hỗ trợ nhiều kiểu volumes, như là: NFS, Ceph, GlusterFS, local directory, ...
Namespaces
Đây là một công cụ dùng để nhóm hoặc tách các nhóm đối tượng. Namespaces được sử dụng để kiểm soát truy cập, kiểm soát truy cập network, quản lý resource và quoting.
Nếu tôi đặt service này là "web" lúc chạy production, còn lúc dev thì tôi chạy nó ở đâu? không nhẽ phải đổi tên service? Namespace giải quyết vấn đề này. Mặc định các dịch vụ sẽ sử đụng namespace "default", nhưng ta muốn tạo namespace nào thì tuỳ ý. K8s sử dụng 1 namespace riêng : kube-system, vì vậy nhớ đừng quên namespace khi gọi câu lệnh:
$ kubectl get svc --namespace=kube-system NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE default-http-backend 10.3.246.86 <nodes> 80:31031/TCP 38d elasticsearch-logging 10.3.251.158 <none> 9200/TCP 33d heapster 10.3.242.120 <none> 80/TCP 33d kibana-logging 10.3.245.215 <none> 5601/TCP 33d kube-dns 10.3.240.10 <none> 53/UDP,53/TCP 38d kubernetes-dashboard 10.3.243.251 <none> 80/TCP 38d monitoring-grafana 10.3.243.34 <none> 80/TCP 33d monitoring-influxdb 10.3.253.47 <none> 8086/TCP 33d tiller-deploy 10.3.240.33 <none> 44134/TCP 38d
Ingress rules
Dùng để quản lý network ra và vào các service và pod
Network policies
Định nghĩa các quy tắc truy cập mạng giữa các Pod bên trong Cluster.
Network
Có nhiều loại phần mềm để triển khai container network, như Flannel, Weaver ... nếu bạn dùng Google Cloud, vấn đề này không cần quan tâm.
ConfigMaps and Secrets
Một software ít khi chạy luôn mà không cần config. ConfigMap là giải pháp để nhét 1 file config / đặt các ENVironment var hay set các argument khi gọi câu lệnh. ConfigMap là một cục config, mà pod nào cần, thì chỉ định là nó cần - giúp dễ dàng chia sẻ file cấu hình. Ít ai muốn đặt mật khẩu vào file cấu hình, và chỉ có lập trình viên "tồi" mới hardcode mật khẩu vào code. Vậy nên K8s có "secret", để lưu trữ các mật khẩu, token, ... hay những gì cần giữ bí mật.
Controllers
Các "khái niệm" khác nhau cho các loại dịch vụ khác nhau.
- Deployment : là loại chung nhất, khi ta muốn "deploy" một dịch vụ nào đó. Ta tạo ra pod bằng cách tạo ra một deployment (hoặc statefulSets, hoặc các khái niệm tương đương). StatefulSets được dùng khi ta cần các service bật lên theo tứ tự nhất định.
- DaemonSet : thường dành cho các dịch vụ cần chạy trên tất cả các node. Ví dụ như fluentd để collect log trên tất cả các node.
- StatefulSet : là 1 file "manifest" đặt trong thư mục chỉ định bởi kubelet, các pod này sẽ được chạy khi kubelet chạy. Không thể điều khiển chúng bằng kubectl. Đây là một khái niệm đang dần bị xa lánh bởi sự thiếu linh động và khó kiểm soát. Gõ kubectl get để xem tất cả những khái niệm resource mà k8s sử dụng, và cách gọi ngắn gọn cho từng khái niệm (svc cho service, deploy cho deployment, cm cho configmap ...).
Helm - K8s package manager
Trên Ubuntu, ta dùng APT để cài package, thì trên K8s, Helm dùng để cài các "chart", muốn chạy một hệ thống CI ? Install ngay bằng câu lệnh của helm. helm install something
$ helm install stable/concourse # cài concourse CI
Dashboard
Dashboard cho phép xem tổng quan về cluster k8s đang dùng, nó được cài vào k8s như một add-on https://github.com/kubernetes/dashboard Nói chung là để xem thôi, còn tương tác gì thì cứ câu lệnh kubectl mà chọc. Kiểm tra xem đã cài dashboard chưa:
$ kubectl get svc --namespace=kube-system | grep -i dashboard kubernetes-dashboard 10.3.243.251 <none> 80/TCP 38d
Truy cập:
$ kubectl proxy
Starting to serve on 127.0.0.1:8001 Vào trình duyệt qua 127.0.0.1:8001/ui/
Monitoring
Monitoring trên K8s rất dễ dàng, chỉ cần cài 1 phần mềm có khả năng tích hợp với k8s, nó sẽ hỏi K8s để lấy thông tin về tất cả các pod trong hệ thống.Hãy tưởng tượng ta có hệ thống monitoring tự động cho mọi pod được tạo - mà không cần làm gì :3 Xem thêm tại https://kubernetes.io/docs/concepts/cluster-administration/resource-usage-monitoring/
Create
Mọi file cấu hình cho pod/svc/cm/ ... đều là file ở định dạng YAML. Chỉ cần chạy
kubectl create -f filename # hoặc . để cài hết các file trong thư mục hiện tại
để deploy chúng.
Tóm lại phần kiến trúc của K8S
Nếu bạn sẵn sàng chi tiền để mua K8s chạy trên một hệ thống dựng sẵn nào đó: như GCE hay OpenShift, thì mọi vấn đề liên quan đến cài đặt k8s cùng các thành phần khác sẽ được bỏ qua, bạn chỉ cần quan tâm tới việc vận hành các pod/service của mình, và trả tiền. CoreOS có nhiều đóng góp và doc khá tốt để giới thiệu và tự cài 1 hệ thống K8s: https://coreos.com/kubernetes/docs/latest/
Hướng dẫn cài đặt Kubernetes chi tiết
Triển khai hệ thống Kubernetes
Sử dụng Kubeadm để deploy cho hệ thống thật
Phương pháp này có thể deploy trên các nền tảng sau: AWS, GCE, Azure, Joyent, OpenStack, VMWare, Bare Metal and localhost. Kubeadm được hỗ trợ chính thức bởi Kubernetes, do vậy chúng ta sẽ sử dụng phương pháp này để deploy cho hệ thống thật. Việc setup cực kỳ đơn giản, chúng ta chỉ cần chạy command sau:
sudo snap install conjure-up --classic conjure-up kubernetes
Một màn hình giao diện đơn giản hiện lên và bạn hãy làm theo hướng dẫn trong đó. Dưới đây là một video hướng dẫn setup Kubernetes thông qua Kuberadm classic, không sử dụng giao diện.
Sử dụng Minikube để deploy trên localhost
Minikube cần sử dụng VirtualBox để tạo node, do đó việc đầu tiên chúng ta phải làm đó là cài đặt VirtualBox
sudo apt-get install virtualbox
Cài đặt minikube
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.18.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
Cài đặt kubectl
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.6.0/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
Khởi động Cluster
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.18.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
$ minikube start Starting local Kubernetes cluster... Starting VM... SSH-ing files into VM... Setting up certs... Starting cluster components... Connecting to cluster... Setting up kubeconfig... Kubectl is now configured to use the cluster.
Kiểm tra danh sách các Pod
$ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system kube-addon-manager-minikube 1/1 Running 0 9h kube-system kube-dns-v20-kqlbc 3/3 Running 0 9h kube-system kubernetes-dashboard-52wwl 1/1 Running 0 9h
Kiểm tra danh sách Node
$ kubectl get nodes NAME STATUS AGE VERSION minikube Ready 24m v1.6.0
Kiểm tra danh sách docker container
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d271e008a309 93a43bfb39bf "/exechealthz '--c..." 26 minutes ago Up 26 minutes k8s_healthz_kube-dns-v20-7hn9d_kube-system_557327c7-1d44-11e7-9049-5254001b4720_0 1d6710f4e2e4 3ec65756a89b "/usr/sbin/dnsmasq..." 26 minutes ago Up 26 minutes k8s_dnsmasq_kube-dns-v20-7hn9d_kube-system_557327c7-1d44-11e7-9049-5254001b4720_0 0291e09a264f 26cf1ed9b144 "/kube-dns --domai..." 26 minutes ago Up 26 minutes k8s_kubedns_kube-dns-v20-7hn9d_kube-system_557327c7-1d44-11e7-9049-5254001b4720_0 57ad697d2dec 416701f962f2 "/dashboard --port..." 26 minutes ago Up 26 minutes k8s_kubernetes-dashboard_kubernetes-dashboard-zbnj4_kube-system_54b5857e-1d44-11e7-9049-5254001b4720_0 c2504223e7ea gcr.io/google_containers/pause-amd64:3.0 "/pause" 27 minutes ago Up 27 minutes k8s_POD_kube-dns-v20-7hn9d_kube-system_557327c7-1d44-11e7-9049-5254001b4720_0 903e6044ae1a gcr.io/google_containers/pause-amd64:3.0 "/pause" 27 minutes ago Up 27 minutes k8s_POD_kubernetes-dashboard-zbnj4_kube-system_54b5857e-1d44-11e7-9049-5254001b4720_0 f848bb9dc40e 9da55e306d47 "/opt/kube-addons.sh" 27 minutes ago Up 27 minutes k8s_kube-addon-manager_kube-addon-manager-minikube_kube-system_4fb35b6f38517771d5bfb1cffb784d97_0 80b467aee7e7 gcr.io/google_containers/pause-amd64:3.0 "/pause" 28 minutes ago Up 28 minutes k8s_POD_kube-addon-manager-minikube_kube-system_4fb35b6f38517771d5bfb1cffb784d97_0
Dừng Cluster
$ minikube stop Stopping local Kubernetes cluster... Machine stopped.
Xóa Cluster
$ minikube delete Deleting local Kubernetes cluster... Machine deleted.
Truy cập Kubernetes dashboard:
$ minikube dashboard Opening kubernetes dashboard in default browser...
Vậy là xong!!! Cảm ơn các bạn đã theo dõi!
All rights reserved