k8s重器之Service

Service是k8s的核心,经过建立Service,能够为一组具备相同功能的容器应用提供一个统一的入口地址,并将请求进行负载分发到各个容器应用上。html

目录:node

Service定义详解nginx

Service基本用法程序员

集群外部访问Pod和Service面试

1、Service定义详解vim

Service的定义比Pod简单。api

apiVersion: v1
kind: Service
metadata:
  name: string
  labels:
    name: string
  annotations:
    name: string
spec:
  type: string  
  selector:
    name: string
  clusterIP: string   #虚拟服务ip,缺省默认分配
  sessionAffinity: string    #是否支持session,可选值为ClientIP,表示同一个客户端
  ports:
  - name: string
    protocol: string    #端口协议,支持TCP、UDP,默认是TCP
    port: int  #宿主机端口
    targetPort: int  #目标Pod的端口
    nodePort: int  #k8s内部端口
  status:
    loadBalancer:
      ingress:
        ip: string
        hostname: string

  

上述定义中的spec.type有两个选项:浏览器

当为NodePort时,须要配置nodePort映射到指定端口
当为LoadBalancer,须要在status中设置外部负载均衡器

2、Service基本用法bash

(1)经过yaml文件建立:微信

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    name: nginx-pod
  ports:
  - name: nginx-service
    port: 80
    targetPort: 80
    nodePort: 30080

  

好比上述,定义了一个Service,对应的是具备key=name,value=nginx-pod这个标签的Pod,type定义为NodePort,宿主机端口为80,对应Pod端口为80,而nodePort为30080

经过以下命令建立Service

kubectl create -f service-name.yaml

  

建立以后查看:

 

可看到Service被分配的ip,对应的port以及选择的标签信息

(2)负载均衡

目前k8s提供了两种负载均衡策略:RoundRobin和SessionAffinity

一、RoundRobin:轮询模式

二、SessionAffinity:基于客户端IP地址进行会话保持模式,请求第一次到哪一个Pod,则后续还会继续转发到那个Pod。

默认状况下,采用轮询模式,但也能够 经过设置spec.sessionAffinity设置为ClientIP启用SessionAffinity策略

接下来验证一下默认的轮询模式:

建立两个具备key=name,value=nginx-pod标签的Pod,容器内运行nginx。

nginx-one:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod1
  labels:
    name: nginx-pod
spec:
  containers:
  - name: nginx-pod1
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

  

nginx-two:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod2
  labels:
    name: nginx-pod
spec:
  containers:
  - name: nginx-pod2
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

  

建立完两个容器以后,分别进入两个容器修改nginx首页的字样。

进入容器:

kubectl exec -it  nginx-pod1 /bin/bash

  

找到文件并进行修改,此处须要注意的是,由nginx镜像建立的容器并不具备vim和vi这两个编辑工具,因此这边使用sed或echo都行

sed命令替换字符串格式是:

sed -i 's/须要被替换字符串/替换后字符串/g' file-name
sed -i 's/Welcome to nginx!/Welcome to nginx-pod two!/g' /usr/share/nginx/html/index.html

  

修改好后在浏览器访问:使用ip:nodePort访问

 

 

能够看到,service进行了负载均衡处理。

3、集群外部访问Pod和Service

(1)将Pod的端口号映射到宿主机

好比将上述的nginx-pod1映射到主机的20080端口:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod1
  labels:
    name: nginx-pod
spec:
  containers:
  - name: nginx-pod1
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
      hostPort: 20080

  

而后查看此Pod在哪一个节点上运行

 

而后在浏览器中访问此节点的20080端口:

 

(2)经过设置Pod级别的hostNetwork=true

该Pod的全部容器的端口号都将被直接映射到宿主机上,须要注意的是,若是不指定hostPort,则默认与containerPort同样,若是指定 ,则hostPort必须等于containerPort。

例如将上述的nginx-pod2设置hostNetwork=true

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod2
  labels:
    name: nginx-pod
spec:
  hostNetwork: true
  containers:
  - name: nginx-pod2
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

  

查看pod建立后在哪一个节点上

 

在浏览器上访问:

 

(3)将Service的端口号映射到宿主机上

经过设置spec.type为NodePort,同时设置spec.ports.nodePort设置宿主机上的端口号。

例如在Service基本用法那一小节的Service定义,相应的使用也在那一节有

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    name: nginx-pod
  ports:
  - name: nginx-service
    port: 80
    targetPort: 80
    nodePort: 30080

  

===============================

我是Liusy,一个喜欢健身的程序员。

欢迎关注微信公众号【Liusy01】,一块儿交流Java技术及健身,获取更多干货,领取Java进阶干货,领取最新大厂面试资料,一块儿成为Java大神。

来都来了,关注一波再溜呗。

相关文章
相关标签/搜索