6、service(pod对外暴露端口)

4.5 Service

通过上节课的学习,已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。

虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:

  • Pod IP 会随着Pod的重建产生变化
  • Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问

这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。

Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/10/image_d7f2ed85346cce5cc991e3595fe22339.png

4.5.1 创建集群内部可访问的Service

**前面第5节我们创建的pod 要访问他需要查看他的IP 但是此IP是能集群内部访问 IP还会变化 并且外面环境是无法访问的 **

1
2
# 查看dev下面pod信息
kubectl get pods -n dev -o wide

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/10/image_8b1f4ccbd33ebc304d15abd941459981.png

一. 创建集群内部可以访问的service

1、集群内部访问

环境准备:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1  # 版本
kind: Deployment # 类型
metadata: # 源数据
name: nginx # 当前deployment所属的名字
namespace: dev # 及ns
spec:
replicas: 3 # 定义副本数
selector: # 标签选择器
matchLabels: # 选择nginx标签
run: nginx
template: # 以下为pod 模板
metadata:
labels: # 标签
run: nginx # 定义标签为nginx
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:nginx-latest
name: svc-nginx1
ports:
- containerPort: 80
protocol: TCP

查看deployment

1
2
3
4
# 查看deployment
kubectl get deployment
# 查看pod详细信息
kubectl get pods -n dev -o wide --show-labels

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/10/image_821d88f11ed23a952dae411a39c3790a.png

参数:

  • –port: 80 程序内部端口
  • –target-port:80 需要暴露的端口即80转发到80
  • deploy nginx : deployment名称是nginx
  • –name=svc-nginx1: 此为pod名称

返回:

  • ClusterIP:10.108.11.19 为集群IP 只有集群内部才可以访问
1
2
3
4
5
# 创建集群内部可以访问的service
kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
# 验证
kubectl get svc -n dev -o wide
curl 10.108.11.19

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/10/image_8ebae5ea44fcdb5fb5b65604aa82a768.png

**此时我们访问就不访问podIP了我们访问service的ip加端口 此时其实是做了一个负载均衡他会随机转发到一个pod去提供服务 **

2、实现集群外部访问

  • 上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问
  • 如果需要创建外部也可以访问的Service,需要修改type为NodePort
  • –name=svc-nginx2 ns dev下deployment pod控制器nginx会再创建一个pod名称为svc-nginx2的容器
1
2
3
4
# 集群外部访问
kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
# 验证
kubectl get svc -n dev --show-labels -o wide

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/10/image_5ab57120fd8c0a8abb13b2e210b5033b.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/10/image_57002295d9abf70b483e20dedcb2e54f.png

3、删除service

1
2
# 删除service
kubectl delete svc svc-nginx2 -n dev

4、配置方式

创建一个svc-nginx.yaml,内容如下:

需要修改type为NodePort (修改type类型为NodePort即可实现外部访问)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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,就需要深入学习这几种资源的细节和原理。