kubectl не может получить доступ к приложению pod - PullRequest
0 голосов
/ 15 января 2020

A имеют эту спецификацию модуля:

apiVersion: v1
kind: Pod
metadata:
  name: wp
spec:
  containers:
  - image: wordpress:4.9-apache
    name: wordpress
    env:
      - name: WORDPRESS_DB_PASSWORD
        value: mysqlpwd
      - name: WORDPRESS_DB_HOST
        value: 127.0.0.1
  - image: mysql:5.7
    name: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: mysqlpwd
    volumeMounts:
    - name: data
      mountPath: /var/lib/mysql
  volumes:
    - name: data
      emptyDir: {}

Я развернул ее, используя:

kubectl create -f wordpress-pod.yaml

Теперь он правильно развернут:

kubectl get pods wp 2/2 Запуск 3 35h

Затем, когда я сделаю:

kubectl описать po / wp

Name:         wp
Namespace:    default
Priority:     0
Node:         node3/192.168.50.12
Start Time:   Mon, 13 Jan 2020 23:27:16 +0100
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.233.92.7
IPs:
  IP:  10.233.92.7
Containers:

Моя проблема в том, что я не могу получить доступ к приложению:

wget http://192.168.50.12:8080/wp-admin/install.php
Connecting to 192.168.50.12:8080... failed: Connection refused.

Ни один из wget http://10.233.92.7: 8080 / wp-admin / установить. php работает

Есть ли какие-либо проблемы в описании модуля или в процессе развертывания?

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 января 2020

При текущей настройке вам необходимо использовать wget http://10.233.92.7:8080/wp-admin/install.php из кластера, т.е. путем выполнения kubectl exec в другом модуле, поскольку 10.233.92.7 IP действителен только внутри кластера.

Вы должны создать сервис за разоблачение вашего стручка. Создайте службу типа IP кластера (по умолчанию) для доступа из кластера. Если вы хотите получить доступ извне кластера, то есть с вашего рабочего стола, то создайте службу типа NodePort или LoadBalancer.

Другим способом доступа к приложению с вашего рабочего стола будет переадресация порта . В этом случае вам не нужно создавать службу.

Вот учебник для доступа к модулям с помощью службы NodePort . В этом случае ваш узел должен иметь publi c ip.

0 голосов
/ 16 января 2020

Проблема с вашей конфигурацией - отсутствие служб, которые позволят внешний доступ к вашему WordPress.

Там много материалов, объясняющих, какие есть варианты и как они строго связаны с инфраструктурой, над которой работает Kubernetes.

Позвольте мне подробно остановиться на 3 из них:

  • minikube
  • kubeadm
  • в облаке (GKE, EKS, AKS)

База конфигурации WordPress будет одинаковой в каждом случае.

Содержание:

  • Работает MySQL
    • Секрет
    • PersistentVolumeClaim
    • Развертывание
    • Сервис
  • Запуск WordPress
    • PersistentVolumeClaim
    • Развертывание
  • Разрешение внешнего доступа
    • minikube
    • kubeadm
    • с выделенным облаком (GKE)

На сайте Kubernetes есть хорошее руководство: ЗДЕСЬ!

Бег MySQL

Секрет

В качестве официальной документации Kubernetes: объекты

Kubernetes secret позволяют хранить и управлять конфиденциальной информацией, такой как пароли, токены OAuth и ключи s sh. Поместить эту информацию в secret безопаснее и гибче, чем дословно поместить ее в определение Pod или в изображение контейнера .

- Секреты Kubernetes

Примером ниже является YAML определение секрета, используемого для MySQL пароля:

apiVersion: v1
kind: Secret
metadata:
  name: mysql-password
type: Opaque
data:
  password: c3VwZXJoYXJkcGFzc3dvcmQK

Взгляните на c посмотрите на:

  password: c3VwZXJoYXJkcGFzc3dvcmQK

Этот пароль закодирован в base64 .

Чтобы создать этот пароль, вызовите команду из своего терминала: $ echo "YOUR_PASSWORD" | base64

Вставьте вывод в определение YAML и примените его с: $ kubectl apply -f FILE_NAME.

You можно проверить, правильно ли он был создан с помощью: $ kubectl get secret mysql-password -o yaml

PersistentVolumeClaim

MySQL требуется выделенное место для хранения данных. Существует официальная документация, объясняющая это: Постоянные тома

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

Выше YAML создаст заявку на хранение для MySQL. Примените его с помощью команды:

$ kubectl apply -f FILE_NAME.

Развертывание

Создайте YAML определение развертывания из официального примера и настройте его, если были какие-либо изменения в имена объектов:

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-password
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

Обратите особое внимание на c часть ниже, которая анализирует secret пароль для модуля MySQL:

        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-password
              key: password

Применить это с помощью команды: $ kubectl apply -f FILE_NAME.

Сервис

В вашей конфигурации отсутствовали сервисные объекты. Этот объект позволяет общаться с другими модулями, внешними трафиками c et c. Посмотрите на приведенный ниже пример:

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None

Это определение создаст объект, который будет указывать на модуль MySQL.

Будет создана запись DNS с именем wordpress-mysql и IP-адресом модуля.

Он не будет подвергать его внешнему трафику c, так как он не нужен.

Применить его с помощью команды: $ kubectl apply -f FILE_NAME.

Запуск WordPress

Заявка о постоянном объеме

Как и MySQL, WordPress требуется выделенное место для хранения данных. Создайте его на примере ниже:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

Примените его с помощью команды: $ kubectl apply -f FILE_NAME.

Развертывание

Создайте YAML определение WordPress, как показано ниже:

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-password
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim

Обратите особое внимание на c:

        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-password
              key: password

Эта часть будет анализировать секретное значение для развертывания.

Ниже определение покажет WordPress, где находится MySQL:

        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql

Примените его с помощью команды: $ kubectl apply -f FILE_NAME.

Разрешение внешнего доступа

Существует много разных подходов для настройки внешнего доступа к приложениям.

Minikube

Конфигурация может отличаться для разных гипервизоров.

Например, Minikube может подвергать WordPress внешним трафикам c с помощью:

NodePort

apiVersion: v1
kind: Service
metadata:
  name: wordpress-nodeport 
spec:
  type: NodePort
  selector:
      app: wordpress
      tier: frontend
  ports:
  - name: wordpress-port
    protocol: TCP
    port: 80
    targetPort: 80

После применения этого определения вам нужно будет ввести IP-адрес minikube с соответствующим портом для веб-браузера.

Этот порт можно найти с помощью команды: $ kubectl get svc wordpress-nodeport

Вывод вышеуказанной команды:

wordpress-nodeport   NodePort   10.76.9.15   <none>        80:30173/TCP   8s

В данном случае это 30173.

LoadBalancer

В этом случае он также создаст NodePort!

apiVersion: v1
kind: Service
metadata:
  name: wordpress-loadbalancer
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer

Входной ресурс

Пожалуйста, перейдите по этой ссылке: Minikube: create-an-ingress-resource

Также вы можете сослаться на это Пост переполнения стека

Kubeadm

С кластерами Kubernetes kubeadm

NodePort

Процесс настройки такой же, как в minikube. Единственное отличие состоит в том, что он создаст NodePort на каждом узле кластера. После этого вы можете ввести IP-адрес любого узла с соответствующим портом. Имейте в виду, что вам необходимо находиться в одной сети без брандмауэра, блокирующего ваш доступ.

LoadBalancer

Вы можете создать LoadBalancer объект с таким же определением YAML, как в minikube. Проблема заключается в том, что при kubeadm инициализации на голом металлическом кластере LoadBalancer не получит IP-адрес. Один из вариантов: MetalLB

Входящие

Входящие ресурсы имеют ту же проблему, что и LoadBalancer в kubeadm предоставляемой инфраструктуре. Как указано выше, один из вариантов: MetalLB .

Предоставление облака

Существует множество параметров, которые строго связаны с облаком, над которым работает Kubernetes. Ниже приведен пример настройки ресурса Ingress с контроллером NGINX на GKE:

Примените оба определения YAML:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/provider/cloud-generic.yaml

Применить NodePort определение из minikube

Создать ресурс Ingress:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: wordpress-nodeport
          servicePort: wordpress-port

Применить его с помощью команды: $ kubectl apply -f FILE_NAME.

Проверить, получен ли Ingress ресурс адрес от облачного провайдера с командой:

$ kubectl get ingress

Вывод должен выглядеть так:

NAME      HOSTS   ADDRESS         PORTS   AGE
ingress   *       XXX.XXX.XXX.X   80      26m

После ввода команды IP-адреса сверху вы должны получить : WordPress web browser first use

Пример с предоставлением облака может использоваться для kubeadm подготовленных кластеров с настроенным MetalLB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...