场景
云端软件使用 Jenkins 发布版本时,需要将 Jenkins 的计算节点远程连接到 k8s master 节点上,并执行 kubectl
命令。由于 kubectl
命令需要有 sudo 权限,所以当前,需要解决 SSH 远程免密登录和 sudo 免密执行问题。
SSH 远程免密登录
首先在 Jenkins 计算节点上,生成 ssh key。(已有 key 的忽略这一步)
## 生成 ssh key,打完命令后,无需任何输入,连续三次回车即可
<source_user>@<source_ip>:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lijie/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/lijie/.ssh/id_rsa
Your public key has been saved in /home/lijie/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:o27B/XKyUXIyyn63ofxdBnSnJSccRofB+SR4NBGOp1o <source_user>@<source_ip>
The key's randomart image is:
+---[RSA 3072]----+
| =X*.|
| .=*+.|
| o.B++|
| . + B.|
| . .S o E . |
| .oo.B o . |
| +...o o |
| o..+o+o o |
| .o.+Bo.. |
+----[SHA256]-----+
<source_user>@<source_ip>:~$
使用 ssh-copy-id
复制公钥到目标机器上。
## 默认端口号为 22,如果目标机器的端口号不是 22,需要添加 -p 参数,写明连接的端口号
ssh-copy-id <target_user>@<target_ip> -p <target_port>
如果发现用户名和 ip 名都变成了目标机器,则表示远程免密登录成功。当我们需要执行远程命令时,可用以下指令。
ssh <target_user>@<target_ip> -p <target_port> <shell>
sudo 免密执行
由于 k8s 节点的机器需要对用户权限进行管控,所以一般不会授予用户 root 权限,而给用户 sudo 的权限,但在执行 sudo 提权时,是需要输入密码的,远程连接时无法进行密码的输入动作。所以还需要对用户增加 sudo 免密执行的权限。
在 k8s master 节点上,切换到 root 用户,并修改 /etc/sudoers
文件。添加一行内容 <target_user> ALL=(ALL:ALL) NOPASSWD:ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
## Allows people to run all commands without password
<target_user> ALL=(ALL:ALL) NOPASSWD:ALL
保存退出,这样就可以实现 Jenkins 计算节点免密登录远程机器并免密执行 sudo 命令了。
扩展:限制 IP 登录
由于在生产环境中,登录生产环境的 k8s 进行配置文件等修改的动作是很危险的,所以在设置 sudo 免密执行时需要对登录的 IP 进行限制。
Linux 服务器可以通过设置 /etc/hosts.allow
和 /etc/hosts.deny
两个文件对访问的 IP 进行限制。值得注意的是,当同一个 IP 同时出现在这两个文件时,hosts.allow
优先级大于 hosts.deny
。
hosts.allow
允许某个或者某段 IP 地址远程 SSH 登录服务器,且设置后立即生效,不需要重启 SSHD 服务,具体如下:
vim /etc/hosts.allow
文件格式如下所示:
sshd:10.11.10.10x:allow
sshd:10.11.10.11x:allow
sshd:10.11.10.10x:allow
hosts.deny
限制某个或者某段 IP 地址远程 SSH 登录服务器,且设置后立即生效,不需要重启 SSHD 服务,具体如下:
vim /etc/hosts.deny
文件格式如下所示:
sshd:all:deny