一、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. 题目---汉诺塔及AI代码及八皇后

    2019春第十一周作业 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering ...

  2. OI模板のpoke流[大型考试复习必备/kl]

    数论 快速乘: ll qmul(ll x,ll y,ll mod) { ll ans=0; while(y) { if(y&1) (ans+=x)%=mod; y>>=1; (x+ ...

  3. [转帖]docker-compose

    docker-compose https://www.cnblogs.com/embedded-linux/p/10714179.html 需要学习使用一下. 改天自己再改改用过的yaml文件.   ...

  4. [转帖]2015年时的新闻:Debian GNU/Hurd 2015 发布

    Debian GNU/Hurd 2015 发布 oschina 发布于 2015年04月30日 https://www.oschina.net/news/62004/debian-gnu-hurd-2 ...

  5. java多线程的优先性问题

    多线程的优先级问题 重点:理解线程优先级的继承性.规则性.随机性 线程的优先级 在操作系统中,线程可以划分优先级,.尽可能多的给优先级高的线程分配更多的CPU资源. 线程的优先级分为1~10,有三个预 ...

  6. Java代码 简单用于处理和数据库相关的操作

    package util; import org.apache.commons.beanutils.BeanUtils; import java.lang.reflect.InvocationTarg ...

  7. JAVA基础--JAVA API集合框架

    一.Map集合 1. map集合介绍 Collection集合的特点: 集合中存储的所有元素都是单一元素,元素和元素之间没有必然的关系.因此我们把Collection集合也称为单列集合. Map集合: ...

  8. C++;STL--队列与栈;

    队列 queue模板类的定义在<queue>头文件中. queue 模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型. 定 ...

  9. P2670 【扫雷游戏】

    题面哦~~ lalala~~~ 这题数据并不大,最大不过100*100,所以果断穷举 其实本来我是想边读边做的,但读入是个问题. 主要思路呢,就是读完之后穷举一边,只要是炸弹,就把周围一圈8个加一遍 ...

  10. myBatis+Spring+SpringMVC框架面试题整理

    myBatis+Spring+SpringMVC框架面试题整理(一) 2018年09月06日 13:36:01 新新许愿树 阅读数 14034更多 分类专栏: SSM   版权声明:本文为博主原创文章 ...