k8s service的概念以及创建方法

Service 的功能:

  • Service主要用于提供网络服务,通过Service的定义,能够为客户端应用提供稳定的访问地址(域名或IP地址)和负载均衡功能,以及屏蔽后端Endpoint的变化,是K8s实现微服务的核心资源。

Service主要解决了什么问题:

  • 引入Service主要是解决Pod的动态变化,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。
  • 由于pod的不稳定性,比如水平扩展时,pod异常时生成新的pod,都会让pod拥有新的ip地址,这不利于前端的访问,所以需要把pod绑定到固定的IP(域名)上,所以Service就出现了。

本文主要介绍Service的创建方法,命令行模式和声明模式,

Service主要是为Pod提供统一访问入口的资源对象,所有需要先创建一个pod

  1. 创建Pod

     kubectl run nginx --image=nginx --port=80 --labels="app=nginx" 
    
  • kubectl run nginx : 创建一个名为nginx的pod
  • --image=nginx:使用nginx镜像文件
  • --port=80:声明服务的端口
  • --labels="app=nginx" :给pod打上标签
    note: 如果pod想要外部访问,必须打上标签
  1. 命令行模式创建service并绑定" app = nginx" 的pod

     kubectl expose pod nginx --port=80 --target-port=80  --type=NodePort
    
  • kubectl expose pod nginx : 创建一个svc,svc的名称就是nginx,自动选择nginx pod的标签
  • --port=80: svc的端口
  • --target-port=80:容器的端口
  • --type=NodePort:svc的类型,NodePort模式,会自动把svc的80端口映射到所有node主机的随机端口(端口范围:30000-32767),这样客户端可以通过任意node主机的IP + 端口访问到Pod。

svc的几种类型

类型 描述
ClusterIP 集群内部使用
NodePort 对外暴露应用端口(集群外可访问)
LoadBalancer 对外暴露应用,将Service映射到一个已存在的负载均衡器的IP地址上,适合公有云
ExternalName 将Service映射为一个外部域名地址,通过externalName字段进行设置

查看svc

# kubectl get svc nginx -o wide
bash 复制代码
NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE   SELECTOR
nginx   NodePort   10.105.125.73   <none>        80:30974/TCP   12m   app=nginx
  • CLUSTER-IP : Service地址(是一个不会变化的ip地址)
  • PORT(S): svc端口和node端口的映射
  • SELECTOR: 通过标签选择绑定哪些Pod

由于已经通过NodePort模式将svc的端口映射到了node主机的 30974 端口,即可以通过node的ip加端口访问到Pod的服务

  1. 通过yaml 文件声明式的创建svc

    编写yaml文件

     # cat nginx.yaml
    
    bash 复制代码
    apiVersion: v1			# api版本
    kind: Service			# 绑定资源类型,首字符必须大写
    metadata:				# metadata 元数据
     name: nginx-svc			# 定义 svc的名称
     labels:				# 下面是定义标签
      tier: frontend		
    spec:				# 规格
     ports:				# 定义端口,svc和pod
      - port: 80		# svc的端口
    	protocol: TCP		# 协议
        targetPort: 80		# 容器的端口
     selector:			# 标签选择
      app: nginx
     type: NodePort		# svc 类型

    创建svc(svc 是service的简写)

    查看那些资源对象存在简写: kubectl api-resources

     # kubectl create -f  nginx.yaml
    

    查看svc

     # kubectl get svc nginx-svc -o wide
    
    bash 复制代码
    NAME        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE     SELECTOR
    nginx-svc   NodePort   10.107.55.165   <none>        80:32238/TCP   5m40s   app=nginx
  • -o wide : 显示更多信息

    svc nginx-svc的类型为 NodePort 同样可以通过 node的ip加端口访问到pod 里的容器服务。

Additional information:

可以使用命令行创建svc的使用使用 -o yaml输出yaml格式信息。

例如:

kubectl expose pod nginx --port=80 --target-port=80  --type=NodePort --dry-run=client  -o yaml
bash 复制代码
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
status:
  loadBalancer: {}
  • --dry-run=client : 以客户端的模式运行(运行测试并不生效)
  • -o yaml:以yaml格式输出

--dry-run=client ,以客户端的方式尝试运行,配置 -o yaml 输出简略的信息
--dry-run=server ,以服务端的方式运行,配合-o yaml 输出非常详细的信息

kubectl expose pod nginx --port=80 --target-port=80  --type=NodePort --dry-run=server -o yaml
bash 复制代码
Error from server (AlreadyExists): services "nginx" already exists
  • 在server模式下,由于 svc nginx 已经存在所以报错,删除svc nginx即可正常显示
相关推荐
老大白菜3 小时前
Windows 11 安装 Dify 完整指南 非docker环境
windows·docker·容器
tntlbb7 小时前
Ubuntu20.4 VPN+Docker代理配置
运维·ubuntu·docker·容器
Gabriel_liao8 小时前
Docker安装Neo4j
docker·容器·neo4j
有一个好名字8 小时前
zookeeper分布式锁模拟12306买票
分布式·zookeeper·云原生
Anna_Tong10 小时前
云原生大数据计算服务 MaxCompute 是什么?
大数据·阿里云·云原生·maxcompute·odps
豆豆豆豆变11 小时前
Docker轻量级可视化工具Portainer
docker·容器·自动化运维
花晓木11 小时前
k8s etcd 数据损坏处理方式
容器·kubernetes·etcd
运维&陈同学11 小时前
【模块一】kubernetes容器编排进阶实战之基于velero及minio实现etcd数据备份与恢复
数据库·后端·云原生·容器·kubernetes·etcd·minio·velero
花晓木11 小时前
k8s备份 ETCD , 使用velero工具进行备份
容器·kubernetes·etcd
大熊程序猿11 小时前
xxl-job docker 安装
运维·docker·容器