Kubernetes吊舱在最初几次尝试中无法连接到timescaledb

2024-05-17 17:56:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试运行这些东西:

  1. 类似的多个POD(共10个)可从交易所获得外汇汇率。每个吊舱将在同一时间每10秒拉一个特定的外汇汇率,并保存到DB吊舱

  2. 将每个pod中的外汇汇率保存到带有PVC的timescaledb pod中。据我所知,timescaledb在postgresql上运行。所以我的timescaledb.yaml文件使用postgres env。但是,在同时部署所有10个吊舱时,我在一些吊舱的前几次尝试中遇到了这个错误: sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused Is the server running on host "timescaledb-service" (10.43.179.113) and accepting TCP/IP connections on port 5432?

平均来说,它运行正常后,3-5次尝试的一些豆荚

  1. 我还为每个外汇汇率(其中10个)运行cronjobs,以便每天午夜提取汇率,用于下游流程。我在尝试提取大多数cronjobs吊舱的费率时也遇到了与上面相同的错误。现在,我使用restartPolicy: OnFailurebackoffLimit: 20来确保cronjobs成功运行。与上面类似,平均来说,在对一些pod进行3-5次尝试后,它运行正常,最大重试次数为8次

我正在使用sqlalchemy连接到timescaledb

想知道如何修复连接被拒绝的问题。我一直在stackoverflow上搜索类似的问题/答案,但尚未找到

我感谢你在这方面的帮助

pv_.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pv-claim
  namespace: get-rates
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 40Gi

timescaledb.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: timescaledb
  namespace: get-rates
  labels:
    app: get-rates
    namespace: get-rates
    group: api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: get-rates
  template:
    metadata:
      labels:
        app: get-rates
        group: api
    spec:
      hostname: get-rates-timescaledb-service
      containers:
      - name: timescaledb
        image: timescale/timescaledb:2.1.1-pg13
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_USER
          valueFrom:
            secretKeyRef:
              name: get-rates-secret
              key: timescaledb-root-username
        - name: POSTGRES_PASSWORD
          valueFrom: 
            secretKeyRef:
              name: get-rates-secret
              key: timescaledb-root-password
        - name: POSTGRES_DB
          valueFrom: 
            secretKeyRef:
              name: get-rates-secret
              key: timescaledb-default-db
        volumeMounts:
            - name: pv-claim
              mountPath: /var/lib/postgresql/data
      volumes:
      - name: pv-claim
        persistentVolumeClaim:
          claimName: pv-claim

服务中心

apiVersion: v1
kind: Service
metadata:
  name: get-rates-timescaledb-service
  namespace: get-rates
  labels:
    group: api
spec:
  type: ClusterIP
  selector:
    app: get-rates
  ports:
    - name: get-rates-service
      protocol: TCP
      port: 5432
      targetPort: 5432

get-price.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: price-puller-eur-usd
  namespace: get-rates
  labels:
    app: get-rates
    namespace: get-rates
    group: api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: get-rates
  template:
    metadata:
      labels:
        app: get-rates
        group: api
    spec:
      containers:
      - name: price-puller
        image: <price-puller-image>
        ports: 
          - containerPort: 8080
        env:
        - name: POSTGRES_USER
          valueFrom:
            secretKeyRef:
              name: get-rates-secret
              key: timescaledb-root-username
        - name: POSTGRES_PASSWORD
          valueFrom: 
            secretKeyRef:
              name: get-rates-secret
              key: timescaledb-root-password
        - name: POSTGRES_DB
          valueFrom: 
            secretKeyRef:
              name: get-rates-secret
              key: timescaledb-default-db
        - name: POSTGRES_HOST
          value: get-rates-timescaledb-service.get-rates.svc.cluster.local
        - name: SYMBOL
          value: 'EUR/USD'
        - name: POSTGRES_PORT
          value: '5432'

Tags: keynameappgetsecret汇率postgresnamespace
1条回答
网友
1楼 · 发布于 2024-05-17 17:56:39

您的服务选择器是:

spec:
  selector:
    app: get-rates

您的db吊舱标签:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: timescaledb
  namespace: get-rates
[...]
spec:
  template:
    metadata:
      labels:
        app: get-rates
        group: api

和价格标签:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: price-puller-eur-usd
[...]
spec:
  template:
    metadata:
      labels:
        app: get-rates
        group: api

它们都有相同的标签

您的服务get-rates-timescaledb-service不仅将requestst转发给一个时间刻度数据库,而且还转发给与选择器匹配的每个其他pod,这意味着它将随机选择价格拉器eur usd pod并将请求转发给它,但由于没有运行DB,您将获得拒绝连接

运行以下命令:

kubectl get endpoints 

它将向您显示sepcific服务的所有端点。确保它只列出你想要的豆荚,不要重复使用标签

阅读有关services in k8s docs的更多信息

相关问题 更多 >