#docker #kubernetes #google-kubernetes-engine
#docker #kubernetes #google-kubernetes-engine
Вопрос:
У меня есть три разных образа, связанных с моим приложением, которое отлично работает в docker-compose и имеет проблемы с запуском в кластере kubernetes в GCP.
Ниже приведен файл развертывания.
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql-database
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql-database
tier: database
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql-database
spec:
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql-database
tier: database
spec:
hostname: mysql
containers:
- image: mysql/mysql-server:5.7
name: mysql
env:
- name: "MYSQL_USER"
value: "root"
- name: "MYSQL_HOST"
value: "mysql"
- name: "MYSQL_DATABASE"
value: "xxxx"
- name: "MYSQL_PORT"
value: "3306"
- name: "MYSQL_PASSWORD"
value: "password"
- name: "MYSQL_ROOT_PASSWORD"
value: "password"
- name: "RAILS_ENV"
value: "production"
ports:
- containerPort: 5432
name: db
---
apiVersion: v1
kind: Service
metadata:
name: dgservice
labels:
app: dgservice
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
selector:
name: dgservice
tier: dgservice
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: dgservice
labels:
app: dgservice
spec:
strategy:
type: Recreate
template:
metadata:
labels:
app: dgservice
tier: dgservice
spec:
hostname: dgservice
containers:
- image: gcr.io/sample/sample-image:check_1
name: dgservice
ports:
- containerPort: 8080
name: dgservice
---
apiVersion: v1
kind: Service
metadata:
name: dg-ui
labels:
name: dg-ui
spec:
type: NodePort
ports:
- nodePort: 30156
port: 8000
protocol: TCP
targetPort: 8000
selector:
app: dg-ui
tier: dg
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: dg-ui
labels:
app: dg-ui
spec:
strategy:
type: Recreate
template:
metadata:
labels:
app: dg-ui
tier: dg
spec:
hostname: dg-ui
containers:
- image: gcr.io/sample/sample:latest
name: dg-ui
env:
- name: "MYSQL_USER"
value: "root"
- name: "MYSQL_HOST"
value: "mysql"
- name: "MYSQL_DATABASE"
value: "xxxx"
- name: "MYSQL_PORT"
value: "3306"
- name: "MYSQL_PASSWORD"
value: "password"
- name: "MYSQL_ROOT_PASSWORD"
value: "password"
- name: "RAILS_ENV"
value: "production"
- name: "DG_SERVICE_HOST"
value: "dgservice"
ports:
- containerPort: 8000
name: dg-ui
Изображение также успешно извлекается из GCR.
Соединение между mysql и службой пользовательского интерфейса также работает нормально, и мои данные переносятся без каких-либо проблем. Но соединение не установлено между службой и пользовательским интерфейсом.
Почему пользовательский интерфейс не может получить доступ к службе в моем приложении?
Комментарии:
1. Привет, если связь между службами является внутренней, тогда значение должно быть
type: ClusterIP
большеtype: NodePort
2. С какой ошибкой вы столкнулись? можете ли вы выполнить curl для служб?
3. @SureshVishnoi curl не работает нормально.
kubectl exec -it dg-ui-586c69fdb8-8wvdn bash root@dg-ui:/home/app/webapp# curl http://dgservice:8080/fieldTypes/metadata curl: (7) Failed to connect to dgservice port 8080: Connection timed out root@dg-ui:/home/app/webapp# command terminated with exit code 137
. Но тот же curl работает нормально, когда я запускаю его с узла dgservice4. @SureshVishnoi Я тоже пробовал с ClusterIP. все еще это не работает
5. Привет, можешь запустить
kubectl describe service dgservice
иkubectl get endpoints dgservice
Ответ №1:
Поскольку ваше развертывание имеет следующие метки, поэтому службе необходимо иметь одинаковые метки для создания объекта конечной точки
конечные точки — это объект API, стоящий за сервисом. Конечные точки — это то, куда служба будет направлять соединения при установлении соединения с ClusterIP службы
Ниже приведены ярлыки развертываний
labels:
app: dgservice
tier: dgservice
Новое определение службы с правильными метками
apiVersion: v1
kind: Service
metadata:
name: dgservice
labels:
app: dgservice
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
selector:
app: dgservice
tier: dgservice
Ответ №2:
Я предполагаю, что под «сервисом» вы имеете в виду свой «dgservice». Я полагаю, что с помощью yaml, представленного выше, вам также необходимо указать DG_SERVICE_PORT (порт 8080) для правильного доступа к «dgservice».
Как упоминалось Suresh в комментариях, вы должны предоставлять внутренние службы, используя тип ClusterIP. NodePort является надмножеством ClusterIP и предоставляет доступ к службе как внутри вашего кластера по адресу service-name:port
, так и извне по адресу node-ip:nodeport
, ориентируясь на ваше развертывание / модуль по адресу targetport
.