Kubernetes 实践之 service

service是k8s最核心的概念。通过创建service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上去

service定义详解

ymal格式的service定义文件的完整内容如下

apiVersion: v1            #必须
kind: Service              #必须
matadata:               #必须,元数据
  name: string             #必须,service的名称
  namespace: string          #非必须,指定的namespace名称,与rc在同一个namespace即可
  labels:                #非必须,service的标签
    - name: string
  annotations:             #非必须,service的注解属性信息
    - name: string
spec:                  #必须,详细描述
  selector: []              #必须,lable selector设置,选择具有执行lable标签的pod作为管理范文
  type: string             #必须,service的类型,指定service的访问方式,默认为cluster ip,用于k8s内部的pod访问, node上的kube-proxy通过设置iptables 转发
                       nodePort,使用 宿主机的端口,是能够访问各node的外部客户通过node的ip地址和端口就能访问服务                                     loadbalancer: 使用外接负载均衡完成服务到负载的分发,需要在spec.status.loadBalancer字段指定负载均衡器的ip,并同时定义nodePort和clusterIP  clusterIP: string          #非必须,虚拟服务器ip地址
  sessionAffinity: string       #非必须,是否支持session,可选值为cluster ip
  ports:                 #端口       
  - name: string            #端口名称  
    protocol: string          #协议类型
    port: int              #服务监听的端口号,service clusterip的端口
    targetPort: int           #需要转发到后端pod的端口
    nodePort: int            #container port 映射到宿主机的端口
  status:                 #当type 为loadBalancer时,说这负载均衡的地址
    loadBalancer:
      ingress:              #外部负载均衡
        ip: string           #负载均衡器的ip地址
        hostname: string        #外部负载均衡的主机名
  • 一、service的基本用法

创建一个包含两个tomcat副本rc,并为其创建一个service

[[email protected]_master tomcat-service-rc]# cat webapp-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
    name: webapp
    labels:
        name: webapp
spec:
    replicas: 2
    selector:
        name: webapp
    template:
        metadata:
            labels:
                name: webapp
        spec:
            containers:
            - name: webapp
              image: tomcat
              imagePullPolicy: IfNotPresent
              ports:
              - containerPort: 8080

[[email protected]_master tomcat-service-rc]# kubectl create -f webapp-rc.yaml  

#创建service并查看
[[email protected]_master tomcat-service-rc]# kubectl expose rc webapp    #通过命令行快速创建,一般不采用
service "webapp" exposed

[[email protected]_master tomcat-service-rc]# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kubernetes   10.254.0.1       <none>        443/TCP    272d
webapp       10.254.185.154   <none>        8080/TCP   12s
[[email protected]_master tomcat-service-rc]# kubectl describe svc webapp
Name:            webapp
Namespace:        default
Labels:            name=webapp
Selector:        name=webapp
Type:            ClusterIP
IP:            10.254.185.154
Port:            <unset>    8080/TCP
Endpoints:        10.1.20.2:8080,10.1.34.2:8080
Session Affinity:    None
No events.

此时在两个node 上通过clusterip:8080 均可以访问 tomcat服务,service将请求分发到两台容器上,默认采用了RoundRobin(轮训rr)模式,  SessionAffinity : 基于客户端ip地址进行会话保持的模式,即第一次访问哪个pod,以后的请求都访问这个pod

#通过yaml文件的方式创建自定义的service
[[email protected]_master tomcat-service-rc]# cat webapp-service.yaml
apiVersion: v1
kind: Service
metadata:
    name: webapp1
    labels:
        name: webapp
spec:
    ports:
      - port: 8081
        targetPort: 8081
    selector:
        name: webapp

[[email protected]_master tomcat-service-rc]# kubectl create -f webapp-service.yaml

#查看两个service
[[email protected]_master tomcat-service-rc]# kubectl describe svc webapp webapp1
Name:            webapp
Namespace:        default
Labels:            name=webapp
Selector:        name=webapp
Type:            ClusterIP
IP:            10.254.185.154
Port:            <unset>    8080/TCP
Endpoints:        10.1.20.2:8080,10.1.34.2:8080
Session Affinity:    None
No events.

Name:            webapp1
Namespace:        default
Labels:            name=webapp
Selector:        name=webapp
Type:            ClusterIP
IP:            10.254.179.138
Port:            <unset>    8081/TCP
Endpoints:        10.1.20.2:8080,10.1.34.2:8080
Session Affinity:    None
No events.

创建一个不带标签选择器的service,即无法选择后端pod,系统不会自动创建endpoint,因此需要手动创建一个和该service同名的endpoint,用于指向实际的后端访问地址,如下:

  • 二、集群外部访问pod或者service

  pod和service是集群内的虚拟概念,所有集群外的客户端系统无法通过pod的ip地址或者service的虚拟ip地址和端口访问到他们,为了让客户端能够访问到他们,需要将pod或者service的地址和端口映射到宿主机。

①、将容器应用的端口映射到物理机

容器级别映射

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    name: webapp
spec:
  containers:
  - name: webapp
    image: tomcat
    ports:
    - containerPort: 8080       #容器端口
      hostPort: 8081          #宿主机端口(物理机)

  pod级别的设置,hostNetwork=true,该pod中所有容器的端口号都被直接映射到物理机上,使用此设置的时候要注意,如果该容器的ports定义部分不指定hostPort(物理机端口),则默认hostPort等于containerPort,如果指定了hostPort,则hostPort必须等于containerPort的值

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    name: webapp
spec:
  hostNetwork: true
  containers:
  - name: webapp
    image: tomcat
    ports:
    - containerPort: 8080

此时会将tomcat容器运行的所有端口映射到创建pod的物理机上

②、将service的端口号映射到物理机

  • A、设置NodePort映射到物理机,同时设置service的类型为NodePort
[[email protected]_master tomcat-service-rc]# cat webapp-rc.yaml     #创建一个rc
apiVersion: v1
kind: ReplicationController
metadata:
    name: webapp
    labels:
        name: webapp
spec:
    replicas: 2
    selector:
        name: webapp
    template:
        metadata:
            labels:
                name: webapp
        spec:
            containers:
            - name: webapp
              image: tomcat
              imagePullPolicy: IfNotPresent
              ports:
              - containerPort: 8080

[[email protected]_master tomcat-service-rc]# cat webapp-service.yaml
apiVersion: v1
kind: Service
metadata:
    name: webapp
    labels:
        name: webapp
spec:
    type: NodePort
    ports:
      - port: 8080          #service虚拟端口
        targetPort: 8080      #容器端口
        nodePort: 30001        #各node节点开启的端口,端口范围 3000-32767
    selector:
        name: webapp

查看

[[email protected]_master tomcat-service-rc]# kubectl get svc -o wide
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE       SELECTOR
kubernetes   10.254.0.1      <none>        443/TCP          273d      <none>
webapp       10.254.44.190   <nodes>       8080:30001/TCP   24s       name=webapp
  • B、设置LoadBalancer映射到公网云服务商(或nginx/lvs/harpoxy)提供的LoadBalancer地址,对该service的访问请求将会通过LoadBalancer转发到后端pod上,分发机制依赖于LoadBalancer的实现机制,仅供格式参考
apiVersion: v1
kind: Service
metadata:
    name: my-webapp
    labels:
        name: my-webapp
spec:
    ports:
      - protocol: TCP
        port: 8080
        targetPort: 8080
        nodePort: 30001
    clusterIP: 10.254.44.191
    LoadBalancerIP: 10.20.203.100
    type: LoadBalancer
    selector:
        name: webapp
status:
    LoadBalancer:
        ingress:
        - ip: 10.20.203.100
  • 三、DNS服务搭建

  为了实现通过服务的名字在集群内部进行服务的相互访问,需要创建虚拟DNS服务来完成服务名到clusterip的解析

k8s提供的虚拟dns服务名为skydns,由四个组件构成

  • (1) etcd: DNS存储
  • (2) kube2sky: 将k8s master中的service 注册到etcd
  • (3) skydns: 提供skydns的解析服务
  • (4) healthz:提供对skydns服务的健康检查功能

工作原理解析

  • 1、kube2sky容器应用通过调用k8s master的api获得集群中所有srvice的信息,并持续监控新service的生成,然后写入etcd中
  • 2、根据kubelet启动参数设置(--cluster-dns),kubectl会在每个新创建的pod中设置dns域名解析配置文件/etc/resolv.conf,在其中增加一条nameserver和一条search
  • 3、最后应用程序就能够像访问网站域名一样,通过服务的名字就能访问到服务器了

具体搭建信息看 kubernetes DNS

  • 四、Ingress: HTTP 7层路由

  service的表现形式为IP.Port,工作在tcp/ip层,对于基于http的服务来说,不同的url地址要对应到不同的后端服务或者虚拟服务器上去,这些要求通过service机制无法实现,k8s 1.1以后增加的ingress 可以将不同的url访问请求转发到后端不同的service,实现http的业务路由机制,在k8s中需要ingress的定义和ingress controller的定义结合起来,才能形成完整的http负载分发能力

示例: 暂时略过

原文地址:https://www.cnblogs.com/FRESHMANS/p/9342793.html

时间: 2024-08-01 08:17:16

Kubernetes 实践之 service的相关文章

kubernetes实践指南(四)

一.安装docker二.安装kubelet三.安装kube-proxy四.验证集群可用性五.bootstrap说明 一.安装docker [[email protected] yaml]# docker version Client: Version: 17.06.0-ce API version: 1.30 Go version: go1.8.3 Git commit: 02c1d87 Built: Fri Jun 23 21:20:36 2017 OS/Arch: linux/amd64 这

Kubernetes 控制器之 Service 讲解(七)

一.背景介绍 我们这里准备三台机器,一台master,两台node,采用kubeadm的方式进行安装的,安装过程大家可以参照我之前的博文. IP 角色 版本 192.168.1.200 master kubeadm v1.13.0 192.168.1.201 node01 kubeadm v1.13.0 192.168.1.202 node02 kubeadm v1.13.0 我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.D

kubernetes 实践之Pod

首先看一个例子,Guestbook,对k8s对于容器应用的基本操作和用法进行理解,本例通过pod .RC.Service等资源对象创建完成,架构图: ①.创建redis-master的RC和Service [[email protected]_master php-redis]# cat redis-master-controller-RC.yaml apiVersion: v1 kind: ReplicationController metadata: name: redis-master #

kubernetes实践之一:kubernetes二进制包安装

kubernetes二进制部署 1.环境规划 软件 版本 Linux操作系统 CentOS Linux release 7.6.1810 (Core) Kubernetes 1.9 Docker 18.09.3 etcd 3.3.10 角色 IP 组件 推荐配置 k8s_master etcd01 192.168.1.153 kube-apiserver kube-controller-manager kube-scheduler etcd CPU 2核+ 2G内存+ k8s_node01 et

kubernetes实践之二:Kubernetes可视WEB UI Dashboard搭建

Kubernetes可视WEBUI Dashboard搭建 支持浏览器:火狐 一.Dashboard下载地址 git clone https://github.com/kubernetes/kubernetes/ 二.部署Dashboard需要文件 [root@k8s_master ui]# ll 总用量 28 -rwxr-xr-x 1 root root  833 3月  20 19:13 dashboard-cert.sh -rwxr-xr-x 1 root root  264 3月  20

kubernetes实践指南(一)

一.Docker相关内容二.Kubernets简介三.kuadm安装k8s 一.Docker相关内容 1.Docker工具集 Docker三剑客:Compse.swarm.machine docker compose:适用于单机,容器编排定义 docker swarm:对所有Docker宿主机资源整合,集群管理 docker machine:初始化Docker环境,跨平台支持 mesos+marathonmesos:主机资源整合分配调度管理工具的框架marathon:基于Mesos的私有PaaS

K8S实践Ⅳ(Service)

一.Service概念 通过创建service可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求负载分发到后端的各个容器应用上. 二.Service基本用法 1.定义一个web服务的RC,由两个tomcat容器副本组成 # cat webapp-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: webapp spec: replicas: 2 template: metadata: name: we

第五章 Kubernetes进阶之Service与外界连通

1.Pod与Service的关系 Pod出现故障以后Deployment会根据策略重启Pod,但是重启Pod会生成新的IP,需要引入Service概念保证访问正常 Service 防止Pod失联 定义一组Pod访问策略 支持ClusterIP,NodePort以及LoadBanlancer三种类型 Service的底层主要有Iptables和IPVS两种网络模式 2.Service的定义 Pod与Service的关系 通过label-selector相关联 通过Service实现Pod的负载均衡

kubernetes 实践三:使用kubeadm安装k8s1.16.0

环境版本说明: 三台vmware虚拟机,系统版本CentOS7.6. Kubernetes 1.16.0,当前最新版. flannel v0.11 docker 18.09 使用kubeadm可以简单的搭建一套k8s集群环境,而不用关注安装部署的细节,而且现在k8s的版本更新频率很快,所以这种方法十分推荐. 相关准备 注:本节相关操作要在所有节点上执行. 硬件环境 使用三台vmware虚拟机,配置网络,并保证可以联网. k8s-master 4G 4核 CentOS7 192.168.10.20