文章 86
评论 0
浏览 124459
kubectl客户端工具备忘录

kubectl客户端工具备忘录

一、kubectl备忘录

1.1 kubectl的bash自动补全

bash中设置当前 shell的自动补全,需先安装 bash-completion包否则会报错

#方法1:临时生效退出重新登录会失效
source <(kubectl completion bash)
#方法2:永久生效写入到/etc/profile文件中,这样会导致所有用户都会生效,如果只给一个用户生效请写到~/.bashrc文件中
echo 'source <(kubectl completion bash)' >>/etc/profile

您还可以为 kubectl 使用一个速记别名,该别名也可以与 completion 一起使用

cat ~/.bashrc
source <(kubectl completion bash)
alias k=kubectl    #别名
complete -F __start_kubectl k #设置completion

#执行命令如下
k get pod 

1.2 kubectl上下文和配置

kubectl客户端工具与k8s集群通信,需要一个上下文配置文件,之后需要把这个配置文件拷贝到执行kubectl命令的用户家目录 ~/.kube/config或者,把配置文件写入到环境变量 KUBECONFIG中。

示例如下

#拷贝文件
[root@km1-81 ~]# ll ~/.kube/config 
-rw------- 1 root root 6255 Dec 14 10:54 /root/.kube/config
#设置变量,变量可以设置多个配置文件使用:隔开
export KUBECONFIG=~/.kube/config:~/.kube/config2

设置 kubectl 与哪个 Kubernetes 集群进行通信并修改配置信息。 上下文的切换一般在多kubernetes集群中使用同一个 kubectl时,需要使用上下文切换所操作的集群。单个集群无需操作。

#显示kubeconfig上下文配置
kubectl config view
#显示上下文列表
kubectl config get-contexts
#展示当前所处的上下文
kubectl config current-context 
#设置默认上下文
kubectl config use-context my-cluster-name

1.3 kubectl查看资源配置文件的说明文档

kubernetes中有各种资源,创建这些资源需要创建yaml文件,不同的kubernetes版本,资源配置可能不太一样,所以需要查看官方的一些文档。

示例如下:

#查看Pod文档
kubectl explain pod.spec

注意:yaml配置文件以空格来区分上下级,所以查看某个配置时,需要用 .来区别上下级。

1.4 kubectl创建资源

kubectl创建资源的命令有俩个分别是 applycreate他们的区别分别是

  • apply:一般使用-f参数指定yaml文件创建资源,如果这个资源已经存在,他会检查已有资源跟yaml文件中定义是否一致,不一致会进行更新,一致不对已有资源进行更改,没有则创建。
  • create:可以直接使用命令创建资源(不推荐),也可以使用-f指定yaml文件,如果资源存在则不创建,不存在则创建。

create的一些实用操作:

生成资源模板文件,并不创建资源

#创建deploy
kubectl create deployment nginx-2 --image=10.122.6.81:5000/image/nginx:v1 --dry-run -oyaml
#创建svc
kubectl create service clusterip my-cs --tcp=5678:8080 --dry-run -oyaml

--dir-run   #不做创建操作
-oyaml      #输出为yaml文件

#如果不会写创建资源命令可以使用-h查看帮助,如
kubectl create deploy -h
kubectl create svc -h
....

1.5 kubectl删除资源

kubectl可以使用 delete删除资源,可以使用 -f参数指定yaml文件删除资源

kubectl delete deploy nginx

kubectl delete -f nginx.yaml

1.6 查看与查找资源

kubectl查看资源的命令有俩个分别是 getdescribediff区别为:

  • get:一般为查看资源的列表,也可以使用-o参数把查找的资源输出为别的文件类型。
  • describe:查看资源的详细信息,可以检查资源的运行事件帮助排错。
  • diff:可以用来比较资源差异性,可以使用-f指定yaml文件。

示例

#查找资源
kubectl get deployments.apps

#查找一个资源并且输出为yaml文件
kubectl get deployments.apps  nginx -oyaml -A
#查看pv并且以容量排序
kubectl get pv --sort-by=spec.capacity.storage
#列出事件(Events),按时间戳排序
kubectl get events --sort-by=.metadata.creationTimestamp -A

-owide  #以列表方式查看更详细的信息
-oyaml  #以yaml文件格式输出
-A      #所有命名空间
--sort-by  #排序,以资源中定义的某些信息排序
--show-labels #显示资源的labels
-l          #显示匹配标签的资源

#查看一个资源的详细信息
kubectl describe nodes 10.122.6.75

1.7 与Pod进行交互

查看容器日志 log

#追踪容器日志
kubectl logs nginx -c nginx  -f

#容器执行命令
kubectl exec nginx-1-84c69559fd-cxmhr -c centos -- ls

#进入Pod终端
kubectl exec -it nginx-1-84c69559fd-cxmhr -c centos bash

#在本地打开端口并转发到pod上,需要有socat命令
kubectl port-forward --address 0.0.0.0 nginx-1-84c69559fd-cxmhr 80:80

#显示给定 Pod 和其中容器的监控数据
kubectl top pod nginx --containers

1.8 格式化输出

要以特定格式将详细信息输出到终端窗口,将 -o(或者 --output)参数添加到支持的 kubectl 命令中。

输出格式描述
-o=custom-columns=<spec>使用逗号分隔的自定义列来打印表格
-o=custom-columns-file=<filename>使用<filename> 文件中的自定义列模板打印表格
-o=json输出 JSON 格式的 API 对象
-o=jsonpath=<template>打印 jsonpath表达式中定义的字段
-o=jsonpath-file=<filename>打印在<filename> 文件中定义的 jsonpath 表达式所指定的字段。
-o=name仅打印资源名称而不打印其他内容
-o=wide以纯文本格式输出额外信息,对于 Pod 来说,输出中包含了节点名称
-o=yaml输出 YAML 格式的 API 对象

示例

#输出集群中运行着的所有镜像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'

二、kubectl扩展脚本安装

需要把写好的shell脚本放置到linux系统的PATH变量的路径文件夹中,并且命名为kubectl-{name},添加执行权限,首行声明 #!/bin/bash如下:

[21:00:44 root@master01 ~]#ls /usr/local/sbin/
kubectl-backup  kubectl-update
#验证安装的扩展
[21:00:50 root@master01 ~]#kubectl plugin list
The following compatible plugins are available:
/usr/local/sbin/kubectl-backup
/usr/local/sbin/kubectl-update

使用kubectl调用扩展脚本

#由于我们脚本名称被命名为kubectl-{name},所以执行kubectl {name}即可调用插件脚本
[21:01:25 root@master01 ~]#kubectl backup
ERROR: Please bring parameters is [ namespace ]
[21:03:09 root@master01 ~]#kubectl update
-----------------使用说明------------------------------------------
 stop      暂停deploy资源的更新
 start     启用deploy资源的更新
 image     更新deploy资源的pod镜像
 env       更新deploy资源的pod变量
 update    获取deploy中container的名称并且生成新的配置文件
 verify    验证升级配置文件,更新前验证,没有任何输出表示升级文件正常
 rollback  deploy回滚到上一个版本
-------------------------------------------------------------------

2.1 kubernetes备份deploy与service资源

#!/bin/bash
#注意此脚本可以备份k8s集群中svc与dep资源以yaml文件的方式导出,执行脚本时需要携带命名空间名称参数
#如需要备份其他资源请自行修改脚本
#dep没有的参数
dep_label='
annotations:
deployment.kubernetes.io\/revision:
kubectl.kubernetes.io\/last-applied-configuration:
\{.*\}
creationTimestamp:
generation:
resourceVersion:
selfLink:
uid:
progressDeadlineSeconds:
replicas:
revisionHistoryLimit:
strategy
rollingUpdate:
maxSurge:
maxUnavailable:
type:
creationTimestamp:
'
#svc没有用的参数
svc_label='
annotations:
kubectl.kubernetes.io\/last-applied-configuration:
\{.*\}
creationTimestamp:
resourceVersion:
selfLink:
uid:
clusterIP:
externalTrafficPolicy:
sessionAffinity:
'
#获取deployments资源有用的信息
dep(){
  sed -ri '/^status:/,$d' $1
  for a in $dep_label;do
    sed -ri "/${a}/d" $1
  done
}
#获取service资源有用信息
svc(){
  sed -ri '/^status:/,$d' $1
  for a in $svc_label;do
    sed -ri "/${a}/d" $1
  done
}
#主执行脚本
backup_yaml(){
  PWD=`pwd`
  mkdir $PWD/$1/{dep,svc} -p
  kubectl get deployments.apps -n $1 >$PWD/dep_name.txt
  dep_name=`awk  'NR!=1{print $1}' $PWD/dep_name.txt`
  kubectl get svc -n $1 >$PWD/svc_name.txt
  svc_name=`awk  'NR!=1{print $1}' $PWD/svc_name.txt`
  for i in $dep_name;do
    kubectl get deployments.apps $i -n $1 -oyaml >$PWD/$1/dep/$i-dep.yaml
    dep $PWD/$1/dep/$i-dep.yaml
    [ $? -eq 0 ] && echo "deployments is $i backup Successful" || echo "deployments is $i backup Fail"
  done
  for i in $svc_name;do
    kubectl get svc $i -n $1 -oyaml >$PWD/$1/svc/$i-svc.yaml
    svc $PWD/$1/svc/$i-svc.yaml
    [ $? -eq 0 ] && echo "service is $i backup Successful" || echo "service is $i backup Fail"
  done
  rm -rf $PWD/dep_name.txt $PWD/svc_name.txt
}
test_1(){
  [ -z "$1" ] && echo "ERROR: Please bring parameters is [ namespace ]" && exit
}
main(){
  test_1 $1
  backup_yaml $1
}
main $1

2.2 kubernetes的deploy批量更新脚本

#!/bin/bash
#升级配置文件检查
verify(){
   if [ -n "$2" ];then
     [ -z $1 ] && { echo "请携带升级配置文件[file]"; exit;} 
     ls $1 &>/dev/null || { echo "${1} 配置文件不存在"; exit ;}
     while read depname images containerd;do
       [ -z $depname ] && { echo "升级配置文件格式错误"; exit;}
       [ -z $containerd ] && { echo "升级配置文件格式错误"; exit;}
       [ -z $images ]  && { echo "升级配置文件格式错误"; exit;}
     done < $1
   while read depname image containerd;do
     kubectl get deployments.apps $depname -n $2 &>/dev/null || echo "没有${depname}这个deployments资源,请重新配置配置文件" 
   done < $1
   else
    echo "-----------------使用说明---------------------------------"
    echo "kubectl update verify [file] [namespace]"
    echo "----------------------------------------------------------"
   fi
}
#暂停更新
stop_update(){
  if [ -n "$2" ];then
    [ -z $1 ] && { echo "请配置暂停更新的deploy的名称列表[file]"; exit;}
    ls $1 &>/dev/null || { echo "${1} 配置文件不存在"; exit ;}
    [ -z "$2" ] && { echo "请携带命名空间名称"; exit;}
    kubectl get ns $2 &>/dev/null || { echo "携带的命名空间名称错误"; exit ;}
    while read depname image containerd;do
      kubectl rollout pause deployment $depname -n $2
    done < $1
  else
    echo "-----------------使用说明---------------------------------"
    echo "kubectl update stop [file] [namespace]"
    echo "----------------------------------------------------------"
  fi
}

#恢复更新
start_update(){
  if [ -n "$2" ];then
    [ -z "$1" ] && { echo "请配置启动更新的deploy的名称列表[file]"; exit;}
    ls $1 &>/dev/null || { echo "${1} 配置文件不存在"; exit ;}
    [ -z "$2" ] && { echo "请携带命名空间名称"; exit;}
    kubectl get ns $2 &>/dev/null || { echo "携带的命名空间名称错误"; exit ;}
    while read depname image containerd;do
    kubectl rollout resume deployment $depname -n $2
    done < $1
  else
    echo "-----------------使用说明---------------------------------"
    echo "kubectl update start [file] [namespace]"
    echo "----------------------------------------------------------"
  fi
}

#镜像更新
image(){
  if [ -n "$1" ];then
    while read depname image containerd;do
      kubectl set image deploy ${depname} ${containerd}=${image} -n $2
    done < $1
  else
    echo "-----------------使用说明---------------------------------"
    echo "kubectl update image [file] [namespace]"
    echo "----------------------------------------------------------"
  fi
}

#变量更新
env(){
  if [ -n "$1" ];then
    while read depname env containerd;do
      env_new=`echo "$env" | awk -F"," '{print $1,$2}'`
      kubectl set env deploy ${depname} --containers=${containerd} ${env_new}
    done < $1
  else
    echo "-----------------使用说明---------------------------------"
    echo "kubectl update env [file] [namespace]"
    echo "----------------------------------------------------------"
  fi
}
#获取deploy中containerd的名称
update_file(){
  if [ -n "$2" ];then
    [ -z $1 ] && { echo "请配置更新的文件"; exit;}
    ls $1 &>/dev/null || { echo "${1} 配置文件不存在"; exit ;}
    [ -z "$2" ] && { echo "请携带命名空间名称"; exit;}
    kubectl get ns $2 &>/dev/null || { echo "携带的命名空间名称错误"; exit ;}
    while read depname image containerd;do
      rm -rf 1.txt
      kubectl get deployments.apps $depname -o wide -n $2 | awk 'NR!=1{print $6}' >>1.txt
    done < $1
    paste $1 1.txt -d " " >${1}_new && echo "${1}_new 文件更新成功"
    rm -rf 1.txt
  else
    echo "-----------------使用说明---------------------------------"
    echo "kubectl update update [file] [namespace]"
    echo "----------------------------------------------------------"
  fi
}
rollback(){
  if [ -n "$2" ];then
    while read depname image containerd;do
      kubectl rollout undo deployment ${depname} -n $2
    done < $1 
  else
    echo "-----------------使用说明---------------------------------"
    echo "kubectl update rollback [file] [namespace]"
    echo "----------------------------------------------------------"
  fi
}

main(){
  case $1 in
  stop)
    stop_update $2 $3
  ;;
  start)
    start_update $2 $3
  ;;
  image)
    image $2 $3
  ;;
  env)
    env $2 $3
  ;;
  update)
    update_file $2 $3
  ;;
  verify)
    verify $2 $3
  ;;
  rollback)
    rollback $2 $3
  ;;
  *)
    echo "-----------------使用说明------------------------------------------"
    echo " stop      暂停deploy资源的更新"
    echo " start     启用deploy资源的更新"
    echo " image     更新deploy资源的pod镜像"
    echo " env       更新deploy资源的pod变量"
    echo " update    获取deploy中container的名称并且生成新的配置文件"
    echo " verify    验证升级配置文件,更新前验证,没有任何输出表示升级文件正常"
    echo " rollback  deploy回滚到上一个版本"
    echo "-------------------------------------------------------------------"
  esac
}

main $1 $2 $3 

标题:kubectl客户端工具备忘录
作者:Carey
地址:HTTPS://zhangzhuo.ltd/articles/2022/01/04/1641268950961.html

生而为人

取消