首页 k8s中的Service
文章
取消

k8s中的Service

一、 概述

我们可以通过Controller创建应用,可是当我们访问应用时,发现一个问题,Pod的状态不是认为控制的,Pod IP是在创建的时候分配的。假设Pod被误删除,被Controller重新拉起一个新的Pod时,我们发现Pod IP是变化的。如果访问必须更换IP地址,这样对于大量Pod运行应用来说,我们对Pod完全无法控制,因此在k8s集群中我们引入另一个新的概念:Service

本期目标

  • 了解Service的作用
  • 了解Serivce的类型
  • Serivce参数
  • Service创建方法
  • Service删除方法

二、相关概念

2.1 Service概念

  • Serivice不是一个实体服务,Service是一条iptables或ipvs的转发规则
  • 通过Service为Pod客户端提供访问Pod方法(即客户端访问Pod入口),Service通过Pod标签与Pod进行关联

2.2 Service类型

ClusterIP: 默认,分配一个集群内部可以访问的虚拟IP

NodePort: 在每个Node上分配一个端口作为外部访问入口

LoadBalancer: 工作在待定的Cloud Provider上,例如 Google Cloud,AWS,OpenStack

ExternalName: 表示把集群外部的服务引入到集群内部中来,即实现集群内部Pod和集群外部的服务进行通信

2.3 Service参数

常用端口参数

  • port: 访问Service使用的端口
  • targetPort: Pod中容器端口
  • NodePort: 通过Node实现外网用户访问k8s集群内部Service(30000-32767)

三、Service的创建

3.1 通过命令创建Service

先创建deployment应用,然后创建Service与Deployment应用关联,查看deployment应用:kubectl get deployment.apps,返回以下内容

1
2
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-app2   1/1     1            1           7m43s

创建Service

1
kubectl expose deployment.apps nginx-app2 --type=ClusterIP --target-port=80 --port=80

查看创建的Service

1
2
3
kubectl get service
# 或
kubectl get svc

返回以下内容

1
2
3
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   24h
nginx-app2   ClusterIP   10.104.130.50   <none>        80/TCP    6m58s

查看Service与Pod的端点关系,使用以下命令

1
kubectl get endpoints

返回以下内容

1
2
3
NAME         ENDPOINTS           AGE
kubernetes   192.168.64.4:6443   24h
nginx-app2   10.244.1.5:80       7m10s

3.2 通过资源清单创建Service

我们先在资源清单里定义Deployment应用,再定义Service,创建create-deployment-nginx-app-service.yaml资源清单文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 2
  selector:
    matchLabels:
      apps: nginx
  template:
    metadata:
      labels:
        apps: nginx
    spec:
      containers:
      - name: nginxapp
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app2-svc
spec:
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 80
  selector:
   apps: nginx

通过以下命令来创建

1
kubectl apply -f create-deployment-nginx-app-service.yaml

3.3 通过资源清单创建NodePort类型的Service

创建create-deployment-nginx-app3-service.yaml,定义内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app3
spec:
  replicas: 2
  selector:
    matchLabels:
      apps: nginx-app3
  template:
    metadata:
      labels:
        apps: nginx-app3
    spec:
      containers:
      - name: nginxapp3
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app3-svc
spec:
  type: NodePort
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30001
  selector:
   apps: nginx-app3

通过以下命令来创建

1
kubectl apply -f create-deployment-nginx-app3-service.yaml

3.4 删除Service

通过命令行删除

1
kubectl delete service nginx-app2

通过资源清单文件创建的可以通过资源清单文件删除,如下

1
kubectl delete -f create-deployment-nginx-app-service.yaml
本文由作者按照 CC BY 4.0 进行授权

k8s中的Ingress

k8s中的存储