1. 部署web组件
(1)创建名为web-deployment.yaml yaml文件。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: web
spec:
replicas: 1
selector:
mathLabels:
app: pets
service: web
template:
metadata:
labels:
app: pets
service: web
spec:
containers:
- image: fundamentalsoftdocker/ch08-web:1.0
name: web
ports:
- containerPort: 3000
protocol: TCP
(2)使用kubectl部署Deployment对象。
$ kubectl create -f web-deployment.yaml
(3)使用kubernetes命令查看第2步创建的部署
(4)定义服务的配置文件,名为web-service.yaml,内容如下。
apiVersion: v1
kind: Service
metadata:
name: web
spec:
type: NodePort
ports:
- port: 3000
protocol: TCP
selector:
app: pets
service: web
(5)使用kubectl创建服务的对象。
$ kubectl create -f web-service.yaml
(6)列出创建的服务
(7)对部署的服务进行测试
$ IP=$(minikube ip)
$ curl -4 $IP:30125/
Pets Demo Application
2. 部署数据库
有状态的组件和无状态的组件应该区分开来,作不同的对待,比如web组件和数据库组件。
kubernetes针对有状态的组件定义了一个指定类型的ReplicaSet. 该对象叫StatefulSet.
(1)定义文件名为db-stateful-set.yaml,内容如下。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db
spec:
selector:
matchLabels:
app: pets
service: db
serviceName: db
template:
metadata:
labels:
app: pets
service: db
spec:
containers:
- image: fundamentalsofdocker/ch08-db:1.0
name: db
ports:
- containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: pets-data
volumeClaimTemplates:
- metadata:
name: pets-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
(2) 使用kubectl创建刚才定义的对象
$ kubectl create -f db-stateful-set.yaml
(3)查看我们创建的对象
(4)创建服务的文件,名称为db-service.yaml,内容如下。
apiVersion: v1
kind: Service
metadata:
name: db
spec:
type: ClusterIP
ports:
- port: 5432
protocol: TCP
selector:
app: pets
service: db
(5)使用下面的命令部署服务。
$ kubectl create -f db-service.yaml
(6)使用浏览器测试部署的服务
3. 移除上面部署的应用
kubectl delete svc/web
kubectl delete deploy/web
kubectl delete svc/db
kubectl delete statefulset/db
4. 简化部署
从上面部署两个应用我们创建了四个文件去部署到群集中,而且这只是一个简单的应用,包含web和数据库两个组件。想一下现实中的应用比这复杂的多,部署起来是相当的麻烦。有些方法可以简化应用,使用一个单一的文件部署应用。比如使用包管理器Helm.
假如我们的应用包含多个kubernetes对象,比如Deployment和服务的对象,那么可以把它放在一个文件内,并通过定义三个破折号对每个对象分别定义。 比如,针对web组件想要有一个部署和服务定义在一个文件中,看起来如下。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: web
spec:
replicas: 1
selector:
matchLabels:
app: pets
service: web
template:
metadata:
labels:
app: pets
service: web
spec:
containers:
- image: fundamentalsofdocker/ch08-web:1.0
name: web
ports:
- containerPort: 3000
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: web
spec:
type: NodePort
ports:
- port: 3000
protocol: TCP
selector:
app: pets
service: web
5. 针对Pets应用把针对四个对象的定义全放在pets.yaml文件中,然后部署应用。
pets.yaml文件内容如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: web
spec:
replicas: 1
selector:
matchLabels:
app: pets
service: web
template:
metadata:
labels:
app: pets
service: web
spec:
containers:
- image: fundamentalsofdocker/ch08-web:1.0
name: web
ports:
- containerPort: 3000
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: web
spec:
type: NodePort
ports:
- port: 3000
protocol: TCP
selector:
app: pets
service: web
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db
spec:
selector:
matchLabels:
app: pets
service: db
serviceName: db
template:
metadata:
labels:
app: pets
service: db
spec:
containers:
- image: fundamentalsofdocker/ch08-db:1.0
name: db
ports:
- containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: pets-data
volumeClaimTemplates:
- metadata:
name: pets-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
---
apiVersion: v1
kind: Service
metadata:
name: db
spec:
type: ClusterIP
ports:
- port: 5432
protocol: TCP
selector:
app: pets
service: db
![](https://blog.xiodi.cn/wp-content/uploads/2018/07/d8bbdcf89189fbc9f81cf72f1ee62a68.png)
6.同样,也可以使用一个脚本对创建的应用删除。
脚本内容如下:
kubectl delete deploy/web
kubectl delete svc/web
kubectl delete statefulset/db
kubectl delete svc/db