AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
在`/home/shiyanlou`目录下新建`tomcat-deployment.yaml`文件,并向其中写入如下代码: ~~~yaml apiVersion: apps/v1 kind: Deployment metadata: name: multi-ports spec: selector: matchLabels: app: tomcat replicas: 2 template: metadata: labels: app: tomcat spec: containers: - name: tomcat image: tomcat ports: - name: service # 将 8080 端口命名为 service containerPort: 8080 - name: shutdown # 将 8005 端口命名为 shutdown containerPort: 8005 ~~~ 执行创建: ~~~bash $ kubectl create -f tomcat-deployment.yaml deployment.apps/multi-ports created ~~~ 查看创建的详细情况: ~~~bash $ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE multi-ports 2/2 2 2 61s $ kubectl get pods NAME READY STATUS RESTARTS AGE multi-ports-797bbf966b-9rh46 1/1 Running 0 94s multi-ports-797bbf966b-tdrsz 1/1 Running 0 94s ~~~ 在`/home/shiyanlou`目录下新建`multi-ports-service.yaml`文件,并向其中写入如下代码: ~~~yaml apiVersion: v1 kind: Service metadata: name: multi-ports-service spec: sessionAffinity: ClientIP # 设置 service 为会话保持模式 ports: - name: service-port port: 88 # 将名为 service-port Service 的 88 端口映射到 Pod 名为 service 的端口 targetPort: service - name: shutdown-port port: 85 # 将名为 shutdown-port Service 的 85 端口映射到 Pod 名为 shutdown 的端口 targetPort: shutdown selector: app: tomcat ~~~ 执行创建: ~~~bash # 可以看到 multi-ports-service 服务有两个端口,分别为 tcp 88 端口和 tcp 85 端口 $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 85d multi-ports-service ClusterIP 10.99.212.184 <none> 88/TCP,85/TCP 7s # 查看 endpoints $ kubectl get endpoints NAME ENDPOINTS AGE kubernetes 10.192.0.2:6443 85d # 这里省略了一个 IP地址+端口号 未显示,应该为:10.244.3.3:8080 multi-ports-service 10.244.2.4:8005,10.244.3.3:8005,10.244.2.4:8080 + 1 more... 18s $ kubectl get endpoints -o yaml ... subsets: - addresses: - ip: 10.244.2.4 # 可以看到 10.244.2.4 的 IP 地址是 kube-node-1 节点的 nodeName: kube-node-1 targetRef: kind: Pod name: multi-ports-797bbf966b-tdrsz namespace: default resourceVersion: "2077" uid: f6106369-b920-4a76-a7cd-f342d287bfd6 - ip: 10.244.3.3 # 可以看到 10.244.3.3 的 IP 地址是 kube-node-2 节点的 nodeName: kube-node-2 targetRef: kind: Pod name: multi-ports-797bbf966b-9rh46 namespace: default resourceVersion: "2069" uid: 1be2227f-702a-4131-b767-7f1e0d852def ports: - name: shutdown-port port: 8005 # 对应的容器 shutdown 端口号为 8005 protocol: TCP - name: service-port port: 8080 # 对应的容器 service 端口号为 8080 protocol: TCP ... ~~~ 进行验证: ~~~bash # 任意进入一个 Node 节点 $ docker exec -it kube-node-1 bash root@kube-node-1:/# curl 10.99.212.184:88 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Apache Tomcat/8.5.47</title> <link href="favicon.ico" rel="icon" type="image/x-icon" /> <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" /> <link href="tomcat.css" rel="stylesheet" type="text/css" /> </head> ... ~~~ 只要理解清楚了服务实现的基本原理,在 kubernetes 集群中创建基本的 Service 还是比较容易的。 需要着重理解的是 Service 的 Cluster IP,是 kubernetes 集群内部的虚拟 IP,是伪造的 IP 网络,它有如下 4 个特点: * Cluster IP 只能用于 Service 对象,由 kubernetes 从 Cluster IP 池中进行分配和管理 * Cluster IP 不能被 ping 通,因为没有“实体网络对象”进行响应,所以在集群内部只能使用 curl 而不能使用 ping * Cluster IP 只能和 Service Port 一并使用构成通信端口,单独的 Cluster IP 不具备 TCP/IP 通信功能;如果集群外的节点想要访问这个通信端口,还需要额外的操作 * 在集群内部,Node IP 网络、Pod IP 网络和 Cluster IP 之间的通信采用的是 kubernetes 自己设计的独特的路由规则,这和普通的 IP 路由不一样。 因此 Service 的 Cluster IP 只是属于集群内部的地址。