k8s集群核心概念Service

一、场景

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

二、Service简介

1 Service介绍

  • 不是实体服务
  • 是一条iptable或者ipvs的转发规则

2 Service作用

  • 通过Service为pod客户端提供访问pod方法,即客户端访问pod入口
  • Service通过Pod标签与Pod进行关联

在这里插入图片描述

3 Service类型

类型解释yaml文件注意字段
cluster(default)内部客户端向稳定的内部IP地址发送请求type:ClusterIP
NodePort客户端向使用Service指定的一个或多个nodePort值的节点的IP地址发送请求type:NodePort
LoadBalancer客户端向网络负载均衡的ip地址发送请求type:LoadBalancer
ExternalName内部客户端使用service的DNS服务作为外部DNS名称的别名type:ExternalName
Headless如果你需要对Pod分组,但是不需要稳定的IP地址,就可以使用Headless服务type:Headless

4 Service参数

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

三、Service创建

Service的创建在工作中有两种方式,一是命令行创建,二是通过资源清单文件YAML文件创建

创建Service时,kubernetes会创建一个与Service同名的EndPoints对象。kubernetes使用Endpoints对象来跟踪哪些Pod属于Service的成员

1 通过资源清单YAML文件创建

编写用于创建Service资源清单文件

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-apps
  labels:
    app: nginx        
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginxapps
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports: 
        - containerPort: 88
        resources:
          limits:
            cpu: '1'
            memory: 1Gi
          requests:
            cpu: 200m
            memory: 512Mi
---                      
apiVersion: v1
kind: Service
metadata:
  name: nginx-apps
spec:
  selector:
    app: nginx  # 具有app=nginx-app标签的pod都属于该服务
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 88 # 该服务的可用端口
    targetPort: 80  # 服务将连接转发的容器的端口

应用用于创建Service资源清单文件

root@k8s1:/home# kubectl apply -f 04-create-deployment-service-clusterip.yaml 
deployment.apps/nginx-apps created
service/nginx-apps created

验证资源对象创建结果

root@k8s1:/home# kubectl get deployments.apps 
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
nginx-apps          1/1     1            1           10s



root@k8s1:/home# kubectl get service
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP      PORT(S) 
nginx-apps           ClusterIP   10.233.7.4      <none>           88/TCP                       2m24s



root@k8s1:/home# curl http://10.233.7.4:88
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

2 基于资源清单YAML文件创建NodePort类型Service

编写资源清单文件

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app-nodeport
  labels:
    app: nginx-app        
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-app 
  template:
    metadata:
      labels:
        app: nginx-app
    spec:
      containers:
      - name: nginxapp
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports: 
        - containerPort: 88
        resources:
          limits:
            cpu: '1'
            memory: 1Gi
          requests:
            cpu: 200m
            memory: 512Mi
---                      
apiVersion: v1
kind: Service
metadata:
  name: nginx-app
spec:
  selector:
    app: nginx-app  # 具有app=nginx-app标签的pod都属于该服务
  type: NodePort
  ports:
  - protocol: TCP
    nodePort: 30001
    port: 88 # 该服务的可用端口
    targetPort: 80  # 服务将连接转发的容器的端口

应用资源清单文件

root@k8s1:/home# kubectl apply -f 05-create-deployment-service-nodeport.yaml 
deployment.apps/nginx-app-nodeport created
service/nginx-app created

验证资源对象创建情况

root@k8s1:/home# kubectl get service
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP      PORT(S) 
nginx-app            NodePort    10.233.12.32    <none>           88:30001/TCP                 63s

查看k8s集群所有主机30001端口侦听状态

root@k8s1:/home# ss -anput | grep ":30001"
tcp     LISTEN        0         128                            0.0.0.0:30001                                              0.0.0.0:*                              users:(("kube-proxy",pid=1607146,fd=19))   

在k8s集群外访问Service

在物理机浏览器中访问即可验证

地址:服务器ip:30001

在这里插入图片描述

四、删除Service

通过命令行删除

root@k8s1:/home# kubectl delete service nginx-app 
service "nginx-app" deleted

通过资源清单YAML文件删除

root@k8s1:/home# kubectl delete -f 05-create-deployment-service-nodeport.yaml 
deployment.apps "nginx-app-nodeport" deleted
service "nginx-app" deleted
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐