K8s-Deployment 使用

Deployment
运行一个Deployment

[root@master ~]# kubectl  run  nginx-1  --image=nginx  --replicas=2
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-1 created

查看Deployment 状态

[root@master ~]# kubectl  get deployments.apps  nginx-1
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
nginx-1   2/2     2            2           85s

详细查看

[root@master ~]# kubectl describe  deployments.apps  nginx-1
Name:                   nginx-1
Namespace:              default
CreationTimestamp:      Wed, 15 Jul 2020 19:06:34 +0800
Labels:                 run=nginx-1
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               run=nginx-1
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  run=nginx-1
  Containers:
   nginx-1:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-1-56756dd7cf (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  2m5s  deployment-controller  Scaled up replica set nginx-1-56756dd7cf to 2

详细查看副本资源

[root@master ~]# kubectl  get replicasets.apps  nginx-1-56756dd7cf
NAME                 DESIRED   CURRENT   READY   AGE
nginx-1-56756dd7cf   2         2         2       4m41s

详细的

[root@master ~]# kubectl describe  replicasets.apps nginx-1-56756dd7cf
Name:           nginx-1-56756dd7cf
Namespace:      default
Selector:       pod-template-hash=56756dd7cf,run=nginx-1
Labels:         pod-template-hash=56756dd7cf
                run=nginx-1
Annotations:    deployment.kubernetes.io/desired-replicas: 2
                deployment.kubernetes.io/max-replicas: 3
                deployment.kubernetes.io/revision: 1
Controlled By:  Deployment/nginx-1
Replicas:       2 current / 2 desired
Pods Status:    2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  pod-template-hash=56756dd7cf
           run=nginx-1
  Containers:
   nginx-1:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  6m6s  replicaset-controller  Created pod: nginx-1-56756dd7cf-mg9v4
  Normal  SuccessfulCreate  6m6s  replicaset-controller  Created pod: nginx-1-56756dd7cf-665w6

查看Pod

[root@master ~]# kubectl  get  pod 
NAME                       READY   STATUS    RESTARTS   AGE
myweb-f867f887d-r2hds      1/1     Running   1          17h
myweb-f867f887d-x494f      1/1     Running   1          17h
myweb1-7f7b69fddb-252vk    1/1     Running   1          17h
myweb1-7f7b69fddb-6hb5k    1/1     Running   1          17h
nginx-1-56756dd7cf-665w6   1/1     Running   0          7m25s
nginx-1-56756dd7cf-mg9v4   1/1     Running   0          7m25s

查看某个pod的详细信息

[root@master ~]# kubectl  describe  pod  nginx-1-56756dd7cf-665w6
Name:         nginx-1-56756dd7cf-665w6
Namespace:    default
Priority:     0
Node:         node2/192.168.64.30
Start Time:   Wed, 15 Jul 2020 19:06:34 +0800
Labels:       pod-template-hash=56756dd7cf
              run=nginx-1
Annotations:  <none>
Status:       Running
IP:           10.244.2.19
IPs:
  IP:           10.244.2.19
Controlled By:  ReplicaSet/nginx-1-56756dd7cf
Containers:
  nginx-1:
    Container ID:   docker://fee7b3b0339a179f2a93c68e4d810393d67579204eaf75d4e3ec048dc368b91f
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:a93c8a0b0974c967aebe868a186e5c205f4d3bcb5423a56559f2f9599074bbcd
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 15 Jul 2020 19:06:52 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-wnrfh (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-wnrfh:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-wnrfh
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  8m20s  default-scheduler  Successfully assigned default/nginx-1-56756dd7cf-665w6 to node2
  Normal  Pulling    8m19s  kubelet, node2     Pulling image "nginx"
  Normal  Pulled     8m3s   kubelet, node2     Successfully pulled image "nginx"
  Normal  Created    8m3s   kubelet, node2     Created container nginx-1
  Normal  Started    8m2s   kubelet, node2     Started container nginx-1

总结过程
1.用户通过kubectl创建Deployment
2.Deployment创建ReplicaSet
3.ReplicaSet创建Pod

对象的命名方式:子对象的名字=父对象的名字+随机字符串或数字

K8s创建资源的两种方式
命令VS配置文件

1.用Kubectl命令直接创建
2.通过配置文件和kubectl apply创建

直接生成一个yml文件

[root@master ~]# kubectl  create  deployment  nginx  --image=nginx  --dry-run  -o yaml > web.yml
**文件内容:**
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

基于命令的方式
1.简单直观快捷,容易上手
2.适合临时检测或实验

基于配置文件的方式
1.配置文件描述了 What,即应用最终要达到的状态
2.配置文件提供了创建资源的模班,能够重复部署
3.可以像管理代码一样管理部署
4.适合正式的,跨环境的,规模化部署
5.这种方式要求熟悉配置文件的语法,有一定难度

Deployment YAML

编写一个yml文件
文件如下:

[root@master ~]# cat  nginx.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

apiVersion 是当前配置文件格式的版本
Kind 是要创键资源的类型
Metadata 是资源的元数据 name是必备的元数据项
Labels 资源标签
Name 资源名字
Spec 资源规格
Replicas 副本个数
Template Pod模板
metadata 定义Pod的元数据
labels Pod标签
spec Pod的规格
-image Pod使用那个镜像
name Pod名字

部署

[root@master ~]# kubectl  apply  -f  nginx.yml 
deployment.apps/nginx created

查看资源

[root@master ~]# kubectl  get  deployments.apps
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
myweb     2/2     2            2           18h
myweb1    2/2     2            2           18h
nginx     1/1     1            1           89s
nginx-1   2/2     2            2           37m
[root@master ~]# kubectl get  replicasets.apps
NAME                 DESIRED   CURRENT   READY   AGE
myweb-7bfcd86fd6     0         0         0       18h
myweb-f867f887d      2         2         2       18h
myweb1-74755bd858    0         0         0       18h
myweb1-7f7b69fddb    2         2         2       18h
nginx-1-56756dd7cf   2         2         2       37m
nginx-86c57db685     1         1         1       91s
[root@master ~]# kubectl  get pod  -o  wide
NAME                       READY   STATUS    RESTARTS   AGE    IP            NODE    NOMINATED NODE   READINESS GATES
myweb-f867f887d-r2hds      1/1     Running   1          18h    10.244.2.15   node2   <none>           <none>
myweb-f867f887d-x494f      1/1     Running   1          18h    10.244.2.17   node2   <none>           <none>
myweb1-7f7b69fddb-252vk    1/1     Running   1          18h    10.244.2.16   node2   <none>           <none>
myweb1-7f7b69fddb-6hb5k    1/1     Running   1          18h    10.244.2.18   node2   <none>           <none>
nginx-1-56756dd7cf-665w6   1/1     Running   0          37m    10.244.2.19   node2   <none>           <none>
nginx-1-56756dd7cf-mg9v4   1/1     Running   0          37m    10.244.1.2    node1   <none>           <none>
nginx-86c57db685-bjk95     1/1     Running   0          104s   10.244.1.3    node1   <none>

删除资源有两种方法

第一种:
[root@master ~]# kubectl  delete  -f  nginx.yml 
deployment.apps "nginx" deleted
第二种:
[root@master ~]# kubectl  delete  deployment  nginx-deployment

Scale Up/Down

伸缩只需修改 yml 文件对应的 副本数即可

将副本数改为 3 个

[root@master ~]# cat  nginx.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

部署

[root@master ~]# kubectl  apply  -f nginx.yml 
deployment.apps/nginx created

查看副本

[root@master ~]# kubectl  get  pod  -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
myweb-f867f887d-r2hds      1/1     Running   1          18h   10.244.2.15   node2   <none>           <none>
myweb-f867f887d-x494f      1/1     Running   1          18h   10.244.2.17   node2   <none>           <none>
myweb1-7f7b69fddb-252vk    1/1     Running   1          18h   10.244.2.16   node2   <none>           <none>
myweb1-7f7b69fddb-6hb5k    1/1     Running   1          18h   10.244.2.18   node2   <none>           <none>
nginx-1-56756dd7cf-665w6   1/1     Running   0          44m   10.244.2.19   node2   <none>           <none>
nginx-1-56756dd7cf-mg9v4   1/1     Running   0          44m   10.244.1.2    node1   <none>           <none>
nginx-86c57db685-8lqbd     1/1     Running   0          41s   10.244.1.4    node1   <none>           <none>
nginx-86c57db685-knrl7     1/1     Running   0          41s   10.244.2.20   node2   <none>           <none>
nginx-86c57db685-zm2m2     1/1     Running   0          41s   10.244.1.5    node1   <none>

K8s 的节点如果 down 了,会将其上面的 Pod 标记为 Unknown,并在其他节点上创建 Pod,维持总副本数,即使那个节点恢复了,Unknown 的 Pod 会被删除,不过运行 Pod 也不会调回那个节点了

出于安全考虑,默认配置下 k8s 不会将 Pod 调度到 master 节点,
如果想使用 master 节点,执行下面命令

[root@master ~]# kubectl  taint node master node-role.kubernetes.io/master-
node/master untainted

恢复master only 的状态

[root@master ~]# kubectl  taint  node master node-role.kubernetes.io/master="":NoSchedule
node/master tainted

用 label 控制 Pod 的位置

label 可以将 Pod 部署到指定的节点上面

[root@master ~]# kubectl label  nodes  node1 disktype=ssd 
node/node1 labeled
[root@master ~]# kubectl get  nodes --show-labels
NAME     STATUS   ROLES    AGE   VERSION   LABELS
master   Ready    master   19h   v1.17.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node1    Ready    <none>   65m   v1.17.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux
node2    Ready    <none>   19h   v1.17.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux

disktype=ssd 已经添加到 node1 上面了
编辑 yml 文件指定

[root@master ~]# cat  nginx.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deployment
  name: nginx-deployment
spec:
  replicas:  3
  selector:
    matchLabels:
      app: nginx-deployment
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-deployment
    spec:
      containers:
      - image: nginx
        name: nginx
      nodeSelector:
        disktype: ssd

在 Pod 的模班 spec 里通过 nodeSelector 指定将此 Pod 部署到具有 label disktype=ssd 的 Node 上。

部署并查看

[root@master ~]# kubectl  apply  -f  nginx.yml 
deployment.apps/nginx-deployment created
[root@master ~]# kubectl  get  pod  -o  wide
NAME                                READY   STATUS              RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
myweb-f867f887d-r2hds               1/1     Running             1          18h   10.244.2.15   node2   <none>           <none>
myweb-f867f887d-x494f               1/1     Running             1          18h   10.244.2.17   node2   <none>           <none>
myweb1-7f7b69fddb-252vk             1/1     Running             1          18h   10.244.2.16   node2   <none>           <none>
myweb1-7f7b69fddb-6hb5k             1/1     Running             1          18h   10.244.2.18   node2   <none>           <none>
nginx-1-56756dd7cf-665w6            1/1     Running             0          55m   10.244.2.19   node2   <none>           <none>
nginx-1-56756dd7cf-mg9v4            1/1     Running             0          55m   10.244.1.2    node1   <none>           <none>
nginx-86c57db685-8lqbd              1/1     Running             0          12m   10.244.1.4    node1   <none>           <none>
nginx-86c57db685-knrl7              1/1     Running             0          12m   10.244.2.20   node2   <none>           <none>
nginx-86c57db685-zm2m2              1/1     Running             0          12m   10.244.1.5    node1   <none>           <none>
nginx-deployment-65458ffb99-d6krj   0/1     ContainerCreating   0          20s   <none>      

删除label

[root@master ~]# kubectl  label  nodes  node1  disktype-
node/node1 labeled
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐