[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
是更直觀的選擇。
特性 | kubectl | crictl | nerdctl |
---|---|---|---|
主要用途 | 操作和管理 Kubernetes cluster | 管理 Container 和其 runtime | 基於 containerd 的 CLI( 類似 docker 的指令) |
抽象層級 | Kubernetes 資源 | Container runtime | Containers and images |
依賴 | Kubernetes API server | CRI-compatible runtime | containerD |
主要用戶 | 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 |