我写了一个判断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