我写了一个判断Kubernetes Pod的脚本,在挂起的情况下,必须写Pod日志(log)并删除它.Kube master在另一台服务器上,我try 通过ssh连接到它.当我try 在Kube主服务器上本地启动脚本时,它工作得很好,但当我try 输入与ssh参数相同的命令时,我得到pod被删除,但这个pod的日志(log)没有写入,也没有错误,所以我不知道我做错了什么.对于它们所在的脚本和目录,我使用的是python3.6,访问权限为777.

我知道使用K8s API可以做到这一点,但我现在不知道怎么做.我仍在学习,稍后会努力实现这一点,但系统现在应该可以工作了.

PS.我这样做的原因是我想把‘check_Radio’添加到cron中,而不是挂起pod …… PPS.我不是大师级的,只是一个普通的系统管理员,想成为一名开发者,所以如果你有一些 idea 如何优化我的工作,你是受欢迎的.

以下是Kube主服务器(kube_reload.py)上的脚本:

#!/bin/python3


import sys
import os
import re
import subprocess as sp
from contextlib import redirect_stdout as r_stdout


marker = False
pod_nums = ''
pod_nums_int = []
for_reload = []

get_pods = sp.check_output(['kubectl', 'get', 'pods'])
get_pods = str(get_pods)
get_pods = get_pods.split()

pods = []


'''write garbage pod names in array'''

for word in get_pods:
    if 'radio-hls' in word:
        pods.append(word) 

'''make usual pod names from garbage names'''

for num in range(len(pods)):

    while marker == False:
        if pods[num][:5] != 'radio':
            pods[num] = pods[num][1:]
        if pods[num][:5] == 'radio':
            break


'''Function that lists all pods'''

def pod_list():

    sp.run('clear')
    print('PODS LIST:\n')
    for num in range(len(pods)):
        print(num+1, '.\t', pods[num])

    print(len(pods)+1, '.\t Reload all')

'''Function for recursion in try-except statement in 'input_nums()' function'''

def return_for_except():
    pod_list()
    print('Error input. Try again\n\n')
    input_nums()

'''Function that asks which pods you want to reload'''

def input_nums():
    pod_nums = str(input('Select which pods you want to reload (type all numbers with a space):\nExample: 1 2 3 10\n\n'))
    pod_nums = pod_nums.split()

    try:
        global pod_nums_int
        pod_nums_int = [eval(i) for i in pod_nums]
    except:
        return return_for_except()

'''Function to write pod logs to a file'''

def write_logs():

    global for_reload

    if len(pods)+1 in pod_nums_int:

        all_reload = input('You selected "Reload all". To continue, press Enter\n')

        if all_reload == '':
            for i in range(len(pods)):
                with open (f'{pods[i-1][10:-17]}.log', 'w') as pod_log:
                                    sp.run(['kubectl', 'logs', f'{pods[i-1]}'], stdout=pod_log)
                print(f'{pods[i-1]} logged successfully')
                for_reload.append(i)
        else:
            print('Something went wrong')
            quit()
    else:
        for i in pod_nums_int:

            with open (f'{pods[i-1][10:-17]}.log', 'w') as pod_log:
                sp.run(['kubectl', 'logs', f'{pods[i-1]}'], stdout=pod_log)
            print(f'{pods[i-1]} logged successfully')
            for_reload.append(i)


'''Function that reloads streams'''

def reload_pods(for_reload, pods):
    for i in for_reload:
        sp.run(['kubectl', 'delete', 'pod', f'{pods[i-1]}'])
        print(f'{pods[i-1]}', 'deleted')






'''Start'''

'''manual (with no arguments)'''
if len(sys.argv) == 1:
    pod_list()
    input_nums()
    write_logs()
    reload_pods(for_reload, pods)
    sp.run(['kubectl', 'get', 'pods'])
    print()
    sp.run(['ls', '-lah'])

'''auto (from nginx srver)'''

if len(sys.argv) > 1:
    for arg in sys.argv:
        if arg == './kube_reload.py':
            continue
        else:
            for pod in pods:
                if arg in pod:
                    #write logs
                    with open (f'{arg}.log', 'w') as log:
                        sp.run(['kubectl', 'logs', f'{pod}'], stdout=log)
                    #reload pods
                    sp.run(['kubectl', 'delete', 'pod', f'{pod}'])
                else:
                    continue

以下是来自另一台服务器(Check_Radio)的脚本:

#!/bin/python3


import requests as r
import subprocess as sp
import sys

'''IN CASE OF ADDING ADDITIONAL STREAM ADD IT TO "streams" '''

streams = [
'gold',
'tophits',
'worldchart',
'ukraine',
'rock',
'chill',
'rap',
'retromusic',
'elektro',
'sport',
'radionv',
'edyninov',
'hromadske'
]

'''IF IF THERE IS NO NEED TO CHECK SOME STREAMS YOU CAN ADD IT TO "streams_not_to_check" '''

streams_not_to_check = [
'radionv',
'edyninov',
'hromadske'
]

streams_to_delete = []

#CLUSTER_API = 'https://host_ip:6443'
#auth_header = 'Authorization: '

for stream in streams:
    check_stream = r.get(f'https://host.host/stream/{stream}/status/health').json()

    if check_stream['metadata'] == 'UNHEALTHY':
        streams_to_delete.append(stream)

for stream in streams_not_to_check:
    if stream in streams_to_delete:
        streams_to_delete.remove(stream)

print(streams_to_delete)




if len(streams_to_delete) >= 1:

    for stream in streams_to_delete:

        sp.Popen(f'ssh developer@radio1 python3 ~/deekly/kube_reload.py {stream}', shell=True).communicate()

我在nginx服务器上try 了一下

./check_radio

然后拿到这个

[developer@radio-lb1 deekly]$ ./check_radio
['rap', 'rock']
pod "radio-hls-rap-f4b86bd77-jpmr4" deleted
pod "radio-hls-rock-57fc8fcd64-m54k5" deleted
[developer@radio-lb1 deekly]$

这是在Kube服务器上

[developer@radio1 deekly]$ ls -la
total 8
drwxrwxrwx  2 developer developer   28 Aug  4 20:46 .
drwx------ 14 developer developer 4096 Aug  4 20:26 ..
-rwxrwxrwx  1 developer developer 2850 Aug  4 19:51 kube_reload.py
[developer@radio1 deekly]$

但是当我在Kube Master上试这个的时候

./kube_reload.py rap rock

或者这个(无关紧要)

python3 kube_reload.py rap rock

我明白了

[developer@radio1 deekly]$ ./kube_reload.py rap rock
pod "radio-hls-rap-f4b86bd77-4bvcs" deleted
pod "radio-hls-rock-57fc8fcd64-g5j96" deleted
[developer@radio1 deekly]$ ls -la
total 32
drwxrwxrwx  2 developer developer   59 Aug  5 16:38 .
drwx------ 14 developer developer 4096 Aug  4 20:26 ..
-rwxrwxrwx  1 developer developer 2850 Aug  4 19:51 kube_reload.py
-rw-rw-r--  1 developer developer 8303 Aug  5 16:38 rap.log
-rw-rw-r--  1 developer developer 8345 Aug  5 16:38 rock.log

推荐答案

您的kube_reload.py脚本将其日志(log)写入其当前工作目录:

with open (f'{arg}.log', 'w') as log:
...

当您以交互方式运行Kube_reload.py时,您将从这个"deekly"目录运行它,因此"deekly"是进程的工作目录,日志(log)写在那里:

[developer@radio1 deekly]$ ./kube_reload.py rap rock
...
[developer@radio1 deekly]$ ls -la
...
-rw-rw-r--  1 developer developer 8303 Aug  5 16:38 rap.log
-rw-rw-r--  1 developer developer 8345 Aug  5 16:38 rock.log

当这check_radio调用kube_reload.pyssh时,kube_reload.py进程将这个"开发人员"用户的主目录作为其工作目录,而不是"deekly"目录:

sp.Popen(f'ssh developer@radio1 python3 ~/deekly/kube_reload.py {stream}', shell=True)...

kube_reload.py可能会将其日志(log)文件写入该"开发人员"用户的主目录,而不是"deekly"子目录.

如果您想要将日志(log)写入这个"deekly"目录,您应该执行以下三项操作之一:

  1. 修改kube_reload.py以将日志(log)放置在您想要的位置,而不是其当前工作目录.

  2. 修改kube_reload.py以在打开日志(log)之前将其工作目录更改为所需的目录.

  3. 修改check_radio以使用正确的工作目录在远程主机上调用kube_reload.py.我不是一名python程序员,所以我不能给您提供准确的python语法.但下面这样的命令应该能做到这一点:

    SSH Developer@Radi1‘cd deekly&;&;python3./kube_reload.py args...’

您必须在python中执行所有必要的操作来转义这些单引号,以便它们出现在实际执行的命令中.

Python相关问答推荐

Gekko解算器错误results.json未找到,无法找出原因

在Python中使用readline函数时如何向下行

有什么方法可以修复奇怪的y轴Python matplotlib图吗?

在后台运行的Python函数

如何在vercel中指定Python运行时版本?

如何使用PyTest根据self 模拟具有副作用的属性

使用Python和PRNG(不是梅森龙卷风)有效地生成伪随机浮点数在[0,1)中均匀?

Google Drive API获取文件计量数据

DataFrame groupby函数从列返回数组而不是值

将特定列信息移动到当前行下的新行

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

根据在同一数据框中的查找向数据框添加值

2D空间中的反旋算法

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

Polars:用氨纶的其他部分替换氨纶的部分

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

如何使用它?

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

如何在BeautifulSoup/CSS Select 器中处理regex?

Matplotlib中的字体权重