# Kubernetes notes

# Getting started

## Cài đặt tools

### kubectl

Linux x86-64:

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

Linux ARM64:

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

1. Cài đặt kubectl
    
    ```bash
    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`
    
    ```bash
    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:
    
    ```bash
    kubectl version --client
    ```
    
    Hoặc sử dụng câu lệnh sau để xem detail về versions:
    
    ```plaintext
    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:
    
    ```shell
    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:
    
    ```shell
    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:
    
    ```shell
    # 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:
    
    ```shell
    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:
    
    ```bash
    # 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`:
    
    ```bash
    sudo yum install -y kubectl
    ```
    

### kind

Docs: [https://kind.sigs.k8s.io/docs/user/quick-start/](https://kind.sigs.k8s.io/docs/user/quick-start/)

Cài đặt:

```plaintext
# 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:

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

kind create cluster --image=...

kind create cluster --name kind-2 
```

Interact với cluster:

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

Xóa cluster:

```plaintext
kind delete cluster
```

Load image và cluster:

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

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

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

Workflow:

```plaintext
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:

```plaintext
# 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:

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

Multi-node cluster:

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

```plaintext
# 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:

```plaintext
# 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:

```plaintext
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:

```plaintext
kind export logs

kind export logs ./somedir
```

### Minikube

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

Start cluster:

```plaintext
minikube start
```

Interact với cluster:

```plaintext
kubectl get po -A

minikube kubectl -- get po -A

alias kubectl="minikube kubectl --"

minikube dashboard
```

Deploy applications:

* Service:
    

```plaintext
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:
    

```plaintext
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:
    

```plaintext
minikube addons enable ingress
```

Sample ingress configure file:

```plaintext
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:

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

Verify:

```plaintext
$ 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:

```plaintext
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
