ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
参考文档:https://feisky.xyz/kubernetes-handbook/concepts/service.html **** Service 有四种类型: * ClusterIP:默认类型,自动分配一个仅供集群内部可以访问的虚拟 IP。 * NodePort:可以让集群外访问 pod,可以通过`<NodeIP>:NodePort`来访问。 * LoadBalancer:这需要云服务提供商提供一个外部的负载均衡器,并将请求转发到`<NodeIP>:NodePort`。 * ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。需要 kube-dns 版本在 1.7 以上。 这里我部署了 3 个副本的 tomcat6,它们目前是不能被访问到的,需要配合 Service 才能。 ```shell # cat tomcat6-dep02.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: tomcat6-dep02 name: tomcat6-dep02 spec: replicas: 3 #3个副本 selector: matchLabels: app: tomcat6-dep02 template: metadata: labels: app: tomcat6-dep02 spec: containers: - image: tomcat:6.0.53-jre8 name: tomcat ports: - containerPort: 8080 # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE ... tomcat6-dep02-86d9567d55-76cww 1/1 Running 0 3m23s 10.244.1.24 k8s-node1 ... tomcat6-dep02-86d9567d55-dj6cp 1/1 Running 0 3m23s 10.244.1.25 k8s-node1 ... tomcat6-dep02-86d9567d55-phgxm 1/1 Running 0 3m23s 10.244.2.18 k8s-node2 ... ``` <br/> [TOC] # 1. ClusterIP ```shell 【1】生成 Service 模板 # kubectl expose deployment tomcat6-dep02 \ --port=8080 \ --target-port=8080 \ --type=ClusterIP \ --dry-run=client -o yaml > tomcat6-svc01.yaml 【2】 # vim tomcat6-svc01.yaml apiVersion: v1 kind: Service #类型为Service metadata: labels: app: tomcat6-svc01 name: tomcat6-svc01 spec: ports: - port: 8080 #Service的端口 protocol: TCP targetPort: 8080 #Pod的端口 selector: app: tomcat6-dep02 #绑定的Deployment type: ClusterIP #类型为ClusterIP,这是默认的,不指定也可以 ``` ![](https://img.kancloud.cn/db/dd/dbdd1e80c6ad5e0c9b5f878f66a54947_1821x751.png) ```shell 【3】应用 Service # kubectl apply -f tomcat6-svc01.yaml 【4】查看 svc。10.104.49.211 就是 Service 的 IP、8080 就是 Service 的端口 # kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tomcat6-svc01 ClusterIP 10.104.49.211 <none> 8080/TCP 4m21s 【5】集群内访问测试,在任意节点使用:<ClusterIP>:Port # curl 10.104.49.211:8080 ``` ![](https://img.kancloud.cn/84/ad/84ad405cfcec6250b62c50feecf305fd_2139x846.png) 如果在集群外访问是不行的: ![](https://img.kancloud.cn/e8/8e/e88e10a5055948721f7d0ba566c5319f_1930x595.png) <br/> # 2. NodePort **1. 部署 Service** ```shell 【1】生成 Service 模板 # kubectl expose deployment tomcat6-dep02 \ --port=8080 \ --target-port=8080 \ --type=NodePort \ --dry-run=client -o yaml > tomcat6-svc02.yaml 【2】 # vim tomcat6-svc02.yaml apiVersion: v1 kind: Service #类型为Service metadata: labels: app: tomcat6-svc02 name: tomcat6-svc02 spec: ports: - port: 8080 #Service的端口 protocol: TCP targetPort: 8080 #Pod的端口 selector: app: tomcat6-dep02 #绑定的Deployment type: NodePort #类型指定为NodePort ``` ![](https://img.kancloud.cn/db/dd/dbdd1e80c6ad5e0c9b5f878f66a54947_1821x751.png) ```shell 【3】应用 Service # kubectl apply -f tomcat6-svc02.yaml 【4】查看 NodePort 端口,30553 就是 NodePort 端口 # kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tomcat6-svc02 NodePort 10.109.199.122 <none> 8080:30553/TCP 16m ``` <br/> **2. 通过`<NodeIP>:NodePort`集群外即可访问集群内的 Pod** 浏览器访问:http://192.168.1.18:30553/ ![](https://img.kancloud.cn/23/d1/23d1bebfa714f358b564a6fbedc223c4_2118x564.png)