一、Deployment

        k8s通过各种Controller管理Pod的生命周期,为了满足不同的业务场景,k8s提供了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等多种资源类型。

1、创建Deployment应用

kubectl run nginx-deployment --image=nginx:1.7. --replicas=

 上述命令部署了包含两个副本的nginx-deployment,容器的image为nginx:1.7.9

①查看nginx-deployment的状态

[root@k8s-node1 ~]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 6h

②详细查看nginx-deployment

[root@k8s-node1 ~]# kubectl describe deployment nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Thu, Dec :: +
Labels: run=nginx-deployment
Annotations: deployment.kubernetes.io/revision=
Selector: run=nginx-deployment
Replicas: desired | updated | total | available | unavailable
StrategyType: RollingUpdate
MinReadySeconds:
RollingUpdateStrategy: max unavailable, max surge
Pod Template:
Labels: run=nginx-deployment
Containers:
nginx-deployment:
Image: nginx:1.7.
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-6b5c99b6fd (/ replicas created)
Events: <none>

图上标红的部分告诉我们创建了一个nginx-deployment-6b5c99b6fd,Events记录了ReplicaSet的启动过程,同样验证了deployment是通过ReplicaSet来管理Pod,可以通过命令查看ReplicaSet

[root@k8s-node1 ~]# kubectl get replicaset
NAME DESIRED CURRENT READY AGE
nginx-deployment-6b5c99b6fd 6h

③详细查看Replicaset

[root@k8s-node1 ~]# kubectl describe replicaset nginx-deployment-6b5c99b6fd
Name: nginx-deployment-6b5c99b6fd
Namespace: default
Selector: pod-template-hash=,run=nginx-deployment
Labels: pod-template-hash=
run=nginx-deployment
Annotations: deployment.kubernetes.io/desired-replicas=
deployment.kubernetes.io/max-replicas=
deployment.kubernetes.io/revision=
Controlled By: Deployment/nginx-deployment
Replicas: 2 current / 2 desired
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: pod-template-hash=2617556298
run=nginx-deployment
Containers:
nginx-deployment:
Image: nginx:1.7.9
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Events: <none>

④查看Pod

[root@k8s-node1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-6b5c99b6fd-9mxc7 / Running 6h
nginx-deployment-6b5c99b6fd-wq6vb / Running 6h

⑤详细查看Pod

[root@k8s-node1 ~]# kubectl describe pod nginx-deployment-6b5c99b6fd-9mxc7
Name: nginx-deployment-6b5c99b6fd-9mxc7
Namespace: default
Node: 192.168.56.12/192.168.56.12
Start Time: Thu, Dec :: +
Labels: pod-template-hash=
run=nginx-deployment
Annotations: <none>
Status: Running
IP: 10.2.72.5
Controlled By: ReplicaSet/nginx-deployment-
nginx-deployment-6b5c99b6fd #此Pod是由nginx-deployment-nginx-deployment-6b5c99b6fd创建的
 Containers: nginx-deployment: Container ID: docker://a9768d66dd2cee284ca310250cb01d7814251335d5104ab98d0444e295e7a94d Image: nginx:1.7. Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451 Port: <none> Host Port: <none> State: Running Started: Thu,  Dec  :: + Ready: True Restart Count:  Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-jqfzk (ro)

2、创建Deployment整个过程

  • 用户通过kubectl创建Deployment
  • Deployment创建ReplicaSet
  • ReplicaSet创建Pod

3、YAML文件方式创建

①kubectl apply -f nginx.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: nginx-deployment
name: nginx-deployment
spec:
replicas:
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
labels:
app: nginx-deployment
spec:
containers:
- image: nginx:1.7.
name: nginx

②通过命令自动生成yaml文件

kubectl create deployment nginx-deployment --image=nginx:1.7. --dry-run -o yaml >nginx-deployment.yaml

kubectl apply不但能够创建k8s资源,也可以对资源进行更新,此外k8s还提供了kubectl create、kubectl replace、kubectl edit和 kubectl patch,工作中尽量使用 kubectl apply,此命令可以应对90%以上的应用场景。

4、Deployment配置文件介绍

①nginx-deployment为例说明

②删除Deployment资源

kubectl delete deployment nginx-deployment

或者

kubectl delete -f nginx-deployment.yaml

5、Pod弹性伸缩

①查看pod分配在哪个节点

[root@k8s-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-6b5c99b6fd-9mxc7 / Running 3d 10.2.72.5 192.168.56.12
nginx-deployment-6b5c99b6fd-wq6vb / Running 3d 10.2.73.1 192.168.56.13

②修改Pod副本数为5

[root@k8s-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-6d8fccdfcb-4ql9d / Running 10s 10.2.72.5 192.168.56.12
nginx-deployment-6d8fccdfcb-f7895 / Running 10s 10.2.72.6 192.168.56.12
nginx-deployment-6d8fccdfcb-jsmfj / Running 10s 10.2.72.7 192.168.56.12
nginx-deployment-6d8fccdfcb-mcrxz / Running 10s 10.2.73.1 192.168.56.13
nginx-deployment-6d8fccdfcb-qnjvc / Running 10s 10.2.73.2 192.168.56.13

新创建的三个Podf副本调度到k8s-node1和k8s-node2

③修改Pod副本书为3

[root@k8s-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-6d8fccdfcb-4ql9d / Running 8m 10.2.72.5 192.168.56.12
nginx-deployment-6d8fccdfcb-mcrxz / Running 8m 10.2.72.6 192.168.56.12
nginx-deployment-6d8fccdfcb-qnjvc / Running 8m 10.2.73.1 192.168.56.13

6、Failover

  •  如果k8s-node2节点故障,k8s会检查到k8s-node2节点不可用,将node2上的Pod标记为Unknown状态,并在node1上新创建两个Pod,保持副本数为3
  •  当k8s-node2节点恢复后,Unknown的Pod会被删除,不过已经运行的 Pod不会重新调度回node2节点的

7、用label控制Pod的位置

  • 默认配置下,Scheduler会将Pod调度到所有可用的Node节点
  • 配置Pod部署到指定的Node节点,通过label来实现
  • label是Key-value对,各种资源都可以设置label,自定义属性

①标注k8s-node2配置SSD节点

[root@k8s-node1 ~]# kubectl label node 192.168.56.12 disktype=ssd
node "192.168.56.12" labeled

②查看节点的label

[root@k8s-node1 ~]# kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
192.168.56.12 Ready <none> 5d v1.10.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=192.168.56.12

③修改yaml配置文件指定将Pod部署到k8s-node2上面

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: nginx-deployment
name: nginx-deployment
spec:
replicas:
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
labels:
app: nginx-deployment
spec:
containers:
- image: nginx:1.7.
name: nginx
nodeSelector:
disktype: ssd

④查看Pod运行在的节点

[root@k8s-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-5c7c98cf4b-fr85m / Running 1m 10.2.72.24 192.168.56.12
nginx-deployment-5c7c98cf4b-krb4z / Running 1m 10.2.72.25 192.168.56.12
nginx-deployment-5c7c98cf4b-x9nqd / Running 1m 10.2.72.23 192.168.56.12

结果:3个副本全都运行在了k8s-node2节点上面

⑤删除标签 label disktype

[root@k8s-node1 ~]# kubectl label node 192.168.56.12 disktype-
node "192.168.56.12" labeled

虽然删除了label,但Pod并不会重新部署,除非修改yaml中配置,kubectl apply重新部署

二、DaemonSet

  • Deployment部署的Pod副本会分布在每个node节点,每个node可能运行好几个副本
  • DaemonSet的不同之处在于,每个Node上最多只部署运行一个副本

1、DaemonSet应用场景

  • 在集群的每个节点上运行存储Daemon,比如glusterd或ceph
  • 在每个节点上运行日志收集Daemon,比如logstash
  • 在每个节点上运行监控Daemon,比如Prometheus Node Exporter或 collectd

2、K8s的系统组件也是通过DaemonSet实现的(kube-flannel-ds、kube-proxy)

[root@k8s-node1 ~]# kubectl get pod --namespace=kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE
coredns-77c989547b-jkg8k / Running 32d 10.2.11.2 192.168.29.182
coredns-77c989547b-zcwv9 / Running 3d 10.2.11.23 192.168.29.182
grafana-core-f796895df-mqfqp / Running 16h 10.2.1.41 192.168.29.176
heapster-64f4f9f59d-tdxsc / Running 3d 10.2.11.26 192.168.29.182
kubernetes-dashboard-66c9d98865- / Running 32d 10.2.11.3 192.168.29.182
monitoring-influxdb-644db5c5b6-zfkdd / Running 32d 10.2.11.4 192.168.29.182
node-exporter-8zrg7 / Running 19h 10.2.11.79 192.168.29.182 #监控Daemon
node-exporter-prshg / Running 19h 10.2.1.55 192.168.29.176 #监控Daemon
prometheus-5f9d587758-bcmpm / Running 17h 10.2.1.152 192.168.29.176

3、Node Exporter配置文件

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: node-exporter
namespace: kube-system
labels:
k8s-app: node-exporter
spec:
template:
metadata:
labels:
k8s-app: node-exporter
spec:
containers:
- image: prom/node-exporter
name: node-exporter
ports:
- containerPort:
protocol: TCP
name: http
volumeMounts:
- name: tz-config
mountPath: /etc/localtime
volumes:
- name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai

三、Job

   容器按照持续运行时间分为两类:

  • 服务类容器:持续提供服务,需要一直运行,例如:HTTP Server、Daemon等
  • 工作类容器:一次性任务,例如:批处理程序,完成后容器就会退出

1、创建一个Job配置文件

apiVersion: batch/v1  #当前Job的apiVersion
kind: Job #指明当前资源类型
metadata:
name: myjob
spec:
template:
metadata:
name: myjob
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello k8s job!"]
restartPolicy: Never #什么时候重启容器,对于Job只能设置Never或者OnFailure

2、查看Job

[root@k8s-node1 ~]# kubectl apply -f myjob.yaml
job.batch "myjob" created [root@k8s-node1 ~]# kubectl get job
NAME DESIRED SUCCESSFUL AGE
myjob 25s #DESIRED和SUCCESSFUL都为1,表示启动一个pod并成功执行,SUCCESSFUL为0刚表示失败

 Pod执行完毕后容器会退出,需要用--show-all才能查看已经完成的Pod

[root@k8s-node1 ~]# kubectl get pod --show-all
NAME READY STATUS RESTARTS AGE
myjob-98knz / Completed 3m
  • restartPolicy: Never 如果启动Pod失败,此容器不会被重启,但Job DESIRED值为1,目前SUCCESSFUL为0,所以会一直重新启动Pod,直到SUCCESSFUL为1
  • restartPolicy: OnFailure 如果启动Pod失败,容器会自动重启

3、Job的并行

①创建示例文件

apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
parallelism: 2 #通过此参数设置同时运行多个Pod,提高Job的执行效率
template:
metadata:
name: myjob
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello k8s job!"]
restartPolicy: Never

②查看执行结果

[root@k8s-node1 ~]# kubectl get job
NAME DESIRED SUCCESSFUL AGE
myjob <none> 35s [root@k8s-node1 ~]# kubectl get pod --show-all NAME READY STATUS RESTARTS AGE #一共启动了两个Pod,而且AGE相同,可见是并行运行的
myjob-n4sd6 / Completed 1m
myjob-q84dx / Completed 1m

③Job并行应用场景

           批处理:每个副本都会从任务池中读取任务并执行,副本越多,执行时间就越快,效率就越高

4、定时Job

k8s也提供了类似linux中cron定时任务功能CronJob,可以定时执行Job。

①创建示例文件

apiVersion: batch/v2alpha1   #当前CronJob的apiVersion版本
kind: CronJob #资源类型
metadata:
name: hello
spec:
schedule: "*/1 * * * *" #什么时候运行Job,这里表示每一分钟启动一次
jobTemplate: #定义Job的模板,格式与前面的Job一致
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello k8s job!"]
restartPolicy: OnFailure

②创建定时Job

[root@k8s-node1 ~]# kubectl apply -f cronjob.yaml
error: error validating "cronjob.yaml": error validating data: [ValidationError(CronJob.spec): unknown field "spec" in io.k8s.api.batch.v1beta1.CronJobSpec, ValidationError(CronJob.spec): missing required field "jobTemplate" in io.k8s.api.batch.v1beta1.CronJobSpec]; if you choose to ignore these errors, turn validation off with --validate=false

k8s默认没有允许CronJob的功能,需要在kube-apiserver中加入这个功能

③修改kube-apiserver配置文件

vim /usr/lib/systemd/system/kube-apiserver.service

加入以下参数
--runtime-config=batch/v2alpha1=true

重启Node节点kubelet服务

systemctl restart kubelet.service

④查看定时任务

kubectl apply -f cronjob.yaml
[root@k8s-node1 ~]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */ * * * * False 16s 5m

查看Job执行情况

[root@k8s-node1 ~]# kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
hello- 3m
hello- 2m
hello- 1m
hello- 11s

每隔一分钟就会启动一个Job,通过kubect log可以查看某个Job的日志

[root@k8s-node1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello--d7479 / Completed 2m
hello--cpxdj / Completed 1m
hello--6dqvj / Completed 37s
[root@k8s-node1 ~]# kubectl logs hello--d7479
hello k8s job!

linux运维、架构之路-K8s应用的更多相关文章

  1. linux运维架构师职业规划

    1.假如你从来未接触过Linux的话,首先要做的就找一本指导书来学习.现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面,鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇.“鸟哥的私房 ...

  2. 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路

    做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...

  3. Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Discuz!

    Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Disc ...

  4. Linux运维企业架构实战系列

    Linux运维企业架构项目实战系列 项目实战1-LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2-LVS.nginx实现负载均衡系列 2.1 项目实战2.1-实现基于LVS负载均衡集 ...

  5. Linux运维企业架构项目实战系列

    Linux运维企业架构项目实战系列 项目实战1—LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2—LVS.nginx实现负载均衡系列2.1 项目实战2.1—实现基于LVS负载均衡集群 ...

  6. Linux 运维入门到跑路书单推荐

    一.基础入门 <鸟哥的Linux私房菜基础学习篇>:最具知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>,全面而详细地介绍了Linux操作系统. https://b ...

  7. linux运维工程师面试题收集

    面试必考 mysql5和mysql6 有什么区别 mysql-server-5.5:默认引擎改为Innodb,提高了性能和扩展性,提高实用性(中继日志自动恢复) mysql-server-5.6:In ...

  8. Linux运维工程师成长必经之路

    本路线图是从0基础开始,全方位由浅入深,按照多年Linux培训经验和优秀教学方法制定的学习思路和学习方法,路线图包括初级入门.中级进阶.高级提升和资深冲刺四个阶段,每阶段对应着不同优秀的课程和学习方法 ...

  9. 面试 Linux 运维工作至少需要知道哪些知识?

    前言 我们已经发过不少 Linux 面试题,但是单独的面试题总感觉会过于零碎,没有体系化内容给人的帮助大. 知乎上有这样一个问题:一个新手面试 Linux 运维工作至少需要知道哪些知识?其中有一个答案 ...

  10. 从零起步做到Linux运维经理, 你必须管好的23个细节

    “不想成为将军的士兵,不是好士兵”-拿破仑 如何成为运维经理? 一般来说,运维经理大概有两种出身:一种是从底层最基础的维护做起,通过出色的维护工作,让公司领导对这个人非常认可,同时对Linux运维工作 ...

随机推荐

  1. 【Linux开发】linux设备驱动归纳总结(四):3.抢占和上下文切换

    linux设备驱动归纳总结(四):3.抢占和上下文切换 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  2. C++学习笔记-引用

    引用是C语言中没有,而在C++中又很重要的一个概念,通过应用,可以得到变量本身,相对于得到变量的值而言,有更大的操作空间. 普通引用 变量的本质 变量名实质上是一段连续存储空间的别名,是一个标号 程序 ...

  3. pigcms研究

    {s:5:"price";s:2:"20";s:3:"num";i:2;s:4:"name";s:21:"紫薯 ...

  4. Interceptors - 拦截器

    1.概述 Flume有能力在运行阶段修改/删除Event,这是通过拦截器(Interceptors)来实现的. 拦截器需要实现org.apache.flume.interceptor.Intercep ...

  5. __VA_ARGS__用法

    转载 自定义调试信息的输出 调试信息的输出方法有很多种,  例如直接用printf,  或者出错时使用perror, fprintf等将信息直接打印到终端上, 在Qt上面一般使用qDebug,而守护进 ...

  6. PTA(Advanced Level)1036.Boys vs Girls

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  7. 【转帖】网卡多队列技术与RSS功能介绍

    网卡多队列技术与RSS功能介绍 2017年02月08日 15:44:37 Murphy_0806 阅读数 10665 标签: rss网卡dpdk 更多 个人分类: DPDK https://blog. ...

  8. 解决远程连不到CentOS7虚拟机或ifconfig中没有ens33

    在使用Secure CRT连接虚拟机连接不上,可能之前虚拟机关闭不当 登到虚拟机的中断使用ifconfig发现没有ens33 猜测是CentOS图形管理中的NetworkManager接管了网络配置, ...

  9. 【Vue高级知识】细谈Vue 中三要素(响应式+模板+render函数)

    [Vue高级知识]细谈Vue 中三要素(响应式+模板+render函数):https://blog.csdn.net/m0_37981569/article/details/93304809

  10. Makefile 书写规则

    1.1 Makefile的规则 在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则. target ... : prerequisites ...   command   ...