- vừa được xem lúc

Giới thiệu về Kubernetes, kiến trúc và hướng dẫn cài đặt chi tiết

0 0 9

Người đăng: Kubernetes

Theo Viblo Asia

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 đủ:

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ó:

  1. Minikube để cài 1 cluster test chơi chơi trên máy của bạn
  2. 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
  3. 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
  4. Dùng SaltStack để cài https://github.com/kubernetes/kubernetes/tree/master/cluster/saltbase/
  5. Cài bằng tay trên CoreOS Container Linux
  6. Kops để cài trên AWS (Amazon cloud)
  7. 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

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. image.png

Master server

image.png

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. image.png

Node Server

image.png

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. image.png

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

image.png

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, ... image.png

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. image.png

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 image.png

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/ image.png

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

image.png

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

image.png

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...

image.png

Vậy là xong!!! Cảm ơn các bạn đã theo dõi!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Deploying A Containerized Web Application On Kubernetes

1. Overview. Kubernetes is an open source project (available on kubernetes.io) which can run on many different environments, from laptops to high-availability multi-node clusters; from public clouds to on-premise deployments; from virtual machines to bare metal.

0 0 55

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 113

- vừa được xem lúc

[Kubernetes] Kubectl và các command cơ bản

Mở đầu. Kubectl là công cụ quản trị Kubernetes thông qua giao diện dòng lệnh, cho phép bạn thực thi các câu lệnh trong Kubernetes cluster.

0 0 59

- vừa được xem lúc

Triển khai EFK Stack trên Kubernetes

EFK stack on K8S. Giới thiệu. Một hệ thống có thể chạy nhiều dịch vụ hoặc ứng dụng khác nhau, vì vậy việc. theo dõi hệ thống là vô cùng cần thiết.

0 0 72

- vừa được xem lúc

Thực hành Kubernetes (K8S) bằng cách sử dụng lệnh Command

Bài hướng dẫn hôm nay sẽ hướng dẫn sử dụng K8S bằng cách sử dụng câu lệnh thay vì UI trên web. Có 2 lựa chọn để thực hiện:. . Sử dụng Cloud Shell.

0 0 56

- vừa được xem lúc

Kubernetes best practices - Liveness và Readiness Health checks

Mở đầu. Kubernetes cung cấp cho bạn một framework để chạy các hệ phân tán một cách mạnh mẽ.

0 0 49