项目环境搭建【Docker+k8s】十 || kubernetes资源配置运行容器

经过上文的创建文件测试可以感受到,通过run命令启动容器非常麻烦。其中docker提供了compose解决了这个问题,而kubernetes使用kubectl create命令就可以做到和compose一样的效果,该命令可以通过配置文件快速创建一个集群资源对象。

部署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

部署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

猜你喜欢

转载自www.cnblogs.com/kevin-ying/p/12360586.html