1. 简介
kubernets service 是将运行一组pods上的应用程序公开为网络服务的抽象方法。
有了 kubernets service,你就无需修改应用程序即可使用服务发现机制,kubernets 为 pods 提供自己的ip地址,并为一组pod提供相同的DNS名,并且可以在它们之间进行负载均衡。
2. 为什么要用services
创建和销毁 kubernets pod 以匹配集群状态。pod 是非永久性资源。如果你使用 Deployment 来运行你的应用程序,则它可以动态创建和销毁 Pod。
每个 Pod 都有自己的 IP 地址,但是在 Deployment 中,在同一时刻运行的 Pod 集合可能与稍后运行该应用程序的 Pod 集合不同。
这导致了一个问题: 如果一组 Pod(称为”后端”)为集群内的其他 Pod(称为”前端”)提供功能, 那么前端如何找出并跟踪要连接的 IP 地址,以便前端可以使用提供工作负载的后端部分?
3. quick start
3.1 创建svc
资源模板 svc-deploy-nginx.yaml
信息如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy-test
name: nginx-test-1
spec:
replicas: 3
selector:
matchLabels:
app: nginx-test
template:
metadata:
labels:
app: nginx-test
spec:
containers:
- image: nginx:latest
name: nginx
imagePullPolicy: IfNotPresent
apiVersion: v1
kind: Service
metadata:
name: my-service-2
spec:
type: NodePort
selector:
app: nginx-test-02
ports:
- protocol: TCP
port: 8000
targetPort: 80
# 可选字段
# 默认情况下,为了方便起见,Kubernetes 会从范围内分配一个端口号(默认:30000-32767)
nodePort: 30007
- 访问svc
4.3 LoadBalancer
使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort
服务和 ClusterIP
服务上。
4.4 ExternalName
类型为 ExternalName 的服务将服务映射到 DNS 名称,而不是典型的选择器,例如 其他svc 或者 公网域名。 你可以使用 spec.externalName
参数指定这些服务。
- 创建服务 例如,以下 Service 定义将
default
名称空间中的my-service-2
服务映射到my-service-1.test.svc.cluster.local
(test 名称空间中的 my-service-1 service):
apiVersion: v1
kind: Service
metadata:
name: my-service-2
spec:
type: ExternalName
externalName: my-service-1.test.svc.cluster.local
服务信息如下:
服务是在default namespace 下 没有分配CLUSTER-IP,但是有我们指定的 EXTERNAL-IP
$ kubectl get svc -owide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 443/TCP 170d
my-service-2 ExternalName my-service-1.test.svc.cluster.local 41s
为了验证映射效果,我们再创建一个 my-service-1.test
service
注意 服务都是在test namespace 下
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy-test
name: nginx-test-1
namespace: test
spec:
replicas: 3
selector:
matchLabels:
app: nginx-test
template:
metadata:
labels:
app: nginx-test
spec:
containers:
- image: nginx:latest
name: nginx
imagePullPolicy: IfNotPresent
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
服务信息如下:
$ kubectl get deploy -owide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
web 2/2 2 2 3h25m nginx nginx app=nginx
$ kubectl get svc/nginx -owide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx ClusterIP 10.96.41.170 192.168.0.101 8080/TCP 4m app=nginx
如果在集群节点上访问
192.168.0.101:8080
,是不能将结果导入到deploy上的,只有在集群服务内部访问才有效
4. 此时我们将svc/nginx 删除掉,看下访问的结果
符合预期
6. 管理外部的服务
场景:如果我们的中间件或者数据库服务不是在k8s集群内的,而是在其他的服务器上,但是我们还是想通过访问svc的方式去访问这些外部的服务,我们应该怎么做呢?
- 声明一个没有选择符的svc
- 创建一个同名(和第一步中的svc name 相同)的
endpoints
服务去管理这些外部的服务地址
实例:
实例通过创建svc 和 endpoints,实现访问svc-name,svc 将流量导出到外部的springboot(项目信息如5.0中提到的)项目中
- 创建服务
`yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
– protocol: TCP
port: 80
targetPort: 8080
Original: https://www.cnblogs.com/ludangxin/p/15760914.html
Author: 张铁牛
Title: Kubernetes-Service
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581152/
转载文章受原作者版权保护。转载请注明原作者出处!