kubectl logs
kubectl logs my-pod # 获取 pod 日志(标准输出) kubectl logs my-pod |grep -i error # 获取 pod 日志关键词error(标准输出) kubectl logs -l name=myLabel # 获取含 name=myLabel 标签的 Pods 的日志(标准输出) kubectl logs my-pod --previous # 获取上个容器实例的 pod 日志(标准输出) kubectl logs my-pod -c my-container # 获取 Pod 容器的日志(标准输出, 多容器场景) kubectl logs -l name=myLabel -c my-container # 获取含 name=myLabel 标签的 Pod 容器日志(标准输出, 多容器场景) kubectl logs my-pod -c my-container --previous # 获取 Pod 中某容器的上个实例的日志(标准输出, 多容器场景) kubectl logs -f my-pod # 流式输出 Pod 的日志(标准输出) kubectl logs -f my-pod -c my-container # 流式输出 Pod 容器的日志(标准输出, 多容器场景) kubectl logs -f -l name=myLabel --all-containers # 流式输出含 name=myLabel 标签的 Pod 的所有日志(标准输出) # 返回pod ruby中已经停止的容器web-1的日志快照 $ kubectl logs -p -c ruby web-1 # 持续输出pod ruby中的容器web-1的日志 $ kubectl logs -f -c ruby web-1 # 仅输出pod nginx中最近的20条日志 $ kubectl logs --tail=20 nginx # 输出pod nginx中最近一小时内产生的所有日志 $ kubectl logs --since=1h nginx
kubectl describe pods/zongxun-test-1 -n <namespace> #查看监控信息 kubectl describe pods zongxun-test-1 -n <namespace> kubeclt exec -n <namespace> -ti <pod> bash kubectl exec -n <namespace> -ti <pod> -c <container> bash kubectl logs -f -n kube-system <pod> kubectl get cm -n kube-system kubectl edit cm -n kube-system coredns kubectl edit deployment -n kube-system coredns kubectl scale deployment -n kube-system coredns --replicas=0 kubectl delete pods -n kube-system <pod> <pod>
允许master节点部署pod,使用命令如下:
kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl cordon
使node1不能调度pod
kubectl cordon <node-name>
Which will cause the node to be in the status: Ready,SchedulingDisabled.
使node1恢复调度pod
kubectl uncordon node1
kubectl drain
节点foo不可调度
kubectl cordon foo
使node1节点不可调度,并重新分配该节点上的pod
kubectl drain node node1 --ignore-daemonsets --delete-local-data
kubectl rollout
查看deployment的历史记录 kubectl rollout history deployment/abc 查看daemonset修订版3的详细信息 kubectl rollout history daemonset/abc --revision=3 查看deployment的状态 kubectl rollout status deployment/nginx 将deployment标记为暂停。#只要deployment在暂停中,使用deployment更新将不会生效。 kubectl rollout pause deployment/nginx 恢复已暂停的 deployment kubectl rollout resume deployment/nginx 回滚到之前的deployment版本 kubectl rollout undo deployment/abc kubectl rollout undo --dry-run=true deployment/abc 回滚到daemonset 修订3版本 kubectl rollout undo daemonset/abc --to-revision=3 重启deployment kubectl rollout restart deployment xxx
kubectl delete
使用 pod.json中指定的资源类型和名称删除pod。 kubectl delete -f ./pod.json 根据传入stdin的JSON所指定的类型和名称删除pod。 cat pod.json | kubectl delete -f - 删除名为“baz”和“foo”的Pod和Service。 kubectl delete pod,service baz foo 删除 Label name = myLabel的pod和Service。 kubectl delete pods,services -l name=myLabel 强制删除dead node上的pod kubectl delete pod foo --grace-period=0 --force 删除所有pod kubectl delete pods --all 优雅下线时间也可以设置成零,零的意思是立即从 Kubernetes 中删除此 Pod $ kubectl -f pod.yaml delete --force --grace-period=0 warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely. pod "pod" force deleted 等等删除资源 kubectl delete service audit-pod --wait kubectl delete pod audit-pod --wait --now
kubectl describe
# 描述一个node $ kubectl describe nodes kubernetes-minion-emt8.c.myproject.internal # 描述一个pod $ kubectl describe pods/nginx # 描述pod.json中的资源类型和名称指定的pod $ kubectl describe -f pod.json # 描述所有的pod $ kubectl describe pods # 描述所有包含label name=myLabel的pod $ kubectl describe po -l name=myLabel # 描述所有被replication controller “frontend”管理的pod(rc创建的pod都以rc的名字作为前缀) $ kubectl describe pods frontend
选项
-f, --filename=[]: 用来指定待描述资源的文件名,目录名或者URL。 -l, --selector="": 用于过滤资源的Label。
继承自父命令的选项
--alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。 --api-version="": 和服务端交互使用的API版本。 --certificate-authority="": 用以进行认证授权的.cert文件路径。 --client-certificate="": TLS使用的客户端证书路径。 --client-key="": TLS使用的客户端密钥路径。 --cluster="": 指定使用的kubeconfig配置文件中的集群名。 --context="": 指定使用的kubeconfig配置文件中的环境名。 --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。 --kubeconfig="": 命令行请求使用的配置文件路径。 --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。 --log-dir="": 如果不为空,将日志文件写入此目录。 --log-flush-frequency=5s: 刷新日志的最大时间间隔。 --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。 --match-server-version[=false]: 要求服务端和客户端版本匹配。 --namespace="": 如果不为空,命令将使用此namespace。 --password="": API Server进行简单认证使用的密码。 -s, --server="": Kubernetes API Server的地址和端口号。 --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。 --token="": 认证到API Server使用的令牌。 --user="": 指定使用的kubeconfig配置文件中的用户名。 --username="": API Server进行简单认证使用的用户名。 --v=0: 指定输出日志的级别。 --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。
kubectl label
给名为foo的Pod添加label unhealthy=true。 kubectl label pods foo unhealthy=true 给名为foo的Pod修改label 为 'status' / value 'unhealthy',且覆盖现有的value。 kubectl label --overwrite pods foo status=unhealthy 给 namespace 中的所有 pod 添加 label kubectl label pods --all status=unhealthy 仅当resource-version=1时才更新 名为foo的Pod上的label。 kubectl label pods foo status=unhealthy --resource-version=1 删除名为“app”的label 。(使用“ - ”减号相连) kubectl label po nginx1 nginx2 nginx3 app- # or kubectl label po nginx{1..3} app- # or kubectl label po -l app app- 给node设置标签 docker label node node1 name=ek8s-node-1 #设置 docker get node --show-labels #查看 删除一个Label,只需在命令行最后指定Label的key名并与一个减号相连即可: $ kubectl label nodes 1.1.1.1 role- 修改一个Label的值,需要加上--overwrite参数: $ kubectl label nodes 1.1.1.1 role=apache --overwrite
kubectl set
升级镜像 kubectl set image pod/nginx nginx=nginx:1.7.1 kubectl get po nginx -o jsonpath='{.spec.containers[].image}{"\n"}'
kubectl scale
kubectl scale deploy nginx --replicas=5 kubectl get po kubectl describe deploy nginx #Autoscale the deployment, pods between 5 and 10, targetting CPU utilization at 80% kubectl autoscale deploy nginx --min=5 --max=10 --cpu-percent=80
kubectl api-resources
kubectl api-resources
kubectl plugin list
kubectl plugin list
kubectl diff
kubectl diff -f pod.json cat service.yaml | kubectl diff -f - kubectl diff -Rf /deployment/ | grep -v "kubectl\|recursive\|generation" | tee diff.log
kubectl auth
root@master:~/k8slib# k auth can-i delete deployments --as jane yes root@master:~/k8slib# k auth can-i delete deployments --as jane -n default yes root@master:~/k8slib# k auth can-i delete deployments --as jane -n red yes root@master:~/k8slib# k auth can-i delete pods --as jane -n red no root@master:~/k8slib# k auth can-i delete deployments --as jim -n default no root@master:~/k8slib# k auth can-i delete deployments --as jim -A no root@master:~/k8slib# k auth can-i delete deployments --as jim -n red yes
kubectl certificate
root@master:~/cks/RBAC# k get csr NAME AGE SIGNERNAME REQUESTOR CONDITION jane 7s kubernetes.io/kube-apiserver-client kubernetes-admin Pending 手动批准(或拒绝)证书签名请求 root@master:~/cks/RBAC# k certificate approve jane certificatesigningrequest.certificates.k8s.io/jane approved root@master:~/cks/RBAC# k get csr NAME AGE SIGNERNAME REQUESTOR CONDITION jane 73s kubernetes.io/kube-apiserver-client kubernetes-admin Approved,Issued 拒绝证书签名请求 root@master:~/cks/RBAC# k certificate deny jane
kubectl config
k8s@terminal:~$ k config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE gianna@infra-prod gianna@infra-prod gianna@infra-prod infra-prod infra-prod infra-prod restricted@infra-prod restricted@infra-prod restricted@infra-prod * workload-prod workload-prod workload-prod workload-stage workload-stage workload-stage k8s@terminal:~$ k config get-contexts -o name gianna@infra-prod infra-prod restricted@infra-prod workload-prod workload-stage k8s@terminal:~$ k config view -o jsonpath='{.contexts[*].name}' gianna@infra-prod infra-prod restricted@infra-prod workload-prod workload-stage k8s@terminal:~$ k config view -o jsonpath="{.contexts[*].name}" | tr " " "\n" gianna@infra-prod infra-prod restricted@infra-prod workload-prod k8s@terminal:~$ k config view --raw apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1ERXlNakU0TWpBeE5Gb1hEVE14TURFeU1ERTRNakF4TkZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTG5GCmsyL0oyeWRQWVJhMlAwZ0xHRmloTnliNHUvM0N3VjVLOWgzKzd5MkNLbTNPenpIbG9GSFgzL0FjQW1VamxRWCsKSkQ5TU51VU1NR3pQaXFvUWsyVFBwZkVIa3ljaVk0Q0xQK0hpd3hKSExHdlhVazNlZGxGMEtGL3pTUkFWT3IvTAp5dnllOGtOazd4K3M5UUpoK1RsRElyUjY1RXFaNDJNbzJJbE5jYTAyMHZlR1ZEdUpHM1JyMHRoTEhsTkh6MU5sCmZNa1pBRnNtK3ZGYWxGdzJHRE5HdXFqZjgvMEVjQVJYQkhnM3kzMndxN2lwRis4OVlDNnJwcG1MSXVITXdkVVQKNzJpbENabm1XSStVMlh2aDVRT1drblhGdWpGa2xNRGk0cU9XREJXbFJ3NGZLRGNQUnVoRWlMUmZJOUlTOUlFcQovZ3N4Wmk1TTB4aURacVNXUmIwQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQMS8xMTRQZU5LU3J3cFA3OUwzbDlYdWdCNlVNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCaGViODl5aWZWU1hndWtHazJHUkFaZXBDbzRMTDhhaXdMT2ZzT1VwSVplMEFZWFJjQwpycVNyM2dWemJaekRZMmZKMjZTNEtNdzlOZUdWNlZsd2tZNTlvOTZWOGZOMUhlMUZNb2g5TStuUWV3RGFBT1V5CllaMTkzcjhubUxGZGVnR2RJSCtCQXkzYnJkcDJXZVZ0eW56OHRRZW0rSlVBdUFQR0k1OEpRYVNoYTdadXJiT0EKUVlXTHNsc1V6bVJBbkpTQXB1OUNZdU5jTXlUNkxmNTFaaWcyV0NxSHozZEh0SHVXR2NTK0J0NllmVFAvakZZQgpmNHVFTG1DQld0Mjg4bFJiczhhVjdjZXRKckQxOGsrN01nUTBrdWtaYjBMeG5iRndrelhDN0kyUkg0SjN0WTNuClNjSGVHMXQxVjlyLytwMHdDMmdVRUtFbGlQd0wyVGFzbmhHcQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== server: https://192.168.100.21:6443 name: gianna@infra-prod
创建 kubelet bootstrapping kubeconfig 文件 设置集群参数 [root@k8smaster ssl]# kubectl config set-cluster kubernetes –certificate-authority=/opt/kubernetes/ssl/ca.pem –embed-certs=true –server=https://192.168.137.171:6443 –kubeconfig=bootstrap.kubeconfig Cluster “kubernetes” set. 设置客户端认证参数 [root@k8smaster ssl]# kubectl config set-credentials kubelet-bootstrap –token=ad6d5bb607a186796d8861557df0d17f –kubeconfig=bootstrap.kubeconfig User “kubelet-bootstrap” set. 设置上下文参数 [root@k8smaster ssl]# kubectl config set-context default –cluster=kubernetes –user=kubelet-bootstrap –kubeconfig=bootstrap.kubeconfig Context “default” created. 选择默认上下文 [root@k8smaster ~]# kubectl config use-context default --kubeconfig=bootstrap.kubeconfig Switched to context “default”.
kubectl config
设置别名
# Get current context alias krc='kubectl config current-context' # List all contexts alias klc='kubectl config get-contexts -o name | sed "s/^/ /;\|^ $(krc)$|s/ /*/"' # Change current context alias kcc='kubectl config use-context "$(klc | fzf -e | sed "s/^..//")"' # Get current namespace alias krn='kubectl config get-contexts --no-headers "$(krc)" | awk "{print \$5}" | sed "s/^$/default/"' # List all namespaces alias kln='kubectl get -o name ns | sed "s|^.*/| |;\|^ $(krn)$|s/ /*/"' # Change current namespace alias kcn='kubectl config set-context --current --namespace "$(kln | fzf -e | sed "s/^..//")"'
综合
Helpful commands for debugging
# Run busybox container k run busybox --image=busybox:1.28 --rm --restart=Never -it sh # Connect to a specific container in a Pod k exec -it busybox -c busybox2 -- /bin/sh # adding limits and requests in command kubectl run nginx --image=nginx --restart=Never --requests='cpu=100m,memory=256Mi' --limits='cpu=200m,memory=512Mi' # Create a Pod with a service kubectl run nginx --image=nginx --restart=Never --port=80 --expose # Check port nc -z -v -w 2 <service-name> <port-name> # NSLookup nslookup <service-name> nslookup 10-32-0-10.default.pod
Rolling updates and rollouts
k set image deploy/nginx nginx=nginx:1.17.0 --record k rollout status deploy/nginx k rollout history deploy/nginx # Rollback to previous version k rollout undo deploy/nginx # Rollback to revision number k rollout undo deploy/nginx --to-revision=2 k rollout pause deploy/nginx k rollout resume deploy/nginx k rollout restart deploy/nginx kubectl run nginx-deploy --image=nginx:1.16 --replias=1 --record
✈更多阅读:
https://kubernetes.io/zh/docs/tasks/tools/install-kubectl/
kubectl 常用
https://learnk8s.io/blog/kubectl-productivity
Be fast with Kubectl 1.19 CKAD/CKA
Kubectl Cheatsheet
✈推荐阅读:
docker 命令
podman 命令
crictl 命令
kubectl 命令
operator-sdk 命令