#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, вероятно, не будет).