Skip to main content

Command Palette

Search for a command to run...

Kubernetes notes

Updated
5 min readView as Markdown

Getting started

Cài đặt tools

kubectl

Linux x86-64:

curl -LO https://dl.k8s.io/release/v1.28.4/bin/linux/amd64/kubectl

Linux ARM64:

curl -LO https://dl.k8s.io/release/v1.28.4/bin/linux/arm64/kubectl
  1. Cài đặt kubectl

    sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
    

    Note:

    Nếu không có root access trên hệ thống, vẫn có thể cài đặt kubectl vào thư mục ~/.local/bin

    chmod +x kubectl
    mkdir -p ~/.local/bin
    mv ./kubectl ~/.local/bin/kubectl
    # and then append (or prepend) ~/.local/bin to $PATH
    
  2. Đảm bảo version được cài đặt là up-to-date:

    kubectl version --client
    

    Hoặc sử dụng câu lệnh sau để xem detail về versions:

    kubectl version --client --output=yaml
    

Cài đặt bằng native package management

Debian based:

  1. Update apt package index và cài đặt các packages cần thiết để sử dụng apt repository:

    sudo apt-get update
    # apt-transport-https may be a dummy package; if so, you can skip that package
    sudo apt-get install -y apt-transport-https ca-certificates curl
    
  2. Download public signing key cho K8s repositories. Signing key được sử dụng cho tất cả các repo, nên không quan trọng version ở URL:

    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    
  3. Add Kubernetes apt repository, nếu muốn dùng version khác thì thay v1.28 bằng version mong muốn:

    # This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    
  4. Update apt package index, và cài đặt kubectl:

    sudo apt-get update
    sudo apt-get install -y kubectl
    

Rehat based:

  1. Add Kubernetes yum repository, nếu muốn sử dụng version khác thì thay v1.28 thành version mong muốn:

    # This overwrites any existing configuration in /etc/yum.repos.d/kubernetes.repo
    cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
    enabled=1
    gpgcheck=1
    gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
    EOF
    
  2. Cài đặt kubectl sử dụng yum:

    sudo yum install -y kubectl
    

kind

Docs: https://kind.sigs.k8s.io/docs/user/quick-start/

Cài đặt:

# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

Tạo 1 cluster bằng kind:

kind create cluster # # Default cluster context name is `kind`.

kind create cluster --image=...

kind create cluster --name kind-2 

Interact với cluster:

kind get clusters
kubectl cluster-info --context kind-kind
kubectl cluster-info --context kind-kind-2

Xóa cluster:

kind delete cluster

Load image và cluster:

kind load docker-image my-custom-image-0 my-custom-image-1

Image archive có thể được load vào với command:

kind load image-archive /my-image-archive.tar

Workflow:

docker build -t my-custom-image:unique-tag ./my-image-dir
kind load docker-image my-custom-image:unique-tag
kubectl apply -f my-manifest-using-my-image:unique-tag

Configure kind cluster:

Sample configure file:

# this config file contains all config fields with comments
# NOTE: this is not a particularly useful config file
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
# patch the generated kubeadm config with some extra settings
kubeadmConfigPatches:
- |
  apiVersion: kubelet.config.k8s.io/v1beta1
  kind: KubeletConfiguration
  evictionHard:
    nodefs.available: "0%"
# patch it further using a JSON 6902 patch
kubeadmConfigPatchesJSON6902:
- group: kubeadm.k8s.io
  version: v1beta3
  kind: ClusterConfiguration
  patch: |
    - op: add
      path: /apiServer/certSANs/-
      value: my-hostname
# 1 control plane node and 3 workers
nodes:
# the control plane node config
- role: control-plane
# the three workers
- role: worker
- role: worker
- role: worker

Configure:

kind create cluster --config kind-example-config.yaml

Multi-node cluster:

Một configuration đơn giản để tạo multi-node cluster:

# three node (two workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker

Có thể tạo mulitple control-plane nodes:

# a cluster with 3 control-plane nodes and 3 workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker

Bạn có thể map extra ports từ nodes tới host machgine với extraPortMappings:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
    protocol: udp # Optional, defaults to tcp

Exporting cluster logs:

kind export logs

kind export logs ./somedir

Minikube

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

Start cluster:

minikube start

Interact với cluster:

kubectl get po -A

minikube kubectl -- get po -A

alias kubectl="minikube kubectl --"

minikube dashboard

Deploy applications:

  • Service:
kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
kubectl expose deployment hello-minikube --type=NodePort --port=8080

kubectl get services hello-minikube
minikube service hello-minikube # The easiest way to access this service is to let minikube launch a web browser for you
kubectl port-forward service/hello-minikube 7080:8080
  • Load balancer:
kubectl create deployment balanced --image=kicbase/echo-server:1.0
kubectl expose deployment balanced --type=LoadBalancer --port=8080

minikube tunnel
kubectl get services balanced
  • Ingress: Enable ingress addon:
minikube addons enable ingress

Sample ingress configure file:

kind: Pod
apiVersion: v1
metadata:
  name: foo-app
  labels:
    app: foo
spec:
  containers:
    - name: foo-app
      image: 'kicbase/echo-server:1.0'
---
kind: Service
apiVersion: v1
metadata:
  name: foo-service
spec:
  selector:
    app: foo
  ports:
    - port: 8080
---
kind: Pod
apiVersion: v1
metadata:
  name: bar-app
  labels:
    app: bar
spec:
  containers:
    - name: bar-app
      image: 'kicbase/echo-server:1.0'
---
kind: Service
apiVersion: v1
metadata:
  name: bar-service
spec:
  selector:
    app: bar
  ports:
    - port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
    - http:
        paths:
          - pathType: Prefix
            path: /foo
            backend:
              service:
                name: foo-service
                port:
                  number: 8080
          - pathType: Prefix
            path: /bar
            backend:
              service:
                name: bar-service
                port:
                  number: 8080
---

Apply content:

kubectl apply -f https://storage.googleapis.com/minikube-site-examples/ingress-example.yaml

Verify:

$ curl <ip_from_above>/foo
Request served by foo-app
...

$ curl <ip_from_above>/bar
Request served by bar-app
...

Các câu lệnh manage minikube cluster:

minikube pause
minikube unpause
minikube stop
minikube config set memory 9001
minikube addons list
minikube start -p aged --kubernetes-version=v1.16.1
minikube delete --all

Kubeadm

hfj