K8s创建资源

版权声明:文章转发需标明文章出处地址及作者 https://blog.csdn.net/weixin_44267608/article/details/89604453

创建资源的两种方式

1、通过命令

kubectl run httpd-app --image=httpd:latest --replicas=2
#运行镜像,replicas指定副本数为2,名字为httpd-app

kubectl get deployment 获取信息
kubectl get pod -n default -o wide 获取pod信息

kubectl describe deployment httpd-app 获取httpd-app详细信息
在这里插入图片描述

Deployment 通过 ReplicaSet 来管理 Pod
kubectl get replicaset -n default

[root@chen harbor]# kubectl get replicaset -n default
NAME                   DESIRED   CURRENT   READY     AGE
httpd-app-695f5f7bbd   2         2         2         10m

查看replicaset 详细信息
kubectl describe replicaset -n default
在这里插入图片描述

  1. 用户通过 kubectl 创建 Deployment。
  2. Deployment 创建 ReplicaSet。
  3. ReplicaSet 创建 Pod。

在这里插入图片描述

可以看出 对象的命名方式是:子对象的名字 = 父对象名字 + 随机字符串或数字。

2、编排文件

mkdir yaml
cd yaml
vim httpd.yml

apiVersion: extensions/v1beta1       #当前配置格式的版本
kind: Deployment                  #要创建的资源类型,这里为Deployment
metadata:                        #该资源的元数据,name是必须的源数据项
  name: httpd-deployment
spec:                             #该Deployment的规格说明
  replicas: 2                       #指定副本数量,默认为1
  template:                         #定义pod的模板
    metadata:     #定义pod的元数据,至少要定义一个label,label的key和value可以任意指定    
      labels:
        name: httpd
    spec:           #描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image 是必需的。
      containers:     #此处为容器
      - name: httpd-app            #容器名
        image: reg.yunwei.edu/learn/httpd:latest #容器应用的镜像

命令:
运行pod

kubectl apply -f httpd.yml  

也可以用

kubectl create -f httpd.yml

kubectl apply 不但能够创建 Kubernetes 资源,也能对资源进行更新,非常方便。不过 Kubernets 还提供了几个类似的命令,例如 kubectl create、kubectl replace、kubectl edit 和 kubectl patch。
为避免造成不必要的困扰,我们会尽量只使用 kubectl apply,此命令已经能够应对超过 90% 的场景,事半功倍。

删除pod

kubectl delete -f httpd.yml   

获取pod信息
kubectl get pod -o wide
在这里插入图片描述

进阶

伸缩

(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。

用 label 控制 Pod 的位置

默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node。那如何将pod调度到指定的节点node上呢?比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。该怎么办?
kubernetes是通过label来实现这个功能的。label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性。比如执行如下命令标注 k8s-chen2 是配置了 SSD 的节点。
kubectl label node 192.168.1.14 disktype=ssd

查看node的labels信息
kubectl get node --show-labels
在这里插入图片描述

有了 disktype 这个自定义 label,接下来就可以指定将 Pod 部署到 k8s-chen2。编辑 httpd.yml:
vim httpd.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: httpd-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        name: httpd
    spec:
      containers:
      - name: httpd-app
        image: httpd:latest
        nodeSelector:
          disktype: ssd
~                           

在 Pod 模板的 spec 里通过 nodeSelector 指定将此 Pod 部署到具有:
label disktype=ssd 的 Node 上。
部署 Deployment 并查看 Pod 的运行节点:

kubectl apply -f .
kubectl get pod -o wide

这时发现2副本都运行在同义节点上。

如想删除label disktype,执行如下操作

kubectl labels node 192.168.1.14 disktype-

DaemonSet

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

DaemonSet calico-node分别负责在每个节点上运行 calico-node 组件。

kubectl get pod -n kube-system -o wide

注意

因为 calico-node 属于系统组件,需要在命令行中通过 --namespace=kube-system 指定 namespace kube-system。如果不指定则只返回默认 namespace default 中的资源。

猜你喜欢

转载自blog.csdn.net/weixin_44267608/article/details/89604453