0


k8s服务发现(service discovery)常用的两种方式Nodeport和ClusterIP

介绍

NodePort:

主要特点:

为Service在每个节点上分配一个固定的端口(NodePort),允许外部流量通过节点的IP地址和NodePort访问Service。
NodePort将流量从集群外部引入到Service内部。
Service类型为NodePort时,还会创建一个ClusterIP,但它只是一个内部的ClusterIP,通常不会直接使用。
使用场景:

当需要从集群外部访问Service,但不希望使用负载均衡器或Ingress时,可以使用NodePort。
适用于开发和测试环境,以便快速访问Service。
不推荐用于生产环境,因为NodePort通常需要手动配置负载均衡,不够灵活和安全。
ClusterIP:

主要特点:

为Service创建一个内部ClusterIP,只能在集群内部访问。
ClusterIP将流量从集群外部引入到集群内部Service。
使用场景:

当Service只需要在集群内部访问,不需要从外部访问时,通常使用ClusterIP。
适用于微服务之间的通信,内部服务发现和负载均衡。
在生产环境中更为常见,因为ClusterIP提供了更好的安全性和控制,不暴露Service到公共网络。

准备

准备一个k8s集群,要求有一个master节点和一个node节点

Nodeport实现服务发现

在master节点上编写yaml配置文件:

  1. [root@master ~]# mkdir /service
  2. [root@master ~]# cd /service/[root@master service]# ls
  3. [root@master service]# vim scnginx.yaml
  4. [root@master service]# cat scnginx.yaml
  5. apiVersion: apps/v1
  6. kind: Deployment
  7. metadata:
  8. name: scnginx-deployment
  9. labels:
  10. app: scnginx
  11. spec:
  12. replicas:3
  13. selector:
  14. matchLabels:
  15. app: scnginx
  16. template:
  17. metadata:
  18. labels:
  19. app: scnginx
  20. spec:
  21. containers:- name: nginx
  22. image: nginx
  23. imagePullPolicy: IfNotPresent
  24. ports:- containerPort:80---
  25. apiVersion: v1
  26. kind: Service
  27. metadata:
  28. name: scnginx-service
  29. spec:type: NodePort
  30. selector:
  31. app: scnginx
  32. ports:- name: name-of-service-port
  33. protocol: TCP
  34. port:80
  35. targetPort:80
  36. nodePort:30009

下面是对每行命令的解释:

apiVersion: apps/v1: 指定了使用的Kubernetes API版本,这是Deployment对象的版本。
kind: Deployment: 指定了要创建的Kubernetes资源类型,这是一个Deployment(部署)对象。
metadata: Deployment的元数据部分,包含有关部署的信息。
name: scnginx-deployment: 部署的名称是 “scnginx-deployment”。
labels: 为部署添加了标签,标签的键是 “app”,值是 “scnginx”。
spec: 部署的规范部分,定义了部署的配置。
replicas: 3: 指定要创建的副本数为3,这意味着将运行3个相同的Pod实例。
selector:: 用于选择要控制的Pod的标签。
matchLabels:: 匹配Pod的标签,以确保Deployment可以控制正确的Pod。
app: scnginx: 匹配标签 “app” 的值为 “scnginx” 的Pod。
template:: 定义了要创建的Pod的模板。
metadata:: Pod的元数据部分,包含有关Pod的信息。
labels:: 为Pod添加了标签,标签的键是 “app”,值是 “scnginx”。
spec:: Pod的规范部分,定义了Pod的配置。
containers:: 定义了要在Pod中运行的容器。
name: nginx: 容器的名称是 “nginx”。
image: nginx: 使用的容器镜像是 “nginx”。
imagePullPolicy: IfNotPresent: 定义了拉取镜像的策略,如果本地不存在该镜像,则拉取。
ports:: 定义了容器的端口配置。
containerPort: 80: 将容器的端口80映射到Pod的端口。

以下部分定义了一个Service:
apiVersion: v1: 指定了使用的Kubernetes API版本,这是Service对象的版本。
kind: Service: 指定了要创建的Kubernetes资源类型,这是一个Service(服务)对象。
metadata:: Service的元数据部分,包含有关服务的信息。
name: scnginx-service: 服务的名称是 “scnginx-service”。
spec:: 服务的规范部分,定义了服务的配置。
type: NodePort: 定义了服务的类型为NodePort,这意味着Service将会公开一个节点的端口供外部访问。
selector:: 通过标签选择要路由流量到的Pod。
app: scnginx: 匹配标签 “app” 的值为 “scnginx” 的Pod。
ports: 定义了服务的端口配置。
name: name-of-service-port: 服务端口的名称。
protocol: TCP: 指定端口协议为TCP。
port: 80: 服务监听的端口号。
targetPort: 80: 将流量路由到Pod的端口80。
nodePort: 30009: 指定NodePort的端口号为30009,外部可以通过节点的IP地址和这个端口来访问Service。
这个配置文件创建了一个名为 “scnginx-deployment” 的Deployment,其中运行3个Nginx容器的Pod,并创建了一个名为 “scnginx-service” 的NodePort类型的Service,将流量路由到这三个Pod中的任何一个,通过任意节点的IP地址和端口30009进行访问。

下面检查服务是否成功运行:

  1. [root@k8smaster service]# kubectl apply -f scnginx.yaml
  2. deployment.apps/scnginx-deployment created
  3. service/scnginx-service unchanged
  4. [root@k8smaster service]# kubectl get svc
  5. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  6. kubernetes ClusterIP 10.96.0.1<none>443/TCP 5d21h
  7. mysql-service NodePort 10.100.48.98<none>3306:30008/TCP 17m
  8. nginx-service ClusterIP 10.111.156.94<none>80/TCP 3h44m
  9. nginx-service-2 NodePort 10.102.129.209<none>80:30007/TCP 3h34m
  10. php-apache ClusterIP 10.106.101.193<none>80/TCP 24h
  11. scnginx-service NodePort 10.98.63.131<none>80:30009/TCP 2m21s
  12. [root@k8smaster service]# kubectl get pod
  13. NAME READY STATUS RESTARTS AGE
  14. mysql 1/1 Running 0 17m
  15. nginx 1/1 Running 0 3h45m
  16. nginx-21/1 Running 0 3h35m
  17. nginx-deployment-559d658b74-62hxx 1/1 Running 0 4h24m
  18. nginx-deployment-559d658b74-zwlh4 1/1 Running 1 24h
  19. php-apache-567d9f79d-rfv9b 1/1 Running 0 4h24m
  20. scnginx-deployment-b975997c7-glfdb 1/1 Running 0 55s
  21. scnginx-deployment-b975997c7-mk92v 1/1 Running 0 55s
  22. scnginx-deployment-b975997c7-vsbt5 1/1 Running 0 55s
  23. [root@k8smaster service]#

在Windows机器上访问,测试是否可以看到页面:
http://192.168.74.156:30009/ (任何节点IP+端口号30009)
在这里插入图片描述

ClusterIP服务发现

在master节点编写yaml配置文件:

  1. [root@master service] cd /service
  2. [root@master service] vim scnginx-2.yaml
  3. [root@master service]cat scnginx-2.yaml
  4. apiVersion: apps/v1
  5. kind: Deployment
  6. metadata:
  7. name: scnginx-deployment-2
  8. labels:
  9. app: scnginx-2
  10. spec:
  11. replicas: 3
  12. selector:
  13. matchLabels:
  14. app: scnginx-2
  15. template:
  16. metadata:
  17. labels:
  18. app: scnginx-2
  19. spec:
  20. containers:
  21. - name: nginx
  22. image: nginx:latest
  23. imagePullPolicy: IfNotPresent
  24. ports:
  25. - containerPort: 80
  26. ---
  27. apiVersion: v1
  28. kind: Service
  29. metadata:
  30. name: scnginx-service-2
  31. spec:
  32. type: ClusterIP
  33. selector:
  34. app: scnginx-2
  35. ports:
  36. - name: name-of-service-port-2
  37. protocol: TCP
  38. port: 80
  39. targetPort: 80
  40. #nodePort: 30009

验证服务是否启动

  1. [root@master-1 nginx] kubectl get svc
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19d
  4. php-apache ClusterIP 10.107.194.238 <none> 80/TCP 16d
  5. scnginx-service-2 ClusterIP 10.110.242.117 <none> 80/TCP 14m

在任意节点访问
该服务只能在集群内部使用,外面不能访问过来

  1. [root@master-1 nginx] curl 10.110.242.117
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>Welcome to nginx!</title>
  6. <style>
  7. html { color-scheme: light dark;}
  8. body { width: 35em; margin: 0 auto;
  9. font-family: Tahoma, Verdana, Arial, sans-serif;}
  10. </style>
  11. </head>
  12. <body>
  13. <h1>Welcome to nginx!</h1>
  14. <p>If you see this page, the nginx web server is successfully installed and
  15. working. Further configuration is required.</p>
  16. <p>For online documentation and support please refer to
  17. <a href="http://nginx.org/">nginx.org</a>.<br/>
  18. Commercial support is available at
  19. <a href="http://nginx.com/">nginx.com</a>.</p>
  20. <p><em>Thank you forusing nginx.</em></p>
  21. </body>
  22. </html>

成功

总结

NodePort适用于需要从集群外部直接访问Service的情况,但通常不是生产环境的首选。ClusterIP适用于内部通信和服务发现,提供了更好的隔离和安全性,适合生产环境中的大多数用例。在实际部署中,通常会结合使用不同类型的Service来满足不同的需求。


本文转载自: https://blog.csdn.net/weixin_50606361/article/details/132675427
版权归原作者 XGorgeous 所有, 如有侵权,请联系我们删除。

“k8s服务发现(service discovery)常用的两种方式Nodeport和ClusterIP”的评论:

还没有评论