前言
前面文章《K8S部署一个C/S架构的服务器应用(重点讲Service)》中研究过K8s 的三种服务:ClusterIP、NodePort、LoadBalancer。其中ClusterIP仅支持内部访问,NodePort和LoadBalancer既支持内部访问也支持外部访问。其实K8S还提供了一种很重要的服务Headless,即无头服务,一般应用于分布式应用程序、mysql、redis等。
一、Headless介绍
在分布式应用场景下,由于应用程序已经有了自己的负载均衡策略,所以就不再需要使用 Service 提供的负载均衡功能。在mysql或者redis应用场景下,它们需要直接访问后端pod。针对这些情况,K8S提供了 Headless Service,这类 Service 不会分配 ClusterIP。
Headless服务就是一组Pod组成的只供集群内访问的Service,一般结合StatefulSet用于部署有状态应用的场景,因为是有状态的,所以想找到对应的Pod,可以直接通过pod名称.svc名称.命名空间.svc.cluster.local组成的域名访问。该 Service 的请求流量不需要 kube-proxy 处理,也不会有负载均衡和路由规则,而是由ClusterDNS的域名解析机制直接去访问固定的Pod资源。
二、Headless部署
1.服务部署
server.cpp代码见前篇文章《K8S部署一个C/S架构的服务器应用(重点讲Service)》。
server-dockerfile文件如下:
# 使用Ubuntu作为基础镜像
FROM ubuntu:20.04
# 安装编译依赖
RUN apt-get update && apt-get install -y g++
RUN mkdir /home/myapp
ADD server.cpp /home/myapp
WORKDIR /home/myapp
RUN g++ server.cpp -o server
CMD ["./server"]
docker build -f ./server-dockerfile -t server:v5 .生成server:v5镜像。
server.yaml文件如下:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: server-sts
spec:
selector:
matchLabels:
app: server-pod
serviceName: "server-headless-svc"
replicas: 2
template:
metadata: #pod的元数据
labels: #labels标签,必填一个
app: server-pod
spec: #pod的期望状态
containers: #容器
- name: server #容器名称
image: server:v5 #镜像
ports: #容器的端口
- containerPort: 5188
---
apiVersion: v1 #版本
kind: Service #创建资源的类型
metadata: #资源的元数据
name: server-headless-svc #资源的名称,是元数据必填项
labels: #labels标签
app: server-headless-svc
spec: #期望状态
clusterIP: None #无头服务
ports: #端口
- port: 30060
targetPo

最低0.47元/天 解锁文章
2042

被折叠的 条评论
为什么被折叠?



