Не так давно я начал собирать кластер Kubernetes в своей локальной сети, где у меня нет OpenStack или OpenShift, которые могли бы предоставить мне IP балансировщика нагрузки.
Большинство облачных платформ имеют уже написанную логику балансировки нагрузки, которая может предоставлять IP-адрес при создании сервиса с типом LoadBalancer.
В моем сценарии я предоставлю свой сервис приложений через тип NodePort, который предоставит порт на всех рабочих узлах и перенаправит трафик на правильный под.
ПРИМЕЧАНИЕ. Вам нужно будет вручную ввести NODE IP: EXPOSE PORT в свой предварительный балансировщик нагрузки. Если у вас есть автоматизация, которая может сделать за вас, это здорово!
Я дойду до этого в конце этого раздела.
Сначала я создам под, а затем перейду к службам.
kubectl run nginx-demo --image=nginx --port=80 --labels="name=nginx-demo"
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-demo-74df6b89b6-lkjvq 1/1 Running 0 1m
Создадим сервис NodePort
Сервис NodePort предоставляет порт на каждом сервере, который будет перенаправлять трафик на ваш под.
Вы можете динамически генерировать порт или назначать статический порт, пока он доступен.
Сгенерируем файл yaml для создания NodePort.
vi nginx-demo-nodeport-svc.yaml
Вставьте содержимое, показанное ниже в файл, указанный выше.
apiVersion: v1
kind: Service
metadata:
name: nginx-demo
labels:
name: nginx-demo-nodeport-svc
spec:
type: NodePort
ports:
- port: 80
nodePort: 30180
name: http
- port: 443
nodePort: 31443
name: https
selector:
name: nginx-demo
kubectl create -f nginx-demo-nodeport-svc.yaml
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d
nginx-demo NodePort 10.98.148.146 <none> 80:30180/TCP,443:31443/TCP 1m
kubectl get pods -o wide
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-demo-74df6b89b6-lkjvq 1/1 Running 0 44m 10.244.1.15 k8s-worker-node1
$ nslookup k8s-worker-node1
Address: 192.168.0.151
Выполнение тестирования
Используя Curl:
$ curl 192.168.0.151:30180
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Использование командной строки для создания сервиса NodePort
kubectl expose deployment nginx-demo --port=80 --type=NodePort
Вывод:
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d
nginx-demo NodePort 10.100.95.81 <none> 80:32546/TCP 4s
ПРИМЕЧАНИЕ. Когда вы создаете развертывание для NodePort через командную строку, вы не можете назначить порт вручную. Кластер автоматически назначит один динамически. Если вы должны назначить порт вручную, используйте шаблон yaml и создайте развертывание.
Спасибо за доступное объяснение ! Сервис заработал!
Всегда пожалуйста!