k8s入门知识之Service

143 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

背景

经过我们之前的学习,已经能够了解到如何利用Deployment来创建Pod并提供具有高可用性的服务。 虽然每个Pod都会分配一个单独的Pod IP,然而在我们从使用过程中却仍然能够发现如下的两个问题:

  • Pod IP 会随着Pod的重建产生变化
  • Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问 这样2个问题对于访问这个服务带来了致命的问题,故此k8s创造出Service来解决这个2个问题问题。下面我们就来简单了解下Service。

简介 Service可以看作是一组由Deployment创建的同类Pod对外的统一访问接口。借助Service这个桥梁,Pod应用可以方便地与外界实现通讯并实现服务发现和负载均衡。 Service和Pod、Deployment、Label之间的关系大致如下图所示: service.png

  • Deployment创建了一组Pod
  • Label标识这一组Pod是什么类型的
  • Service通过Label并提供访问接口到Pod

操作 1.创建内部访问Service

# 暴露Service
[root@master ~]# kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
service/svc-nginx1 exposed

# 查看service
[root@master ~]# kubectl get svc svc-nginx1 -n dev -o wide
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE     SELECTOR
svc-nginx1   ClusterIP   10.109.179.231   <none>        80/TCP    3m51s   run=nginx

# 这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的
# 可以通过这个IP访问当前service对应的POD
[root@master ~]# curl 10.109.179.231:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body>
<h1>Welcome to nginx!</h1>
.......
</body>
</html>

2.创建内外部均能访问的Service

# 上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问
# 如果需要创建外部也可以访问的Service,需要修改type为NodePort
[root@master ~]# kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
service/svc-nginx2 exposed

# 此时查看,会发现出现了NodePort类型的Service,而且有一对Port(80:31928/TC)
[root@master ~]# kubectl get svc  svc-nginx2  -n dev -o wide
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE    SELECTOR
svc-nginx2    NodePort    10.100.94.0      <none>        80:31928/TCP   9s     run=nginx

# 接下来就可以通过集群外的主机访问 节点IP:31928访问服务了
# 例如在的电脑主机上通过浏览器访问下面的地址
http://192.168.5.4:31928/

3.删除一个Service

[root@master ~]# kubectl delete svc svc-nginx-1 -n dev service "svc-nginx-1" deleted

4.配置方式 创建一个svc-nginx.yaml,内容如下

apiVersion: v1
kind: Service
metadata:
  name: svc-nginx
  namespace: dev
spec:
  clusterIP: 10.109.179.231 #固定svc的内网ip
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: ClusterIP

接下来我们就可以愉快地进行操作了 创建命令:kubectl create -f svc-nginx.yaml 删除命令:kubectl delete -f svc-nginx.yaml

总结 至此,已经掌握了Namespace、Pod、Deployment、Service资源的基本操作,有了这些操作,就可以在kubernetes集群中实现一个服务的简单部署和访问了,但是如果想要更好的使用kubernetes,我们还需要深入地去学习这些知识点,比如Service有哪些模型,有哪些类型,各种类型和模型下Pod与Pod之间的交互原理又是怎样的?kubeproxy又在其中充当了什么角色?等等。 总之,只有你想不到的,没有k8s做不到的,太强了简直!