Kubernetes notes
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
Cài đặt kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectlNote:
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/binchmod +x kubectl mkdir -p ~/.local/bin mv ./kubectl ~/.local/bin/kubectl # and then append (or prepend) ~/.local/bin to $PATHĐảm bảo version được cài đặt là up-to-date:
kubectl version --clientHoặ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:
Update
aptpackage index và cài đặt các packages cần thiết để sử dụngaptrepository: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 curlDownload 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.gpgAdd Kubernetes
aptrepository, 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.listUpdate
aptpackage index, và cài đặt kubectl:sudo apt-get update sudo apt-get install -y kubectl
Rehat based:
Add Kubernetes
yumrepository, 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 EOFCà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