k8s基础-kubectl node-shell 登录节点

2023-11-14

通过kubectl node-shell可以直接登录任意节点主机:

(weops) [root@node201 helm]# curl -LO https://github.com/kvaps/kubectl-node-shell/raw/master/kubectl-node_shell
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   150  100   150    0     0    123      0  0:00:01  0:00:01 --:--:--   123
100  3438  100  3438    0     0   1405      0  0:00:02  0:00:02 --:--:--  8013
(weops) [root@node201 helm]# chmod +x ./kubectl-node_shell
(weops) [root@node201 helm]# sudo mv ./kubectl-node_shell /usr/local/bin/kubectl-node_shell

(weops) [root@node201 helm]# kubectl get node
NAME      STATUS   ROLES                  AGE   VERSION
node2     Ready    control-plane,master   91d   v1.20.2
node201   Ready    <none>                 91d   v1.20.2

(weops) [root@node201 helm]# kubectl node-shell node2
spawning "nsenter-xhadg3" on "node2"
If you don't see a command prompt, try pressing enter.
[root@node2 /]# hostname
node2
[root@node2 /]# exit
logout
pod "nsenter-xhadg3" deleted
(weops) [root@node201 helm]#

源码解析:

#!/usr/bin/env sh
set -e

kubectl=kubectl
version=1.5.5
generator=""
node=""
nodefaultctx=0
nodefaultns=0
cmd='[ "nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid", "--"'
if [ -t 0 ]; then
  tty=true
else
  tty=false
fi
while [ $# -gt 0 ]; do
  key="$1"

  case $key in
  -v | --version)
    echo "kubectl-node-shell $version"
    exit 0
    ;;
  --context)
    nodefaultctx=1
    kubectl="$kubectl --context $2"
    shift
    shift
    ;;
  --kubecontext=*)
    nodefaultctx=1
    kubectl="$kubectl --context=${key##*=}"
    shift
    ;;
  --kubeconfig)
    kubectl="$kubectl --kubeconfig $2"
    shift
    shift
    ;;
  --kubeconfig=*)
    kubectl="$kubectl --kubeconfig=${key##*=}"
    shift
    ;;
  -n | --namespace)
    nodefaultns=1
    kubectl="$kubectl --namespace $2"
    shift
    shift
    ;;
  --namespace=*)
    nodefaultns=1
    kubectl="$kubectl --namespace=${key##*=}"
    shift
    ;;
  --)
    shift
    break
    ;;
  *)
    if [ -z "$node" ]; then
      node="${1#node/}"
      shift
    else
      echo "exactly one node required"
      exit 1
    fi
    ;;
  esac
done

# Set the default context and namespace to avoid situations where the user switch them during the build process
[ "$nodefaultctx" = 1 ] || kubectl="$kubectl --context=$(${kubectl} config current-context)"
[ "$nodefaultns" = 1 ] || kubectl="$kubectl --namespace=$(${kubectl} config view --minify --output 'jsonpath={.contexts..namespace}')"

if [ $# -gt 0 ]; then
  while [ $# -gt 0 ]; do
    cmd="$cmd, \"$(echo "$1" | \
      awk '{gsub(/["\\]/,"\\\\&");gsub(/\x1b/,"\\u001b");printf "%s",last;last=$0"\\n"} END{print $0}' \
    )\""
    shift
  done
  cmd="$cmd ]"
else
  cmd="$cmd, \"bash\", \"-l\" ]"
fi

if [ -z "$node" ]; then
  echo "Please specify node name"
  exit 1
fi

image="${KUBECTL_NODE_SHELL_IMAGE:-docker.io/library/alpine}"
pod="nsenter-$(env LC_ALL=C tr -dc a-z0-9 </dev/urandom | head -c 6)"

# Check the node
$kubectl get node "$node" >/dev/null || exit 1

container_cpu="${KUBECTL_NODE_SHELL_POD_CPU:-100m}"
container_memory="${KUBECTL_NODE_SHELL_POD_MEMORY:-256Mi}"
labels="${KUBECTL_NODE_SHELL_LABELS}"

overrides="$(
  cat <<EOT
{
  "spec": {
    "nodeName": "$node",
    "hostPID": true,
    "hostNetwork": true,
    "containers": [
      {
        "securityContext": {
          "privileged": true
        },
        "image": "$image",
        "name": "nsenter",
        "stdin": true,
        "stdinOnce": true,
        "tty": $tty,
        "command": $cmd,
        "resources": {
          "limits": {
            "cpu": "${container_cpu}",
            "memory": "${container_memory}"
          },
          "requests": {
            "cpu": "${container_cpu}",
            "memory": "${container_memory}"
          }
        }
      }
    ],
    "tolerations": [
      {
        "key": "CriticalAddonsOnly",
        "operator": "Exists"
      },
      {
        "effect": "NoExecute",
        "operator": "Exists"
      }
    ]
  }
}
EOT
)"

# Support Kubectl <1.18
m=$(kubectl version --client -o yaml | awk -F'[ :"]+' '$2 == "minor" {print $3+0}')
if [ "$m" -lt 18 ]; then
  generator="--generator=run-pod/v1"
fi

trap "EC=\$?; $kubectl delete pod --wait=false $pod >&2 || true; exit \$EC" EXIT INT TERM

echo "spawning \"$pod\" on \"$node\"" >&2
$kubectl run --image "$image" --restart=Never --overrides="$overrides" --labels="$labels" $([ "$tty" = true ] && echo -t) -i "$pod" $generator

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s基础-kubectl node-shell 登录节点 的相关文章

随机推荐

  • nodeJS入门(四)之身份验证

    身份验证 一 bcrypt模块 1 1 简单介绍一下 1 2 安装 1 3 加密 二 身份验证 2 1 session 会话 2 1 1 session实现身份验证的思路 2 1 2 session的业务流程 2 1 3 express s
  • QT学习总结

    转眼间工作已经三个月了 实习期也已经满了 在这三个月中 对qt的学习遇到了很多问题 也解决了很多问题 也留下了一些现在的未解之谜 在工作中关于qt的一些东西也需要进行一些记录 QT Creator对大于带有两个空格的目录和中文命名的目录不支
  • cv2.error: OpenCV(4.6.0) /io/opencv/modules/imgcodecs/src/grfmt_exr.cpp:103: error

    问题描述 cv2 error OpenCV 4 6 0 io opencv modules imgcodecs src grfmt exr cpp 103 error 213 The function feature is not impl
  • 数据库服务器配置参数修改,数据库服务器参数配置

    数据库服务器参数配置 内容精选 换一换 云搜索服务 Cloud Search Service 为用户提供结构化 非结构化文本的多条件检索 统计 报表 本章节介绍如何通过CDM将本地Elasticsearch整库迁移到云搜索服务中 流程如下
  • 如何在GitHub的repository中建立文件夹

    GitHub的repository无法直接建立文件夹 需要曲线建立 第一步 创建新的repository 若已有repository可直接将其打开 第二步 在repository界面右上角选择创建新文件 create new files 不
  • 费曼技巧学习笔记

    博主狂言 技巧正文 技巧的详细步骤 技巧步骤一 技巧步骤二 技巧步骤三 技巧的提纲总结 费曼技巧可以解决的问题 费曼技巧的另一种描述四步学习法 步骤一 步骤二 步骤三 步骤四 博主读后感 博主狂言 初识费曼技巧 甚是熟悉 博主自认有那么一点
  • 基于Springboot实现Kafka消费数据

    本文介绍使用Kafka监听和订阅两种不同方式进行数据消费 1 配置文件 spring kafka bootstrap servers 192 168 1 16 9092 消费者 consumer group id alarmService
  • MySQL check table/optimize table/analyze table/REPAIR TABLE

    check table 检查InnoDB和MyIsam是否有错误 检查表或者视图是否存在错误 对 MyISAM 和 InnoDB 存储引擎的表有作用 对于 MyISAM 存储引擎的表进行表检查 也会同时更新关键字统计数据 CHECK TAB
  • 《ios零基础教程》-- ”Mac OS X的介绍”和一些“基础语法” 2014-3-18总结

    一 学前须知 讲的ios和c语言的一些发展历史 作为了解即可 二 Mac OS X简单介绍 讲的是对苹果电脑的一些操作和基础了解 感觉蛮有用的 以前都是用的windows 突然用这种高富帅装备 还真不习惯 装个软件都费劲 看了这个之后 对m
  • 1 Centos7安装(jdk8)Tomcat9并设置为开机启动

    一 安装过程 cd usr local src wget http mirrors hust edu cn apache tomcat tomcat 9 v9 0 12 bin apache tomcat 9 0 12 tar gz 可以下
  • 面试余额宝Java技术岗(1-4面题目):GC+spring+二叉树+Dubbo+线上调优+​​​​数据库索引+mq

    余额宝一面 JVM 内存分哪几个区 每个区的作用是什么 JVM有哪些回收算法 对应的收集器有哪些 GC 的两种判定方法 CMS 收集器与 G1 收集器的特点 hashmap源码问题 HashMap HashMap如何保证线程安全 Concu
  • Aix6.1下安装SWFTools

    该文章参考http tech sxinfo net jctj article do curMenu 14 childMenu 16 articleId 388 再结合我在实际上在Aix6 1上的安装经验来编写 相关文件的下载 ftp ftp
  • Linux 同步工具rsync 文件目录同步,增量备份的手段之一

    一 rsync介绍 rsync是linux系统下的数据镜像备份工具 使用快速增量备份工具Remote Sync可以远程同步 支持本地复制 或者与其他SSH rsync主机同步 它的特性如下 可以镜像保存整个目录树和文件系统 可以很容易做到保
  • 工具类库系列(十四)-FileData

    第十四个工具类 FileData 用于文本文件读取 保存 以及在内存中修改文本文件内容 读取 ifstream 保存 ofstream 修改内容 以string类型 获取 设置 文本文件内容 最大支持文件大小1M 上代码 FileData
  • 【多线程】线程安全、锁的同步和异步

    一 基本概念 线程安全 当多个线程访问某一个类 对象或方法 时 这个类始终都能表现出正确的行为 那么这个类 对象或方法 就是线程安全的 非线程安全 非线程主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改 值不同步的情况
  • cmake:foreach、endforeach

    foreach 为列表中的每个值计算一组命令 foreach
  • python 数据可视化- 地图

    import json from pyecharts charts import Map from pyecharts options import 读取数据文件 f open D 桌面 python 资料 可视化案例数据 地图数据 疫情
  • JWT安全

    文章目录 JWT是什么 为什么要使用JWT JWT的数据结构 JWT的工作过程 JWT是什么 JSON Web Token JWT 是一个开放标准 RFC 7519 它定义了一种紧凑的 自包含的方式 用于作为JSON对象在各方之间安全地传输
  • Markdown 常用语法汇总

    前言 Markdown 作为一种标记语言 本质上与HTML等无异 都是通过特定的语法 再经过渲染 才能呈现出最终效果 因为程序对 Markdown 语法的支持程度不同 故部分程序中可能无法使用一些较新的语法规则 本文将其常用的语法进行了汇总
  • k8s基础-kubectl node-shell 登录节点

    通过kubectl node shell可以直接登录任意节点主机 weops root node201 helm curl LO https github com kvaps kubectl node shell raw master ku