kubernets之服务资源

一  服务集群内部或者客户端与pod的通信桥梁

 

    kubernets集群的内部pod访问为啥不能使用传统的IP:PORT的形式?

    • pod是短暂的,它们会随时启动或者关闭,原因可能是pod所在的节点下线了,或者管控者RC,RS,DS,JOB,CronJob等的移除
    • pod的IP在调度前才会分配IP,因此客户端无法提前预知到pod的IP地址
    • pod的水平伸缩性,预示这,客户端无需关注pod的ip,相反所有的pod都应该通过一个唯一并且固定的IP进行访问才能符合pod的这一特性

   

二  认识services

 

   结合以上所述场景,kubernets提供了一种servier的资源,services拥有一个固定的IP以及端口,客户端通过这个端口来访问services管理下面的pod

即使管理的pod由于节点下线,或者管控器的缩放导致pod的数量增加或者减少(减少后的数量始终应该大于等于1),客户端仍然可以通过services的IP以及端口

来访问剩下的pod所提供的服务,而无需管理pod的实际IP,同时也实现了负载均衡的作用

 

三  定义service

  3.1  在定义service之前我们可以先创建包含三个pod的RC,RC通过标签来组织管理pod,同样的svc也是通过标签来为pod提供统一IP和端口暴露

    3.1.1  RC以及SVC的定义文件展示

 

RC的文件展示
apiVersion: v1
kind: ReplicationController
metadata:
  name: kubia
spec:
  replicas: 3
  selector:
    app: kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
        - name: kubia
          image: luksa/kubia
          ports:
          - containerPort: 8080

 

SVC的文件定义展示

apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
sessionAffnity: ClientIp ports:
- port: 80 targetPort: 8080 selector: app: kubia
sessionAffnity这个参数添加的话可以让每次同一个client访问的pod都是同一个,称之为svc的会话亲和性

  3.2  创建RC以及SVC的结果显示

[root@node01 Chapter05]# k get po
NAME          READY   STATUS    RESTARTS   AGE
kubia-c8fnf   1/1     Running   0          10m
kubia-k4fkm   1/1     Running   0          10m
kubia-kr6bc   1/1     Running   0          10m

[root@node01 Chapter05]# k describe svc kubia
Name:              kubia
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=kubia
Type:              ClusterIP
IP Families:       <none>
IP:                10.109.29.64
IPs:               <none>
Port:              <unset>  80/TCP
TargetPort:        8080/TCP
Endpoints:         10.244.1.47:8080,10.244.2.42:8080,10.244.2.43:8080

 

  3.3  验证能否通过服务的唯一IP:PORT来访问刚才创建的pod

 

[root@node01 Chapter05]# k get po
NAME          READY   STATUS    RESTARTS   AGE
kubia-c8fnf   1/1     Running   0          138m
kubia-k4fkm   1/1     Running   0          138m
kubia-kr6bc   1/1     Running   0          138m

[root@node01 Chapter05]# k get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   3d2h
kubia        ClusterIP   10.109.29.64   <none>        80/TCP    133m
[root@node01 Chapter05]# k exec kubia
-c8fnf -- curl -s http://10.109.29.64 You've hit kubia-k4fkm
[root@node01 Chapter05]# k exec kubia-c8fnf -- curl -s http://10.109.29.64 You've hit kubia-c8fnf
[root@node01 Chapter05]# k exec kubia-c8fnf -- curl -s http://10.109.29.64 You've hit kubia-kr6bc
[root@node01 Chapter05]# k exec kubia-c8fnf -- curl -s http://10.109.29.64 You've hit kubia-k4fkm

通过在节点上面以其中之一的pod里面访问服务暴露出来的ip:port能够访问到服务关联的pod里面的应用,并且每次都是随机的去访问pod的应用

 

  3.4 上面的例子可以很好的说明了对于pod内部的应用是单端口的情况下的访问情况,但是如果pod内部的应用属于两个或两个以上的端口呢?kubernets提供了什么解决方案

下面看这个双端口的pod是如何被服务映射出来的

apiVersion: v1
kind: Service
metadata:
  name: kubia
spec:
  ports:
  - port: 80
    targetPort: 8080
  - port: 443
    targetPort: 8443
  selector:
    app: kubia

 没错,正如你所见,只需要单纯的在spce.ports里面添加pod需要映射出来的端口,是不是很简单?

  

  3.5 另外kubernets还支持使用别名的形式来命名pod里面需要映射的端口号,这么做的好处显而易见,就是在pod修改端口号的时候,由于svc里面只是引用端口的别名,所有svc不需要

更改也能正确的映射出pod修改后的端口号

  现在分别对pod和svc的配置文件列出来作出说明

  pod

kind: Pod
spec:
  containers:
  - name: kubia
    ports:
    - name: http
      containerPort: 8080
    - name: https
      containerPort: 8443

  svc

 

kind: Service
spec:
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https

 

 

 

  

posted @ 2020-12-24 00:11  伊铭(netease)  阅读(214)  评论(4编辑  收藏  举报