k8s集群核心概念Service

x33g5p2x  于2021-11-16 转载在 其他  
字(3.9k)|赞(0)|评价(0)|浏览(546)

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资源清单文件

  1. ---
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: nginx-apps
  6. labels:
  7. app: nginx
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: nginx
  13. template:
  14. metadata:
  15. labels:
  16. app: nginx
  17. spec:
  18. containers:
  19. - name: nginxapps
  20. image: nginx:latest
  21. imagePullPolicy: IfNotPresent
  22. ports:
  23. - containerPort: 88
  24. resources:
  25. limits:
  26. cpu: '1'
  27. memory: 1Gi
  28. requests:
  29. cpu: 200m
  30. memory: 512Mi
  31. ---
  32. apiVersion: v1
  33. kind: Service
  34. metadata:
  35. name: nginx-apps
  36. spec:
  37. selector:
  38. app: nginx # 具有app=nginx-app标签的pod都属于该服务
  39. type: ClusterIP
  40. ports:
  41. - protocol: TCP
  42. port: 88 # 该服务的可用端口
  43. targetPort: 80 # 服务将连接转发的容器的端口

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

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

验证资源对象创建结果

  1. root@k8s1:/home# kubectl get deployments.apps
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. nginx-apps 1/1 1 1 10s
  4. root@k8s1:/home# kubectl get service
  5. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
  6. nginx-apps ClusterIP 10.233.7.4 <none> 88/TCP 2m24s
  7. root@k8s1:/home# curl http://10.233.7.4:88
  8. <!DOCTYPE html>
  9. <html>
  10. <head>
  11. <title>Welcome to nginx!</title>
  12. <style>
  13. html { color-scheme: light dark; }
  14. body { width: 35em; margin: 0 auto;
  15. font-family: Tahoma, Verdana, Arial, sans-serif; }
  16. </style>
  17. </head>
  18. <body>
  19. <h1>Welcome to nginx!</h1>
  20. <p>If you see this page, the nginx web server is successfully installed and
  21. working. Further configuration is required.</p>
  22. <p>For online documentation and support please refer to
  23. <a href="http://nginx.org/">nginx.org</a>.<br/>
  24. Commercial support is available at
  25. <a href="http://nginx.com/">nginx.com</a>.</p>
  26. <p><em>Thank you for using nginx.</em></p>
  27. </body>
  28. </html>

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

编写资源清单文件

  1. ---
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: nginx-app-nodeport
  6. labels:
  7. app: nginx-app
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: nginx-app
  13. template:
  14. metadata:
  15. labels:
  16. app: nginx-app
  17. spec:
  18. containers:
  19. - name: nginxapp
  20. image: nginx:latest
  21. imagePullPolicy: IfNotPresent
  22. ports:
  23. - containerPort: 88
  24. resources:
  25. limits:
  26. cpu: '1'
  27. memory: 1Gi
  28. requests:
  29. cpu: 200m
  30. memory: 512Mi
  31. ---
  32. apiVersion: v1
  33. kind: Service
  34. metadata:
  35. name: nginx-app
  36. spec:
  37. selector:
  38. app: nginx-app # 具有app=nginx-app标签的pod都属于该服务
  39. type: NodePort
  40. ports:
  41. - protocol: TCP
  42. nodePort: 30001
  43. port: 88 # 该服务的可用端口
  44. targetPort: 80 # 服务将连接转发的容器的端口

应用资源清单文件

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

验证资源对象创建情况

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

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

  1. root@k8s1:/home# ss -anput | grep ":30001"
  2. 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

通过命令行删除

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

通过资源清单YAML文件删除

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

相关文章