Service Discovery¶
Kubernetes 服务的自动发现。
源码 https://github.com/xiaopeng163/flask-redis
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-deployment
spec:
replicas: 1
selector:
matchLabels:
app: redis-server
template:
metadata:
labels:
app: redis-server
spec:
containers:
- name: redis-server
image: redis:latest
command:
- redis-server
- --requirepass
- redis
ports:
- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
selector:
app: redis-server
ports:
- protocol: TCP
port: 6379
targetPort: 6379
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask-deployment
spec:
replicas: 1
selector:
matchLabels:
app: flask-app
template:
metadata:
labels:
app: flask-app
spec:
containers:
- name: flask-app
image: xiaopeng163/flask-redis
ports:
- containerPort: 5000
env:
- name: REDIS_HOST
value: ????????????????????????
---
apiVersion: v1
kind: Service
metadata:
name: flask-service
spec:
selector:
app: flask-app
ports:
- protocol: TCP
port: 8000
targetPort: 5000
DNS¶
(国内无法访问google的朋友,请替换下面image为 xiaopeng163/hello-app:1.0)
$ kubectl create deployment demo --image=gcr.io/google-samples/hello-app:1.0 --port=8080
$ kubectl expose deployment demo
这时不仅有一个clusterIP可供整个cluster访问,同时一个DNS域名也被注册了(类似前面讲过的POD)。
我们可以在集群节点上访问以下域名,(当然要指定DNS server是coredns的地址)
$ kubectl get svc --namespace kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 37d
$ nslookup demo.default.svc.cluster.local 10.96.0.10
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: demo.default.svc.cluster.local
Address: 10.105.71.223
也就是 <service name>.<namespace>.svc.cluster.local
如果在创建一个pod,在pod里可以访问到demo这个service以及后面的deployment
$ kubectl run client --image=xiaopeng163/net-box --command -- sh -c "sleep 100000"
$ kubectl exec -it client -- sh
/omd # nslookup demo.default.svc.cluster.local
;; Truncated, retrying in TCP mode.
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: demo.default.svc.cluster.local
Address: 10.105.71.223
/omd # curl demo.default.svc.cluster.local:8080
Hello, world!
Version: 1.0.0
Hostname: demo-557f884dd8-7n55c
/omd #
ENV¶
另外一些环境变量也会在集群内注册。这时候如果我们创建另外一个POD
$ kubectl run client --image=xiaopeng163/net-box --command -- sh -c "sleep 100000"
$ kubectl exec -it client -- sh
/omd # env | grep DEMO
DEMO_SERVICE_HOST=10.105.71.223
DEMO_PORT_8080_TCP_ADDR=10.105.71.223
DEMO_PORT_8080_TCP_PORT=8080
DEMO_PORT_8080_TCP_PROTO=tcp
DEMO_PORT=tcp://10.105.71.223:8080
DEMO_SERVICE_PORT=8080
DEMO_PORT_8080_TCP=tcp://10.105.71.223:8080