Как получить доступ к экземпляру MinIO в кластере Kubernetes?
Я развернул сервер MinIO в Kubernetes с помощью cdk8s, использовалminio1
как serviceId и открытый порт 9000.
Я ожидал, что смогу получить к нему доступ, используяhttp://minio1:9000
, но мой сервер MinIO недоступен как из Prometheus, так и из других экземпляров в моем пространстве имен (Loki, Mimir и т. д.). Есть ли конкретная конфигурация, которую я пропустил, чтобы включить доступ в сети? Сервер запускается без ошибок, так что это звучит как проблема с сетью.
Я запускаю сервер так:
command: ["minio"],
args: [
"server",
"/data",
"--address",
`:9000`,
"--console-address",
`:9001`,
],
Исправлена конфигурация K8S, чтобы выставить как 9000, так и 9001.
const d = ApiObject.of(minioDeployment);
//Create the empty port list
d.addJsonPatch(JsonPatch.add("/spec/template/spec/containers/0/ports", []));
//add port for console
d.addJsonPatch(
JsonPatch.add("/spec/template/spec/containers/0/ports/0", {
name: "console",
containerPort: 9001,
})
);
// add port for bucket
d.addJsonPatch(
JsonPatch.replace("/spec/template/spec/containers/0/ports/1", {
name: "bucket",
containerPort: 9000,
})
);
Может ли это быть связано с многопортовой конфигурацией? Или есть способ явно определить имя хоста как идентификатор службы, чтобы сделать его доступным в пространстве имен Kubernetes?
Вот мое определение службы, сгенерированное cdk8s:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
use-default-egress-policy: "true"
name: minio1
namespace: ns-monitoring
spec:
minReadySeconds: 0
progressDeadlineSeconds: 600
replicas: 1
selector:
matchExpressions: []
matchLabels:
cdk8s.deployment: monitoring-stack-minio1-minio1-deployment-c8e6c44f
strategy:
rollingUpdate:
maxSurge: 50%
maxUnavailable: 50%
type: RollingUpdate
template:
metadata:
labels:
cdk8s.deployment: monitoring-stack-minio1-minio1-deployment-c8e6c44f
spec:
automountServiceAccountToken: true
containers:
- args:
- server
- /data/minio/
- --address
- :9000
- --console-address
- :9001
command:
- minio
env:
- name: MINIO_ROOT_USER
value: userminio
- name: MINIO_ROOT_PASSWORD
value: XXXXXXXXXXXXXX
- name: MINIO_BROWSER
value: "on"
- name: MINIO_PROMETHEUS_AUTH_TYPE
value: public
image: minio/minio
imagePullPolicy: Always
name: minio1-docker
ports:
- containerPort: 9001
name: console
- containerPort: 9000
name: bucket
securityContext:
privileged: false
readOnlyRootFilesystem: false
runAsNonRoot: false
volumeMounts:
- mountPath: /data
name: data
dnsConfig:
nameservers: []
options: []
searches: []
dnsPolicy: ClusterFirst
hostAliases: []
initContainers: []
restartPolicy: Always
securityContext:
fsGroupChangePolicy: Always
runAsNonRoot: false
sysctls: []
setHostnameAsFQDN: false
volumes:
- emptyDir: {}
name: data
---
apiVersion: v1
kind: Service
metadata:
labels:
use-default-egress-policy: "true"
name: minio1
namespace: ns-monitoring
spec:
externalIPs: []
ports:
- port: 443
targetPort: 9001
selector:
cdk8s.deployment: stack-minio1-minio1-deployment-c8e6c44f
type: ClusterIP
1 ответ
Как указано в документе:
Список портов для предоставления из контейнера. Отсутствие указания порта здесь НЕ предотвращает раскрытие этого порта. Любой порт, прослушивающий адрес по умолчанию «0.0.0.0» внутри контейнера, будет доступен из сети.
.
Как предложил @user2311578, его раскрытие на уровне контейнера не делает его автоматически доступным в службе. Вы должны указать его там, когда хотите получить к нему доступ через сервис (и его виртуальный IP-адрес).
Также проверьте ссылку GitHub для получения дополнительной информации.