K8S入门系列之四:用kubectl操作和访问集群


kubectl执行流程

kubectl命令行补齐

子命令说明
completion kubectl为指定的shell(bash或zsh)中的子命令或参数实现自动补齐。建议写入~/.bash_profile,source后立即生效
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bash_profile

kubectl集群信息检索/维护

api-versions 以"group/version"的格式,打印当前服务端支持的API版本
api-resources 列出集群支持的API资源
cluster-info 显示整个集群的kubernetes master、kubeDNS、metrics-server等服务组件的endpoints。
使用kubectl cluster-info dump --output-directory分类存放集群信息,进一步调试和诊断集群问题。
kubectl cluster-info dump --output-directory=/path/to/cluster-state
certificate 修改证书请求资源的状态,使用kubectl get csr列出证书签名请求。
approve:批准证书签名请求
deny:拒绝证书签名请求
top 显示node或者pod的cpu、memory的使用量,需要提前安装并正确配置metrics-server。
--sort-by=cpu|memory使用cpu或者memory排序
kubectl top node --sort-by=cpu
kubectl top pod
cordon 将指定节点标记为不可被调度,将不会被master节点上的kube-scheduler分配新的pod。被标记的节点(除非发布任务时使用nodeName强制指定标记的节点),使用kubect get nodes查看到的STATUS为Ready,SchedulingDisabled
kubectl cordon k8s-node3
uncordon 标记指定节点可以被kube-scheduler调度
kubectl uncordon k8s-node3
drain 排空准备维护的节点
1. 给指定的节点标记为SchedulingDisabled,防止被kube-scheduler分配新的pod
2. 尝试把运行的pod迁移到其它node节点,如果无法迁移将删除pod
3. 使用--ignore-daemonsets参数删除由DaemonSet管理的pod,使用--delete-emptydir-data参数删除没有使用共享存储,而是将数据存放在当前node节点的pod
4. drain后的node节点,可以使用kubectl delete node NodeName,从etcd中彻底删除。使用kubeadm reset初始化该节点
5. 也可以把drain后的node点,使用kubectl uncordon NodeName,重新标记为可以被调度
kubectl drain k8s-node3 --ignore-daemonsets
kubectl delete node k8s-node3

kubectl认证与鉴权

config 修改、配置客户端登录凭证文件。每次执行kubectl命令可以使用--kubeconfig指定登录凭证,或设置KUBECONFIG环境变量。当多个登录凭证存在时,优先级排序
--kubeconfig > $KUBECONFIG > ${HOME}/.kube/config
auth 检查当前用户的授权
can-i // 检查当前用户是否可对某种资源执行操作。
kubectl auth can-i create pods --all-namespaces
kubectl auth can-i list deployments.apps
# check to see if I can do everything in my current namespace
kubectl auth can-i '*' '*' 
kubectl auth can-i list jobs.batch/bar -n foo
# check to see if I can read pod logs
kubectl auth can-i get pods --subresource=log
# check to see if I can access the URL /logs/
kubectl auth can-i get /logs/
# list all allowd actions in namespace "foo"
kubectl auth can-i --list --namespace=foo

kubectl POD基本操作

注:部分常见命令未列出

run 创建一个pod并运行容器
--image=指定镜像名字
--image-pull-policy=指定下载镜像的策略,可选值Always,Never,IfNotPresent,默认为Always
-l, --labels=[] "k1=v1,k2=v2,..." 指定pod的标签
--annotations="" 应用于pod的注释,多个注释使用多个--annotations
--env="" 设置pod中的环境变量,多个变量使用多个--env
--command 在容器中执行的命令
--expose 为pod创建ClusterIP Service
--port 指定容器的暴露端口
--attach 等待pod启动运行后,附加命令到pod中执行
--rm 在执行完容器中attach命令后删除pod
--record 在资源annotations中记录当前的kubectl命令
--privileged 以特权身份运行容器,默认为false
--restart=指定pod的重启策略,可选值:Always,OnFailure,Never,默认为Always
kubectl run busybox -it --image=busybox --rm --attach -- shell
port-forward 将本地的一个或多个端口转发到pod:localPort:podPort,会持续占用一个终端(终端关闭结束端口转发)。支持的资源:pod、deployment、service
kubectl port-forward TYPE/NAME [options] [LOCAL_PORT]:REMOTE_PORT [...[LOCAL_PORT_N]:REMOTE_PORT_N]
# 范例
kubectl port-forward pod/mypod 5000 6000
kubectl port-forward pod/mypod 8888:5000
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
kubectl port-forward --address localhost,192.168.126.188 pod/mypod 8888:5000
# listen on a random port locally
kubectl port-forward pod/mypod :5000
kubectl port-forward deployment/mydeployment 5000 6000

kubectl调试排错

注:部分常见命令未列出

debug 创建调试会话以对工作负载和节点进行故障排除,默认资源类型为pod。debug采取的操作因指定的资源而异。支持的行动包括:
  • 工作负载:创建现有pod的副本,并更改某些属性,例如将镜像标记更改为新版本
  • 工作负载:向已经运行的pod添加临时容器,例如,在不重新启动pod的情况下添加调试实用程序
  • 节点:创建一个新的pod,该pod在节点的主机名称空间中运行,并且可以访问节点的文件系统
范例:在node1节点上使用"hostIPC:true", "hostNetwork:true", "hostPID:true", "restartPolicy:Never"启用debugger容器,并以rw挂载节点的/文件系统到centos容器的/host文件夹
kubectl debug -it node/k8s-node1 --image=centos
proxy 转发kube-apiserver到本地的指定地址和端口,默认为127.0.0.1:8001,随后可通过curl获取集群资源信息
--address 指定转发到本机的IP地址 -p, --port 指定转发到本机的端口。0为随机端口 --accept-hosts 使用正则表达式指定允许访问转发的主机,默认为localhost,'^*$'为放行所有主机
kubectl proxy --address=0.0.0.0 --port=8080

kubectl资源管理

注:部分常见命令未列出

label 以key=value的形式,设置或更新资源的标签
  • 标签key和value必须以字母或数字开头,可以包含字母、数字、"-"、"."和"_",每个字符长度不超过63个字符
  • key可以使用类似于DNS子域前缀和单个"/"开头,如example.com/my-app
  • 默认不允许修改现存标签的value,使用--overwrite覆盖现有标签的value
  • 使用--resource-version设置资源的某个版本的标签,否则为当前版本
# 范例
kubectl label pods foo unhealthy=true
kubectl label --overwrite pods foo status=unhealthy
# update all pods label in the namespace
kubectl label pods --all status=unhealthy
# update a pod identified by the type and name in "pod.json"
kubectl label -f pod.json status=unhealthy
kubectl label pods foo status=unhealthy --resource-version=1
# update pod 'foo' by removing a label named 'bar' if exists
kubectl label pods foo bar-
annotate 更新或设置一个或多个资源的注释
  • 所有kubernetes对象都支持将附加数据作为注释与对象一起存储。注释是权重大于标签的键值对,并且包含任意字符串值,如结构化JSON。可以使用注释来实现kubernetes处于beta阶段的功能扩展
  • 默认不允许修改现存注释的value,使用--overwrite覆盖现有注释的value
  • 使用--resource-version设置资源的某个版本的注释,否则为当前版本
# 范例
kubectl annotate pods foo description='my frontend'
# update a pod identified by the type and name in "pod.json"
kubectl annotate -f pod.json description='my frontend'
expose 给已经存在的pod,service,replicationcontroller,deployment,replicaset资源创建或关联service
# 范例
# create a service for a replicaset nginx, which serves on port 80 and connects to the containers on port 8000
kubectl expose rc nginx --port=80 --target-port=8000
kubectl expose deployment nginx --port=80 --target-port=8000
kubectl expose pod valid-port --port=444 --name=frontend
replace 通过文本文件或标准命令行替换已经存在的资源
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -
kubectl replace -f ./pod.json
patch 使用JSON补丁更新资源的字段
以下patch方法常用于使用go封装云原生应用部署,即替换image版本、扩缩容副本
kubectl patch deployments web -p '{"spec":{"replicas":1}}'
以下patch方法常用于admission webhook为工作负载增加配置字段,可参加K8S二次开发系列之三:自定义开发Admission Webhook
kubectl patch deployments web --type='json' -p '[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"nginx:1.21.5"}]'

kubectl更新workload

set 对现有应用程序的资源进行更改:env, image, resources, selector, serviceaccount, subject
scale 对指定的工作负载副本数量进行缩放,如果指定了--current-replicas或--resource-version则会在尝试缩放之前对其进行验证,并保证在将缩放发送到服务器时前提条件为true
# 范例:
kubectl scale --replicas=3 rs/foo
kubectl scale --replicas=3 -f foo.yaml
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql
autoscale 使用metrics-server对指定的工作负载的cpu-percent指标进行度量,按照预支自动缩放pod副本数量 ```shell # 范例 # 使用默认策略对foo进行最大10最小2的副本缩放 kubectl autoscale deployment foo --min=2 --max=10 # cpu使用率超过80%后进行最大5最小1的副本缩放 kubectl autoscale rc foo --max=5 --cpu-percent=80

文章作者: 洪宇轩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 洪宇轩 !
评论
  目录