我写了一个脚本来检查kubernetes的pod,如果挂起,它必须写入pod日志并删除它。Kube master在另一台服务器上,我尝试通过ssh连接到它。当我尝试在kube主服务器上本地启动脚本时,它工作得很好,但是当我尝试输入与ssh参数相同的命令时,我得到了pod删除,但是这个pod的日志没有写入并且没有错误,所以我不明白我做错了什么。我使用python 3.6,脚本和它们所在目录的访问权限为777。
我知道使用k8s API可以做到这一点,但我现在不知道如何做到这一点。我还在学习,稍后会尝试实现它,但系统现在应该工作。
PS.我这样做的原因是我想添加'check_radio'到cron,忘记挂pod...我不是python的高手,只是一个想成为devops的普通系统管理员,所以如果你有一些关于如何优化我的工作的想法,欢迎你。
下面是kube master上的脚本(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服务器上试了一下
./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
型
1条答案
按热度按时间bogh5gae1#
您的
kube_reload.py
脚本将其日志写入其当前工作目录:字符串
当你以交互方式运行kube_reload.py时,你是从这个“deekly”目录运行它的,所以“deekly”是进程的工作目录,日志被写在那里:
型
当这个
check_radio
通过ssh
调用kube_reload.py
时,kube_reload.py
进程将这个“developer”用户的主目录作为其工作目录,而不是“deekly”目录:型
kube_reload.py
可能会将其日志文件写入这个“developer”用户的主目录,而不是“deekly”子目录。如果您希望日志被写入这个“deekly”目录,您应该做以下三件事之一:
1.修改
kube_reload.py
,将日志放在您想要的位置,而不是当前的工作目录。1.修改
kube_reload.py
,在打开日志之前将其工作目录更改为所需目录。1.修改
check_radio
以使用正确的工作目录在远程主机上调用kube_reload.py
。我不是Python程序员,所以我不能给予你确切的Python语法。但是像下面这样的命令应该可以做到这一点:ssh developer@radio1 'cd deekly && python3 ./kube_reload.py args...'
你将不得不在python中做任何必要的事情来转义这些单引号,以便它们出现在实际执行的命令中。