加入收藏 | 设为首页 | 会员中心 | 我要投稿 草根网 (https://www.1asp.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 云计算 > 正文

Linux云计算运维架构师(连载)-K8S-Deployment资源详解

发布时间:2022-10-28 12:58:12 所属栏目:云计算 来源:
导读:  # kubectl get deploy my-nginx -L app
   CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS APP
   my-nginx11 nginx nginx app=nginx111 2 nginx
  selector

  

  # kubectl get deploy my-nginx -L app
    CONTROLLER  CONTAINER(S)  IMAGE(S)  SELECTOR   REPLICAS  APP
    my-nginx11   nginx      nginx    app=nginx111  2      nginx
  selector
 
  过滤规则的定义,是在 Deployment 的"spec.selector.matchLabels"字段。一般称之为:Label Selector。
 
  pod的label会被用来创建一个selector,用来匹配过滤携带这些label的pods。
 
  可以通过kubectl get请求这样一个字段来查看template的格式化输出:
 
  # kubectl get rc my-nginx -o template --template="{{.spec.selector}}"
    map[app:nginx11]
  使用labels定位pods
 
    [root@k8s-master ~]# kubectl get pods -l app=nginx11 -o wide
    NAME        READY   STATUS   RESTARTS  AGE    IP      NODE
    my-nginx11-1r2p4  1/1    Running  0      11m    10.0.6.3   k8s-node-1
    my-nginx11-pc4ds  1/1    Running  0      11m    10.0.33.6  k8s-node-2
  检查你的Pod的IPs:
 
  # kubectl get pods -l app=nginx -o json | grep podIP
           "podIP": "10.245.0.15",
           "podIP": "10.245.0.14",
  spec
 
  一个 k8s 的 API 对象的定义,大多可以分为 Metadata 和 Spec 两个部分。前者存放的是这个对象的元数据,对所有 API 对象来说,这一部分的字段和格式基本上是一样的;而后者存放的,则是属于这个对象独有的定义,用来描述它所要表达的功能。
 
  这里定义需要两个副本,此处可以设置很多属性,主要是受此Deployment影响的Pod的选择器
 
  spec 选项的template其实就是对Pod对象的定义
 
  可以在Kubernetes v1beta1 API 参考中找到完整的Deployment可指定的参数列表
 
  replicas
 
  定义的 Pod 副本个数 (spec.replicas) 是:2
 
  template
 
  定义了一个 Pod 模版(spec.template),这个模版描述了想要创建的 Pod 的细节。例子里,这个 Pod 里只有一个容器,这个容器的镜像(spec.containers.image)是 nginx:1.7.9,这个容器监听端口(containerPort)是 80。
 
  volumes
 
  是属于 Pod 对象的一部分。需要修改 template.spec 字段
 
  例3中,在 Deployment 的 Pod 模板部分添加了一个 volumes 字段,定义了这个 Pod 声明的所有 Volume。它的名字叫作 nginx-vol,类型是 emptyDir。
 
  关于emptyDir 类型:
 
  ? 等同于 Docker 的隐式 Volume 参数,即:不显式声明宿主机目录的 Volume。所以,Kubernetes 也会在宿主机上创建一个临时目录,这个目录将来就会被绑定挂载到容器所声明的 Volume 目录上。
 
  ? k8s 的 emptyDir 类型,只是把 k8s 创建的临时目录作为 Volume 的宿主机目录,交给了 Docker。这么做的原因,是 k8s 不想依赖 Docker 自己创建的那个 _data 目录。
 
  volumeMounts
 
  Pod 中的容器,使用的是 volumeMounts 字段来声明自己要挂载哪个 Volume,并通过 mountPath 字段来定义容器内的 Volume 目录,比如:/usr/share/nginx/html。
 
  hostPath
 
  k8s 也提供了显式的 Volume 定义,它叫做 hostPath。比如下面的这个 YAML 文件:
 
   ...  
  ?
      volumes:
  ?
       - name: nginx-vol
  ?
         hostPath:
  ?
          path: /var/data
  这样云计算架构师,容器 Volume 挂载的宿主机目录,就变成了 /var/data
 
  使用 kubectl exec 指令,进入到这个 Pod 当中(即容器的 Namespace 中)查看这个 Volume 目录:
 
 
  # kubectl exec -it nginx-deployment-5c678cfb6d-lg9lw -- /bin/bash
  /# ls /usr/share/nginx/html
  # cat dep_test_vol.yaml
  apiVersion: extensions/v1beta1
  kind: Deployment
  metadata:
   name: dep-test
  spec:
   replicas: 2
   template:
    metadata:
     labels:
      app: nginx
    spec:
     containers:
     - name: nginx
       image: daocloud.io/library/nginx:1.7.9
       ports:
       - containerPort: 80
  ?
      volumeMounts:
       - name: nginx-vol-1
         mountPath: /test
     volumes:
      - name: nginx-vol-1
        hostPath:
         path: /var/data
  创建Deployment:
 
  将上述的YAML文件保存为deployment.yaml,然后创建Deployment:
 
  # kubectl apply -f deployment.yaml
  deployment "kube100-site" created
  检查Deployment的列表:
 
  通过 kubectl get 命令检查这个 YAML 运行起来的状态是不是与我们预期的一致:
 
  # kubectl get deployments
  NAME      DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
  kube100-site  2     2     2       2      2m
  # kubectl get pods -l app=nginx
  NAME                 READY   STATUS   RESTARTS  AGE
  nginx-deployment-67594d6bf6-9gdvr  1/1    Running  0      10m
  nginx-deployment-67594d6bf6-v6j7w  1/1    Running  0      10m
  kubectl get 指令的作用,就是从 Kubernetes 里面获取(GET)指定的 API 对象。可以看到,在这里我还加上了一个 -l 参数,即获取所有匹配 app: nginx 标签的 Pod。需要注意的是,在命令行中,所有 key-value 格式的参数,都使用"="而非":"表示。
 
  删除Deployment:
 
  [root@k8s-master ~]# kubectl delete deployments my-nginx
  deployment "my-nginx" deleted
  或者
  [root@k8s-master ~]# kubectl delete -f  deployment.yaml
 

(编辑:草根网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章