关于 Service
Kubernetes Service 定义了这样一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 —— 通常称为微服务。 这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector(查看下面了解,为什么可能需要没有 selector 的 Service)实现的。
举个例子,考虑一个图片处理 backend,它运行了3个副本。这些副本是可互换的 —— frontend 不需要关心它们调用了哪个 backend 副本。 然而组成这一组 backend 程序的 Pod 实际上可能会发生变化,frontend 客户端不应该也没必要知道,而且也不需要跟踪这一组 backend 的状态。 Service 定义的抽象能够解耦这种关联。
对 Kubernetes 集群中的应用,Kubernetes 提供了简单的 Endpoints API,只要 Service 中的一组 Pod 发生变更,应用程序就会被更新。 对非 Kubernetes 集群中的应用,Kubernetes 提供了基于 VIP 的网桥的方式访问 Service,再由 Service 重定向到 backend Pod。
[root@k8s-master ~]# vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
selector:
app: nginx
role: web
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 80
type: NodePort
[root@k8s-master ~]# vim nginx-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
role: web
spec:
containers:
- name: nginx
image: nginx:1.10
ports:
- containerPort: 80
[root@k8s-master ~]# kubectl create -f nginx-deployment.yaml
[root@k8s-master ~]# kubectl create -f nginx-service.yaml
暴露内部端口为10.10.10.239:8080
对外暴露端口为192.168.30.22:44860
[root@k8s-master ~]# kubectl get svc
nginx-service NodePort 10.10.10.239 <none> 8080:44860/TCP
[root@k8s-node1 ~]# curl 10.10.10.239:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[root@k8s-node2 ~]# curl 10.10.10.239:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>