文章都可以转载、引用,标明转载出处即可。

kubernetes 1.5 配置(三)

Kubernetes Mr.c 1566℃ 0评论

  上一篇写了kubernetes 创建一个RC 的过程,但是单纯的有RC 是不行的,如果一台node上就启动一个pod还可以采用端口映射的方式单独占用一个端口,但是如果这太node上要启动两个一样的pod呢,那就没办法使用hostPort 定义端口了,这时需要kubernetes的另外一个重要组件——Service
  Service是定义一系列Pod以及访问这些Pod的策略的一层抽象。Service通过Label找到Pod组。因为Service是抽象的,所以在图表里通常看不到它们的存在,这也就让这一概念更难以理解。
例如通过定义一个RC启动了4个pod,如何让外部能优雅的调用到这几个pod提供的服务?由于pod的IP地址可能随时发生变化(当一个pod被重启后IP就会重新获取IP地址),在pod的外层使用nginx等进行负载也就不太方便了,而Service 就是解决这个问题而存在的。
  Service 可以根据pod的标签将对应的所有pod纳入一个负载均衡组的形式,通过kube-proxy 进行数据转发,可提供一个唯一的入口地址,提供对外调用。

Service 创建网络服务一般分为集群内部访问(clusterIP )和集群外部访问(NodePort)模式:
  clusterIP 的方式会创建一个虚拟IP地址,该地址没有基于某个实际网卡创建,所以在宿主机上是无法访问的,仅能在集群内部访问,也就是在容器内部访问;
  NodePort 是通过映射端口到宿主机的方式,访问地址为宿主机IP地址加上端口的方式,和hostPort 类似,但是NodePort 会在kubernetes集群的所有node上监听,也就是说创建一个Service ,配置了一个NodePort 监听30000端口,那么集群内所有的node都会监听30000端口,不管访问该node上有没有对应的pod,随意访问任何一台node的30000端口都可以被转发到正确的后端pod中;

下面是一个例子创建基于clusterIP 创建
对应的RC使用上章写的nginx服务:

[root@cnyunwei kubernetes_data]# cat ng-cn.yml
---  
apiVersion: v1  
kind: ReplicationController  
metadata:  
  name: ng-rc
spec:  
  replicas: 2
  selector:  
    app: ng-rc 
  template:   
    metadata:  
      labels:  
        app: ng-rc
    spec:  
      containers:  
      - name: ng-rc 
        image: nginx  
        ports:  
        - containerPort: 80 

创建一个ng-cn-sr.yml 文件:

[root@cnyunwei kubernetes_data]# vim ng-cn-sr.yml 
apiVersion: v1  
kind: Service  
metadata:  
  name: ng-svc
  labels:  
    name: ng-svc 
spec: 
  ports:  
  - port: 88
    targetPort: 80  
    protocol: TCP
  selector:  
    app: ng-rc

kind: Service 指定创建一个Service
– port: 88 指的是监听88端口
targetPort: 80 是指定后端pod监听的端口
selector:
app: ng-rc 指定具有app标签,且值为ng-rc 的pod全部纳入本组Service
创建好后可以查看到clusterIP和端口等信息

[root@cnyunwei ~]# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
kubernetes   192.168.0.1              443/TCP           35d
ng-svc       192.168.60.120           88/TCP            42s

该IP是虚拟的,直接在master或者node上访问都访问不了:

[root@cnyunwei ~]# curl -I 192.168.60.120:88
curl: (7) Failed to connect to 192.168.60.120 port 88: Connection timed out

  我们需要进入到容器中,在master上通过kubectl exec -ti podName 即可进入容器,nginx等镜像采用精简版Ubuntu构建,大部分命令都没有,需要初始化并安装一些基本工具。

[root@cnyunwei ~]# kubectl exec -ti ng-rc-j7n7g /bin/bash
root@ng-rc-j7n7g:/# apt-get update
root@ng-rc-j7n7g:/# apt-get  install  procps   net-tools  inetutils-ping  curl
root@ng-rc-j7n7g:/# curl -I 192.168.60.120:88
HTTP/1.1 200 OK
Server: nginx/1.13.12
Date: Fri, 27 Apr 2018 01:12:32 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
Connection: keep-alive
ETag: "5acb8e45-264"
Accept-Ranges: bytes

  测试集群容器内可以访问clusterIP ,在外部是无法访问到的,感觉这种模式存在很大的缺陷,还好有一个NodePort ,篇幅有点长,下文写NodePort

转载请注明:菜鸟运维网 » kubernetes 1.5 配置(三)

喜欢 (1)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 可以的q
    小轮子2018-04-28 15:05 回复