Service 的作用
每个 pod 都有一个自己的IP,pod 崩溃后会有新的 pod 代替它,但 IP 就变了,这个 pod 对外提供服务,IP 的变化就对调用端产生了影响,解决方法就是使用 service。
service 逻辑上代表了一组 pod,具有相同 label 的 pod 就是一组,service 有自己的 ip,是不变的,客户端只需要访问 service 的 ip,kubernetes 负责维护 service 和 pod 的映射关系,无论 pod 如何变化,service 不变,对客户端没有影响。
创建 service
先创建 deployment(httpd.yml):
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
启动:
kubectl apply -f httpd.yml
查看 pod:
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP
httpd-8c6c4bd9b-kqxsk 1/1 Running 0 86s 10.1.1.184
httpd-8c6c4bd9b-whkzq 1/1 Running 0 86s 10.1.1.185
httpd-8c6c4bd9b-xfgr9 1/1 Running 0 86s 10.1.1.183
...
启动了3个 pod,每个都有自己的 ip,可以通过各个 pod 的 ip 访问服务:
curl 10.1.1.184
<html><body><h1>It works!</h1></body></html>
创建 service(httpd-svc.yml):
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector:
run: httpd
ports:
- protocol: TCP
port: 8080
targetPort: 80
启动:
kubectl apply -f httpd-svc.yml
查看 service :
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-svc ClusterIP 10.152.183.3 <none> 8080/TCP 22s
service 的 ip 是 10.152.183.3,端口是 8080,访问:
curl 10.152.183.3:8080
<html><body><h1>It works!</h1></body></html>
可以访问到后面的 pod。
DNS 访问 service
kubernetes 中的 kube-dns 组件是一个 DNS 服务器,每当有新的 service 创建时,kube-dns 会添加 dns 记录,cluster 中的 pod 可以通过 <service_name>.<namespace_name> 访问 service。
例如:
kubectl run busybox --rm -ti --image=busybox /bin/sh
/ # wget httpd-svc:8080
Connecting to httpd-svc:8080 (10.152.183.174:8080)
index.html 100% |*******************************| 45 0:00:00 ETA
使用了一个临时的 pod 验证了 DNS 特性,说明在一个 pod 中可以通过 service name 访问 service。