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