неизвестный хост при поиске модуля по имени, разрешается с помощью перезагрузки модуля - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть установщик, который раскручивает два модуля в моем потоке CI, назовем их web и activemq. Когда веб-модуль запускается, он пытается связаться с модулем activemq, используя k8s, назначенное имя модуля amq-deploy-0.activemq.

Случайным образом, при попытке доступа к amq-deploy1.activemq Интернет получит неизвестное исключение хоста. Если я перезапущу веб-модуль в этой ситуации, у него не возникнет проблем с подключением к модулю activemq.

Я вошел в веб-модуль, когда это происходит, и файлы /etc/resolv.conf и / etc / hosts выглядят нормально. Хост-машины /etc/resolve.conf и / etc / hosts немногочисленны и не вызывают сомнений.

Информация: Работает только 1 рабочий узел.

kubectl - версия Kubernetes v1.8.3 + icp + ee

Любые идеи о том, как отладить эту проблему. Я не могу придумать вескую причину для того, чтобы это произошло случайным образом, и не решил сам при перезагрузке модуля.

Если понадобится другая полезная информация, я могу ее получить. Заранее благодарен

Для activeMQ у нас есть этот сервисный файл

apiVersion: v1 kind: Service
metadata:
    name: activemq
    labels:
            app: myapp
            env: dev
spec:
    ports:
        - port: 8161
          protocol: TCP
          targetPort: 8161
          name: http
        - port: 61616
          protocol: TCP
          targetPort: 61616
          name: amq
    selector:
        component: analytics-amq
        app: myapp
        environment: dev
        type: fa-core
    clusterIP: None

И этот набор состояний ActiveMQ (это шаблон)

kind: StatefulSet
apiVersion: apps/v1beta1
metadata:
  name: pa-amq-deployment
spec:
  replicas: {{ activemqs }}
  updateStrategy:
    type: RollingUpdate
  serviceName: "activemq"
  template:
      metadata:
          labels:
              component: analytics-amq
              app: myapp
              environment: dev
              type: fa-core
      spec:
          containers:
              - name: pa-amq
                image: default/myco/activemq:latest
                imagePullPolicy: Always
                resources:
                      limits:
                          cpu: 150m
                          memory: 1Gi
                livenessProbe:
                    exec:
                        command:
                        - /etc/init.d/activemq
                        - status
                    initialDelaySeconds: 10
                    periodSeconds: 15
                    failureThreshold: 16
                ports:
                    - containerPort: 8161
                      protocol: TCP
                      name: http
                    - containerPort: 61616
                      protocol: TCP
                      name: amq
                envFrom:
                    - configMapRef:
                        name: pa-activemq-conf-all
                    - secretRef:
                        name: pa-activemq-secret
                volumeMounts:
                    - name: timezone
                      mountPath: /etc/localtime
          volumes:
              - name: timezone
                hostPath:
                  path: /usr/share/zoneinfo/UTC

Веб-набор с отслеживанием состояния:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
    name: pa-web-deployment
spec:
    replicas: 1
    updateStrategy:
        type: RollingUpdate
    serviceName: "pa-web"
    template:
        metadata:
            labels:
                component: analytics-web
                app: myapp
                environment: dev
                type: fa-core
        spec:
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                - weight: 100
                  podAffinityTerm:
                    labelSelector:
                      matchExpressions:
                      - key: component
                        operator: In
                        values:
                        - analytics-web
                    topologyKey: kubernetes.io/hostname
            containers:
                - name: pa-web
                  image: default/myco/web:latest
                  imagePullPolicy: Always
                  resources:
                        limits:
                            cpu: 1
                            memory: 2Gi
                  readinessProbe:
                      httpGet:
                          path: /versions
                          port: 8080
                      initialDelaySeconds: 30
                      periodSeconds: 15
                      failureThreshold: 76
                  livenessProbe:
                      httpGet:
                          path: /versions
                          port: 8080
                      initialDelaySeconds: 30
                      periodSeconds: 15
                      failureThreshold: 80
                  securityContext:
                      privileged: true
                  ports:
                      - containerPort: 8080
                        name: http
                        protocol: TCP
                  envFrom:
                      - configMapRef:
                         name: pa-web-conf-all
                      - secretRef:
                         name: pa-web-secret
                  volumeMounts:
                      - name: shared-volume
                        mountPath: /MySharedPath
                      - name: timezone
                        mountPath: /etc/localtime
            volumes:
                - nfs:
                    server: 10.100.10.23
                    path: /MySharedPath
                  name: shared-volume
                - name: timezone
                  hostPath:
                    path: /usr/share/zoneinfo/UTC

В этом веб-модуле также есть похожая проблема с «неизвестным хостом» при поиске настроенной нами внешней базы данных. Проблема решается аналогичным образом путем перезапуска модуля. Вот конфигурация этого внешнего сервиса. Может быть, с этой точки зрения легче решить проблему? ActiveMQ не имеет проблем с использованием имени службы базы данных для поиска БД и запуска.

apiVersion: v1
kind: Service
metadata:
  name: dbhost
  labels:
    app: myapp
    env: dev
spec:
  type: ExternalName
  externalName: mydb.host.com

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Не удалось найти решение, я создал обходной путь. Я настроил файл entrypoint.sh в своем образе для поиска домена, к которому мне нужно получить доступ, и записи в журнал, выход при ошибке:

#!/bin/bash

#disable echo and exit on error
set +ex

#####################################
# verfiy that the db service can be found or exit container
#####################################
# we do not want to install nslookup to determine if the db_host_name is valid name
# we have ping available though
# 0-success, 1-error pinging but lookup worked (services can not be pinged), 2-unreachable host
ping -W 2 -c 1 ${db_host_name} &> /dev/null
if [ $? -le 1 ]
then
  echo "service ${db_host_name} is known"
else
  echo "${db_host_name} service is NOT recognized. Exiting container..."
  exit 1
fi

Далее, поскольку только перезапуск модуля разрешил проблему. В моем развернутом развертывании я выполняю проверку развертывания, запрашивая журнал, чтобы узнать, нужно ли мне перезапускать модуль. Например:

свитка-check.yml

- name: "Rollout status for {{rollout_item.statefulset}}"
  shell: timeout 4m kubectl rollout status -n {{fa_namespace}} -f {{ rollout_item.statefulset }}
  ignore_errors: yes

# assuming that the first pod will be the one that would have an issue
- name: "Get {{rollout_item.pod_name}} log to check for issue with dns lookup"
  shell: kubectl logs {{rollout_item.pod_name}} --tail=1 -n {{fa_namespace}}
  register: log_line

# the entrypoint will write dbhost service is NOT recognized. Exiting container... to the log
# if there is a problem getting to the dbhost
- name: "Try removing {{rollout_item.component}} pod if unable to deploy"
  shell: kubectl delete pods -l component={{rollout_item.component}} --force --grace-period=0 --ignore-not-found=true -n {{fa_namespace}}
  when: log_line.stdout.find('service is NOT recognized') > 0

Я повторяю эту проверку развертывания 6 раз, поскольку иногда даже после перезапуска модуля не удается найти службу. Дополнительные проверки выполняются мгновенно после успешного запуска модуля.

- name: "Web rollout"
  include_tasks: rollout-check.yml
  loop:
  - { c: 1, statefulset: "{{ dest_deploy }}/web.statefulset.yml", pod_name: "pa-web-deployment-0", component: "analytics-web" }
  - { c: 2, statefulset: "{{ dest_deploy }}/web.statefulset.yml", pod_name: "pa-web-deployment-0", component: "analytics-web" }
  - { c: 3, statefulset: "{{ dest_deploy }}/web.statefulset.yml", pod_name: "pa-web-deployment-0", component: "analytics-web" }
  - { c: 4, statefulset: "{{ dest_deploy }}/web.statefulset.yml", pod_name: "pa-web-deployment-0", component: "analytics-web" }
  - { c: 5, statefulset: "{{ dest_deploy }}/web.statefulset.yml", pod_name: "pa-web-deployment-0", component: "analytics-web" }
  - { c: 6, statefulset: "{{ dest_deploy }}/web.statefulset.yml", pod_name: "pa-web-deployment-0", component: "analytics-web" }
  loop_control:
    loop_var: rollout_item
0 голосов
/ 09 сентября 2018

Возможно ли, что вопрос в том, какой модуль и приложение в его контейнере запускается первым, а какой - вторым?

В любом случае рекомендуется использовать подключение Service , а не имя модуля, так как имя модуля, назначенное Kubernetes, изменяется между перезапусками модуля.

Способ проверки подключения - использовать telnet (или curl для поддерживаемых протоколов), если он найден на изображении:

telnet <host/pod/Service> <port>
...