Header Ads Widget

Ticker

6/recent/ticker-posts

Phần 2: Cài đặt Kubernetes xây dựng Cluster và build App bằng file yaml cơ bản trên Ubuntu

Keywords: How to install kubernetes cluster and build app by file yaml bassic on ubuntu
Như hướng dẫn trước của mình, thì mình đã hướng dẫn xong cho các bạn cách cài đặt kubernetes với rancher rồi đúng không, với ai không thích sử dụng rancher mà lại muốn một kubernetes gốc thì có thể sử dụng cách làm tay trong phần 2 này
Các bạn có thể xem lại
Khác với phần 1 một chút là chúng ta chỉ cần có tổng cộng 3 máy server cho Lab này, mình sẻ nói lướt qua chổ này, các bạn có thể coi kỷ hơn bằng cách xem lại phần 1 nhé và 3 máy server cần cho Lab này sẻ là Node Master, Node Worker1 và Node Worker2 cũng lần lượt là
  • Server 1: Docker và làm Node Master (Ram >= 3GB + CPU 4 + Disk 20GB)
  • Server 2: Docker và làm Node Worker (Ram 1GB + CPU 1 + Disk 20GB)
  • Server 3: Docker và làm Node Worker (Ram 1GB + CPU 1 + Disk 20GB)
Bước 1: Cài đặt Docker trên tất cả 3 server
sudo apt-get update
sudo apt-get install docker.io
docker --version
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker
Đến đây mọi thứ vẫn giống như phần 1 là hiện tại 3 server của chúng ta sẻ được miêu tả gần giống như sau
Bước 2: Chuẩn bị một số phần cơ bản trước khi cài đặt Kubernetes
Sẻ có rất nhiều vấn đề cần chuẩn bị vì thế mình sẻ nói ra từng vấn đề một cho các bạn giải quyết trước nha
  • Đặt tên lại cho các máy server để chúng ta dễ dàng phân biệt và nó sẻ sử dụng tên đó để xây dựng cho vùng Cluster, với mình thì mình đã đặt tên lần lượt cho tất cả các máy là như sau: k8s-master, k8s-node1, k8s-node2
  • Thực hiện update và cài đặt một số gói hổ trợ
apt-get update -y && apt-get upgrade -y
apt-get -y install -y vim curl wget
  • Tắt tính năng swap trên OS cho 3 máy server bởi vì Kubernetes không sử dụng phân vùng swap, nếu có nó sẻ không cài đặt và báo lỗi nên vì vậy ta lần lượt thực hiện trên tất cả các máy bằng cách chạy lệnh sau
swapoff -a
Sau đó mở file fstab để comment dòng swap lại nhé
vi /etc/fstab

Các bạn cũng làm như thế với 2 máy còn lại là node1 và node2 rồi sau đó kiểm tra bằng cách gõ lệnh
free -m
Nếu ngay chổ phân vùng Swap mà để 0 hết thì đã ok rồi đấy
  • Bây giờ các bạn phải chắc cú 1 điều là 3 máy server hiện tại có Class IP trùng với nhau và có thể ping thấy nhau, để chắc cú hơn các bạn có thể add IP vào /etc/hosts để máy dễ dàng nhìn thấy nhau hơn qua IP và name bằng cách
vi /etc/hosts
Làm giống vậy cho Node1 và Node2 luôn nhé
Như bạn thấy trên hình thì 3 máy server của mình cùng class mạng 1 và mình đã khai báo cho toàn bộ y như vậy trong file hosts để nó dễ nhận diện lấy nhau dễ hơn chứ thật ra không có cũng ko mất gì mấy hihi
Bước 3: Thực hiện cài đặt một số thành phần cần thiết cho K8S (Mình sẻ gọi tắt như thế cho Kubernetes các bạn nhé)
Cài đặt kubelet, kubeadm và kubectl cho tất cả các node server luôn nhé
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt-get install kubeadm kubelet kubectl
sudo apt-mark hold kubeadm kubelet kubectl
Trong đó:
  1. kubeadm: Được sử dụng để có thể thiết lập cụm cluster cho k8s
  2. kubelet: Thành phần chạy trên các host, có nhiệm vụ kích hoạt pods và container cho cụm cluster
  3. kubectl: Công cụ cung cấp cli (Giao diện dòng lệnh) để thực thi lệnh k8s
Bước 4: Xây dựng Node Master để tạo Cluster cho K8S
Tại đây mình chỉ thực hiện duy nhất trên Node Master thôi nhé, bắt đầu chạy câu lệnh sau để tạo cụm cluster
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
hoặc
kubeadm init --apiserver-advertise-address 10.0.1.160 --pod-network-cidr=10.244.0.0/16
Trong đó:
  1. --apiserver-advertise-address: Chính là nơi để yêu cầu địa chỉ IP của máy k8s-master của mình kiểu dạng như trên thì nó tự tìm đến địa chỉ IP của máy master luôn nhưng nếu như máy bạn nhiều card mạng quá thì các bạn có thể thêm lệnh này để khai báo địa chỉ IP mà bạn muốn thằng k8s-master sử dụng
  2. --pod-network-cidr: Đây là đỉa chỉ mạng phụ thuộc mà công nghệ network kết hợp với k8s, trong hướng dẫn lần này của chúng ta đang sử dụng flannet để connect với tất cả các node mà thằng flannet này sử dụng dãi IP: 10.244.0.0/16
Mình bắt đầu chạy nhưng do mình quên nâng CPU cho con Master lên thành ra nó lỗi như hình dưới đấy hoặc các bạn đã chỉnh CPU lên rồi nhưng lỗi dưới vẫn còn thì các bạn cứ truy cập vào đường dẫn sau của docker và thêm 1 file daemon.json với nội dung sau
root@master1:~# cat /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
Nếu như các bạn thấy được giống hình sau nghĩa là các bạn đã thành công rồi đấy
Như hình trên các bạn cần chú ý những cái nó yêu cầu sau, thực hiện chạy những lệnh sau ở Node Master
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "source <(kubectl completion bash)" >> ~/.bashrc
Mình đã thêm 2 câu lệnh vào để nó hoàn hiện hơn đó là lệnh tự hoàn thiện command khi nhấn tab và lệnh export config, cũng cần chú ý 1 câu lệnh nữa nhưng câu lệnh này sẻ không chạy trên Node Master đâu nhé, mà sẻ chạy trên các Node Worker để thực hiện Join vào Cluster
Nhưng hiện tại các bạn chưa đụng chạm gì tới lệnh này cả, cứ chú ý nó và save nó vào trong file note nào đó đi để lát chúng ta sẻ lấy ra sử dụng
Bước 5: Cài đặt Pod Network
Tại node-master chúng ta thực hiện lệnh sau để có thể xây dựng deploy pod network cho cluster
sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Bạn có thể kiểm tra mọi thứ bằng lệnh sau
kubectl get pods --all-namespaces

Bước 6: Thực hiện tham gia cluster cho k8s-node1 và k8s-node2
Bạn còn nhớ cái câu lệnh mà mình yêu cầu bạn save lại khi nảy không, bây giờ là lúc bạn lấy nó ra sử dụng rồi đấy, chạy câu lệnh đó vào node1 và node2, đừng copy theo y chang của mình vì mõi k8s cluster nó sẻ tạo ra 1 cái token riêng biệt, nên vì vậy câu lệnh của các bạn có thể hơi giống mình nhưng lại khác phần token đấy
kubeadm join 10.0.1.160:6443 --token 0sd1ae.f82txdwr6hjo2cxx --discovery-token-ca-cert-hash sha256:fada0831efaaa86566370c0c689c60866b75bd9546b5d6a0d8b05350251fbdb4
Thực hiện xong con node1 rồi mới nhảy qua con node 2 nhé, nếu nó hiện thông báo vậy nghĩa là ok rồi đấy
Trên máy master chúng ta thực hiện chạy lệnh sau để xem nó đã kết nối ok chưa nhé
kubectl get nodes

Như các bạn đã thấy mọi thứ đã Ready cả rồi đấy, nói thật bây giờ đa phần thì các bạn chỉ sử dụng con master thôi còn con worker sau khi tham gia vào master thì nó đã không còn giá trị lợi dụng so với chúng ta nữa vì con master sẻ ra lệnh cho bọn nó làm hết mọi vấn đề, nếu trong quá trình làm mà bạn thấy một node nào đó đang bị lỗi hoặc pending chỗ nào đó các bạn có thể sử dụng lệnh sau để check và kiểm tra nó nhé
kubectl describe pod kube-scheduler-k8s-master --namespace=kube-system
Giả sử ở trên mình check thử node master, nhưng hiện tại node master của mình vẫn ổn hehe
Ok như vậy là mình đã hướng dẫn xong cho các bạn cách cài đặt thằng kubernetes hoàn chỉnh bằng tay rồi đấy, mình sẻ hướng dẫn các bạn tiếp tục xây dựng một số ứng dụng cơ bản để các bạn có thể thực thi k8s với kubectl bằng dòng lệnh, nhưng có 2 cách chạy thử ứng dụng đó là các bạn chạy từng dòng lệnh 1 và cách 2 sẻ là sử dụng file yaml để build 1 ứng dụng chỉ bằng 1 command, ok không dài dòng nữa chúng ta sẻ thực hiện cách 1 trước

Cách 1: Cài đặt web nginx trên k8s cơ bản bằng lệnh

Như ở trên mình chạy thử các dòng lệnh cho các bạn thấy thì hiện tại pods, services, deployments vẫn chưa có 1 bất kì gì khác lạ cả, chỉ có mõi dãi IP Cluster hồi nảy mình tạo trong phần services thôi, thực hiện chạy 2 câu lệnh sau để deploy nginx và phân chia nginx cho 2 node làm việc, bây giờ chỉ làm việc trên máy master thôi nên các bạn cứ mở máy master lên mà chạy lệnh thôi, 2 thằng kia hết giá trị lợi dụng rồi kaka
kubectl create deployment k8s-nginx --image=nginx
Sau khi chạy lệnh trên, mình sẻ kiểm tra lại tất cả cho các bạn thấy 1 lần nữa nhé
Như các bạn thấy pods của mình đã tạo ra 1 pods nginx, giá trị deployments cũng ready 1/1 nghĩa là mọi thứ đã ổn, nhưng nếu mình muốn tạo thêm 1 pods nginx nữa để khi con pods này chết thì vẫn còn con khác hoặc tự restore trở lại hoặc giải quyết vấn đề loadbalancer thì sao ? ok chạy tiếp lệnh sau nhé
kubectl scale deployment k8s-nginx --replicas=2
Thực hiện kiểm tra lại lần nữa coi mọi thứ thế nào nhé
Bây giờ Pods của chúng ta đã tăng lênh 2, deployments do lúc đầu nó chưa running xong mà mình bấm nên nó vẫn để 1/2 nhưng khi mình chạy lại lệnh 1 lần nữa thì đã 2/2 rồi đồng nghĩa pods cũng đã lên luôn rồi, ok vẫn ổn, mình sẻ thử delete 1 pods và get lại pods đó cho các bạn xem nhé
Như bạn đã thấy ở trên khi mình delete 1 pod bất kì thì nó sẻ tự động tạo ra 1 pod khác hoàn toàn vì vậy việc chết server là khá khó, trừ khi bạn delete deployments và service thì may ra nó mới chịu dừng lại, ok quá trình test về pod này kia đã xong web nginx thì ok rồi nhưng nó vẫn chưa xong vì mình chưa tạo services cho nó chạy mà thực hiện tạo bằng lệnh sau
kubectl expose deploy k8s-nginx --port 80 --target-port 80 --type NodePort
Sau khi các bạn chạy lệnh trên thì giờ đây bạn có thể truy cập vào trang web nginx rồi đấy, lúc này 1 services trong k8s đã được tạo ra
Ok, thực hiện truy cập trên máy ngoài hoàn toàn luôn nghĩa là các máy khác với những máy node trong dãy mạng lan với máy master muốn truy cập được thì phải thông qua 1 port khác port 80 do đó mình đã thêm --type là NodePort có nghĩa là một port ngẫu nhiên nào đó, nó sẻ tự tạo ra giúp mình, như hình trên bạn đã thấy nó đã tạo ra port 30623 để ta có thể truy cập từ ngoài vào
Ok bây giờ bạn có thể truy cập nginx từ 3 máy node với port 30623 rồi đấy, chúng ta chuyển đến phần build bằng file yaml cơ bản nhé, bây giờ bạn thực hiện xóa đi service và phần deploy của k8s nảy mình đã tạo đi bằng các câu lệnh sau
kubectl delete service k8s-nginx
kubectl delete deployments k8s-nginx

Cách 2: Xây dựng app cơ bản trên k8s bằng file yaml

Sau khi xóa chúng đi ta cũng không thể nào truy cập được nginx nữa, bây giờ ta phải xây dựng lại nginx app bằng file yaml chứ không làm bằng lệnh tay như trên nữa
Coi như là đã kết thúc phần quản lý ứng dụng cơ bản với k8s cluster rồi đấy bây giờ tạo file yaml nào
vi nginx-app.yaml
Với nội dung sau:
apiVersion: v1
kind: Service
metadata:
  name: k8s-nginx
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
Hoặc các bạn có thể sử dụng lệnh sau để lấy file về máy, sau đó sửa lại như ở trên giống mình các bạn nhé
wget https://k8s.io/examples/application/nginx-app.yaml
Sau đó thực hiện lệnh sau để deploy chúng lên
kubectl create -f nginx-app.yaml
Ok như vậy đã thành công rồi đấy, sau khi tạo xong thì giờ đây Port hiện tại của chúng ta sẻ là 30033 các bạn thử truy cập vào nhé
Ngon lành cành sung liền, như vậy mình đã hướng dẫn các bạn xong các bước cơ bản với k8s rồi, cũng khá thú vị đúng không, việc tìm hiểu cấu trúc file khi bạn đã hiểu được phần chạy tay cơ bản thì mình tin chắc rằng file yaml các bạn nhìn vào là hiểu liền, chúc các bạn thành công, nếu bài viết của mình có ích thì giúp mình DONATE ở phía dưới trang web nhé để mình có thêm động lực viết những bài viết tốt hơn nhé. Cảm ơn các bạn rất nhiều !

Post a Comment

0 Comments