ClusterIP

ClusterIP

我们将使用以下命令从一个 Pod 模板创建一个 Pod。

$ kubectl run nginx --image nginx --dry-run=client -o yaml > pod-template.yaml
$ kubectl create -f pod-template.yaml

pod/nginx created

$ kubectl expose pod nginx --port=80

service/nginx exposed

$ kubectl get svc

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   25m
nginx        ClusterIP   10.104.209.243   <none>        80/TCP    7m15s

运行以下命令查看 Nginx 服务的详细信息。

$ kubectl describe service nginx

Name:              nginx
Namespace:         default
Labels:            run=nginx
Annotations:       <none>
Selector:          run=nginx
Type:              ClusterIP
IP:                10.104.209.243
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.46.0.0:80
Session Affinity:  None
Events:            <none>

访问 Ningx。根据自己的环境,用下面的命令更改集群 IP。

$ curl 10.104.209.243

...
<title>Welcome to nginx!</title>
...

$ kubectl logs -f nginx

10.40.0.0 - - [10/May/2020:17:31:56 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"

$ kubectl delete svc nginx

service "nginx" deleted

然后使用 vim primeiro-service-clusterip.yaml

apiVersion : v1
kind : Service
metadata :
   labels :
     run : nginx
  name : nginx-clusterip
  namespace : default
spec :
   ports :
  - port : 80
    protocol : TCP
    targetPort : 80
  selector :
     run : nginx
  type : ClusterIP

创建服务:

$ kubectl create -f primeiro-service-clusterip.yaml

service/nginx-clusterip created

$ kubectl get services

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes        ClusterIP   10.96.0.1       <none>        443/TCP   28m
nginx-clusterip   ClusterIP   10.109.70.243   <none>        80/TCP    71s

$ kubectl describe service nginx-clusterip

Name:              nginx-clusterip
Namespace:         default
Labels:            run=nginx
Annotations:       <none>
Selector:          run=nginx
Type:              ClusterIP
IP:                10.109.70.243
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.46.0.1:80
Session Affinity:  None
Events:            <none>

$ kubectl delete -f primeiro-service-clusterip.yaml

service "nginx-clusterip" deleted

然后我们修改下 sessionAffinity 属性:

apiVersion : v1
kind : Service
metadata :
   labels :
     run : nginx
  name : nginx-clusterip
  namespace : default
spec :
   ports :
  - port : 80
    protocol : TCP
    targetPort : 80
  selector :
     run : nginx
  sessionAffinity : ClientIP
  type : ClusterIP

再次创建服务:

$ kubectl create -f primeiro-service-clusterip.yaml

service/nginx-clusterip created

$ kubectl get services

NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes        ClusterIP   10.96.0.1      <none>        443/TCP   29m
nginx-clusterip   ClusterIP   10.96.44.114   <none>        80/TCP    7s

$ kubectl describe service nginx

Name:              nginx-clusterip
Namespace:         default
Labels:            run=nginx
Annotations:       <none>
Selector:          run=nginx
Type:              ClusterIP
IP:                10.96.44.114
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.46.0.1:80
Session Affinity:  ClientIP
Events:            <none>

有了这些,现在我们就可以维护会话了,也就是说,它将与同一个 pod 保持连接,尊重客户端的原 IP。如果有必要,可以将超时值改为 sessionAffinity(默认值为 10800 秒,即 3 小时),只需添加以下配置即可。

sessionAffinityConfig:
  clientIP:
    timeoutSeconds: 10

现在我们可以删除服务。

$ kubectl delete -f primeiro-service-clusterip.yaml

service "nginx-clusterip" deleted

EndPoint

每当我们创建一个服务,就会自动创建一个端点。端点无非就是服务要使用的 IP pod,比如我们创建服务类型 ClusterIP 的时候就有你的 IP,对吧?现在,当我们打到这个 IP 的时候,它就会通过这个 IP,即 EndPoint 重定向连接到 Pod。要列出已创建的 EndPoints,请运行命令。

$ kubectl get endpoints

NAME         ENDPOINTS         AGE
kubernetes   10.142.0.5:6443   4d

$ kubectl describe endpoints kubernetes

Name:         kubernetes
Namespace:    default
Labels:       <none>
Annotations:  <none>
Subsets:
  Addresses:          172.31.17.67
  NotReadyAddresses:  <none>
  Ports:
    Name   Port  Protocol
    ----   ----  --------
    https  6443  TCP

Events:  <none>

让我们做一个例子,对于这个,我们将执行一个部署的创建,将副本的数量增加到 3 个,然后是一个服务,这样我们就可以更详细地看到将创建的端点。

$ kubectl create deployment nginx --image=nginx

deployment.apps/nginx created

$ kubectl get deployments.apps

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           5s

将 nginx 部署扩展到 3 个副本。

$ kubectl scale deployment nginx --replicas=3

deployment.apps/nginx scaled

$ kubectl get deployments.apps

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           1m5s

$ kubectl expose deployment nginx --port=80

service/nginx exposed

$ kubectl get svc

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   40m
nginx        ClusterIP   10.98.153.22   <none>        80/TCP    6s

访问 nginx:

curl 10.98.153.22

...
<h1>Welcome to nginx!</h1>
...

查看端点:

kubectl get endpoints

NAME         ENDPOINTS                                AGE
kubernetes   172.31.17.67:6443                        44m
nginx        10.32.0.2:80,10.32.0.3:80,10.46.0.2:80   3m31s

查看 nginx 端点的详细信息:

$ kubectl describe endpoints nginx

Name:         nginx
Namespace:    default
Labels:       app=nginx
Annotations:  endpoints.kubernetes.io/last-change-trigger-time: 2020-05-10T17:47:05Z
Subsets:
  Addresses:          10.32.0.2,10.32.0.3,10.46.0.2
  NotReadyAddresses:  <none>
  Ports:
    Name     Port  Protocol
    ----     ----  --------
    <unset>  80    TCP

Events:  <none>

以 YAML 格式查看端点。

$ kubectl get endpoints -o yaml

apiVersion: v1
items:
- apiVersion: v1
  kind: Endpoints
  metadata:
    creationTimestamp: "2020-05-10T17:06:12Z"
    managedFields:
    - apiVersion: v1
      fieldsType: FieldsV1
      fieldsV1:
        f:subsets: {}
      manager: kube-apiserver
      operation: Update
      time: "2020-05-10T17:06:12Z"
    name: kubernetes
    namespace: default
    resourceVersion: "163"
    selfLink: /api/v1/namespaces/default/endpoints/kubernetes
    uid: 39f1e237-f9cc-4553-a32d-95402ff52f6c
...
    - ip: 10.46.0.2
      nodeName: elliot-03
      targetRef:
        kind: Pod
        name: nginx-f89759699-dmt4t
        namespace: default
        resourceVersion: "6805"
        uid: 6a9c4639-78ee-44c6-8eb1-4fd90d308189
    ports:
    - port: 80
      protocol: TCP
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

移除相关的资源:

$ kubectl delete deployment nginx

deployment.apps "nginx" deleted

$ kubectl delete service nginx

service "nginx" deleted