持续创作,加速成长!这是我参与「掘金日新计划 · 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之间的关系大致如下图所示:
- 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做不到的,太强了简直!