k8s创建pod资源对象-03

创建一个http应用程序

1)创建一个应用程序,我们使用 "kubectl run " 命令,是 “kubectl run -h” 查看命令使用帮助,命令说明告诉我们这个命令可以创建一个deployment或者job的容器(deployment和job是什么意思,我们后续再讲)
[root@master ~]# kubectl run nginx-deploy --image=nginx --port=80
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-deploy created

[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
httpd-app 2/2 2 2 6m51s
nginx-deploy 1/1 1 1 8s

[root@master ~]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deploy 1/1 1 1 22s nginx-deploy nginx run=nginx-deploy
[root@master ~]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-5c9b546997-r24bq 1/1 Running 0 36s 10.244.1.7 node01 <none> <none>

[root@master ~]# curl 10.244.1.7  -I
HTTP/1.1 200 OK
当我们在集群之外访问是发现无法访问,那么集群之外的客户端如何才能访问呢?这就需要我们的service服务了,下面我们就创建一个service,是外部客户端可以访问我们的pod
[root@master ~]# kubectl expose deployment nginx-deploy --name=myweb --port=80 --type=NodePort
service/myweb exposed
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d2h
myweb NodePort 10.106.20.142 <none> 80:32438/TCP 11s
nginx-svc ClusterIP 10.99.171.202 <none> 8080/39393/TCP 107m
在这里插入图片描述

pod应用程序的扩容与伸缩

[root@master ~]# kubectl scale deployment nginx-deploy --replicas=2
deployment.extensions/nginx-deploy scaled

[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-5c9b546997-n7mhg 1/1 Running 0 11s 10.244.2.7 node02 <none> <none>
nginx-deploy-5c9b546997-r24bq 1/1 Running 0 14m 10.244.1.7 node01 <none> <none>

也可以通过编写容器的yaml配置文件来进行设置
[root@master ~]# kubectl edit deployment nginx-deploy
deployment.extensions/nginx-deploy edited

[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-5c9b546997-ls5nn 1/1 Running 0 6s 10.244.1.8 node01 <none> <none>
nginx-deploy-5c9b546997-n7mhg 1/1 Running 0 91s 10.244.2.7 node02 <none> <none>
nginx-deploy-5c9b546997-r24bq 1/1 Running 0 15m 10.244.1.7 node01 <none> <none>

服务的升级与回滚
[root@master ~]# kubectl describe deployments. nginx-deploy
Image: nginx
[root@master ~]# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.15
[root@master ~]# kubectl describe deployments. nginx-deploy
Image: nginx:1.15

应用程序服务的回滚

describe显示容器的详细信息
[root@master ~]# kubectl describe deployments nginx-deploy
----省略部分代码----
Pod Template:
Labels: run=nginx-deploy
Containers:
nginx-deploy:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
----省略部分代码----

升级版本
[root@master ~]# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.15
deployment.extensions/nginx-deploy image updated

[root@master ~]# kubectl describe deployments. nginx-deploy
----省略部分代码----
Pod Template:
Labels: run=nginx-deploy
Containers:
nginx-deploy:
Image: nginx:1.15
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
----省略部分代码----

回滚到之前版本
[root@master ~]# kubectl rollout undo deployment nginx-deploy
deployment.extensions/nginx-deploy rolled back

[root@master ~]# kubectl describe deployments nginx-deploy
----省略部分代码----
Pod Template:
Labels: run=nginx-deploy
Containers:
nginx-deploy:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
----省略部分代码----

kubectl常用命令集合

kubectl run #创建一个deployment或job来管理创建的容器
kubectl get #显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源
kubectl expose #将一个资源暴露为一个新的kubernetes的service资源,资源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs)
kubectl describe #显示特定资源或资源组的详细信息
kubectl scale #可以对Deployment, ReplicaSet, Replication Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件
kubectl set #更改现有的应用程序资源
kubectl rollout #资源回滚管理

创建资源的方法:资源清单

APIserver仅接受JSON格式的资源定义;
Yaml格式提供配置清单,apiserver可以无损、自动的将其转为json格式,而后再提交;

  1. 什么是资源清单
    在k8s中,一般使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件我们一般称为资源清单
  2. 资源清单的格式
apiVersion: group/apiversion   #如果没有给定group名称,那么默认为croe,可以使用kubectl api-versions 获取当前k8s版本上所有的apiVersion版本信息(每个版本可能不同)
kind:       #资源类别
metadata:  #资源元数据
   name
   namespace  #k8s自身的namespace
   lables
   annotations   #主要目的是方便用户阅读查找
spec:期望的状态(disired state)
status:当前状态,本字段有kubernetes自身维护,用户不能去定义

大部分资源的配置清单都有五个一级字段组成:
apiVersion :group/version
在终端执行kubectl api-versions 查看一下可以看到这个分好组了已经,分组的好处是,如果一个组做出了改变,其他组不收影响,再者一个组加版本号以后,可以在同一个组并存。
版本号级别:

  1. v1:Pod是最核心资源,它属于V1,而控制器等其他属于apps/v1组
  2. Beta(贝塔)属于公测版本,不是公共厕所。里边大部分内容都有测试过,还有极少数内容,还需要测试,待定。还有阿尔法:(内测版本)

kind:资源类别
这个有内建的,也可以自定义,不过要按照一定的书写格式来写

metadata: 叫元数据
name,(必须是唯一的),namespace(k8s的和之前提到过的6项隔离的定义是不一样的),labels:(标签),annotations(资源注解),每个资源的引用PATH(路径)/api/GROUP/VERSION/namespaces/NAMESPACE/TYPE/NAME

Spec:disred state(期望的状态)
最重要,可以嵌套二级或三级字段,不同的类型资源,其spec应该是各不相同的。

Status:当前状态
本字段由kubernetes集群维护;用户不能自定义。

如何编写yaml,可先查看例子
[root@master ~]# kubectl explain pods //看到Object,就注意会嵌套跟多二级字段
[root@master ~]# kubectl explain pods.metadata //查看某个字段怎么写
String是字符串,[ ]括号是列表。Map表示是json格式的,由众多K\V组成的json格式的数组。
[root@master ~]# kubectl explain pods.spec
其中containers <Object> -required- 有required是比写字段。

[root@master ~]# kubectl explain pods.spec.containers //查看嵌套字段怎么写
Command(自定义)、ENV定义环境变量、ENVFROM从其他地方获取环境变量、imagePullicy(镜像获取策略)

编写一个yaml文件

[root@master ~]# mkdir /usr/local/k8s/yaml_conf/ -p
[root@master ~]# cd /usr/local/k8s/yaml_conf/
[root@master yaml_conf]# vim nginx.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: web_server
    spec:
      containers:
      - name: nginx
        image: nginx

[root@master yaml_conf]# kubectl apply -f nginx.yaml
deployment.extensions/nginx-deployment created

部署成功。同样地,通过 kubectl get 查看 nginx-deployment 的各种资源:
[root@master yaml_conf]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 6m42s

[root@master yaml_conf]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-855b6b9dc8-flq48 1/1 Running 0 6m56s 10.244.1.11 node01 <none> <none>
nginx-deployment-855b6b9dc8-wjx5m 1/1 Running 0 6m56s 10.244.2.10 node02 <none> <none>

Deployment、ReplicaSet、Pod 都已经就绪。如果要删除这些资源,执行 kubectl delete deployment nginx-deployment 或者 kubectl delete -f nginx.yml。
[root@master yaml_conf]# kubectl delete -f nginx.yaml
deployment.extensions “nginx-deployment” deleted

资源属性定义的两种方式:基于命令的方式、基于配置文件的方式
资源的属性写在配置文件中,文件格式为 YAML。
下面对这两种方式进行比较。

  • 基于命令的方式:
    简单直观快捷,上手快。
    适合临时测试或实验。
  • 基于配置文件的方式:
    配置文件描述了 What,即应用最终要达到的状态。
    配置文件提供了创建资源的模板,能够重复部署。
    可以像管理代码一样管理部署。
    适合正式的、跨环境的、规模化部署。
    这种方式要求熟悉配置文件的语法,有一定难度。
    后面我们都将采用配置文件的方式,大家需要尽快熟悉和掌握。

kubectl apply 不但能够创建 Kubernetes 资源,也能对资源进行更新,非常方便。不过 Kubernets 还提供了几个类似的命令,例如 kubectl create、kubectl replace、kubectl edit 和 kubectl patch。
为避免造成不必要的困扰,我们会尽量只使用 kubectl apply,此命令已经能够应对超过 90% 的场景,事半功倍。
接下来修改配置文件,将副本数减少为 3 个,重新执行 kubectl apply:

详解 Deployment 的配置文件格式

如何读懂 Deployment YAML 文件?
既然要用 YAML 配置文件部署应用,现在就很有必要了解一下 Deployment 的配置格式,其他 Controller(比如 DaemonSet)非常类似。
还是以 nginx-deployment 为例,配置文件如下图所示:
在这里插入图片描述
① apiVersion 是当前配置格式的版本。
② kind 是要创建的资源类型,这里是 Deployment。
③ metadata 是该资源的元数据,name 是必需的元数据项。
④ spec 部分是该 Deployment 的规格说明。
⑤ replicas 指明副本数量,默认为 1。
⑥ template 定义 Pod 的模板,这是配置文件的重要部分。
⑦ metadata 定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定。
⑧ spec 描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image是必需的。
上面的nginx.yml 是一个最简单的 Deployment 配置文件,后面我们学习 Kubernetes 各项功能时会逐步丰富这个文件。

如何Scal Up Down Deployment

伸缩是指在线增加或减少 Pod 的副本数。
Deployment nginx-deployment 初始是两个副本,k8s-node1 和 k8s-node2 上各跑了一个副本。现在修改 nginx.yml,将副本改成 5 个。
[root@master yaml_conf]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-855b6b9dc8-dhb7v 1/1 Running 0 4m23s 10.244.2.3 node02 <none> <none>
nginx-deployment-855b6b9dc8-jnsk9 1/1 Running 0 4m23s 10.244.1.3 node01 <none> <none>

在这里插入图片描述
[root@master yaml_conf]# kubectl apply -f nginx.yaml
deployment.extensions/nginx-deployment configured

[root@master yaml_conf]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-855b6b9dc8-5sr95 1/1 Running 0 5s 10.244.2.4 node02 <none> <none>
nginx-deployment-855b6b9dc8-cl4fd 1/1 Running 0 5s 10.244.1.4 node01 <none> <none>
nginx-deployment-855b6b9dc8-dhb7v 1/1 Running 0 19m 10.244.2.3 node02 <none> <none>
nginx-deployment-855b6b9dc8-jnsk9 1/1 Running 0 19m 10.244.1.3 node01 <none> <none>
nginx-deployment-855b6b9dc8-jp8ws 1/1 Running 0 5s 10.244.1.5 node01 <none> <none>

在master上运行pod
出于安全考虑,默认配置下 Kubernetes 不会将 Pod 调度到 Master 节点。如果希望将 k8s-master 也当作 Node 使用,可以执行如下命令:

kubectl taint node master node-role.kubernetes.io/master-
#node后面的master为节点名称(主机名)
如果要恢复 Master Only 状态,执行如下命令:
kubectl taint node master node-role.kubernetes.io/master="":NoSchedule
接下来修改配置文件,将副本数减少为 3 个,重新执行 kubectl apply:在这里插入图片描述可以看到两个副本被删除,最终保留了 3 个副本。

k8s 的 Failover(失效备援)

接上节,现在模拟 k8s-node2 故障,关闭该节点。
[root@node02 ~]# halt -h
PolicyKit daemon disconnected from the bus.
We are no longer a registered authentication agent.
Connection to 192.168.83.5 closed by remote host.
Connection to 192.168.83.5 closed.

[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 8d v1.14.1
node01 Ready <none> 8d v1.14.1
node02 NotReady <none> 8d v1.14.1

[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-855b6b9dc8-59qtv 1/1 Running 0 21m 10.244.1.2 node01 <none> <none>
nginx-deployment-855b6b9dc8-6p6tt 1/1 Running 0 3m38s 10.244.1.5 node01 <none> <none>
nginx-deployment-855b6b9dc8-d7t6h 1/1 Terminating 0 21m 10.244.2.2 node02 <none> <none>
nginx-deployment-855b6b9dc8-fx6tx 1/1 Running 0 13m 10.244.1.3 node01 <none> <none>
nginx-deployment-855b6b9dc8-h65gm 1/1 Terminating 0 13m 10.244.2.3 node02 <none> <none>
nginx-deployment-855b6b9dc8-m7gp7 1/1 Running 0 3m38s 10.244.1.4 node01 <none> <none>

当 k8s-node2 恢复后,Unknown 的 Pod 会被删除,不过已经运行的 Pod 不会重新调度回 k8s-node2。

[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-855b6b9dc8-59qtv 1/1 Running 0 26m 10.244.1.2 node01 <none> <none>
nginx-deployment-855b6b9dc8-6p6tt 1/1 Running 0 9m6s 10.244.1.5 node01 <none> <none>
nginx-deployment-855b6b9dc8-fx6tx 1/1 Running 0 19m 10.244.1.3 node01 <none> <none>
nginx-deployment-855b6b9dc8-m7gp7 1/1 Running 0 9m6s 10.244.1.4 node01 <none> <none>

用 label 控制 Pod 的位置

默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node。不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。
Kubernetes 是通过 label 来实现这个功能的。
label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性。比如执行如下命令标注 k8s-node1 是配置了 SSD 的节点。
kubectl label node node01 disktype=ssd
然后通过 kubectl get node --show-labels 查看节点的 label。
在这里插入图片描述
disktype=ssd 已经成功添加到 k8s-node1,除了 disktype,Node 还有几个 Kubernetes 自己维护的 label。
有了 disktype 这个自定义 label,接下来就可以指定将 Pod 部署到 k8s-node1。编辑 nginx.yml:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 6
  template:
    metadata:
      labels:
        app: web_server
    spec:
      containers:
      - name: nginx
        image: nginx
      nodeSelector:
        disktype: ssd

在这里插入图片描述
全部 6 个副本都运行在 k8s-node1 上,符合我们的预期。
要删除 label disktype,执行如下命令:
kubectl label node node01 disktype-
在这里插入图片描述
不过此时 Pod 并不会重新部署,依然在 k8s-node1 上运行。
在这里插入图片描述
除非在 nginx.yml 中删除 nodeSelector 设置,然后通过 kubectl apply 重新部署。
Kubernetes 会删除之前的 Pod 并调度和运行新的 Pod。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值