实时日志处理
使用 kubectl logs -f
可以非常方便地集中查看集群当中各个 pod 的日志,但是通常需要看日志的是开发人员,而不是运维人员,kubectl 命令对集群管理的权限又很大,因此不可能将 kubectl 的权限开放给开发人员。经过分析,找到了方法,就是使用 rbash 来限制开发人员只能执行自定义的查看日志的命令,而不能进行其他任何操作。
大致步骤如下(需在任意一台安装有 kubectl 命令的集群机器上执行):
1. 添加一个查看日志的用户
adduser k8sloger
passwd k8sloger
2. 使用 rbash 限制用户部分权限
ln -s /bin/bash /bin/rbash
bash -c 'echo "/bin/rbash" >> /etc/shells'
chsh -s /bin/rbash k8sloger
3. 回收日志用户所有的权限
bash -c 'echo "export PATH=/home/k8sloger/" >> /home/k8sloger/.bashrc'
4. 赋予日志用户最基本的权限
ln -s /bin/ping /home/k8sloger/ping
ln -s /bin/ls /home/k8sloger/ls
ln -s /bin/grep /home/k8sloger/grep
ln -s /bin/wc /home/k8sloger/wc
ln -s /bin/awk /home/k8sloger/awk
ln -s /bin/sudo /home/k8sloger/sudo
5. 添加 sudo 权限
visudo
# 手工添加以下内容
# k8sloger ALL=NOPASSWD: /root/local/bin/kubectl
6. 添加查看日志的脚本
tee /home/k8sloger/getlog <<-'EOF'
#!/bin/sh
#sudo /root/local/bin/kubectl get namespace
read -p "请输入工程名: " val
result=$(sudo /root/local/bin/kubectl get pods --all-namespaces -o=wide | grep $val | awk '{printf("k8s%03d %s\n", NR, $0)}')
# 如果是echo $result,输出结果为一行,没有换行符
# 如果是echo "$result",输出结果为多行,有换行符
# echo "$result"
count=$(echo "$result" | wc -l)
#echo $count
#echo "$result"
if [ "$result" = "" ]
then
echo "未发现 Running 的POD,请检查"
else
if [ "$count" = "1" ]
then
echo "发现一个 Running 的POD,即将输出日志..."
namespace=$(echo "$result" | awk '{print $2}')
podname=$(echo "$result" | awk '{print $3}')
sudo /root/local/bin/kubectl logs -f --tail 100 $podname -n $namespace
else
# 如果是echo $result,输出结果为一行,没有换行符
# 如果是echo "$result",输出结果为多行,有换行符
echo "$result"
read -p "发现多个 Running 的POD,请输入 POD 序号: " val
podname=$(echo "$result" | grep $val | awk '{print $3}')
namespace=$(echo "$result" | grep $val | awk '{print $2}')
if [ -n "$namespace" ]
then
sudo /root/local/bin/kubectl logs -f --tail 100 $podname -n $namespace
else
echo "未发现 Running 的POD,请检查"
fi
fi
fi
EOF
chmod +x /home/k8sloger/getlog
7. 应用方法
使用 k8sloger
用户 ssh 登陆到服务器(这里建议开发使用 webssh 登陆),然后执行 getlog
命令根据提示进行操作,即可看到实时日志了。