我的 pods 不断重启,我不明白为什么
My pods are constantly restarting and I can't figure out why
我在容器中有一个 API,当我创建集群时,api 工作正常,但 pods 不断重启,没有任何具体原因日志。
我在 m5.Large EC2 实例上并使用 k3d。我正在关注一个演示所以在安装 k3d 之后我 运行 这个命令
k3d cluster create test -p "80:80@loadbalancer"
这是我的部署文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: stock-api
labels:
app: stock-api
spec:
replicas: 1
selector:
matchLabels:
app: stock-api
template:
metadata:
labels:
app: stock-api
spec:
containers:
- name: stock-api
image: mpriv32/stock-api:latest
envFrom:
- secretRef:
name: api-credentials
服务文件
apiVersion: v1
kind: Service
metadata:
name: stock-api
labels:
app: stock-api
spec:
type: ClusterIP
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: stock-api
我的第三个文件只是我的机密文件,我刚刚删除了这个 post
的值
apiVersion: v1
kind: Secret
metadata:
name: api-credentials
stringData:
ACCESS_KEY:
SECRET_KEY:
EMAIL_PASSWORD:
EMAIL_USER:
API_KEY:
我应用了所有文件并且 API 工作正常,但是我的 pods 不断重启。
首先我 运行 这个命令和我得到股票信息的原因是因为我在我的应用程序中有一个打印语句来测试 api 响应并忘记删除它。
kubectl logs -p stock-api-7f5c45776b-gc67c
{'Company': {'S': 'AAPL'}, 'DailyPrice': {'S': '166.02'}}
获取日志没有帮助,所以我 运行 描述并得到了这个输出
Normal Scheduled 16m default-scheduler Successfully assigned default/stock-api-7f5c45776b-gc67c to k3d-test-server-0
Normal Pulled 15m kubelet Successfully pulled image "mpriv32/stock-api:latest" in 16.509616605s
Normal Pulled 15m kubelet Successfully pulled image "mpriv32/stock-api:latest" in 696.527075ms
Normal Pulled 15m kubelet Successfully pulled image "mpriv32/stock-api:latest" in 734.334806ms
Normal Pulled 15m kubelet Successfully pulled image "mpriv32/stock-api:latest" in 823.429206ms
Normal Started 15m (x4 over 15m) kubelet Started container stock-api
Normal Pulling 14m (x5 over 16m) kubelet Pulling image "mpriv32/stock-api:latest"
Normal Pulled 14m kubelet Successfully pulled image "mpriv32/stock-api:latest" in 698.883126ms
Normal Created 14m (x5 over 15m) kubelet Created container stock-api
Warning BackOff 62s (x67 over 15m) kubelet Back-off restarting failed container
它不断地保持“退避重启”
When I run `describe po` I get this
Name: stock-api-7f5c45776b-gc67c
Namespace: default
Priority: 0
Node: k3d-test-server-0/172.18.0.2
Start Time: Mon, 23 May 2022 06:44:42 +0000
Labels: app=stock-api
pod-template-hash=7f5c45776b
Annotations: <none>
Status: Running
IP: 10.42.0.9
IPs:
IP: 10.42.0.9
Controlled By: ReplicaSet/stock-api-7f5c45776b
Containers:
stock-api:
Container ID: containerd://846d4c5c282274453c4b2ad8b834f20d2c673468ca18386d7404b07915b81a9c
Image: mpriv32/stock-api:latest
Image ID: docker.io/mpriv32/stock-api@sha256:98189cdf972ed61af79505b58aba2a0166fd012f5be4e0f012b2dffa0ea3dd5f
Port: <none>
Host Port: <none>
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Completed
Exit Code: 0
Started: Mon, 23 May 2022 08:23:16 +0000
Finished: Mon, 23 May 2022 08:23:17 +0000
Ready: False
Restart Count: 24
Environment Variables from:
api-credentials Secret Optional: false
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-czkv9 (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
kube-api-access-czkv9:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning BackOff 3m8s (x457 over 102m) kubelet Back-off restarting failed container
我的应用程序的 Dockerfile
FROM python:3.8
COPY app.py .
RUN pip install requests python-dotenv
ARG API_KEY
ARG EMAIL_USER
ARG EMAIL_PASSWORD
ENV API_KEY $API_KEY
ENV EMAIL_USER $EMAIL_USER
ENV EMAIL_PASSWORD $EMAIL_PASSWORD
COPY database.py .
RUN pip install boto3
ARG ACCESS_KEY
ARG SECRET_KEY
ENV ACCESS_KEY $ACCESS_KEY
ENV SECRET_KEY $SECRET_KEY
CMD ["python", "database.py"]
EXPOSE 80
app.py
from datetime import datetime
import smtplib
import os
import requests
today_date = {datetime.today().strftime("%Y-%m-%d")}
url = (
'https://api.polygon.io/v1/open-close/{stock}/2022-05-10?adjusted=true&apiKey={API_key}'
)
if os.path.isfile('.env'):
from dotenv import load_dotenv
load_dotenv()
def __send_email(stock_data: str) -> None:
gmail_user = os.getenv('EMAIL_USER')
gmail_password = os.getenv('EMAIL_PASSWORD')
mail_from = gmail_user
mail_to = gmail_user
mail_subject = f'Your stock update for {datetime.today().strftime("%m/%d/%Y")}'
mail_message = f'Subject: {mail_subject}\n\n{stock_data}'
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(gmail_user, gmail_password)
server.sendmail(mail_from, mail_to, mail_message)
server.close()
class api_data:
response = requests.get(url.format(
stock=os.getenv('stock'),
API_key=os.getenv('API_key')
))
data = response.json()
ticker = data['symbol']
daily_high = data['high']
daily_low = data['low']
daily_close = data['close']
def __email_body():
stock_data = (
f"""For the stock: {api_data.ticker}
\nToday's high was {api_data.daily_high}
\nToday's low was $ {api_data.daily_low}
\n{api_data.ticker} closed at $ {api_data.daily_close}"""
)
__send_email(stock_data)
__email_body()
database.py
import boto3
import app
import os
#Pulling stock name and daily price from API
stock_name = str(app.api_data.ticker)
stock_price = str(app.api_data.daily_close)
if os.path.isfile('.env'):
from dotenv import load_dotenv
load_dotenv()
ACCESS_KEY = os.getenv('ACCESS_KEY')
SECRET_KEY = os.getenv('SECRET_KEY')
#DynamoDB table name
table_name = "stock_tracker"
dynamodb_client = boto3.client('dynamodb', region_name='us-west-2', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
stock_info ={
'Company': {'S': stock_name}
,'DailyPrice': {'S': stock_price}
}
print(stock_info)
if __name__ == "__main__":
dynamodb_client.put_item(TableName = table_name, Item = stock_info )
首先,下面这行似乎不是日志条目
{'Company': {'S': 'AAPL'}, 'DailyPrice': {'S': '166.02'}}
您需要在日志条目中包含日志选项、时间戳和其他标准值。这似乎是一个代码问题。 plug-in 标准日志记录库,如 log4j,并添加日志级别,如 debug/warn/error 等,以输出正确的日志事件。这将帮助您解决问题。
您的两个 python 文件都在执行批处理操作。
app.py
文件发送电子邮件,database.py
在数据库中存储内容。
这不是 Pods 的工作方式。 Pods 意味着持久,或者换句话说,运行 持续。旨在 运行 在 pod 内的工作负载示例是网络服务器或 DBMS。
对于您向我们展示的两个应用程序,您可能想使用 Job
代替(作业 运行 是您的容器一次然后退出)或者 CronJob
也许如果您需要您的脚本按计划 运行 多次。
我在容器中有一个 API,当我创建集群时,api 工作正常,但 pods 不断重启,没有任何具体原因日志。
我在 m5.Large EC2 实例上并使用 k3d。我正在关注一个演示所以在安装 k3d 之后我 运行 这个命令
k3d cluster create test -p "80:80@loadbalancer"
这是我的部署文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: stock-api
labels:
app: stock-api
spec:
replicas: 1
selector:
matchLabels:
app: stock-api
template:
metadata:
labels:
app: stock-api
spec:
containers:
- name: stock-api
image: mpriv32/stock-api:latest
envFrom:
- secretRef:
name: api-credentials
服务文件
apiVersion: v1
kind: Service
metadata:
name: stock-api
labels:
app: stock-api
spec:
type: ClusterIP
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: stock-api
我的第三个文件只是我的机密文件,我刚刚删除了这个 post
的值apiVersion: v1
kind: Secret
metadata:
name: api-credentials
stringData:
ACCESS_KEY:
SECRET_KEY:
EMAIL_PASSWORD:
EMAIL_USER:
API_KEY:
我应用了所有文件并且 API 工作正常,但是我的 pods 不断重启。
首先我 运行 这个命令和我得到股票信息的原因是因为我在我的应用程序中有一个打印语句来测试 api 响应并忘记删除它。
kubectl logs -p stock-api-7f5c45776b-gc67c
{'Company': {'S': 'AAPL'}, 'DailyPrice': {'S': '166.02'}}
获取日志没有帮助,所以我 运行 描述并得到了这个输出
Normal Scheduled 16m default-scheduler Successfully assigned default/stock-api-7f5c45776b-gc67c to k3d-test-server-0
Normal Pulled 15m kubelet Successfully pulled image "mpriv32/stock-api:latest" in 16.509616605s
Normal Pulled 15m kubelet Successfully pulled image "mpriv32/stock-api:latest" in 696.527075ms
Normal Pulled 15m kubelet Successfully pulled image "mpriv32/stock-api:latest" in 734.334806ms
Normal Pulled 15m kubelet Successfully pulled image "mpriv32/stock-api:latest" in 823.429206ms
Normal Started 15m (x4 over 15m) kubelet Started container stock-api
Normal Pulling 14m (x5 over 16m) kubelet Pulling image "mpriv32/stock-api:latest"
Normal Pulled 14m kubelet Successfully pulled image "mpriv32/stock-api:latest" in 698.883126ms
Normal Created 14m (x5 over 15m) kubelet Created container stock-api
Warning BackOff 62s (x67 over 15m) kubelet Back-off restarting failed container
它不断地保持“退避重启”
When I run `describe po` I get this
Name: stock-api-7f5c45776b-gc67c
Namespace: default
Priority: 0
Node: k3d-test-server-0/172.18.0.2
Start Time: Mon, 23 May 2022 06:44:42 +0000
Labels: app=stock-api
pod-template-hash=7f5c45776b
Annotations: <none>
Status: Running
IP: 10.42.0.9
IPs:
IP: 10.42.0.9
Controlled By: ReplicaSet/stock-api-7f5c45776b
Containers:
stock-api:
Container ID: containerd://846d4c5c282274453c4b2ad8b834f20d2c673468ca18386d7404b07915b81a9c
Image: mpriv32/stock-api:latest
Image ID: docker.io/mpriv32/stock-api@sha256:98189cdf972ed61af79505b58aba2a0166fd012f5be4e0f012b2dffa0ea3dd5f
Port: <none>
Host Port: <none>
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Completed
Exit Code: 0
Started: Mon, 23 May 2022 08:23:16 +0000
Finished: Mon, 23 May 2022 08:23:17 +0000
Ready: False
Restart Count: 24
Environment Variables from:
api-credentials Secret Optional: false
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-czkv9 (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
kube-api-access-czkv9:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning BackOff 3m8s (x457 over 102m) kubelet Back-off restarting failed container
我的应用程序的 Dockerfile
FROM python:3.8
COPY app.py .
RUN pip install requests python-dotenv
ARG API_KEY
ARG EMAIL_USER
ARG EMAIL_PASSWORD
ENV API_KEY $API_KEY
ENV EMAIL_USER $EMAIL_USER
ENV EMAIL_PASSWORD $EMAIL_PASSWORD
COPY database.py .
RUN pip install boto3
ARG ACCESS_KEY
ARG SECRET_KEY
ENV ACCESS_KEY $ACCESS_KEY
ENV SECRET_KEY $SECRET_KEY
CMD ["python", "database.py"]
EXPOSE 80
app.py
from datetime import datetime
import smtplib
import os
import requests
today_date = {datetime.today().strftime("%Y-%m-%d")}
url = (
'https://api.polygon.io/v1/open-close/{stock}/2022-05-10?adjusted=true&apiKey={API_key}'
)
if os.path.isfile('.env'):
from dotenv import load_dotenv
load_dotenv()
def __send_email(stock_data: str) -> None:
gmail_user = os.getenv('EMAIL_USER')
gmail_password = os.getenv('EMAIL_PASSWORD')
mail_from = gmail_user
mail_to = gmail_user
mail_subject = f'Your stock update for {datetime.today().strftime("%m/%d/%Y")}'
mail_message = f'Subject: {mail_subject}\n\n{stock_data}'
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(gmail_user, gmail_password)
server.sendmail(mail_from, mail_to, mail_message)
server.close()
class api_data:
response = requests.get(url.format(
stock=os.getenv('stock'),
API_key=os.getenv('API_key')
))
data = response.json()
ticker = data['symbol']
daily_high = data['high']
daily_low = data['low']
daily_close = data['close']
def __email_body():
stock_data = (
f"""For the stock: {api_data.ticker}
\nToday's high was {api_data.daily_high}
\nToday's low was $ {api_data.daily_low}
\n{api_data.ticker} closed at $ {api_data.daily_close}"""
)
__send_email(stock_data)
__email_body()
database.py
import boto3
import app
import os
#Pulling stock name and daily price from API
stock_name = str(app.api_data.ticker)
stock_price = str(app.api_data.daily_close)
if os.path.isfile('.env'):
from dotenv import load_dotenv
load_dotenv()
ACCESS_KEY = os.getenv('ACCESS_KEY')
SECRET_KEY = os.getenv('SECRET_KEY')
#DynamoDB table name
table_name = "stock_tracker"
dynamodb_client = boto3.client('dynamodb', region_name='us-west-2', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
stock_info ={
'Company': {'S': stock_name}
,'DailyPrice': {'S': stock_price}
}
print(stock_info)
if __name__ == "__main__":
dynamodb_client.put_item(TableName = table_name, Item = stock_info )
首先,下面这行似乎不是日志条目
{'Company': {'S': 'AAPL'}, 'DailyPrice': {'S': '166.02'}}
您需要在日志条目中包含日志选项、时间戳和其他标准值。这似乎是一个代码问题。 plug-in 标准日志记录库,如 log4j,并添加日志级别,如 debug/warn/error 等,以输出正确的日志事件。这将帮助您解决问题。
您的两个 python 文件都在执行批处理操作。
app.py
文件发送电子邮件,database.py
在数据库中存储内容。
这不是 Pods 的工作方式。 Pods 意味着持久,或者换句话说,运行 持续。旨在 运行 在 pod 内的工作负载示例是网络服务器或 DBMS。
对于您向我们展示的两个应用程序,您可能想使用 Job
代替(作业 运行 是您的容器一次然后退出)或者 CronJob
也许如果您需要您的脚本按计划 运行 多次。