软件开发架构师

第六章 通过Service访问Pod(上)

架构 302 2019-03-22 23:12

不应该直接使用Pod的ID地址作为对外提供服务的接口,应为一旦Pod重启,IP地址就变化了,解决方案是使用Service。

6.1 创建Service

  K8s service从逻辑上代表了一组Pod,具体是哪些Pod则由label来挑选的。

     service有自己的IP,而且这个IP是不变的,客户端只需要访问Service的IP,K8s负责建立和维护service和Pod的映射关系。无论Pod如何变化,对客户端无影响。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 3
  template:
    metadata:
      labels: run: httpd # 定义label给service用
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80             # port对外暴露的端口

部署之后,可以直接通过IP地址访问Pod:

kubeusr@GalaxyKubernetesMaster:~$ kubectl get pods -o wide
NAME                     READY     STATUS              RESTARTS   AGE       IP             NODE
httpd-749bf8c6f4-d86vf   1/1       Running             0          5m        10.244.1.209   galaxykubernetes02
httpd-749bf8c6f4-lwp5g   1/1       Running             0          5m        10.244.2.113   galaxykubernetes03
httpd-749bf8c6f4-pldb4   0/1       ContainerCreating   0          5m        <none>         galaxykubernetes01
kubeusr@GalaxyKubernetesMaster:~$ curl 10.244.1.209:80
<html><body><h1>It works!</h1></body></html>

 接下来定义service,并部署,

apiVersion: v1
kind: Service
metadata:
  name: httpd-svc              # service 名字
spec:
  selector:
    run: httpd                 # selector指明挑选 label为run:httpd 的Pod作为Service的后端。
  ports:
  - protocol: TCP                 
    port: 8080                 # service的端口; service的8080端口映射到Pod的80端口
    targetPort: 80             # Port的端口

 如下,httpd-svc分配到一个CLUSTER-IP 10.101.103.107可以通过该IP访问后端的httpd Pod

kubeusr@GalaxyKubernetesMaster:~$ kubectl get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
httpd-svc    ClusterIP   10.101.103.107   <none>        8080/TCP   6s
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP    127d
kubeusr@GalaxyKubernetesMaster:~$ curl 10.101.103.107:8080
<html><body><h1>It works!</h1></body></html>

 通过kubectl describe可以查看httpd-svc与pod的对应关系:

kubeusr@GalaxyKubernetesMaster:~$ kubectl describe service httpd-svc
Name:              httpd-svc
Namespace:         default
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"httpd-svc","namespace":"default"},"spec":{"ports":[{"port":8080,"protocol":"TC...
Selector:          run=httpd
Type:              ClusterIP
IP:                10.101.103.107
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints: 10.244.1.209:80,10.244.2.113:80              # 罗列了三个Pod的id地址和端口。
Session Affinity:  None
Events:            <none>

 

  

  

  

  

文章评论