如果你最近在学习k8s相关内容,那么这篇内容不可错过,deployment是K8s中最核心的对象,这篇文章将通过一个最简单的例子来介绍下deployment。
pod是k8s中最基础的单元,而deployment是对pod的抽象体现,deployment主要保证实现配置所声明的状态。
下面将会介绍一个完整的nginx deployment示例。
deployment配置文件通常使用yaml格式,其中包含的主要配置有如下几项:
apiVersion
Kind
metadata
spec
在k8s中不仅deployment,其它诸如services, Replica Set, Configmap, Jobs都是被称作对象。
下面具体介绍上面几个配置的含义:
1.apiVersion
目前所使用的k8s对象的版本,生产环境默认使用apps/v1,属于生产稳定版本,另外还有其他如:Alpha:早期的候选版本,Beta:API 在 Alpha 测试后即成为 beta 版本,stable:不包含 alpha 和 beta 的 API 属于稳定类别。
2.kind
它用于声明当前配置文件要创建的资源对象类型。
kind: Deployment
3.metadata
它的作用在于定义对象的元数据信息,常用字段有name、namespace、labels、annotations等
其中labels:主要用于对Deployment对象进行分组和分类的键值对。
Name:表示要创建的 Deployment 的名称。
Namespace:要在其中创建Deployment的命名空间的名称。
Annotations:键值对(如标签),但用于不同的使用案例。
metadata:
name: my-nginx
labels:
app: nginx
4.spec
核心部分,描述对象期望的状态,常用字段有replicas、selector、template
其中selector用于选择哪些pod用于该deployment管理,template其实是pod的模板,会包括其对应的metadata及spec(包括containers及volumes定义存储卷(ConfigMap、Secret、PVC 等))
如:
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
将会通过如下几步来给出一个deployment的实践
我们先创建一个独立的命名空间,便于管理 Nginx 相关的资源。
kubectl create namespace demo-nginx
或者使用 YAML 文件:
apiVersion: v1
kind: Namespace
metadata:
name: demo-nginx
创建一个 Deployment 来运行 Nginx,设置 3 个副本。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: demo-nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
应用配置:
kubectl apply -f nginx-deployment.yaml
验证:
kubectl get pods -n demo-nginx -o wide
Deployment 会启动多个 Pod,而 Pod IP 是临时的,因此我们需要创建 Service 来统一访问入口。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: demo-nginx
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # Service 暴露的端口
targetPort: 80 # Pod 内部容器端口
type: ClusterIP # 只在集群内可访问
应用配置:
kubectl apply -f nginx-service.yaml
查看:
kubectl get svc -n demo-nginx
如果你需要 集群外部访问,可以把 Service 类型改为 NodePort 或通过 Ingress Controller 暴露。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: demo-nginx
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080 # 手动指定 NodePort(范围 30000-32767)
type: NodePort
访问方式(浏览器或 curl):
http://<NodeIP>:30080
✅ 最终结果:
demo-nginx
命名空间中创建了一个 Nginx Deployment(3 个 Pod)。Service
暴露 Pod,并根据需要使用 NodePort 或 Ingress 对外提供访问。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。