跳至主要内容

[CLI] Kubernetes Tools and CLI

kubectl

$ kubectl version --client

$ kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0

# kubectl create -f <config-file>
$ kubectl create -f pod.yml
$ kubectl create -f replicaset-definition.yml

# 以更新後的 config 檔執行
$ kubectl replace -f replicaset-definition.yml

# kubectl get <kind>,<kind>,<kind>
# OUTPUT FORMAT
# -o name: Print only the resource name
# -o wide: Output in a plain-tet format with any additional information
# -o json: Output a JSON formatted API object
# -o yaml: Output a YAML formatted API object
$ kubectl get all
$ kubectl get pods,services
$ kubectl get nodes
$ kubectl get namespaces
$ kubectl get deployments
$ kubectl get services # svc
$ kubectl get pods --show-labels
$ kubectl get replicasets
$ kubectl get configmaps # cm

# kubectl describe <kind> <name>
$ kubectl describe pod nginx
$ kubectl describe replicaset myapp-replicaset


# kubectl delete <kind> <name>
$ kubectl delete pod mypod
$ kubectl delete replicaset myapp-replicaset

$ kubectl delete pods --all

##
# pod
##

# create a pod and run it
# kubectl run <pod-name> --image=<docker-image-name>
$ kubectl run nginx --image=nginx

# apply changes if YAML changes
$ kubectl apply -f pod.yml

##
# ReplicationController & ReplicaSet
##
$ kubectl scale replicaset myapp-replicaset --replicas=6
$ kubectl scale --replicas=6 -f replicaset-definition.yml

# 直接修改在 k8s memory 中暫存的設定檔
# kubectl edit <kind> <name>
$ kubectl edit replicaset myapp-replicaset

##
# Deployment
##

$ kubectl create -f deployment-definition.yml
$ kubectl get deployments
$ kubectl apply -f deployment-definition.yml
# $ kubectl set image deployment/myapp-deployment nginx=nginx:1.9.1
$ kubectl rollout status deployment/myapp-deployment
$ kubectl rollout history deployment/myapp-deployment
$ kubectl rollout undo deployment/myapp-deployment
$ kubectl rollout restart deployment/myapp-deployment
$ kubectl delete deployment myapp-deployment

##
# Others
##

# 把 localhost 8080 port forward 到 argocd-server(service) 的 port 443
$ kubectl port-forward -n argocd svc/argocd-server 8080:443

Imperative Commands & Dry Run

使用 --dry-run 可以測試執行的指令是否正確,搭配 -o 這可以輸出成 yaml 檔作為未來使用:

## POD
# kubectl run <pod-name> --image=<image-name> --labels="[key=value,key=value]" --port=[port]
$ kubectl run nginx --image=nginx # 直接建立一個 pod
$ kubectl run nginx --image=nginx --dry-run=client # 測試輸入的指令是否正確
$ kubectl run nginx --image=nginx --dry-run=client -o yaml > nginx-pod.yaml # 把建立的 Pod 輸出成 YAML 檔

## Deployment
# kubectl create deployment <deployment-name> --image=<image-name> --replicas=[replicas]
$ kubectl create deployment nginx --image=nginx # 建立一個 deployment
$ kubectl create deployment nginx --image=nginx --dry-run=client # 測試輸入的指令是否正確
$ kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > nginx-deployment.yaml # 把建立的 Deployment 輸出成 YAML 檔
# scaling
$ kubectl create deployment nginx --image=nginx --replicas=4
$ kubectl scale deployment nginx --replicas=4

## Service
# kubectl export pod <pod-name> --port=<port> --name=<service-name> --type=[type]
$ kubectl expose pod redis --port=6379 --name=redis-service --dry-run=client -o yaml # 自動使用該 pod 的 labels 作為 service 中的 selector
$ kubectl expose pod nginx --port=80 --name=nginx-service --type=NodePort --dry-run=client -o yaml > nginx-service.yaml # 自動使用該 pod 的 labels 作為 service 中的 selector,但無法指定 NodePort,需要建立成 YAML 後才能指定
$ kubectl apply -f nginx-service.yaml

minikube

官方文件
$ brew install minikube

$ minikube start
$ minikube status

# 啟動某 service 對應到 minikube node IP 上的 port-forwarding tunnel
# minikube service [k8s-service] --url
$ minikube service myapp-service --url
$ minikube service --all # 啟動全部 service 的 port-forwarding tunnel
$ minikube service list # 列出 minikube node 中所有 service

$ minikube stop
$ minikube delete

# 檢視 Minikube node IP
$ minikube ip

Minikube 會在本機與 Minikube 內的 Kubernetes 服務之間建立 local port-forwarding tunnel,這個 tunnel 會隨機指派一個 local port,將流量轉送至 Kubernetes 服務的 nodePort。

kubectl、crictl、nerdctl 的比較

  • 如果你是在管理一個 Kubernetes cluster,通常使用 kubectl
  • 如果你需要深入操作 container runtime,crictl 是合適的工具。
  • 如果你正在使用 containerd 且習慣使用 Docker CLI,nerdctl 是更直觀的選擇。
特性kubectlcrictlnerdctl
主要用途操作和管理 Kubernetes cluster管理 Container 和其 runtime基於 containerd 的 CLI(類似 docker 的指令)
抽象層級Kubernetes 資源Container runtimeContainers and images
依賴Kubernetes API serverCRI-compatible runtimecontainerD
主要用戶K8s 管理員和開發者系統管理員和底層開發者容器開發者和 DevOps 工程師
功能範圍全面的 K8s cluster 管理Container 和 Pod 級別操作容器生命週期管理和 image operations
與 Docker 相似度
常用指令- kubectl get pods
- kubectl describe pod <pod-name>
- crictl ps
- crictl images
- nerdctl run -d <image>
- nerdctl ps

Reference