kiến thức DevOps thực tế và chi tiết

Cách cài đặt và sử dụng K8s cơ bản nhất

Nỗi ám ảnh của biết bao nhiêu DevOps Engineer mới vào nghề và đã có thâm niên trong nghề mang tên Kubernetes hay còn gọi là K8s, cũng là công cụ phổ biến mà các “tay to” và các công ty bự của thế giới như Google, Microsoft, Amazon, IBM, và Docker sử dụng Kubernetes để triển khai và quản lý các dịch vụ cloud của họ và nhiều công ty công nghệ khác nữa, bao gồm Airbnb, Spotify, Lyft và Pinterest,… Nên phần nào bạn đã biế sự đặc biệt của nó. Cũng để thể hiện sự “khoai” của nó bạn đã từng nghe qua nhạc chill code không bug, nhạc tâm linh code phát chạy thì ngay đây có playlist Songs about k8s tịnh tâm (j4f).

Sự mạnh mẽ và phổ biến của nó nên để cài đặt kubernetes Cluster cũng có rất nhiều cách, bạn thử đoán xem, 10 cách? 20 cách? chưa đủ trên dưới 40 cách cài đặt Kubernetes. Và mình thấy việc cài đặt Kubernetes bằng Ansible là một lựa chọn khá tốt về cách sử dụng Asible bạn có thể xem cách sử dụng ansible và sau mình cũng sẽ làm bài viết cài đặt Kubernetes bằng Ansible. Tuy nhiên, trong bài viết này như bạn đã đọc thì đây sẽ là cách cài đặt và sử dụng đơn giản an toàn mà người mới cũng có thể làm được.

Cài đặt Kubernetes

Chúng ta sẽ sử dụng K8s Cluster bằng cách tự cài đặt trên server nội bộ, với những thông tin server làm hands on dưới đây:

  • Server 1: 10.32.3.180
    • Server cài đặt làm Master
    • Cấu hình: Ubuntu 20.04 LTS 4GB RAM, 2CPU, 20GB Storage
  • Server 2: 10.32.3.181
    • Server cài đặt làm Node thứ nhất
    • Cấu hình: Ubuntu 20.04 LTS 4GB RAM, 2CPU, 20GB Storage
  • Server 3: 10.32.3.182
    • Server cài đặt làm Node thứ hai
    • Cấu hình: Ubuntu 20.04 LTS 4GB RAM, 2CPU, 20GB Storage

Cài đặt K8s cluster (nếu bạn đã cài đặt rồi thì bỏ qua phần này nhé)

Vì mình muốn bài viết được hoàn thiện nhất có thể nên mình vẫn thêm bước cài đặt vào, vì thực tế có rất nhiều cách để cài cluster k8s tuy nhiên cách dưới đây mình thấy khá đơn giản cho những bạn mới nên bạn cũng có thể tham khảo nếu bạn đã có cách cài đặt phù hợp của mình.

Step 1: Cài đặt các package cần thiết và cài đặt Kubernetes (Thực hiện trên tất cả các server)

$ sudo apt update && sudo apt -y upgrade
[ -f /var/run/reboot-required ] && sudo reboot -f

$ sudo reboot

$ sudo apt -y install curl apt-transport-https

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

$ sudo apt update -y

$ sudo apt -y install vim git curl wget kubelet kubeadm kubectl

$ sudo apt-mark hold kubelet kubeadm kubectl

$ kubectl version --client && kubeadm version

$ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

$ sudo swapoff -a

$ sudo mount -a

$ free -h

$ sudo modprobe overlay

$ sudo modprobe br_netfilter 

$ sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

$ sudo sysctl --system

$ sudo su -

$ OS="xUbuntu_20.04"

$ VERSION=1.27

$ echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list

$ echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list

$ curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | apt-key add -

$ curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | apt-key add -

$ su - ubuntu

$ sudo apt update

$ sudo apt install cri-o cri-o-runc -y

$ sudo sed -i 's/10.85.0.0/172.24.0.0/g' /etc/cni/net.d/100-crio-bridge.conflist

$ sudo systemctl daemon-reload

$ sudo systemctl restart crio

$ sudo systemctl enable crio

$ sudo systemctl status crio

$ sudo systemctl enable kubelet

$ sudo kubeadm config images pull --cri-socket unix:///var/run/crio/crio.sock

$ sudo sysctl -p

Step 2: Khởi tạo K8s Cluster (chỉ thực hiện trên server Master)

$ sudo kubeadm init --pod-network-cidr=172.24.0.0/16 --cri-socket unix:///var/run/crio/crio.sock

$ mkdir -p $HOME/.kube

$ sudo cp -f /etc/kubernetes/admin.conf $HOME/.kube/config

$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

$ kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml

$ curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml -O

$ sudo vi custom-resources.yaml

apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    # Note: The ipPools section cannot be modified post-install.
    ipPools:
    - blockSize: 26
      cidr: 172.24.0.0/16
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()

$ kubectl create -f custom-resources.yaml

$ kubectl cluster-info

Thành công được kết quả như dưới đây

Cài đặt thành công K8s master

Step 3: Join Node vào Master (Chỉ thực hiện trên các node nhé)

$ sudo touch /proc/sys/net/bridge/bridge-nf-call-iptables

$ sudo kubeadm join 10.32.3.180:6443 --token ladk36.2l7t4puuvxmv3y08 --discovery-token-ca-cert-hash sha256:d5d9f296fd48c909eb188db028c74705d7f9631329f4e9208237eedb7cc45093

Thành công đươc kết quả như dưới đây

cài đặt k8s node thành công

Step 4: Kiểm tra cài đặt k8s cluster (quay lại server Master)

$ kubectl get pods --all-namespaces -w thông tin tất cả các pod trong tất cả các namespace của cụm Kubernetes và theo dõi các thay đổi liên quan đến chúng trong thời gian thực

cài đặt k8s thành công

$ kubectl get no -o wide lấy thông tin về các node trong cụm Kubernetes và hiển thị chi tiết

cài đặt thành công k8s cluster

Vậy là chúng ta đã cài đặt thành công K8s cluster với Master và hai Node, đây là một mô hình thông dụng ngoài ra nếu muốn tận dụng tối đa tài nguyên bạn có thể cài đặt cả 3 server đều là master với role là cả control plane và node tuy nhiên sẽ có hạn chế là việc các master thực thi điều phối có thể làm ảnh hưởng tốc độ ứng dụng.

Tương tự như vậy trong thực tế tài nguyên có thể lớn hơn rất nhiều và số lượng Master và Node cũng vậy tuy nhiên bài này chúng ta chỉ cần như vậy là đủ.

Kubernetes dùng để làm gì?

Kubernetes (K8s) được sử dụng để quản lý và triển khai các ứng dụng được đóng gói vào các container. Cụ thể, Kubernetes giúp giải quyết những vấn đề sau đây:

  1. Tự động triển khai (Automated Deployment): Kubernetes cho phép tự động triển khai ứng dụng trên nhiều máy chủ (nodes) một cách đáng tin cậy. Bạn chỉ cần xác định cấu hình mong muốn, và Kubernetes sẽ quản lý quá trình triển khai, giúp đảm bảo ứng dụng chạy trên môi trường đích như mong muốn.
  2. Tự động mở rộng (Automatic Scaling): Kubernetes cho phép tự động mở rộng số lượng ứng dụng chạy dựa trên tải công việc (workload). Điều này giúp đảm bảo ứng dụng có sẵn để đáp ứng yêu cầu của người dùng mà không gây lãng phí tài nguyên.
  3. Tự phục hồi (Self-healing): Kubernetes đảm bảo rằng ứng dụng được duy trì trong trạng thái lành mạnh bằng cách khởi động lại các container khi chúng gặp sự cố hoặc không phản hồi. Nếu một Pod bị lỗi, Kubernetes sẽ thay thế nó bằng một Pod mới để đảm bảo tính sẵn sàng cao.
  4. Cân nhắc và tải cân đối (Load Balancing): Kubernetes cung cấp cơ chế cân nhắc tự động giữa các Pod để phân phối công việc đều đặn và đảm bảo rằng không có Pod nào bị quá tải.
  5. Cung cấp dịch vụ (Service Discovery): Kubernetes cung cấp cơ chế để phát hiện và truy cập các dịch vụ trong cluster. Bằng cách sử dụng tài nguyên Service, bạn có thể tạo địa chỉ IP ổn định và tên miền cho các dịch vụ của mình.
  6. Cơ chế chia sẻ dữ liệu và trạng thái (Storage Orchestration): Kubernetes hỗ trợ cơ chế chia sẻ dữ liệu và trạng thái giữa các container trong cùng một Pod thông qua các Volume.
  7. Quản lý tài nguyên (Resource Management): Kubernetes giúp quản lý và tối ưu hóa việc sử dụng tài nguyên của cluster, bao gồm CPU, bộ nhớ và lưu trữ.

Nhờ vào những tính năng và khả năng mạnh mẽ này, Kubernetes đã trở thành một trong những công cụ phổ biến nhất cho việc triển khai và quản lý các ứng dụng dựa trên container trong môi trường sản xuất.

Kubernetes là gì?

Kubernetes (K8s) là một hệ thống quản lý container mã nguồn mở được phát triển ban đầu bởi Google và hiện đang được duy trì bởi Cloud Native Computing Foundation (CNCF). Nó cung cấp một nền tảng cho việc triển khai, mở rộng và quản lý các ứng dụng chạy trong container.

Trong bối cảnh phát triển ứng dụng hiện đại, việc đóng gói ứng dụng vào các container đã trở thành một xu hướng quan trọng. Container giúp đảm bảo ứng dụng có thể chạy nhất quán trên môi trường phát triển và sản xuất mà không cần thay đổi nhiều về cấu hình. Mỗi container bao gồm ứng dụng và các phụ thuộc của nó, tạo ra môi trường đóng gói độc lập và di động.

Tuy nhiên, quản lý hàng trăm hoặc hàng nghìn container trong môi trường sản xuất đòi hỏi một hệ thống quản lý linh hoạt và tự động. Đó là lúc Kubernetes trở nên cần thiết. K8s được phát triển để giải quyết các thách thức trong việc triển khai, quản lý, cân nhắc, và mở rộng các ứng dụng chạy trong container.

Điểm mạnh và điểm yếu của Kubernetes

Điểm mạnh của Kubernetes (K8s):

  1. Tích hợp mạnh mẽ: Kubernetes tích hợp tốt với nhiều công nghệ và dịch vụ cloud khác nhau, cho phép bạn triển khai và quản lý ứng dụng trên nhiều môi trường khác nhau một cách linh hoạt.
  2. Tự phục hồi (Self-healing): K8s tự động giám sát và điều khiển trạng thái của các container và Pod. Nếu một Pod gặp sự cố, Kubernetes sẽ tự động khởi động lại Pod hoặc triển khai phiên bản mới để đảm bảo tính sẵn sàng cao cho ứng dụng.
  3. Tự động mở rộng (Automatic Scaling): Kubernetes cho phép tự động mở rộng số lượng ứng dụng dựa trên tải công việc. Khi lưu lượng tăng, K8s có thể triển khai thêm Pod để xử lý tải cao và ngược lại.
  4. Service Discovery và Load Balancing: Kubernetes cung cấp cơ chế dễ dàng để tìm kiếm và truy cập các dịch vụ trong cụm máy chủ thông qua cơ chế Service. Nó tự động cân đối tải giữa các phiên bản dịch vụ, giúp đảm bảo phân phối công việc đều đặn.
  5. Phân tán và Cô lập (Distribution and Isolation): Kubernetes cho phép chia nhỏ ứng dụng thành các Pod, giúp quản lý và mở rộng ứng dụng một cách hiệu quả. Nó cũng hỗ trợ việc sử dụng Namespace để cô lập tài nguyên và công việc giữa các nhóm.
  6. Cung cấp dịch vụ (Service Exposure): Kubernetes cung cấp nhiều cơ chế để phát hiện và tiếp cận các dịch vụ trong cluster, bao gồm NodePort, LoadBalancer và Ingress.

Điểm yếu của Kubernetes (K8s):

  1. Phức tạp trong triển khai ban đầu: Việc triển khai và cấu hình ban đầu Kubernetes có thể phức tạp và đòi hỏi hiểu rõ cách hoạt động của nó. Điều này đòi hỏi một quá trình học tập ban đầu và kỹ năng vận hành.
  2. Yêu cầu phần cứng và tài nguyên lớn: Kubernetes yêu cầu phần cứng và tài nguyên lớn để triển khai và vận hành. Điều này có thể tạo ra một chi phí cao đối với những doanh nghiệp có quy mô nhỏ hoặc hạn chế tài nguyên.
  3. Khó khăn trong việc debugging và giám sát: Vì Kubernetes quản lý nhiều container và Pod, việc giám sát và debugging có thể trở nên phức tạp. Điều này đòi hỏi sử dụng các công cụ và giải pháp bổ sung để theo dõi và phân tích hiệu suất ứng dụng.
  4. Khả năng mở rộng có thể phức tạp: Mặc dù Kubernetes cung cấp cơ chế tự động mở rộng, việc cấu hình và quản lý các cụm máy chủ lớn có thể phức tạp hơn và đòi hỏi kỹ năng cao về quản trị hệ thống.
  5. Cập nhật và nâng cấp có thể gây gián đoạn: Cập nhật và nâng cấp phiên bản Kubernetes có thể gây gián đoạn cho ứng dụng nếu không thực hiện cẩn thận. Điều này đòi hỏi kế hoạch nâng cấp cẩn thận và kiểm tra kỹ lưỡng trước khi thực hiện.

Kubernetes architecture

Để nhanh chóng nắm bắt được kiến thức của K8s hơn thì bạn cần hiểu về kiến trúc của Kubernetes

components-of-kubernetes

Bạn có thể hiểu đơn giản như thế này:

  • Control Plane (Master) giống như trung tâm điều khiển (bộ não) của chúng ta vậy điều khiển các Node (Worker) và các ứng dụng sẽ không được triển khai lên trên server Master trên server Master gồm có những thành phần sau:
    • Kubernetes API Server: thành phần giúp các thành phần khác liên lạc nói chuyện với nhau, khi triển khai ứng dụng sẽ gọi API Kubernetes API Server này.
    • Scheduler: thành phần này lập lịch triển khai cho các ứng dụng, ưng dụng được đặt vào Worker nào để chạy.
    • Controler Manager: thành phần đảm nhiệm phần quản lý các Worker, kiểm tra các Worker sống hay chết, đảm nhận việc nhân bản ứng dụng…
    • Etcd: Đây là cơ sở dữ liệu của Kubernetes, tất cả các thông tin của Kubernetes được lưu trữ cố định vào đây.
  • Worker (Node) những server để thực hiện các tác vụ, hành động như triển khai ứng dụng và server Node gồm những thành phần sau:
    • Container runtime: thành phần giúp chạy các ứng dụng dưới dạng Container. Thông thường người ta sử dụng Docker.
    • Kubelet: đây là thành phần giao tiếp với Kubernetes API Server, và cũng quản lý các container.
    • Kubernetes Service Proxy: thành phần này đảm nhận việc phân tải giữa các ứng dụng.

Nếu hơi khó hiểu bạn có thể hiểu như thế này:

Hãy xem Kubernetes như một trưởng lão của ngôi làng ảo. Trong ngôi làng này, có một số công việc cần làm để giữ cho làng hoạt động một cách trơn tru. Kubernetes chịu trách nhiệm quản lý và điều phối mọi công việc trong ngôi làng này.

1. Trưởng lão (Master): Trưởng lão là người quản lý cả ngôi làng và nhận các yêu cầu từ các người dân (ứng dụng). Trưởng lão được chia thành ba vai trò quan trọng:

  • Trưởng lão trung tâm (kube-apiserver): Là người quản lý chung, tiếp nhận các yêu cầu từ người dân và quyết định cách giải quyết các vấn đề.
  • Kho tri thức (etcd): Là một bảng chứa thông tin quan trọng về ngôi làng, như tài nguyên còn lại và tình trạng các công việc.
  • Kiểm soát viên (kube-controller-manager): Là những người giám sát các hoạt động trong làng, chẳng hạn như chăm sóc những cây cối, đảm bảo rằng có đủ lương thực và các công việc được thực hiện đúng cách.

2. Công dân (Worker Node): Công dân là những người trong ngôi làng, họ làm việc để duy trì cơ sở hạ tầng và cung cấp các dịch vụ cho nhau. Mỗi công dân chịu trách nhiệm quản lý một phần của làng, và có các công việc sau:

  • Nhân viên lập trình (kubelet): Là những công nhân có kỹ năng đặc biệt trong việc triển khai và quản lý các ứng dụng (các container) trong làng.
  • Tiếp viên (kube-proxy): Là những người quản lý việc giao tiếp trong làng, giúp các ứng dụng tìm thấy nhau và đảm bảo các yêu cầu được định tuyến đúng cách.
  • Thợ mỏ (Container Runtime): Là những người chịu trách nhiệm chạy các container, giống như những người chịu trách nhiệm xây dựng các công trình trong làng.

3. Công trình và Dịch vụ (Pod và Service): Công trình (Pod) là những công việc cụ thể mà người dân muốn thực hiện. Chẳng hạn, có thể có công việc chăm sóc cây cối, nấu ăn, xây dựng các công trình, và còn nhiều công việc khác. Mỗi công trình (Pod) có thể chứa một hoặc nhiều người làm việc (container).

Dịch vụ (Service) là những điểm dừng cung cấp các dịch vụ trong làng. Chẳng hạn như nhà hàng cung cấp thức ăn, tiệm thuốc cung cấp dược phẩm, và nhà máy nước cung cấp nước uống. Các dịch vụ này giúp người dân tìm kiếm và truy cập những dịch vụ mà họ cần.

4. Kỹ sư phân tích (ReplicaSet và Deployment): Kỹ sư phân tích (ReplicaSet) là người quản lý số lượng công việc cụ thể (Pod) trong làng. Nếu có quá ít công việc, họ sẽ triển khai thêm công việc mới. Nếu có quá nhiều công việc, họ sẽ thu hồi một số công việc để đảm bảo cân đối tải.

Kỹ sư triển khai (Deployment) là người quản lý quá trình triển khai và cập nhật công việc trong làng. Họ đảm bảo rằng các công việc được triển khai đúng cách và quá trình triển khai diễn ra suôn sẻ.

Chi tiết từng thành phần

Pod

Pod là đơn vị nhỏ nhất và rất quan trọng trong Kubernetes cluster. Bản thân Pod có thể chứa 1 hoặc nhiều hơn 1 container. Pod chính là nơi ứng dụng được chạy trong đó. Pod là các tiến trình nằm trên các Worker Node. Bản thân Pod có tài nguyên riêng về file system, cpu, ram, volumes, địa chỉ network… (có thể hiểu đơn giản Pod giống như một server chứa các containers).

Phù hợp nhất là Pod chứa container càng ít càng tốt, vì khi mà scale Pod lên đồng nghĩa việc các container trong đó cũng sẽ scale lên sẽ chiếm tài nguyên.

Cách triển khai một ứng dụng web sử dụng Pod

$ mkdir -p ~/k8s_hands_on/pod tạo thư mục làm việc với Pod

$ cd ~/k8s_hands_on/pod/ di chuyển đến thư mục đó

$ vi car-serv-pod.yaml tạo file cấu hình như sau

apiVersion: v1
kind: Pod
metadata:
  name: car-serv-pod
spec:
  containers:
  - name: car-serv-container
    image: elroydevops/car-serv

$ kubectl apply -f car-serv-pod.yaml khởi tạo Pod với file cấu hình

$ kubectl get pods xem thông tin các pods

$ kubectl describe pod car-serv-pod xem chi tiết Pod vừa tạo ra thành công được kết quả như sau

$ kubectl delete -f car-serv-pod.yaml xóa pod vừa tạo (có những cách khác nhau để xóa một tài nguyên trong K8s như xóa theo tên tuy nhiên xóa dựa trên file cấu hình sẽ xóa gọn gàng nhất những thành phần trong đó nó đã tạo).

Triển khai nhiều ứng dụng web sử dụng Pod

Trong một Pod, các container chia sẻ tài nguyên và không được chạy độc lập. Việc triển khai nhiều container trong một Pod thích hợp khi chúng cần tương tác hoặc chia sẻ dữ liệu với nhau

$ vi multiple-container-pod.yaml tạo file cấu hình như sau

apiVersion: v1
kind: Pod
metadata:
  name: multiple-containers-pod
spec:
  containers:
  - name: service-1
    image: elroydevops/accountingservice-1
    ports:
    - containerPort: 81
  - name: service-2
    image: elroydevops/accountingservice-2
    ports:
    - containerPort: 82

$ kubectl apply -f multiple-container-pod.yaml khởi tạo cấu hình Pod

$ kubectl get multiple-containers-pod -c service-1 tương ứng xem thông tin của container thứ nhất trong Pod

$ kubectl delete -f multiple-container-pod.yaml tương tự xóa Pod vừa tạo

Vậy là bạn đã hình dung ra được Pod là gì rồi chứ, đơn giản nó giống như một thành phần bao bọc đến các container và trong các container đều có thể giao tiếp với nhau qua rải mạng của pod.

Replicaset

Bạn biết đó nếu mỗi ứng dụng chỉ có 1 container gắn với 1 Pod thì việc khi Pod đó có vấn đề thì sẽ không thể đảm bảo được sự hoạt động ổn định nên chúng ta sẽ tiến hành sử dụng Replicaset Là thành phần quản trị bản sao của Pod, giúp nhân bản hoặc giảm số lượng Pod.

$ mkdir ~/k8s_hands_on/replicaset tạo thư mục làm việc với Replicaset

$ cd ~/k8s_hands_on/replicaset/ di chuyển tới thư mục đó

$ vi car-serv-replicaset.yaml tạo file cấu hình như sau

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: car-serv-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: car-serv
  template:
    metadata:
      labels:
        app: car-serv
    spec:
      containers:
        - name: car-serv-container
          image: elroydevops/car-serv
          ports:
            - containerPort: 81

$ kubectl apply -f car-serv-replicaset.yaml khởi tạo Relicaset từ file cấu hình

$ kubectl get replicasets hiển thị danh sách các ReplicaSet

$ kubectl describe replicaset car-serv-replicaset xem chi tiết của Replicaset vừa tạo

$ kubectl get pods xem danh sách pods như dưới đây là thành công chúng ta đã tạo ra 3 pod chạy ứng dụng

$ kubectl delete -f car-serv-replicaset.yaml tương tự xóa Replicaset từ file cấu hình vừa tạo

Vậy là bạn đã hiểu được thành phần Replicaset rồi khá đơn giản phải không nào, chúng ta cứ đi từ dễ đến phức tạp để hiểu về K8s một cách đầy đủ nhé

Deployment

Deployment là một đối tượng trong Kubernetes được sử dụng để quản lý quá trình triển khai ứng dụng, Deployment định nghĩa cách triển khai ứng dụng, bao gồm số lượng Pod và các cấu hình khác.

$ mkdir ~/k8s_hands_on/deployment tạo thư mục làm việc với Deployment

$ cd ~/k8s_hands_on/deployment/ di chuyển tới thư mục đó

$ vi car-serv-deployment.yaml tạo file cấu hình Deployment như sau

apiVersion: apps/v1
kind: Deployment
metadata:
  name: car-serv-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: car-serv
  template:
    metadata:
      labels:
        app: car-serv
    spec:
      containers:
        - name: car-serv
          image: elroydevops/car-serv
          ports:
            - containerPort: 8080

$ kubectl apply -f car-serv-deployment.yaml triển khai Deployment từ file cấu hình

$ kubectl get deployments hiển thị danh sách Deployments

$ kubectl describe deployment car-serv-deployment xem chi tiết Deployment thành công được kết quả sau

$ kubectl delete -f car-serv-deployment.yaml tương tự xóa Deployment từ file cấu hình vừa tạo

Vậy là bạn cũng đã hiểu được Deployment là gì đúng không nào, đơn giản Pod thì triển khai độc lập các ứng dụng, Replicaset thì triển khai thêm số lượng của ứng dụng và Deployment sẽ triển khai nhiều ứng dụng gồm cả các cấu hình kèm theo

Service

Service là phần mạng (network) của Kubernetes giúp cho các Pod gọi nhau ổn định hơn, hoặc để Load Balancing giữa nhiều bản sao của Pod, và có thể dùng để dẫn traffic từ người dùng vào ứng dụng (Pod), giúp người dùng có thể sử dụng được ứng dụng.

Trong Kubernetes, có 4 loại cơ bản của Service: ClusterIP, NodePort, LoadBalancer và ExternalName cụ thể như sau

  1. ClusterIP: Đây là loại Service mặc định. Nó tạo ra một địa chỉ IP ảo (ClusterIP) trong cùng mạng nội bộ của cluster Kubernetes. Service chỉ có thể truy cập từ bên trong cluster, không thể truy cập từ bên ngoài. Đây là loại Service phổ biến để triển khai các ứng dụng nội bộ trong cluster.
  2. NodePort: Loại Service này mở một cổng trên mỗi node trong cluster và chuyển tiếp yêu cầu đến Service từ cổng đó. Nó cho phép truy cập từ bên ngoài cluster thông qua địa chỉ IP của node và cổng được chỉ định. Mặc dù NodePort giúp Service truy cập được từ bên ngoài, nó không cung cấp cơ chế cân bằng tải và phụ thuộc vào cổng mở trên từng node.
  3. LoadBalancer: Loại Service này sử dụng một dịch vụ cân bằng tải của cloud provider hoặc một thiết bị cân bằng tải riêng để phân phối yêu cầu đến các Pod của Service. Một địa chỉ IP công khai (LoadBalancer IP) được cung cấp để truy cập Service từ bên ngoài. Cân bằng tải giữa các Pod trong Service được quản lý bởi cơ chế cân bằng tải của LoadBalancer.
  4. ExternalName: Loại Service này cung cấp một tên địa chỉ (DNS) tĩnh cho một service bên ngoài cluster. Thay vì chuyển tiếp yêu cầu tới các Pod, ExternalName Service chỉ trả về một tên miền cụ thể. Nó thường được sử dụng để tham chiếu các service bên ngoài cluster, chẳng hạn như dịch vụ database hoặc API ngoại vi.

$ mkdir ~/k8s_hands_on/service tạo thư mục làm việc với Service

$ cd ~/k8s_hands_on/service/ di chuyển tới thư mục đó

$ vi car-serv-service.yaml tạo file cấu hình Service cấu hình trên tôi đã triển khai một Deployment và Service với type là NodePort để có thể trực tiếp truy cập vào ứng dụng của mình từ bên ngoài như sau

apiVersion: apps/v1
kind: Deployment
metadata:
  name: car-serv-deployment
spec:
  selector:
    matchLabels:
      app: car-serv
  replicas: 1
  template:
    metadata:
      labels:
        app: car-serv
    spec:
      containers:
        - name: car-serv
          image: elroydevops/car-serv
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: car-serv-service
spec:
  type: NodePort
  selector:
    app: car-serv
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

$ kubectl apply -f car-serv-service.yaml khởi tạo Service từ file cấu hình

$ kubectl get services hiển thị danh sách Service thành công được kết quả

Bạn có thể thấy một số thông tin trên như port mà chúng ta có thể truy cập từ bên ngoài là 32406 vậy chúng ta sẽ tiến hành truy cập từ địa chỉ 10.32.3.180:32406 thành công được kết quả

$ kubectl delete -f car-serv-service.yaml tương tự xóa Service từ file cấu hình vừa tạo

Để tạo nhanh rancher

$ docker run --name rancher-server -d --restart=unless-stopped -p 6860:80 -p 6868:443 --privileged rancher/rancher:v2.6.10 bạn truy cập port 6868 để sử dụng rancher nhé.

Vậy là đến hiện tại bạn đã biết cách cài đặt và sử dụng Kubernetes cơ bản rồi, thực chất trên internet đã rất nhiều nguồn tài nguyên để học K8s rồi, nên mình không muốn làm quá sâu phần lý thuyết mình sẽ làm nhiều bài viết mang tính thực tế hơn để bạn có thể áp dụng hoặc có cái nhìn thực tế hơn. Mình sẽ làm nhiều hướng dẫn hơn về các kỹ năng các tool khác để giúp bạn tối ưu được những tác vụ cũng như tiết kiệm những chi phí khi phát triển phần mềm. Thanks.

 

Mọi thắc mắc bạn có thể liên hệ:

Email: [email protected]