J'ai créé un pod avec la définition yaml ci-dessous.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: praveensripati/docker-demo:1.2
ports:
- containerPort: 3000
Et maintenant, j'expose le pod, qui crée un service.
kubectl expose pod myapp-pod --type=NodePort
Le port 3000 sur le conteneur est exposé au port 31728 sur les nœuds. Et je peux accéder à la page en utilisant curl sur le port 31728.
kubectl get service myapp-pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp-pod NodePort 10.107.254.254 <none> 3000:31728/TCP 5s
Cette fois, je voulais exposer le service non pas un port aléatoire, mais sur le port 80. Et je spécifie donc le numéro de port 80, en utilisant --port. Les détails du service sont un peu bizarres. Il indique que le port 80 sur le conteneur est exposé au port 31316 sur les nœuds. De plus, je peux accéder à la page en utilisant curl sur le port aléatoire (31316 dans ce cas) et non sur le port 80.
kubectl expose pod myapp-pod --type=NodePort --target-port=3000 --port=80
kubectl get service myapp-pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp-pod NodePort 10.105.123.73 <none> 80:31316/TCP 12s
Je ne suis pas en mesure d'exposer un service sur un port spécifique et non sur un port aléatoire. J'ai essayé quelques combinaisons et lu la documentation du k8s, mais sans succès.
Comment exposer un service sur un port spécifique au lieu d'un port aléatoire?
Je vais essayer de répondre à votre question ici.
De plus, je peux accéder à la page en utilisant curl sur le port aléatoire (31316 dans ce cas) et non sur le port 80.
-- Because, kubernetes exposed the port 31316 on the Host (maps to the service) and hence it can be accessed on Host:31316.
-- Service port is visible only within the kubernetes cluster. You can exec into a pod container and do a curl on servicename:service port instead of the NodePort.
Notez les termes - container port:
le conteneur de port écoute. Service port:
le port où le service kubernetes est exposé sur l'IP interne du cluster et mappé sur le port du conteneur. Nodeport:
le port exposé sur l'hôte et mappé au service kubernetes.
Votre question concerne l'exposition du type de service NodePort sur un port spécifique. Pour cela, vous devez spécifier le champ nodePort
sous ports
dans votre définition de service.
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 3000
nodePort: 32321
type: NodePort
Notez qu'il doit être dans une plage donnée fournie dans les configurations. Par défaut, 30000-32767
. Cette plage peut être spécifiée dans les configurations kube-apiserver en utilisant le --service-node-port-range
option.
Si votre cluster n'a pas de fournisseur LoadBalancer, vous pouvez spécifier externalIPs dans l'IP de l'interface réseau des nœuds.
Par exemple:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: ClusterIP
externalIPs:
- 125.100.99.101 # Node1-IP
- 125.100.99.102 # Node2-IP
- 192.168.55.112 # Node2-IP2
selector:
pod: nginx
ports:
- name: http
port: 80
- name: https
port: 443
Cela écoutera 80 et 443 sur le nœud spécifié, et le transmettra à le service nginx.
Lorsqu'un service Dashboard existant existe déjà, supprimez-le.
kubectl delete service kubernetes-dashboard -n kube-system
Exposez le déploiement du tableau de bord en tant que NodePort.
kubectl expose deployment kubernetes-dashboard -n kube-system --type=NodePort
Ce qui précède attribuera un port aléatoire> = 30000. Utilisez donc la commande Patch pour affecter le port à un port connu, inutilisé et souhaité> = 30000.
kubectl patch service kubernetes-dashboard --namespace=kube-system --type='json' --patch='[{"op": "replace", "path": "/spec/ports/0/nodePort", "value":30000}]'
Attention: N'exposez jamais votre tableau de bord publiquement sans authentification.
nous pouvons exposer le service Kubernetes sur un port de nœud spécifique.
La valeur du port doit être comprise entre 30000 et 32767.
Nous pouvons exposer le service à un port spécifique des types de service ci-dessous:
NodePort
LoadBalancer
Trouvez l'exemple de fichier myservice.yaml ci-dessous:
apiVersion: v1
kind: Service
metadata:
name: app1
spec:
type: NodePort/LoadBalancer
ports:
- name: "80"
port: 80
nodePort: 32062
targetPort: 80
selector:
appone: app1
app: test
Remarque: Dans le fichier yaml de service ci-dessus, nous pouvons spécifier le type de service NodePort ou Loadbalancer.