Ответ 1
Если это только для тестирования, то попробуйте
kubectl port-forward service/nginx-service 80:80
Тогда ты можешь
curl http://localhost:80
РЕДАКТИРОВАТЬ: Весь смысл моей установки заключается в достижении (если возможно) следующих результатов:
Я запускаю небольшой кластер Kubernetes (построенный с помощью kubeadm), чтобы оценить, могу ли я перенести мою установку Docker (старый) Swarm на k8s. Особенность, в которой я абсолютно нуждаюсь, - это возможность назначать IP-контейнеры, например, с помощью MacVlan.
В моей текущей настройке докеры я использую MacVlan для назначения IP-адресов из моей сети компании в некоторые контейнеры, чтобы я мог напрямую связаться (без обратного прокси-сервера), как если бы это был какой-либо физический сервер. Я пытаюсь достичь чего-то подобного с k8s.
Я узнал, что:
Мой файл yaml:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
nodeSelector:
kubernetes.io/hostname: k8s-slave-3
---
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
externalIPs:
- A.B.C.D
Я надеялся, что мой сервис получит IP A.B.C.D(который является одной из моих сетей). Мое развертывание работает, так как я могу достичь своего контейнера nginx изнутри кластера k8s, используя его ClusterIP.
Что мне не хватает? Или, по крайней мере, где я могу найти информацию о моем сетевом трафике, чтобы узнать, поступают ли пакеты?
ИЗМЕНИТЬ:
$ kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.96.0.1 <none> 443/TCP 6d
nginx-service 10.102.64.83 A.B.C.D 80/TCP 23h
Спасибо.
Если это только для тестирования, то попробуйте
kubectl port-forward service/nginx-service 80:80
Тогда ты можешь
curl http://localhost:80
Решение, которое может работать (и не только для тестирования, хотя и имеет свои недостатки), состоит в том, чтобы настроить ваш Pod для сопоставления сети хоста с hostNetwork
спецификации hostNetwork
установленным в true
.
Это означает, что вам не понадобится сервис для предоставления вашего Pod, так как он всегда будет доступен на вашем хосте через один порт (containerPort
вы указали в манифесте). В этом случае нет необходимости вести запись сопоставления DNS.
Это также означает, что вы можете запустить только один экземпляр этого модуля на данном узле (говоря о недостатках...). Таким образом, это делает его хорошим кандидатом на объект DaemonSet.
Если ваш Pod все еще нуждается в доступе/разрешении внутренних имен хостов Kubernetes, вам нужно установить для dnsPolicy
спецификации ClusterFirstWithNoHostNet
значение ClusterFirstWithNoHostNet
. Этот параметр позволит вашему модулю получить доступ к службе DNS K8S.
Пример:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx
spec:
template:
metadata:
labels:
app: nginx-reverse-proxy
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
tolerations: # allow a Pod instance to run on Master - optional
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- image: nginx
name: nginx
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
РЕДАКТИРОВАТЬ: я был поставлен на этот трек благодаря документации ingress-nginx
Вы можете просто установить внешний IP
CMD: $ kubectl patch svc svc_name -p '{"spec":{"externalIPs":["your_external_ip"]}}'
Например: - $ kubectl patch svc kubernetes -p '{"spec":{"externalIPs":["10.2.8.19"]}}'
Прежде всего выполните эту команду:
kubectl get -n namespace services
Вышеприведенная команда вернет вывод примерно так:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend NodePort 10.100.44.154 <none> 9400:3003/TCP 13h
frontend NodePort 10.107.53.39 <none> 3000:30017/TCP 13h
Из приведенного выше вывода видно, что внешние IP-адреса еще не назначены сервисам. Чтобы назначить внешние IP-адреса для внутренней службы, выполните следующую команду.
kubectl patch svc backend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'
и для назначения внешнего IP-адреса внешней службе выполните эту команду.
kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'
Теперь получите сервис пространства имен для проверки назначения внешних IP-адресов:
kubectl get -n namespace services
Мы получаем такой вывод:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend NodePort 10.100.44.154 192.168.0.194 9400:3003/TCP 13h
frontend NodePort 10.107.53.39 192.168.0.194 3000:30017/TCP 13h
Ура !!! Kubernetes Внешние IP-адреса теперь назначены.
вы можете попробовать kube-keepalived-vip configurtion для маршрутизации трафика. https://github.com/kubernetes/contrib/tree/master/keepalived-vip
Вы можете попробовать добавить "type: NodePort" в свой файл yaml для этой службы, а затем у вас будет порт для доступа к нему через веб-браузер или извне. Для моего случая это помогло.
Просто включите дополнительную опцию.
kubectl expose deployment hello-world --type=LoadBalancer --name=my-service --external-ip=1.1.1.1
Я не знаю, поможет ли это в вашем конкретном случае, но то, что я сделал (и я работаю в кластере Bare Metal), - это использование LoadBalancer
и установка loadBalancerIP
а также externalIPs
на IP моего сервера, как вы это сделали.
После этого для балансировщика нагрузки появился правильный внешний IP-адрес.