Kubeernetes服务(services)
在 Cilium Kubernetes Ingress HTTP配置案例 我困扰于如何给Ingress配置External-IP,这需要理解Kubernetes对 公开为网络服务的抽象方法 :
在 Kubernetes 中,通常使用
deployment来部署应用,此时会使用pod。但是需要注意pod是一个有生命周期的非永久性资源,会被动态创建和销毁pod的生生死死,分配的IP地址不同,所以需要使用一种方式来管理提供工作负载的后端(也就是workload概念)services资源就是定义一组pod的访问策略 (也就是微服务) ,service针对的pod集合通常是使用 标签和选择器(labels and selectors) 来确定在
deployment中,后端的pod是可以互换(不区分)的,前端不应该也不必知道后端,而是通过service来管理当
service中的pod集合发生变化(pod的创建和销毁),则kube-apiserver提供的Endpoints资源就会更新,以提供查询(Kubernetes API 服务发现)
例如,我在 Kubernetes集群(z-k8s)使用nerdctl 定义了 deployment :
apiVersion: apps/v1
kind: Deployment
metadata:
name: z-dev
labels:
app: z-dev
tier: frontend
namespace: z-dev
spec:
# replicas: 2
selector:
matchLabels:
app: z-dev
tier: frontend
template:
metadata:
labels:
app: z-dev
tier: frontend
spec:
containers:
- name: z-dev
image: fedora-systemd
imagePullPolicy: Never
securityContext:
privileged: true
ports:
- containerPort: 22
name: z-dev-ssh
- containerPort: 80
name: z-dev-http
- containerPort: 443
name: z-dev-https
备注
在构建 deployment 中定义 labels 可以配合后面的 service 中的 selector ,也就把 pod 和 service 关联了起来,这就是 标签和选择器(labels and selectors) 的秘密
然后,我又可以针对上述 worklod ( deployment ) 来定义 service :
apiVersion: v1
kind: Service
metadata:
name: z-dev-service
namespace: default
spec:
selector:
app: z-dev
ports:
- name: z-dev-ssh
protocol: TCP
port: 22
targetPort: 22
- name: z-dev-http
protocol: TCP
port: 80
targetPort: 80
- name: z-dev-https
protocol: TCP
port: 443
targetPort: 443
备注
定义 service 中的 port 可以映射到任意 targetPort ,而默认情况下, targetPort 设置成与 port 相同值
NodePort类型 Kubernetes服务
Service.Type=NodePort
LoadBalancer类型 Kubernetes服务
Service.Type=LoadBalancer