KubernetesのNodePortがホストマシンからアクセスできることを確認した

はじめに

KubernetesのSericeのNodePortが、ホストマシンからアクセスを確認した

環境

環境:Ubuntu+k3s

実行

Deployment, Serviceを以下とする。

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:latest

service-np.yml

apiVersion: v1
kind: Service
metadata:
  name: web-service-np
spec:
  selector:
    app: web
  type: NodePort
  ports:
  - protocol: TCP
    port: 80
    nodePort: 30001

それぞれのリソースをデプロイする

$ kubectl apply -f deploy.yaml
$ kubectl apply -f service-np.yml

$ kubectl get all -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
pod/web-deploy-7469f999db-z59kw   1/1     Running   0          39m   10.42.0.10   inoue-vm2   <none>           <none>

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service/web-service-np   NodePort    10.43.108.235   <none>        80:30001/TCP   37m   app=web

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
deployment.apps/web-deploy   1/1     1            1           39m   nginx        nginx:latest   app=web

NAME                                    DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
replicaset.apps/web-deploy-7469f999db   1         1         1       39m   nginx        nginx:latest   app=web,pod-template-hash=7469f999db

nodePortで指定したPortを活用し、 ホストマシンからServiceを経由してnginxにアクセスできることを確認する

$ curl http://localhost:30001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
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>

NodeのIPアドレスを指定してもcurlできる

$ kubectl get nodes -o wide
NAME         STATUS   ROLES           AGE   VERSION    INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
5gran-5gc2   Ready    control-plane   19d   v1.25.16   192.168.122.26   <none>        Ubuntu 20.04.6 LTS   5.4.0-174-generic   cri-o://1.25.2
$ curl http://192.168.122.26:30001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
(省略)

また、次のようにCLUSTER-IP, Target Port(80)を指定してもcurlできる。ただし、非推奨である。

$ kubectl get all -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
pod/web-deploy-7469f999db-z59kw   1/1     Running   0          39m   10.42.0.10   inoue-vm2   <none>           <none>

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service/web-service-np   NodePort    10.43.108.235   <none>        80:30001/TCP   37m   app=web

$ curl http://10.43.108.235:80

なお、NodePortは、30000~32767のポートは割当が可能である。

参考:

qiita.com