经过上文的创建文件测试可以感受到,通过run命令启动容器非常麻烦。其中docker提供了compose解决了这个问题,而kubernetes使用kubectl create命令就可以做到和compose一样的效果,该命令可以通过配置文件快速创建一个集群资源对象。
1、部署Deployment
创建一个名为nginx-deployment.yml的配置文件,以创建nginx服务为例进行说明
注意:各版本配置文件内容有所不同,具体请参照官方文档。
(例:v1.15版本apiVersion为extensions/v1beta1,在v1.16在这个版本中Deployment已经从extensions/v1beta1 弃用,更改为apps/v1)。
#API 版本号
apiVersion: apps/v1
#类型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Deployment
#元数据
metadata:
#Kind 的名称
name: nginx-app
spec:
selector: #定义标签选择器
matchLabels:
app: nginx
#部署的实例数量
replicas: 2
template:
metadata:
labels:
#容器标签的名字,发布 Service 时,selector 需要和这里对应
app: nginx
spec:
#配置容器,数组类型,说明可以配置多个容器
containers:
#容器名称
- name: nginx
#容器镜像,不能使用latest
image: nginx:1.17
imagePullPolicy: IfNotPresent
#暴露端口
ports:
#Pod 端口
- containerPort: 80
镜像拉取策略,支持三种ImagePullPolicy:
- Always:不管镜像是否存在都会进行一次拉取
- Never:不管镜像是否存在都不会进行拉取
- IfNotPresent:只有镜像不存在时才会拉取镜像
注意:
- 默认为IfNotPresent,而latest标签的镜像默认为Always
- 拉取镜像时docker会进行校验,如果镜像中的MD5没有变化,则不会拉取镜像数据
- 生产环境中应该避免使用latest标签,而开发环境可以借助latest标签自动拉取最新的镜像
创建资源对象
[root@yn101-22 service]# kubectl create -f nginx-deployment.yml
#输出如下:
deployment.apps/nginx-app created
#查看Pods状态
[root@yn101-22 service]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app-798dcc9989-vs862 1/1 Running 0 3m47s
nginx-app-798dcc9989-xzg4x 1/1 Running 0 3m47s
#查看已部署的服务
[root@yn101-22 service]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 2/2 2 2 4m20s
#查看已发布的服务
[root@yn101-22 service]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12h
2、部署Service
以上配置仅部署了服务,还未运行容器,因此,需要发布服务配置。先停止上一步部署的Deployment
[root@yn101-22 service]# kubectl delete -f nginx-deployment.yml
#输出如下:
deployment.apps "nginx-app" deleted
创建一个名为nginx.yml的配置文件,完整配置内容如下:
#API 版本号
apiVersion: apps/v1
#类型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Deployment
#元数据
metadata:
#Kind 的名称
name: nginx-app
spec:
selector: #定义标签选择器
matchLabels:
app: nginx
#部署的实例数量
replicas: 2
template:
metadata:
labels:
#容器标签的名字,发布 Service 时,selector 需要和这里对应
app: nginx
spec:
#配置容器,数组类型,说明可以配置多个容器
containers:
#容器名称
- name: nginx
#容器镜像,不能使用latest
image: nginx:1.17
imagePullPolicy: IfNotPresent
#暴露端口
ports:
#Pod 端口
- containerPort: 80
---
apiVersion: v1
kind: Service #指明资源类型是 service
metadata: #元数据
name: nginx-http #kind的名称
spec:
ports:
- port: 80 #service暴露的端口
targetPort: 80 #pod上的端口,将service暴露的短句转发到pod端口上
type: LoadBalancer
selector:
app: nginx #需要和上面部署的deployment标签名对应
创建资源对象
[root@yn101-22 service]# kubectl create -f nginx.yml
#输出如下
deployment.apps/nginx-app created
service/nginx-http created
#查看已发布的服务
[root@yn101-22 service]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13h
nginx-http LoadBalancer 10.106.43.210 <pending> 80:30665/TCP 93s
由上可知,服务暴露端口为30665,在node节点进行验证服务是否启动成功。
分别访问node-01节点(192.168.101.31:30665)和node-02节点(192.168.101.32:30665),能正常访问nginx说明启动服务成功。
删除服务
[root@yn101-22 ~]# kubectl delete -f nginx.yml
#输出如下:
deployment.apps "nginx-app" deleted
service "nginx-http" deleted