k8s常用命令
点击数:89
# kubectl常用命令
### 相关服务及用途
| 节点名称 | 服务名称 | 用途 |
|---|---|---|
|管理节点 | kubctl-apiserver | 提供HTTP Rest统一接口服务,处理和验证REST请求和更新etcd中API对象的状态
|管理节点 | kubectl-controller-manager | 资源控制管理同步
|管理节点 | kube-scheduler| 负责资源调度(调度Pod)
|工作节点 | kubelet | 管理Pod的生命周期,创建、启停等任务
|工作节点 | kube-proxy | 负责网络通信及负载均衡
获取 context
# 列出所有的 context
kubectl config get-contexts
# 获取当前的 context
kubectl config current-context
# 更改当前 context
kubectl config use-context
# 修改 context 的元素
kubectl config set-context
更改镜像版本
kubectl set image deployment 应用名称 容器名称=镜像地址
1.重启服务
kubectl patch deployment app名称 -p {\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}} -n 命名空间
2.pod副本数调整(扩容、缩容、自动扩缩容)
kubectl scale deployment APP名称 --replicas=2 -n sev
kubectl scale deployment kubernetes-dashboard --replicas=1 -n kube-system
kubectl scale deployment/deployment_name --replicas=N
# 只有当前副本数等于M时才会执行扩容或者缩容
kubectl scale deployment/deployment_name --replicas=N --current-replicas=M
# 设置多个RC中Pod副本数量
kubectl scale --replicas=5 rc/foo rc/bar rc/baz
# autoscale命令:这个比scale更加强大,也是弹性伸缩策略 ,它是根据流量的多少来自动进行扩展或者缩容。
# 指定Deployment、ReplicaSet或ReplicationController,
# 并创建已定义好资源的自动伸缩器。使用自动伸缩器可以根据需要自动增加或减少系统中部署的pod数量
# 使用 Deployment “foo”设定,使用默认的自动伸缩策略,指定目标CPU使用率,使其Pod数量在2到10之间
kubectl autoscale deployment foo --min=2 --max=10
# 使用RC“foo”设定,使其Pod的数量介于1和5之间,CPU使用率维持在80%
kubectl autoscale rc foo --max=5 --cpu-percent=80
3.查看部署应用
kubectl get deploy -n kube-system
# 在本地主机上为API Server启动一个代理网关
kubectl proxy --port=8080
之后就可以通过curl来对此套字节发起访问请求
curl localhost:8080/api/v1/namespaces/ | jq .items[].metadata.name (jq可以对json进行过滤)
4. 创建资源对象
kubectl run name --image=(镜像名) --replicas=(副本数) --port=(容器要暴露的端口) --labels=(设定自定义标签)
# 陈述式对象配置管理方式
kubectl create -f **.yaml
# 声明式对象配置管理方式(也适用于更新等)
kubectl apply -f **.yaml
5.查看资源对象
# 查看命名空间
kubectl get namespace
# 查看所有名称空间下的pod
kubectl get pods --all-namespaces
等同于
kubectl get pods -A 新版支持,比如v1.18.2
kubectl get pods,services -o wide (-o 输出格式 wide表示plain-text)
kubectl get pod -l "key=value,key=value" -n kube-system (-l 标签选择器(多个的话是与逻辑),-n 指定命名空间,不指定默认default)
kubectl get pod -l "key1 in (val1,val2),!key2" -L key (-l 基于集合的标签选择器, -L查询结果显示标签)
注意:为了避免和shell解释器解析!,必须要为此类表达式使用单引号
# 监视资源变动信息
kubectl get pod -w
4.查询日志
# 动态检查Pod的日志(标准输出)
kubectl logs -f pod名称 -n kube-system
# 在容器内执行命令
kubectl exec -ti pod名称 /bin/bash -n kube-system
# 获得容器前一次运行的日志内容
kubectl logs --previous <Pod名称> <Pod中的容器名称>
kubectl logs --previous l7-lb-controller-74c67fb85d-5b5cg -n kube-system
5.查看描述
kubectl describe pod,svc kubernetes-dashboard -n kube-system
6.查看pod部署节点及IP
kubectl get po
kubectl get po -o wide
kubectl get po ---namespaces=kube-system
kubectl get po --all-namespaces
kubectl get pods -n kube-system -o wide
7.查看集群中服务
kubectl get services --all-namespaces
kubectl get svc kubernetes-dashboard -n kube-system
8.将服务暴露出去(创建Service)
kubectl expose deployments/deployment_name --type="NodePort" --port=(要暴露的容器端口) --name=(Service对象名字)
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web
# 查看暴露端口
kubectl get endpoints -n kube-system kubernetes-dashboard
kubectl get ep -n kube-system kubernetes-dashboard
9.标签管理
# 添加标签
kubectl label nodes <node-name> <label-key>=<label-value>
kubectl label node 192.168.1.66 nodetype=node --overwrite
lsmod | grep ip_vs
# 删除标签
kubectl label nodes node6 IngressProxy-
主机名 标签名-
10.查看标签
kubectl get node --show-labels -n kube-system
kubectl get nodes -L kubernetes.io/role
kubectl get pods --show-labels kube-sytem
kubectl get pod --show-labels podname -n kube-system
11.查看svc/pod描述
kubectl describe 类型 资源名称 命名空间
kubectl describe svc kubernetes-dashboard -n kube-system
kubectl describe pod kubernetes-dashboard -n kube-system
12.以yaml/json方式显示pod信息
kubectl get deployment -o yaml kubernetes-dashboard -n kube-system
kubectl get daemonset -o yaml -n kube-system calico-node
kubectl get svc -o json pod名称 -n kube-system
13.显示所有的服务
kubectl get deployments -n kube-system
kubectl get daemonsets -n kube-system
14.创建命名空间
# 通过命令创建
kubectl create namespace 空间名称
# 通过文件创建
cat > my-namespace.yaml << EOF
apiVersion: v1
kind: Namespace
metadata:
name: new-namespace
EOF
kubectl create -f ./my-namespace.yaml
# Node状态
每个Node都包括以下状态信息
地址:包括hostname、外网IP和内网IP
条件(Condition):包括OutOfDisk、Ready、MemoryPressure和DiskPressure
容量(Capacity):Node上的可用资源,包括CPU、内存和Pod总数
基本信息(Info):包括内核版本、容器引擎版本、OS类型等
# 删除命令空间
kubectl delete namespaces new-namespace
# 删除一个namespace会自动删除所有属于该namespace的资源
# default 和 kube-system 命名空间不可删除
# etcd 强制删除命名空间
etcdctl del /registry/namespaces/rook-ceph
15.创建/查看 Deployment 记录版本号
kubectl create -f nginx-deployment.yaml --record
16.实现水平扩展或收缩
kubectl scale deployment kubernetes-dashboard --replicas=2 -n kube-system
# 重新分配pod数量
kubectl scale deployment kubernetes-dashboard --replicas=1 -n kube-system
17.回滚
# 查看升级历史记录
kubectl rollout history deployment/kubernetes-dashboard -n kube-system
# 回滚到上一个版本
kubectl rollout undo deployment/kubernetes-dashboard -n kube-system
# 查看回退状态
kubectl rollout status deployment/kubernetes-dashboard -n kube-system
# 查看单个revision的详细信息
kubectl rollout history deployment/kubernetes-dashboard --revision=1 -n kube-system
# 使用 --to-revision 参数 指定回滚某个历史版本
kubectl rollout undo deployment/kubernetes-dashboard --to-revision=1 -n kube-system
18.自动扩展
# 集群支持 horizontal pod autoscaling,可以为Deployment设置自动扩展
kubectl autoscale deployment kubernetes-dashboard --min=1 --max=5 --cpu-percent=80 -n kube-system
# 查看hap状态
kubectl get hpa kubernetes-dashboard -n kube-system
# 查看hpa详细状态
kubectl describe hpa kubernetes-dashboard -n kube-system
# 删除hpa
kubectl delete hpa kubernetes-dashboard -n kube-system
19.更新Deployment镜像
kubectl set image deployment kubernetes-dashboard nginx=nginx:1.9.1
kubectl replace -f rc.yaml
# 更新资源对象replace、set
# 如果基于此前的配置文件进行替换,需要加上force
kubectl replace -f xx.yaml --force
# 将deployment中的nginx容器镜像设置为“nginx:1.9.1”
kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
# 所有deployment和rc的nginx容器镜像更新为“nginx:1.9.1”
kubectl set image deployments,rc nginx=nginx:1.9.1 --all
# 将daemonset abc的所有容器镜像更新为“nginx:1.9.1”
kubectl set image daemonset abc *=nginx:1.9.1
# 从本地文件中更新nginx容器镜像
kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml
20.编辑 Deployment pod配置
kubectl edit deployment kubernetes-dashboard -n kube-system
21.升级资源
# 暂停状态下执行
kubectl rollout pause deployment kubernetes-dashboard -n kube-system
kubectl set image deploy kubernetes-dashboard nginx=nginx:1.9.1
# 更新升级资源
kubectl set resources deployment kubernetes-dashboard -c=kubernetes-dashboard --limits=cpu=200m,memory=512Mi -n kube-system
# 恢复
kubectl rollout resume deploy kubernetes-dashboard -n kube-system
22.查看CIDR划分
kubectl get nodes -o json | jq '.items[] | .spec'
23.授权管理
# 查看授权node节点
kubectl get certificatesigningrequests
kubectl get csr
# 添加新工作节点
kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve
# 批量授权认证
for i in `kubectl get csr|grep -v NAME|awk '{print $1}'`;do kubectl certificate approve $i;done
kubectl get nodes
# 拒绝授权
kubectl certificate deny node-csr-AzAMd7KYm57dUkiD-aM3POpS_N37bXCyHeI_B-llyQM
# 批量拒绝授权
for i in `kubectl get csr|grep -v NAME|awk '{print $1}'`;do kubectl certificate deny $i;done
# 删除信任csr节点
kubectl delete csr node-csr-AzAMd7KYm57dUkiD-aM3POpS_N37bXCyHeI_B-llyQM
# 批量删除授权
for i in `kubectl get csr|grep -v NAME|awk '{print $1}'`;do kubectl delete csr $i;done
24.集群信息查看
# 查看集群访问连接
kubectl cluster-info
# 查看命名空间
kubectl get namespaces
# 查看权限
kubectl describe clusterrole cluster-admin -n kube-system
# 查看kubectl版本
kubectl version
# 查看客户端及服务端程序版本信息
kubectl version --short=true
# 查看支持api版本
kubectl api-versions
# 查看当前kubectl配置
kubectl config view
# 查看集群状态
kubectl get componentstatuses
kubectl get rs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-1 Healthy {"health": "true"}
etcd-2 Healthy {"health": "true"}
etcd-0 Healthy {"health": "true"}
# 查看集群节点
kubectl get nodes
25.维护状态/取消维护模式
# 禁止调度
kubectl cordon node名称
# 启用调度
kubectl uncordon node名称
# 驱逐运行中的node节点
kubectl drain --ignore-daemonsets node名称
# 注:该命令会删除节点上的所有pod(daemonset除外),在其他node上重启他们,通常该节点需要维护时使用该命令。
直接使用该命令会自动调用kubectl cordon <node>命令。
当该节点维护完成,启动kubelet后,再使用kubectl uncordon <node> 即可将该节点添加到k8s集群中
26. 删除资源对象
# 删除指定资源对象
kubectl delete [pods/services/deployments/...] name
kubectl delete pod pod名称 -n kube-system
# 删除kube-system下指定标签的资源对象
kubectl delete [pods/services/deployments/...] -l key=value -n kube-system
# 删除kube-system下所有资源对象
kubectl delete [pods/services/deployments/...] --all -n kube-system
# 强制删除Terminating的资源对象
kubectl delete [pods/services/deployments/...] source_name --force --grace-period=0 -n kube-system
# 强制删除pod
kubectl delete pod PODNAME --force --grace-period=0 -n kube-system
kubectl delete -f xx.yaml
# 一般不用这种方式删除
kubectl apply -f xx.yaml --prune -l <labels>
# 默认删除控制器会同时删除其管控的所有Pod对象,cascade=false只删除rs
kubectl delete rs rs_name --cascade=fale
# 删除node节点
kubectl delete node 节点名称
28.匿名访问权限
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
kubectl label nodes 192.168.61.64 IngressProxy=true
29. kubelet.kubeconfig 证书转换
echo "证书内容"|base64 --decode > abc.pem
# 查看证书有效期
openssl x509 -in apiserver.crt -text -noout | grep Not
30.直接通过 kubectl 命令来访问这些 API
kubectl get --raw "/apis/metrics.k8s.io/v1beta1" | jq .
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq .
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods" | jq .
kubectl top nodes
kubectl top pods
31.查看secrets密码
kubectl get secrets jenkins -o yaml|grep password|awk '{print $NF}'|base64 --decode;echo
32.查看yaml内容
kubectl get deployment -o yaml kubernetes-dashboard -n kube-system
33.自动添加新加工作节点命令
kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve
34.日志查看
# 容器之前崩溃,使用以下命令可以获得容器前一次运行的日志
kubectl logs --previous <Pod名称> <Pod中的容器名称>
35.不中断业务升级
kubectl rolling-update pod名称 -f xxx.yaml
# 回退
kubectl rolling-update pod名称 -rollback
36.创建Fluent bit 的 Service Account
kubectl create sa logging -n kube-system
pod 拉取策略
# 镜像拉取规则
# 默认值,总是拉取 pull
imagePullPolicy: Always
# 本地有则使用本地镜像,不拉取
imagePullPolicy: IfNotPresent
# 只使用本地镜像,从不拉取
imagePullPolicy: Never
命令补全
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo"source <(kubectl completion bash)" >> ~/.bashrc
# 添加kubectl的k别名
vim ~/.bashrc alias k='kubectl'
# tab命令只在使用完整的kubectl 命令起作用,使用别名k 时不起作用,修补:
source <( kubectl completion bash | sed's/kubectl/k/g' ) # 写入 .bashrc
mac版
brew install bash-completion
source $(brew --prefix)/etc/bash_completion
source <(kubectl completion bash)
排错
>>> 无法删除命令空间
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.
Error from server (Conflict): Operation cannot be fulfilled on namespaces "rook-ceph":
The system is ensuring all content is removed from this namespace.
Upon completion, this namespace will automatically be purged by the system.
# 1. 获取当前namespace描述
kubectl get namespace test -o json > tmp.json
# 2. 编辑tmp.json,删除其中的spec字段。
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"creationTimestamp": "2019-11-12T01:58:10Z",
"deletionTimestamp": "2019-11-12T04:07:25Z",
"labels": {
"name": "rook-ceph"
},
"name": "rook-ceph",
"resourceVersion": "134355",
"selfLink": "/api/v1/namespaces/rook-ceph",
"uid": "15f7aa00-f9b9-4595-bf62-3630f0510e72"
},
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
"spec": {
"finalizers": [
"kubernetes"
]
},
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
"status": {
"phase": "Terminating"
}
}
3. 最后在管理节点执行
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8080/api/v1/namespa