Kubernetes,k8s, как сделать сервис URL?
Я учу k8s. Мой вопрос заключается в том, как разрешить k8s получить URL-адрес службы, как это делает команда minikube "minikube get service xxx --url"? Я спрашиваю, потому что, когда модуль pod выключен и снова запущен / создан / инициирован, нет необходимости изменять URL, посещая URL службы. Развертывая модуль как NodePort, я мог получить доступ к модулю с IP-адресом хоста и портом, но если он будет заново инициирован / создан, порт изменится.
Мой случай иллюстрируется ниже: у меня есть
one master(172.16.100.91) and
one node(hostname node3, 172.16.100.96)
Я создаю pod и сервис, как показано ниже, helllocomm, развернутый как NodePort, и helloext, развернутый как ClusterIP. hellocomm и helloext являются приложениями hello world с весенней загрузкой.
docker build -t jshenmaster2/hellocomm:0.0.2 .
kubectl run hellocomm --image=jshenmaster2/hellocomm:0.0.2 --port=8080
kubectl expose deployment hellocomm --type NodePort
docker build -t jshenmaster2/helloext:0.0.1 .
kubectl run helloext --image=jshenmaster2/helloext:0.0.1 --port=8080
kubectl expose deployment helloext --type ClusterIP
[root@master2 shell]# kubectl get service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
hellocomm NodePort 10.108.175.143 <none> 8080:31666/TCP 8s run=hellocomm
helloext ClusterIP 10.102.5.44 <none> 8080/TCP 2m run=helloext
[root@master2 hello]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
hellocomm-54584f59c5-7nxp4 1/1 Running 0 18m 192.168.136.2 node3
helloext-c455859cc-5zz4s 1/1 Running 0 21m 192.168.136.1 node3
Выше мой модуль развернут на узле 3(172.16.100.96), поэтому я мог получить доступ к hellocomm с помощью 172.16.100.96:31666/hello. В этом сценарии можно легко увидеть, что когда узел 3 не работает, создается и инициируется новый модуль, порт тоже меняется. так что мой клиент потерял связь. Я не хочу этого решения.
Мой текущий вопрос заключается в том, что helloext развернут как ClusteriP, и это также сервис, как показано выше. Означает ли это, что ClusterIP 10.102.5.44 и порт 8080 будут URL-адресом службы, http://10.102.5.44:8080/hello?
Нужно ли снова создавать сервис по файлу yaml? Чем отличается сервис, созданный командой от файла yaml? Как написать следующий файл yaml, если мне нужно создать сервис по yaml?
Ниже приведен шаблон определения yaml, который мне нужно заполнить. Как заполнить?
apiVersion: v1
kind: Service
matadata:
name: string helloext
namespace: string default
labels:
- name: string helloext
annotations:
- name: string hello world
spec:
selector: [] ?
type: string ?
clusterIP: string anything I could give?
sessionAffinity: string ? (yes or no)
ports:
- name: string helloext
protocol: string tcp
port: int 8081? (port used by host machine)
targetPort: int 8080? (spring boot uses 8080)
nodePort: int ?
status: since I am not using loadBalancer in deploymennt, I could forget this.
loadBalancer:
ingress:
ip: string
hostname: string
2 ответа
NodePort, как следует из названия, открывает порт непосредственно на узле (фактически на всех узлах кластера), чтобы вы могли получить доступ к своей службе. По умолчанию он случайный - поэтому, когда умирает стручок, он генерирует новый для вас. Однако вы также можете указать порт (3-й абзац здесь) - и вы сможете получить доступ к тому же порту даже после повторного создания модуля.
ClusterIP доступен только внутри кластера, так как это частный IP. Это означает, что в сценарии по умолчанию вы можете получить доступ к этой службе из другого контейнера / узла внутри кластера. Вы можете exec
/ ssh
в любой работающий контейнер / узел и попробуйте.
Файлы Yaml могут контролироваться версиями, документироваться, шаблонизироваться ( Helm) и т. Д.
Проверьте https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/ для получения подробной информации о каждом поле.
РЕДАКТИРОВАТЬ: более подробную информацию об услугах здесь: https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0
Как насчет создания входа и указания его службе для доступа к нему вне кластера?