Chuyển tới nội dung

Cài đặt Kubernetes và triển khai ứng dụng trên onprimse

1. Cài đặt cụm kubernetes

1.1. Mô hình cài đặt

1.2. Cấu hình tài nguyên

HostnameOSIPRAM (tối thiểu)CPU (tối thiểu)
k8s-master01Ubuntu 24.0410.100.1.243G2
k8s-worker02Ubuntu 24.0410.100.1.253G2
k8s-worker02Ubuntu 24.0410.100.1.263G2

1.3. Cấu hình hosts file trên cả 3 server
Thực hiện trên cả 3 servers

– Thêm hosts trong file host

vi /etc/hosts

10.100.1.24 k8s-master01
10.100.1.25 k8s-worker01
10.100.1.26 k8s-worker02

– Cập nhật và nâng cấp hệ thống

sudo apt update -y && sudo apt upgrade -y

1.4 Tắt swap

Hệ thống k8s yêu cầu tắt swap, nếu không thì không thể kết nối đến api của cụm

Tắt tạm thời

sudo swapoff -a

Tắt vĩnh viễn

Chỉnh sửa file /etc/fstab

vi /etc/fstab

– Thêm # vào dòng có chữ swap để vô hiệu hóa swap.

– Cấu hình module kernel /etc/modules-load.d/containerd.conf với nội dung sau:

overlay
br_netfilter

– Ta đùng lệnh sau để đưa overlay br_netfilte vào file /etc/modules-load.d/containerd.conf

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

Load module

sudo modprobe overlay
sudo modprobe br_netfilter

Cấu hình hệ thống mạng

echo "net.bridge.bridge-nf-call-ip6tables = 1" | sudo tee -a /etc/sysctl.d/kubernetes.conf
echo "net.bridge.bridge-nf-call-iptables = 1" | sudo tee -a /etc/sysctl.d/kubernetes.conf
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/kubernetes.conf

– Áp dụng cấu hình sysctl

sudo sysctl --system

1.5 Cài đặt các gói cần thiết và thêm kho Docker

sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

– Cài đặt containerd

sudo apt update -y
sudo apt install -y containerd.io

– Cấu hình containerd

containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

– Khởi động containerd

sudo systemctl restart containerd
sudo systemctl enable containerd

– Thêm kho lưu trữ Kubernetes

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

– Cài đặt các gói Kubernetes

sudo apt update -y
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl 

– Reset cụm khi đã khởi tạo cụm (làm sạch cụm k8s)

sudo kubeadm reset -f
sudo rm -rf /var/lib/etcd
sudo rm -rf /etc/kubernetes/manifests/*

1.6. Cài đặt node master

sudo kubeadm init
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

1.7 Cài đặt node 2 worker

sudo kubeadm join 10.100.1.24:6443 --token your_token --discovery-token-ca-cert-hash your_sha

1.8 Kiểm tra hệ thống sau khi cài đặt

iadmin@k8s-master01:~$ kubectl get nodes
NAME           STATUS   ROLES           AGE     VERSION
k8s-master01   Ready    control-plane   3d22h   v1.30.14
k8s-worker01   Ready    worker          3d22h   v1.30.14
k8s-worker02   Ready    worker          3d22h   v1.30.14

2. Cài đặt Rancher trên docker

2.1. Cài đặt docker

sudo apt update
sudo apt upgrade -y
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list> /dev/null

sudo apt update
sudo apt install docker-ce docker-compose docker-ce-cli containerd.io -y

2.2 Tạo network card thông qua card mạng thật để tạo lớp mạng mới

docker network create -d macvlan --subnet=10.100.1.0/24 --ip-range=10.100.1.0/28 --gateway=10.100.1.1 -o macvlan_mode=bridge -o parent=ens33 rancher_network

2.3 File docker-compose.yml

version: '3.9'

services:
  rancher:
    image: rancher/rancher:v2.12.0
    container_name: rancher
    restart: always
    volumes:
      - /data/rancher/data:/var/lib/rancher
    environment:
      CATTLE_BOOTSTRAP_PASSWORD: "BeoBeo@2025"
    networks:
      rancher_network:
        ipv4_address: 10.100.1.54
    privileged: true
  
networks:
  rancher_network:
    external: true

2.4 Cài đặt rancher

docker compose up -d

2.5 Thêm cụm k8s vào rancher để quản lý

Login vào rancher Import

Nhập tên nhóm, Sau đó Create

Chạy câu lệnh để join

Kiểm tra lại hệ thống

3. Triển khai shopingcart trêh hệ thống k8s

3.1 Triển khai trên rancher

3.1.1 Tạo project

3.1.2 Tạo namespaces

3.1.3 Tạo deployment
Vảo Workload -> Deployment -> Create Nhập tên deployment

3.1.4 Tạo services
Service Discovery -> Service

3.3.5 Tạo NodePort

Chọn selector

3.3.6 Tạo Cluster IP

3.3.7 Tạo Ingress

Cài helm

wget https://get.helm.sh/helm-v3.17.4-linux-amd64.tar.gz
tar vxf helm-v3.17.4-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/

Kiểm tra:

helm version

Cài đặt Ingress NGINX với Helm

Trên k8s-master-1

Thêm repo Helm:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

helm pull ingress-nginx

– Trong thư mục devops/ tiến hành giải nén file ingress-nginx mới down về bằng lệnh: tar -xzf tên file.

– Edit file value.yaml trong trong thư mục ingress-nginx sửa type: LoadBalancer thành -> type: NodePort

Và chỉnh port http: 30080 và https: 30443

Chạy các lệnh

kubectl create ns ingress-nginx
helm -n install <release name> -f ingress-nginx/ingress-nginx/value.yaml <helm chart>

helm -n ingress-nginx install ingress-nginx -f values.yaml ingress-nginx/ingress-nginx

Kiểm tra:

kubectl get all -n ingress-ngix

Trên rancher

3.2 Triển khai trên dòng lệnh

Tạo các file namespaces.yml, deployment.yml, nodeport.yml, clusterip.yml

file Namespace.yml

apiVersion: v1
kind: Namespace
metadata:
  labels:
    name: beobeo
  name: beobeo

file Deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    workloadselector: apps.deployment-beobeo-shoping-cart
  name: shoping-cart
  namespace: beobeo
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      workloadselector: apps.deployment-beobeo-shoping-cart
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        workloadselector: apps.deployment-beobeo-shoping-cart
      namespace: beobeo
    spec:
      containers:
        - image: beobeo/shoes-shop:latest
          imagePullPolicy: Always
          name: shoping-cart
          ports:
            - containerPort: 8080
              name: tcp
              protocol: TCP

file NodePort.yml

apiVersion: v1
kind: Service
metadata:
  name: tcp
  namespace: beobeo
spec:
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  ports:
    - name: tcp
      nodePort: 31234
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    workloadselector: apps.deployment-beobeo-shoping-cart
  sessionAffinity: None
  type: NodePort

File ClusterIP.yml

apiVersion: v1
kind: Service
metadata:
  name: sp-clusterip
  namespace: beobeo
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  ports:
    - name: tcp
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    workloadselector: apps.deployment-beobeo-shoping-cart
  sessionAffinity: None
  type: ClusterIP

file Ingres.yml (cần cài Ingress Nginx trước khi cài Ingress)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  generation: 2
  namespace: beobeo
spec:
  ingressClassName: nginx
  rules:
    - host: shoping-shoes.lc
      http:
        paths:
          - backend:
              service:
                name: sp-clusterip
                port:
                  number: 80
            path: /
            pathType: Prefix

Chaỵ các lệnh:

kubectl apply -f Namespace.yml
kubectl apply -f Deployment.yml
kubectl apply -f NodePort.yml
kubectl apply -f ClusterIP.yml
kubectl apply -f Ingress.yml

3.3. Cài đặt Loadbalancer

Cài đặt docker và triển khai trên docker

Tạo lớp mạng mới thông qua card mạng

docker network create -d macvlan --subnet=10.100.1.0/24 --ip-range=10.100.1.0/28 --gateway=10.100.1.1 -o macvlan_mode=bridge -o parent=ens33 rancher_network

file docker-compose.yml

version: '3.9'
services:
  nginx-proxy-manager:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx-proxy-manager
    restart: always
    ports:
      - '80:80'         # HTTP
      - '81:81'         # Web UI
      - '443:443'       # HTTPS
    environment:
      DB_MYSQL_HOST: "10.100.1.54"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm_password"
      DB_MYSQL_NAME: "npm_db_1"
    volumes:
      - ./data/nginx/data:/data
      - ./data/nginx/letsencrypt:/etc/letsencrypt
    networks:
      rancher_network:
        ipv4_address: 10.100.1.55

  npm-db-1:
    image: 'mariadb:10.5'
    container_name: npm-db-1
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'npm_rootpass'
      MYSQL_DATABASE: 'npm_db_1'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm_password'
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      rancher_network:
        ipv4_address: 10.100.1.54
   
   rancher:
    image: rancher/rancher:v2.12.0
    container_name: rancher
    restart: always
    privileged: true
    environment:
      CATTLE_BOOTSTRAP_PASSWORD: "BeoBeo@2025"
    volumes:
      - /data/rancher/data:/var/lib/rancher
    networks:
      rancher_network:
        ipv4_address: 10.100.1.56
    ports:
      - "443:443"

  nginx-lb:
    image: nginx:stable-alpine
    container_name: nginx-lb
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./nginx-lb/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx-lb/conf.d:/etc/nginx/conf.d:ro
    networks:
      rancher_network:
        ipv4_address: 10.100.1.57
  
networks:
  rancher_network:
    external: true

Tạo file ./nginx-lb/nginx.conf

worker_processes auto;

events { worker_connections 4096; }

http {
  include       mime.types;
  default_type  application/octet-stream;
  sendfile      on;

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  include /etc/nginx/conf.d/*.conf;
}

Tạo file ./nginx-lb/conf.d/ingress-lb.conf

upstream my_servers {
    least_conn;
    server 10.100.1.25:30080 max_fails=3 fail_timeout=10s;
    server 10.100.1.26:30080 max_fails=3 fail_timeout=10s;
    keepalive 32;
}

map $http_upgrade $connection_upgrade {
    default upgrade;
    ""      close;
}

server {
    listen 80;
    client_max_body_size 50m;

    location / {
        proxy_pass http://my_servers;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 5s;
        proxy_send_timeout    60s;
        proxy_read_timeout    60s;

        proxy_next_upstream error timeout http_502 http_503 http_504;
        proxy_next_upstream_tries 2;

        proxy_buffering on;
    }
}

Chạy lệnh để cài đặt nginx-lb (và restart lại rancher)

docker compose down

docker compose up -d

Thêm dòng

# ip nginx lb -> shop-shoes.lc
10.100.1.57 shop-shose.lc

kiểm tra qua trình duyệt hoặc curl -v http://shop-shose.lc

Liên hệ