#kubernetes #kubernetes-helm #kubernetes-pod #kubernetes-service #kubernetes-deployment
#kubernetes #kubernetes-helm #kubernetes-pod #kubernetes-сервис #kubernetes-развертывание
Вопрос:
Я запускаю кластер microk8s на домашнем сервере Ubuntu, и он подключен к локальному серверу NAS для постоянного хранения. Я использовал ее в качестве своего личного испытательного полигона для изучения Kubernetes, но, похоже, я сталкиваюсь с проблемой за проблемой практически на каждом этапе пути.
У меня установлен Helm chart от NFS Client Provisioner, который, как я подтвердил, работает — он будет динамически предоставлять PVCS на моем сервере NAS. Позже я смог успешно установить диаграмму Helm Postgres, или я так думал. После ее создания я смог подключиться к ней с помощью SQL-клиента, и я чувствовал себя хорошо.
Пока пару дней спустя я не заметил, что модуль показывает готовность контейнеров 0/1. Хотя интересно, что модуль nfs-client-provisioner по-прежнему показывал 1/1. Короче говоря: я удалил / очистил диаграмму Helm Postgres и попытался переустановить ее, но теперь она больше не работает. На самом деле, ничего нового, что я пытаюсь внедрить, не работает. Все выглядит так, как будто это сработает, но затем просто зависает либо при инициализации, либо при создании контейнера навсегда.
В частности, с Postgres команда, которую я выполнял, заключается в следующем:
helm install --name postgres stable/postgresql -f postgres.yaml
И мой postgres.yaml
файл выглядит следующим образом:
persistence:
storageClass: nfs-client
accessMode: ReadWriteMany
size: 2Gi
Но если я сделаю kubectl get pods
, я все еще вижу это:
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner 1/1 Running 1 11d
postgres-postgresql-0 0/1 Init:0/1 0 3h51m
Если я выполняю kubectl describe pod postgres-postgresql-0
, это результат:
Name: postgres-postgresql-0
Namespace: default
Priority: 0
PriorityClassName: <none>
Node: stjohn/192.168.1.217
Start Time: Thu, 28 Mar 2019 12:51:02 -0500
Labels: app=postgresql
chart=postgresql-3.11.7
controller-revision-hash=postgres-postgresql-5bfb9cc56d
heritage=Tiller
release=postgres
role=master
statefulset.kubernetes.io/pod-name=postgres-postgresql-0
Annotations: <none>
Status: Pending
IP:
Controlled By: StatefulSet/postgres-postgresql
Init Containers:
init-chmod-data:
Container ID:
Image: docker.io/bitnami/minideb:latest
Image ID:
Port: <none>
Host Port: <none>
Command:
sh
-c
chown -R 1001:1001 /bitnami
if [ -d /bitnami/postgresql/data ]; then
chmod 0700 /bitnami/postgresql/data;
fi
State: Waiting
Reason: PodInitializing
Ready: False
Restart Count: 0
Requests:
cpu: 250m
memory: 256Mi
Environment: <none>
Mounts:
/bitnami/postgresql from data (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-h4gph (ro)
Containers:
postgres-postgresql:
Container ID:
Image: docker.io/bitnami/postgresql:10.7.0
Image ID:
Port: 5432/TCP
Host Port: 0/TCP
State: Waiting
Reason: PodInitializing
Ready: False
Restart Count: 0
Requests:
cpu: 250m
memory: 256Mi
Liveness: exec [sh -c exec pg_isready -U "postgres" -h localhost] delay=30s timeout=5s period=10s #success=1 #failure=6
Readiness: exec [sh -c exec pg_isready -U "postgres" -h localhost] delay=5s timeout=5s period=10s #success=1 #failure=6
Environment:
PGDATA: /bitnami/postgresql
POSTGRES_USER: postgres
POSTGRES_PASSWORD: <set to the key 'postgresql-password' in secret 'postgres-postgresql'> Optional: false
Mounts:
/bitnami/postgresql from data (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-h4gph (ro)
Conditions:
Type Status
Initialized False
Ready False
ContainersReady False
PodScheduled True
Volumes:
data:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: data-postgres-postgresql-0
ReadOnly: false
default-token-h4gph:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-h4gph
Optional: false
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>
И если я сделаю kubectl get pod postgres-postgresql-0 -o yaml
, это результат:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2019-03-28T17:51:02Z"
generateName: postgres-postgresql-
labels:
app: postgresql
chart: postgresql-3.11.7
controller-revision-hash: postgres-postgresql-5bfb9cc56d
heritage: Tiller
release: postgres
role: master
statefulset.kubernetes.io/pod-name: postgres-postgresql-0
name: postgres-postgresql-0
namespace: default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: StatefulSet
name: postgres-postgresql
uid: 0d3ef673-5182-11e9-bf14-b8975a0ca30c
resourceVersion: "1953329"
selfLink: /api/v1/namespaces/default/pods/postgres-postgresql-0
uid: 0d4dfb56-5182-11e9-bf14-b8975a0ca30c
spec:
containers:
- env:
- name: PGDATA
value: /bitnami/postgresql
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
key: postgresql-password
name: postgres-postgresql
image: docker.io/bitnami/postgresql:10.7.0
imagePullPolicy: Always
livenessProbe:
exec:
command:
- sh
- -c
- exec pg_isready -U "postgres" -h localhost
failureThreshold: 6
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: postgres-postgresql
ports:
- containerPort: 5432
name: postgresql
protocol: TCP
readinessProbe:
exec:
command:
- sh
- -c
- exec pg_isready -U "postgres" -h localhost
failureThreshold: 6
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
resources:
requests:
cpu: 250m
memory: 256Mi
securityContext:
procMount: Default
runAsUser: 1001
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /bitnami/postgresql
name: data
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-h4gph
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
hostname: postgres-postgresql-0
initContainers:
- command:
- sh
- -c
- |
chown -R 1001:1001 /bitnami
if [ -d /bitnami/postgresql/data ]; then
chmod 0700 /bitnami/postgresql/data;
fi
image: docker.io/bitnami/minideb:latest
imagePullPolicy: Always
name: init-chmod-data
resources:
requests:
cpu: 250m
memory: 256Mi
securityContext:
procMount: Default
runAsUser: 0
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /bitnami/postgresql
name: data
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-h4gph
readOnly: true
nodeName: stjohn
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext:
fsGroup: 1001
serviceAccount: default
serviceAccountName: default
subdomain: postgres-postgresql-headless
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: data
persistentVolumeClaim:
claimName: data-postgres-postgresql-0
- name: default-token-h4gph
secret:
defaultMode: 420
secretName: default-token-h4gph
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2019-03-28T17:51:02Z"
message: 'containers with incomplete status: [init-chmod-data]'
reason: ContainersNotInitialized
status: "False"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2019-03-28T17:51:02Z"
message: 'containers with unready status: [postgres-postgresql]'
reason: ContainersNotReady
status: "False"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2019-03-28T17:51:02Z"
message: 'containers with unready status: [postgres-postgresql]'
reason: ContainersNotReady
status: "False"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2019-03-28T17:51:02Z"
status: "True"
type: PodScheduled
containerStatuses:
- image: docker.io/bitnami/postgresql:10.7.0
imageID: ""
lastState: {}
name: postgres-postgresql
ready: false
restartCount: 0
state:
waiting:
reason: PodInitializing
hostIP: 192.168.1.217
initContainerStatuses:
- image: docker.io/bitnami/minideb:latest
imageID: ""
lastState: {}
name: init-chmod-data
ready: false
restartCount: 0
state:
waiting:
reason: PodInitializing
phase: Pending
qosClass: Burstable
startTime: "2019-03-28T17:51:02Z"
Я не вижу в них ничего очевидного, чтобы иметь возможность точно определить, что может происходить. И я уже перезагрузил сервер, просто чтобы посмотреть, может ли это помочь. Есть мысли? Почему мои контейнеры не запускаются?
Комментарии:
1. Вы просматривали журналы (по сути, ошибки)?
Ответ №1:
Похоже, что ваш initContainer застрял в состоянии подинициализации. Наиболее вероятный сценарий заключается в том, что ваши PVCS не готовы. Я рекомендую вам использовать describe
ваш data-postgres-postgresql-0
PVC, чтобы убедиться, что том действительно подготовлен и находится в READY
состоянии. Возможно, ваш NFS provisioner работает, но этот конкретный PV / PVC не был создан из-за ошибки. Я сталкивался с подобными явлениями с EFS provisioner в AWS.
Комментарии:
1. Выполнение этой команды describe показывает, что PVC находится в
Bound
состоянии. Можете ли вы пролить свет на то, что это может означать?2. Какие-либо другие события в PVC? Если она привязана, то она должна работать правильно. Мне понадобится дополнительная информация, чтобы помочь в отладке.
3. Я в полном замешательстве. Кажется, мой кластер находится в состоянии, когда я не могу запустить какие -либо новые модули, полная остановка. Все они застревают в подинициализации. Даже попытка запустить эту невероятно простую команду застревает:
kubectl run --restart=Never alpine --image=alpine --command -- tail -f /dev/null
. У нее вообще нет PVCS! Запускkubectl get events --all-namespaces=true
не показывает ничего необычного, запуск akubectl describe pod/alpine
не показывает никаких проблем, и даже просмотр всех сообщений журнала с помощью kail также ничего не показывает.4. Я думаю, мне просто придется перерисовывать компьютер, на котором работает этот кластер, и начинать с нуля. Я просто надеюсь, что в конечном итоге она не вернется в это же состояние!
5. Вы проверили причину
PodInitializing
состояния? Вы можете найти некоторые журналы сkubectl get events --sort-by=.metadata.creationTimestamp
и выяснить, почему именно ваши модули не запускаются по расписанию. Если вы используетеcluster-autoscaler
, вы также можете следить за журналами pod, чтобы увидеть, есть ли что-нибудь, блокирующее переход состояния pod!
Ответ №2:
Вы можете использовать команду event в kubectl. Это выдаст вам событие для вашего модуля.
Для фильтрации по определенному модулю вы можете использовать селектор полей:
kubectl получает событие —пространство имен abc-namespace —field-selector involvedObject.name=my-pod-zl6m6