上篇文档中了解到新版本1.18的Kubernetes不能使用kubectl run--replicas,这篇文章中将会使用另一种方法来创建K8S资源deployment

在k8s部署之前,回忆以下之前说过的Deployment,可以创建应用程序(docker image)的实例(docker container),这个实例被包含在称为Pod的概念中,Pod是k8s最小的可管理单元。 在k8s集群中发布Deployment后,它将指示k8s如何创建和更新应用程序实例,master节点的Scheduler将应用程序实例调度到集群中的具体节点上。 之后Deployment会持续监控这些实例。一旦实例所在节点发生故障,会在其他节点重新创建一个新的实例。

Kubernetes创建资源的方式

命令创建

在旧版本中,可以使用命令直接创建,如:

kubectl run httpd-app --image=httpd --replicas=2

httpd镜像运行资源名为httpd-app的两个副本,18版本中被弃用只能创建一个了,如果使用过17版本的应该知道,这里会提示如下:

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.

经过一系列的查询找到了命令使用的另一种方法,先创建后伸缩

kubectl create deployment --image=nginx:1.7.9 nginx-deployment
kubectl scale deployment nginx-deployment --replicas=2

yaml/yml文件创建

旧版本当然也支持此功能,但在新版本中的命令创建部分功能被弃用,1.18之后的只能使用文件创建的方法了

kubectl apply -f x.yml

文件的编写在下篇文档中说到

使用Deployment运行应用

k8s作为容器编排引擎,最重要也是最基本的功能当然是运行容器话应用。

Kubernetes通过各种Controller来管理Pod的生命周期,为了满足不同的业务场景,k8s开发了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等多种Controller。

Deployment是k8s应用最广的资源

Deployment为Pod和ReplicaSet提供描述性的更新方式,描述想要的目标状态,以达到期望值

由于1.18版本将命令的选项–replicas弃用,所以直接使用先创建后伸缩的方法来创建

1.18.1

[root@node1 ~]# kubectl create deployment --image=nginx:1.7.9 nginx-deployment
deployment.apps/nginx-deployment created
[root@node1 ~]# kubectl scale deployment nginx-deployment --replicas=2
deployment.apps/nginx-deployment scaled

查看部署结果

# 查看 Deployment
[root@node1 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           109s
# 查看 Pod
[root@node1 ~]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6dd8bc586b-h4262   1/1     Running   0          28m
nginx-deployment-6dd8bc586b-wl4bq   1/1     Running   0          28m

可以看到一个名为nginx-deployment的Deployment和两个名为nginx-deployment-xxxxxxx的副本Pod

查看运行的两个Pod分别被调度到了那个节点运行

[root@node1 ~]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE   
nginx-deployment-6dd8bc586b-h4262   1/1     Running   0          42m   10.244.1.5   node3 
nginx-deployment-6dd8bc586b-wl4bq   1/1     Running   0          42m   10.244.2.3   node2 

查看到的这两个地址是可以直接访问的,访问不到主机和路由的,建议去查看是否开启了路由转发。

分析创建Deployment过程中,k8s是怎么运行的

查看Deployment的详细信息

[root@node1 ~]# kubectl describe deployments.apps nginx-deployment 
Name:                   nginx-deployment  # Deployment名字
Namespace:              default  # 所在命名空间
CreationTimestamp:      Thu, 07 May 2020 19:06:18 +0800  # 创建时间
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
# 目标的期望状态,期望2,更新2,总共2,在使用2,坏掉的0
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:  # Pod运行状态
  Labels:  app=nginx
  Containers:  # 容器
   nginx:
    Image:        nginx:1.7.9   # 容器使用镜像
    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-deployment-6dd8bc586b (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  14m   deployment-controller  Scaled up replica set nginx-deployment-6dd8bc586b to 1
  Normal  ScalingReplicaSet  14m   deployment-controller  Scaled up replica set nginx-deployment-6dd8bc586b to 2

详细信息中大部分的内容都是翻译过来的意思,重点是下面这部分,最后两个值:NewReplicaSetEvents

NewReplicaSet:是有Deployment创建出来的ReplicaSet,名为nginx-deployment-6dd8bc586b,并且其中有两个副本

Event:使用kubectl run运行的创建的Deployment,记录了ReplicaSet的启动过程。

查看ReplicaSet的详细信息

[root@node1 ~]# kubectl describe replicaset
Name:           nginx-deployment-6dd8bc586b
Namespace:      default
Selector:       app=nginx,pod-template-hash=6dd8bc586b
Labels:         app=nginx
                pod-template-hash=6dd8bc586b
Annotations:    deployment.kubernetes.io/desired-replicas: 2
                deployment.kubernetes.io/max-replicas: 3
                deployment.kubernetes.io/revision: 1
Controlled By:  Deployment/nginx-deployment  # 记录了ReplicaSet是由Deployment(nginx-deployment)创建的
Replicas:       2 current / 2 desired
Pods Status:    2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=nginx
           pod-template-hash=6dd8bc586b
  Containers:
   nginx:
    Image:        nginx:1.7.9
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  16m   replicaset-controller  Created pod: nginx-deployment-6dd8bc586b-h4262
  Normal  SuccessfulCreate  15m   replicaset-controller  Created pod: nginx-deployment-6dd8bc586b-wl4bq

Controlled By:这部分就是实锤了ReplicaSet确实是由Deployment来创建的

Events:同样是日志信息,使用命令创建时会有创建两个Pod的过程

查看Pod的详细信息

[root@node1 ~]# kubectl describe pod nginx-deployment-6dd8bc586b-wl4bq 
Name:         nginx-deployment-6dd8bc586b-wl4bq
Namespace:    default
Priority:     0
Node:         node2/192.168.1.12
Start Time:   Thu, 07 May 2020 19:06:18 +0800
Labels:       app=nginx
              pod-template-hash=6dd8bc586b
Annotations:  <none>
Status:       Running
IP:           10.244.2.3
IPs:
  IP:           10.244.2.3
Controlled By:  ReplicaSet/nginx-deployment-6dd8bc586b  # 该Pod由ReplicaSet创建
Containers:
  nginx:
    Container ID:   docker://fcfa9364fd4f67dfd722fc25dbe734909025fff8a1f1502476503489a109dbfd
    Image:          nginx:1.7.9
    Image ID:       docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Thu, 07 May 2020 19:06:55 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-cdzqz (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-cdzqz:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-cdzqz
    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  17m   default-scheduler  Successfully assigned default/nginx-deployment-788b8d7b98-6cpwt to node2
  Normal  Pulled     17m   kubelet, node2     Container image "nginx:1.7.9" already present on machine
  Normal  Created    17m   kubelet, node2     Created container nginx
  Normal  Started    17m   kubelet, node2     Started container nginx

Controlled By:同样的实锤了Pod是由ReplicaSet创建的

Events:同样是日志信息,使用命令创建时会有启动两个Pod的过程,如果操作失败(比如 image 不存在),也能在这里查看到原因。

总结以上的各组件详细信息

通过对各组件详细信息中的重要信息的观察,可以得出以下过程:

  1. 用户通过kubectl创建Deployment
  2. Deployment创建ReplicaSet
  3. ReplicaSet创建Pod
  4. Pod来启动容器(最后一条因为不是kubectl run命令创建所以看不到events,导致无法看出这个过程)

观察,查看这些信息时的组件名字

Deployment:nginx-deployment(手动自定义的)

ReplicaSet:nginx-deployment-6dd8bc586b

Pod:nginx-deployment-6dd8bc586b-wl4bq

通过在容器运行节点查看,得知最后的容器名为:

Container:k8s_nginx_nginx-deployment-6dd8bc586b-wl4bq_default_1a84d0c3-829e-4c1c-9ec7-7e0395ce3e81_0

最终容器名字的组成:k8s_标签名_Deployment名-ReplicaSet名-Pod名_所在命名空间名_容器id

尽管在旧版本时,存在两种创建资源的方式,但使用文件创建还是最常用,最全面的方法,可能官方也是这么想的

下个文档详细来说编写文件的语法

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0