Service:让客户端发现pod并与之通信

创建服务,利用单个地址访问一组pod

服务是虚拟的网络管理,不涉及实实在在的pod,所以确保已经创建好了pod,可以使用前面的yaml创建,如

$ k create -f kubia-replicaset.yaml                                                                                                                                          130 ↵
replicaset.apps/kubia created
k create -f -<<EOF
apiVersion: apps/v1
kind: ReplicaSet             
metadata:
  name: kubia
spec:
  replicas: 3
  selector:
    matchLabels:
      app: kubia            
  template:
    metadata:
      labels:
        app: kubia           
    spec:
      containers:
      - name: kubia
        image: luksa/kubia
EOF

服务也有yaml描述文件

同样,大家不要刻意记忆,理解就好,后面用到可以到这里copy/paste。创建它

使用clusterip访问

上面有个服务CLUSTER-IP(172.22.2.238),要换成你自己的,找到它访问一下,可以这样

kubectl exec 是用来执行pod中指令的,所以kubia-77bv5是一个pod,大家要换成自己环境的。curl的-s是silent意思,只输出结果

使用集群内域名机制访问

每个服务都有唯一的域名,如这个服务对应的域名是

kubia.<liuzongxian换成你的命名空间>.svc.cluster.local

这个域名在集群内部都是可以直接使用的,如:

如果在同一个集群、同一个命名空间,可以直接使用http://kubia代替,会简洁一些

无法ping通服务ip的原因

我们都习惯ping服务,但实际上集群内部的服务概念是虚拟的,需要结合端口才有意义。

将服务公开给外部客户端

上面的方式其实叫做ClusterIP方式,仅能内部访问,那怎样外部客户端访问呢?

使用NodePort方式

为每个节点开一个独一无二的端口供这个服务占用,客户端使用节点ip+端口方式访问,请创建下面这个服务

查看一下

由于阿里云开的资源默认没有分配公网ip,需要使用内网测试,内网ip可以从节点的名字中找到,如下图的 10.32.100.48

这里稍稍复杂一些,我们启动了一个busybox的pod来测试内网端口

效果如图

使用负载均衡器

create它,然后看看,然后请找到自己的External IP,就是外网负载均衡器了。

通过Ingress反向代理

这里ingress名字比较诡异,但其实就是nginx服务帮你转发。

创建效果如下

ingress 也是一种资源,同pod/svc类似的

从上面的Address代表了nginx外网ip,配置到/etc/hosts下,我们就可以用浏览器输入域名访问了,对必须输入域名。 😛

清理资源

到现在创建了不少资源了,清空一下自己空间的资源吧。

就绪探针Readiness Probe

pod成功用的是健康探测,但是服务还不一定准备好,没有准备好服务的pod不应该对外提供服务,所以要加readiness检测。

上面描述指明,只要/var/ready不存在,就还不能对外提供服务

能看到全都没有提供服务,没有进入READY状态,我们进入一个pod满足它,然后再看状态

已经ready了,此时service才能让它对外提供服务

好的,至此你完成非常难的一个小节了,应该给自己鼓鼓掌!本章节也是日常经常用到的内容。

思考题

  • 请说说就绪探针、健康探针

最后更新于

这有帮助吗?