服务(Service)
# Service 常用配置项
# 1一个简单的Service
apiVersion: v1
kind: Service
metadata:
name: svc1
spec:
ports:
- port: 80 # 服务端口
targetPort: 80 # 转发到目标容器的端口
selector:
app: web # 根据哪些标签来追踪 Pod
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 通过变量的方式使用服务
首先创建一个服务,后续创建的 Pod 将会自动学习到一些变量。
- 变量
<服务名>_SERVICE_HOST
是某个服务的 IP 地址 - 变量
<服务名>_SERVICE_PORT
是某个服务暴露的端口
例如,创建了一个名为svc1
的服务。
kubectl expose pod pod-mysql --name svc1 --port=3306
1
然后,你可以在 yaml 文件中使用这个服务的环境变量。
spec:
containers:
- image: wordpress
name: c1
env:
- name: WORDPRESS_DB_HOST
value: $(SVC1_SERVICE_HOST) # 自动转换为 svc1 的 IP 地址
1
2
3
4
5
6
7
2
3
4
5
6
7
注意
该方式有要求限制:
- 服务和 Pod 必须处于同一个命名空间
- 存在创建的先后顺序,必须先创建服务,再创建 Pod,这样 Pod 才能学习到该服务的相关变量
# 借助集群的 coreDNS 使用服务
任何命名空间的服务,在创建时都会向集群 DNS 注册自身。
直接指定服务名称即可:
spec:
containers:
- image: wordpress
name: c1
env:
- name: WORDPRESS_DB_HOST
value: svc1 # 去 coreDNS 查询主机名 svc1 并返回其地址
1
2
3
4
5
6
7
2
3
4
5
6
7
# CKS安全-最小化外部接入网络
通过字段spec.loadBalancerSourceRanges
实现,参阅文档 (opens new window)。
当使用spec.type: LoadBalancer
的服务时,可以使用spec.loadBalancerSourceRanges
指定允许访问负载均衡器的 IP 范围。此字段采用 IP CIDR 范围列表,Kubernetes 将使用这些范围来配置防火墙例外。目前,仅 Google Compute Engine、Google Container Engine 和 AWS 支持此功能。如果云提供商不支持该功能,则将忽略此字段。
假设10.0.0.0/8
是内部子网。在以下示例中,将创建一个负载均衡器,该负载均衡器只能由群集内部 IP 访问。这将不允许来自 Kubernetes 集群外部的客户端访问负载均衡器。
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
ports:
- port: 8765
targetPort: 9376
selector:
app: example
type: LoadBalancer
loadBalancerSourceRanges:
- 10.0.0.0/8
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
下面的示例创建了一个负载均衡器,该负载均衡器只允许 IP 地址为130.211.204.1
和130.211.204.2
的客户端访问:
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: example
type: LoadBalancer
loadBalancerSourceRanges:
- 130.211.204.1/32
- 130.211.204.2/32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
编辑 (opens new window)