一、创建方式分类:

命令 vs 配置文件

Kubernetes 支持两种方式创建资源:
 
1.用 kubectl 命令直接创建(适用于少数的pod创建)
kubectl run httpd-app --image=reg.yunwei.edu/learn/httpd:latest --replicas=2
 
1)在命令行中通过参数指定资源的属性。
[root@cicd ~]# kubectl run httpd-app --image=reg.yunwei.edu/learn/httpd:latest --replicas=
deployment "httpd-app" created 查看创建的pod信息
[root@cicd ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
httpd-app-cfb6dc947-lq58d / Running 6m 172.20.135.5 192.168.253.10
httpd-app-cfb6dc947-rp8wm / Running 6m 172.20.104.3 192.168.253.11 查看deployment信息
[root@cicd ~]# kubectl get deployment -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd-app 9m httpd-app reg.yunwei.edu/learn/httpd:latest run=httpd-app

可以看到容器名为httpd-app,deployment名为httpd-app

2)查看名为httpd-app的deployment详细描述。

[root@cicd ~]# kubectl describe deployment httpd-app

可以看到deploy的命名空间default和deplyment的来源以及创建了一个名为replicaset的子组件。组件名为httpd-app-cfb6dc947。

deployment的子组件取名方式为在父名后面加上-字符串。

3)我们再通过查看replicaset 的详细信息来了解创建的流程。

[root@cicd ~]# kubectl describe replicaset httpd-app-cfb6dc947

名称和空间

标签(labels)

容器

然后最重要的是来源controller-replicaset,并且创建了两组pod资源

由此可见创建流程为:

controller——deployment——relpicaset——pod

当然如果想更加直观简单的查看replicaset等状态,可以执行:

[root@cicd ~]# kubectl get replicaset
NAME DESIRED CURRENT READY AGE
httpd-app-cfb6dc947 13m
[root@cicd ~]# kubectl get replicaset -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
httpd-app-cfb6dc947 13m httpd-app reg.yunwei.edu/learn/httpd:latest pod-template-hash=,run=httpd-app
2. 通过配置文件和 kubectl apply 创建,要完成前面同样的工作,可执行命令:
kubectl apply -f httpd.yml
 
httpd.yml 的内容为:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: httpd-deployment
spec:
replicas:
template:
metadata:
labels:
name: httpd
spec:
containers:
- name: httpd-app
image: reg.yunwei.edu/learn/httpd:latest

httpd.yml

 
 
 
下面对这两种方式进行比较。
基于命令的方式:
  1. 简单直观快捷,上手快。
  2. 适合临时测试或实验。
 
基于配置文件的方式:
  1. 配置文件描述了 What,即应用最终要达到的状态。
  2. 配置文件提供了创建资源的模板,能够重复部署。
  3. 可以像管理代码一样管理部署。
  4. 适合正式的、跨环境的、规模化部署。
  5. 这种方式要求熟悉配置文件的语法,有一定难度。
后面我们都将采用配置文件的方式,大家需要尽快熟悉和掌握。
kubectl apply 不但能够创建 Kubernetes 资源,也能对资源进行更新,非常方便。不过 Kubernets 还提供了几个类似的命令,例如 kubectl createkubectl replacekubectl edit 和 kubectl patch
为避免造成不必要的困扰,我们会尽量只使用 kubectl apply
此命令已经能够应对超过 90% 的场景,事半功倍。
 
 
二:解析 Deployment YAML
Deployment 的配置格式
分析一个 Deployment 的配置文件。 其他 Controller(比如 DaemonSet)非常类似。
 
 
 
① apiVersion 是当前配置格式的版本。(注意大写)
 kind 是要创建的资源类型,这里是 Deployment。
③ metadata 是该资源的元数据,name 是必需的元数据项。
④ spec 部分是该 Deployment 的规格说明。
⑤ replicas 指明副本数量,默认为 1。
⑥ template 定义 Pod 的模板,这是配置文件的重要部分。
⑦ metadata 定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定。
⑧ spec 描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image 是必需的。
 
 
运行yaml配置文件:
 
执行如下命令:
 kubectl apply -f httpd.yml     运行pod
[root@cicd ~]# kubectl apply -f httpd.yml
deployment "httpd-deployment" configured
 kubectl delete -f http.yml      删除pod
 
 
(1)伸缩(Scale Up/Down): 是指在线增加或减少 Pod 的副本数。直接写改yaml配置文件的replicas: 参数即可
 
出于安全考虑,默认配置下 Kubernetes 不会将 Pod 调度到 Master 节点。
 
 
(2)节点故障(Failover): 若其中一个node故障, Kubernetes 会检查到 k8s-node3 不可用,将 k8s-node1 上的 Pod 标记为 Unknown 状态,并在 k8s-node2 上新创建两个 Pod,维持总副本数为原指定副本数 3。
 
当 k8s-node2 恢复后,Unknown 的 Pod 会被删除,不过已经运行的 Pod 不会重新调度回 k8s-node2。
 如果需要调回,可以更改配置文件来指定调度。
 
 
(3)用 label 控制 Pod 的位置(指定node时): 默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node。不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。
 
 
Kubernetes 是通过 label 来实现这个功能的。label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性
 
1、比如执行如下命令标注 k8s-node3 是配置了 SSD 的节点。
kubectl label node 192.168.253.11 disktype=ssd

[root@cicd ~]# kubectl label node 192.168.253.11 disktype=ssd
node "192.168.253.11" labeled
 
2、然后通过:kubectl get node --show-labels        查看节点的 label。
disktype=ssd 已经成功添加到192.168.253.11,除了 disktype,Node 还有几个 Kubernetes 自己维护的 label。

[root@cicd ~]# kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
192.168.253.10 Ready <none> 21h v1.9.7 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.253.10
192.168.253.11 Ready <none> 21h v1.9.7 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=192.168.253.11
192.168.253.14 Ready,SchedulingDisabled <none> 21h v1.9.7 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.253.14
 
 
3、有了 disktype 这个自定义 label,接下来就可以指定将 Pod 部署到 11节点。编辑 httpd.yml:
 
在 Pod 模板的 spec 里通过 nodeSelector 指定将此 Pod 部署添加到到具有  label disktype=ssd 的 Node 上,也就是11节点上。
在httpd.yml文件的末尾添加下面两行:

nodeSelector:
    disktype: ssd

 
注意nodeSelector的大小写以及与container的对齐
 
4、部署 Deployment 并查看 Pod 的运行节点:
kubectl apply -f .
kubectl get pod -o wide
 
 
5、然后查看pod状态
发现全部 3 个副本都运行在 k8s-node1 上,符合我们的预期。

[root@cicd ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
httpd-deployment-957479bb9-xpvn4 / Running 2h 172.20.135.11 192.168.253.10
httpd-deployment-957479bb9-xpvrl / Running 2h 172.20.104.13 192.168.253.10
httpd-deployment-957479bb9-zqzgw / Running 2h 172.20.135.12 192.168.253.10
6、要删除 label disktype,执行如下命令:kubectl label node k8s-node1 disktype- 即删除。

[root@cicd ~]# kubectl label node 192.168.253.11 disktype-
node "192.168.253.11" labeled
 
7、再次查看pod状态,发现disktype=ssh的标签已经删除。 不过此时 Pod 并不会重新部署,依然在 k8s-node1 上运行。
kubectl get node --show-labels
root@cicd ~]# kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
192.168.253.10 Ready <none> 21h v1.9.7 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.253.10
192.168.253.11 Ready <none> 21h v1.9.7 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.253.11
192.168.253.14 Ready,SchedulingDisabled <none> 21h v1.9.7 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.253.14
除非在 nginx.yml 中删除 nodeSelector 设置,然后通过 kubectl apply 重新部署。 Kubernetes 会删除之前的 Pod 并调度和运行新的 Pod。

#  nodeSelector:
#     disktype: ssd

以及  kubectl apply -f http.yml

 

三、DaemonSet:

DeamonSet应用

Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。
DaemonSet 的典型应用场景有:
  1. 在集群的每个节点上运行存储 Daemon,比如 glusterd 或 ceph。
  2. 在每个节点上运行日志收集 Daemon,比如 flunentd 或 logstash。
  3. 在每个节点上运行监控 Daemon,比如 Prometheus Node Exporter 或 collectd。
其实 Kubernetes 自己就在用 DaemonSet 运行系统组件。执行如下命令:
 
kubectl get daemonset --namespace=kube-system
[root@cicd ~]# kubectl get daemonset --namespace=kube-system -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
calico-node <none> 19h calico-node,install-cni calico/node:v3.0.6,calico/cni:v2.0.5 k8s-app=calico-node
DaemonSet calico-node分别负责在每个节点上运行 calico-node 组件
 
因为 calico-node 属于系统组件,需要在命令行中通过 --namespace=kube-system 指定 namespace kube-system。如果不指定则只返回默认 namespace default 中的资源。
 

k8s创建资源的更多相关文章

  1. k8s创建资源的两种方式

    命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建 kubectl run nginx-deployment --image=nginx: -- ...

  2. k8s创建资源的两种方式及DaemonSet应用(5)

    一.创建方式分类 Kubernetes 支持两种方式创建资源: (1)用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=reg.yunwei.com ...

  3. k8s 创建资源的两种方式 - 每天5分钟玩转 Docker 容器技术(124)

    命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...

  4. k8s 创建资源的两种方式【转】

    命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...

  5. k8s创建资源的两种方式(5)

    一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=reg ...

  6. 第5篇K8S创建资源的两种方式

      一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=r ...

  7. K8s创建pod yaml文件详解

    kubernetes创建pod的yaml文件,参数说明 apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 ...

  8. kubernetes创建资源对象yaml文件例子--pod详解

    apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数据/属性 name: ...

  9. [置顶] kubernetes创建资源yaml文件例子--rc

    apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: ReplicationController #指定创建资源的角色/类型 metadata: ...

随机推荐

  1. python 二分法实现

    # -*- coding: utf-8 -*- def BinarySearch(arr, key): # 记录数组的最高位和最低位 min = 0 max = len(arr) - 1 if key ...

  2. const定义的并非是常量,而是常量索引

    我第一次看const的时候,记忆中对const的定义是,定义常量. 后经过研究,定义的并非常量,而是常量索引. 有时候会遇到使用const定义数组的情况 const arr = [] arr.push ...

  3. CSRF拦截

    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 事实上 ...

  4. git log 详解 以及代码量统计

    https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86% ...

  5. Django【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

    django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); ...

  6. VS2015开发常用快捷键

    以下内容均Ctrl+后面的按钮 M-O\P折叠 K-F 格式化 K-U\C注释 K-S侧外代码-(区域代码) 代码片段 ctor 自动生成默认的构造函数 prop 自动生成get set方法 cw 自 ...

  7. shiro常见的异常以及处理方法

    1.shiro的常见异常 1.1  AuthenticationException 异常是Shiro在登录认证过程中,认证失败需要抛出的异常. AuthenticationException包含以下子 ...

  8. Jdbc连接数据库基本步骤详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Jdbc连接数据库的基本步骤,供大家参考,具体内容如下 package demo.jdbc; import java.s ...

  9. 【leetcode】1170. Compare Strings by Frequency of the Smallest Character

    题目如下: Let's define a function f(s) over a non-empty string s, which calculates the frequency of the ...

  10. android 7.0适配(总结)

    file_paths.xml <?xml version="1.0" encoding="utf-8"?><paths xmlns:andro ...