Не удалось запустить приложение angular на kubernetes

#angular #kubernetes #dockerfile #nginx-config

Вопрос:

Я разработал угловое приложение, которое отлично работает на местном языке. Затем я создал образ docker, который также отлично работает в docker env. Теперь я пытаюсь развернуть образ как службу в кластере Kubernetes. Он показывает, что модуль запущен, однако я не могу получить доступ к приложению. Сначала я попытался запустить приложение через nodeport . Когда это не сработало, я попытался использовать loadbalancer , но оно всегда отображается EXTERNAL-IP как ожидающее.

Вот мои данные:

nginx-custom.conf

 # Expires map
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/json           max;
    application/javascript     max;
    ~image/                    max;
}

server {
  listen 4200;
  location / {
      root /usr/share/nginx/html;
      index index.html index.htm;
      try_files $uri $uri/ /index.html =404;
    }
  expires $expires;
  gzip  on;
}
 

Докерфайл

 # Stage 1 , "build-step",
FROM node:12.16-alpine as build-step
RUN mkdir -p /app
WORKDIR /app
COPY package*.json /app/
RUN npm install
COPY . /app
RUN npm run build -- --output-path=./dist/out --configuration $configuration

# Stage 2
FROM nginx:1.17.1-alpine
COPY --from=build-step /app/dist/out/ /usr/share/nginx/html
COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf
 

развертывание.yaml

 --- 
apiVersion: apps/v1
kind: Deployment
metadata: 
  labels: 
    app: login-ui
    version: v1
  name: login-ui
spec: 
  strategy: # Default, so usually not specified
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1 
      maxUnavailable: 25% 
  replicas: 1
  selector: 
    matchLabels: 
      app: login-ui
      version: v1
  template: 
    metadata: 
      labels: 
        app: login-ui
        version: v1

spec: 
  containers: 
    - image: "tagged-image"
      imagePullPolicy: Always
      name: login-ui
      ports: 
      - name: httpport
        containerPort: 4200
        #hostPort: 4200 
 

service.yaml

 --- 
apiVersion: v1
kind: Service
metadata: 
  labels: 
    app: login-ui
    version: v1
  name: login-ui
spec: 
  ports: 
    - name: http
      port: 4200
      protocol: TCP
  selector: 
    app: login-ui
    version: v1
  type: NodePort  

    
 

kubectl получить стручки

 NAME                                READY   STATUS    RESTARTS   AGE
login-ui-7445d644f6-n7d5m           1/1     Running   0          33m 
 

kubectl получить svc

 NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
login-ui           NodePort       XX.XX.XX.XX     <none>        4200:31475/TCP   33m
 

kubectl описывает пользовательский интерфейс для входа в модуль

 Events:
  Type    Reason     Age        From                Message
  ----    ------     ----       ----                -------
  Normal  Scheduled  <unknown>                      Successfully assigned default/login-ui-7445d644f6-n7d5m to node01-vm
  Normal  Pulling    38m        kubelet, node01-vm  Pulling image "tagged-image"
  Normal  Pulled     37m        kubelet, node01-vm  Successfully pulled image "tagged-image" in 5.401860205s
  Normal  Created    37m        kubelet, node01-vm  Created container login-ui
  Normal  Started    37m        kubelet, node01-vm  Started container login-ui
 

После этого я пытаюсь зайти в браузер с помощью:

 http://"my-node-ip":4200/
 

но я получаю сообщение об ошибке «Невозможно подключиться». Кроме того, когда я пытаюсь проверить журналы модулей, там нет журналов. Другие капсулы там работают нормально. Я вижу журналы для других модулей и могу получить доступ к приложению из браузера.

Комментарии:

1. сначала проверьте брандмауэр и убедитесь, что вы действительно можете получить доступ к узлу или нет

2. @HarshManvar : Привет … Да, я могу, как уже сказал … там работают другие капсулы. И я могу получить к ним доступ через браузер с IP-адресом узла.

3. Вам, вероятно, понадобится второй номер порта на kubectl get service выходе; попробуйте http://any-k8s-node.example.com:31475 . Это EXTERNAL-IP поле не будет заполнено, если у вас нет службы типа балансировщика нагрузки, и ваш кластер знает, как заполнить это поле (установка Kubernetes в общедоступном облаке, вероятно, будет; minikube, вероятно, не будет).

Ответ №1:

Вам нужен второй номер порта из вывода службы kubectl get.
Попробуйте:

 http://any-k8s-node.example.com:31475
 

Это EXTERNAL-IP поле не будет заполнено, если у вас нет определенного LoadBalancer типа службы, и ваш кластер не знает, как заполнить это поле (установка Kubernetes в общедоступном облаке, вероятно, будет; minikube, вероятно, не будет).