[K8S] 05 - Service
Ref: 37 kubernetes极速入门 k8s集群核心概念 Service Service介绍
[是什么,以及作用]
在这里,Service是一个规则。
- 不是实体服务。
- 只是一条 iptables 或 ipvs 的转发规则。
---- 要通过 Service 访问 Pod,通过pod标签与pod关联。
基本概念
Service 类型
-
ClusterIP
Cluster内部分配一个虚拟IP。也是默认创建时的类型。
-
NodePort
Cluster外访问cluster内部的node,可以通过端口访问作为入口。
-
LoadBalancer
工作在特定的Cloud Provider上。
-
ExternalName
Cluster内部的pod与cluster外部的服务进行通信。
Service 参数
创建一个 Service (ClusterIP)
Ref: 38 kubernetes极速入门 k8s集群核心概念 Service 通过命令行创建Service
控制器 --> App --> Pod --> Service
开始创建
命令行创建
- 第一步,创建 Deployment类型App,验证创建结果
$ kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=1
$ kubectl get deployment.apps
同时,可以直接访问pod,但不建议。
- 第二步,创建 Service 与上述应用关联
访问 Service 以实现访问Pod目的。
$ kubectl expose deployment.apps nginx-app1 --type=ClusterIP --target-port=80 --port=80
查看expose的 IP 与 Port。Service 与 Pod 之间建立起来了关联关系。
-
- Endpoint
查看这种“关联关系”,如下可见,endpoints 与 pod 的 IP地址一致。
-
-
三层地址IP
-
Ref: k8s-集群里的三种IP(NodeIP、PodIP、ClusterIP)
Kubernetes集群里有三种IP地址,分别如下:
1) Node IP:Node节点的IP地址,即物理网卡的IP地址。
2) Pod IP:Pod的IP地址,即docker容器的IP地址,此为虚拟IP地址。
3) Cluster IP:Service的IP地址,此为虚拟IP地址。
资源文件创建
-
第一步,控制器类型的应用
--- 连字符,用于资源的分割;
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app2
spec:
replicas: 2 # <---- 有两份,到底访问到哪里呢,通过创建 service 来控制
selector:
matchLabels:
apps: nginx
template:
metadata:
labels:
apps: nginx
spec:
containers:
- name: nginxapp2
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
为访问Pod创建一个Service,还是通过连字符在同一个文件中分开。
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app2-svc
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
apps: nginx
通过“标签”与pod关联起来。可见,这里有两个containers,因为 replicas=2。
- 第二步,执行。
Service 的负载均衡
查看pods,存在两个副本,自动支持负载均衡;做实验,修改下网页的内容。
可见,多requests后,看到不同的response from two different conntainers。
实验:访问,打印出自己是哪个Pod。
创建一个 Service (NodePort)
Ref: 40 kubernetes极速入门 k8s集群核心概念 Service 通过资源清单文件创建Service NodePort
在之前的基础上,修改 service type。
--- apiVersion: v1 kind: Service metadata: name: nginx-app3-svc spec: type: ClusterIP ports: - protocol: TCP port: 80 targetPort: 80
nodePort: 3001 # 该字段用于自定义port
selector: apps: app3
删除一个 Service
Ref: 41 kubernetes极速入门 k8s集群核心概念 Service 删除Service及学习总结
可通过命令行或者资源文件删除。
End.