kubernetes-核心概念及创建应用(六)
kubernetes是什么:
•Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
•K8S用于容器化应用程序的部署,扩展和管理。
•K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
•Kubernetes目标是让部署容器化应用简单高效。
官方网站:http://www.kubernetes.io
kubernetes特性:
自我修复:在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
弹性伸缩:使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
自动部署和回滚:K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
服务发现和负载均衡:K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
机密和配置管理:管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
存储编排:挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
批处理:提供一次性任务,定时任务;满足批量数据处理和分析的场景。
kubernetes核心概念:
Pod
Pod是最小部署单元,每个Pod包含一个或多个容器,Pod中的容器会作为一个整体被Master调度到一个Node上运行。
Kubernetes引入Pod主要基于下面两个目的:
、可管理性
有些容器天生就是需要紧密联系,一起工作。Pod 提供了比容器更高层次的抽象,将它们封装到一个部署单元中。Kubernetes 以 Pod 为最小单位进行调度、扩展、共享资源、管理生命周期 、通信和资源共享
Pod中的所有容器使用同一个网络namespace即相同的IP地址和Port空间,它们可以直接用localhost通信。同样的,这些容器可以共享存储,当Kubernetes挂载volume到Pod本质上是将volume挂载到Pod中的每一个容器。
Controllers
Kubernetes 通常不会直接创建Pod,而是通过Controller来管理Pod的。Controller中定义了Pod的部署特性,比如有几个副本,在什么样的Node上运行等。为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等。
Deployment :无状态应用部署。是最常用的 Controller,Deployment可以管理Pod的多个副本,并确保Pod按照期望的状态运行。
ReplicaSet :确保预期的Pod副本数量。使用Deployment时会自动创建ReplicaSet,也就是说Deployment是通过ReplicaSet来管理Pod的多个副本,我们通常不需要直接使用ReplicaSet。
DaemonSet :用于每个Node最多只运行一个Pod副本的场景。正如其名称所揭示的,DaemonSet通常用于运行daemon。
StatefulSet :有状态应用部署。能够保证Pod的每个副本在整个生命周期中名称是不变的。当某个Pod发生故障需要删除并重新启动时,Pod的名称会发生变化。同时会保证副本按照固定的顺序启动、更新或者删除。
Job :一次性任务。用于运行结束就删除的应用。
Cronjob :定时任务
Service
防止Pod失联。定义一组Pod的访问策略。
Deployment可以部署多个副本,每个Pod都有自己的IP,而Pod很可能会被频繁地销毁和重启,它们的IP会发生变化,用IP来访问不太现实。
Kubernetes Service 定义了外界访问一组特定Pod的方式。Service有自己的IP和端口,Service为Pod提供了负载均衡。
Kubernetes 运行容器(Pod)与访问容器(Pod)这两项任务分别由 Controller 和 Service 执行。
Namespaces
命名空间,将对象逻辑上隔离
Namespace 可以将一个物理的Cluster逻辑上划分成多个虚拟Cluster,每个Cluster就是一个Namespace。不同Namespace里的资源是完全隔离的。 Kubernetes 默认创建了两个 Namespace。
default -- 创建资源时如果不指定,将被放到这个Namespace中。
kube-system -- Kubernetes 自己创建的系统资源将放到这个Namespace中。
Label
标签,附加到某个资源上,用于关联对象、查询和筛选
K8s资源对象上的key/value对。同一个对象的labels属性的key必须唯一。label可以附加到各种资源对象上,如Node,Pod,Service,RC等。
通过给指定的资源对象捆绑一个或多个不用的label来实现多维度的资源分组管理功能,以便于灵活,方便地进行资源分配,调度,配置,部署等管理工作。
默认配置下,Scheduler会将Pod调度到所有可用的 Node。不过有些实际情况我们希望将 Pod部署到指定的Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。
kubectl命令行管理工具
kubectl命令常用选项:
kubectl工具管理资源
创建应用
[root@k8s-master1 ~]# kubectl run nginx --replicas= --image=nginx:1.14 --port=
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 created
[root@k8s-master1 ~]# kubectl get deploy,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/nginx / 32s NAME READY STATUS RESTARTS AGE
pod/nginx-7bc87ddb4d-cwptc / ContainerCreating 32s
pod/nginx-7bc87ddb4d-krl94 / ContainerCreating 32s
pod/nginx-7bc87ddb4d-xzbjn / Running 32s
发布
[root@k8s-master1 ~]# kubectl expose deployment nginx --port= --type=NodePort --target-port= --name=nginx-service
service/nginx-service exposed
[root@k8s-master1 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> /TCP 19h
nginx-service NodePort 10.0.0.201 <none> :/TCP 36s
更新
[root@k8s-master1 ~]# kubectl set image deployment/nginx nginx=nginx:1.15
[root@k8s-master1 ~]# kubectl get deploy,pods -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.extensions/nginx / 9m44s nginx nginx:1.15 run=nginx NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-6f7d58d4cc-24x56 / Running 6s 172.17.92.2 192.168.0.126 <none> <none>
pod/nginx-6f7d58d4cc-jnlx7 / Running 14s 172.17.92.3 192.168.0.126 <none> <none>
pod/nginx-6f7d58d4cc-wpk6n / Running 28s 172.17.19.3 192.168.0.125 <none> <none>
回滚
[root@k8s-master1 ~]# kubectl rollout history deployment/nginx
deployment.extensions/nginx
REVISION CHANGE-CAUSE
<none>
<none> [root@k8s-master1 ~]# kubectl rollout undo deployment/nginx
deployment.extensions/nginx rolled back
[root@k8s-master1 ~]# kubectl get deploy,pods -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.extensions/nginx / 11m nginx nginx:1.14 run=nginx NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-7bc87ddb4d-nqc6f / Running 44s 172.17.19.2 192.168.0.125 <none> <none>
pod/nginx-7bc87ddb4d-tqmxl / Running 40s 172.17.92.3 192.168.0.126 <none> <none>
pod/nginx-7bc87ddb4d-zstkj / Running 42s 172.17.92.2 192.168.0.126 <none> <none>
删除
[root@k8s-master1 ~]# kubectl delete deploy/nginx
deployment.extensions "nginx" deleted
[root@k8s-master1 ~]# kubectl delete svc/nginx-service
service "nginx-service" deleted
YAML配置文件管理资源
配置文件说明:
定义配置时,指定最新稳定版API(当前为v1);
配置文件应该存储在集群之外的版本控制仓库中。如果需要,可以快速回滚配置、重新创建和恢复;
应该使用YAML格式编写配置文件,而不是JSON。尽管这些格式都可以使用,但YAML对用户更加友好;
可以将相关对象组合成单个文件,通常会更容易管理;
不要没必要的指定默认值,简单和最小配置减少错误;
在注释中说明一个对象描述更好维护。
语法格式:
•缩进表示层级关系
•不支持制表符“tab”缩进,使用空格缩进
•通常开头缩进2 个空格
•字符后缩进1 个空格,如冒号、逗号等
•“---” 表示YAML格式,一个文件的开始
•“#”注释
以YAML文件方式创建deployment
[root@k8s-master1 nginx]# vim nginx-deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
replicas:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15
ports:
- containerPort: 80
[root@k8s-master1 nginx]# kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
查看deployment,pod
[root@k8s-master1 nginx]# kubectl get deploy,pod
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/nginx-deployment / 2m4s NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-5fc86c987f-cx9t7 / Running 2m4s
pod/nginx-deployment-5fc86c987f-gj2v9 / Running 2m4s
pod/nginx-deployment-5fc86c987f-r5w7n / Running 2m4s
对副本数进行扩容
[root@k8s-master1 nginx]# kubectl scale deployment nginx-deployment --replicas 5
deployment.extensions/nginx-deployment scaled
[root@k8s-master1 nginx]# kubectl get deploy,pod -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.extensions/nginx-deployment 5/5 5 5 18m nginx nginx:1.15 app=nginx NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-deployment-5fc86c987f-cx9t7 1/1 Running 0 18m 172.17.19.3 192.168.0.125 <none> <none>
pod/nginx-deployment-5fc86c987f-gj2v9 1/1 Running 0 18m 172.17.92.2 192.168.0.126 <none> <none>
pod/nginx-deployment-5fc86c987f-q7rhb 1/1 Running 0 4s 172.17.92.3 192.168.0.126 <none> <none>
pod/nginx-deployment-5fc86c987f-r5w7n 1/1 Running 0 18m 172.17.19.2 192.168.0.125 <none> <none>
pod/nginx-deployment-5fc86c987f-sqksm 1/1 Running 0 4s 172.17.19.4 192.168.0.125 <none>
使用service提供外部访问
[root@k8s-master1 nginx]# vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: NodePort
ports:
- port:
targetPort:
selector:
app: nginx [root@k8s-master1 nginx]# kubectl create -f nginx-service.yaml
service/nginx-service created
[root@k8s-master1 nginx]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.0.0.1 <none> /TCP 20h <none>
nginx-service NodePort 10.0.0.194 <none> :/TCP 20s app=nginx
浏览器访问Node IP:41854
帮助生成YAML文件的方式
•用run命令生成
kubectl run --image=nginx my-deploy -o yaml --dry-run > my-deploy.yaml
•用get命令导出
kubectl get my-deploy/nginx-o=yaml --export > my-deploy.yaml
•Pod容器的字段拼写忘记了
kubectl explain pods.spec.containers
kubernetes-核心概念及创建应用(六)的更多相关文章
- Kubernetes 核心概念
什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...
- 十分钟带你理解Kubernetes核心概念
什么是Kubernetes? Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成K ...
- Kubernetes核心概念简介
本文将会简单介绍Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概 ...
- 后端技术杂谈11:十分钟理解Kubernetes核心概念
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 本文转自 https://github.com/h2pl/Java-Tutorial 喜欢的 ...
- 01 . 容器编排简介及Kubernetes核心概念
Kubernetes简介 Kubernetes是谷歌严格保密十几年的秘密武器-Borg的一个开源版本,是Docker分布式系统解决方案.2014年由Google公司启动. Kubernetes提供了面 ...
- [转]十分钟带你理解Kubernetes核心概念
本文将会简单介绍 Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些 ...
- 第3 章 : Kubernetes 核心概念
Kubernetes 核心概念 本文整理自 CNCF 和阿里巴巴联合举办的云原生技术公开课的课时 3:Kubernetes 核心概念.本次课程中,阿里巴巴资深技术专家.CNCF 9个 TCO 之一 李 ...
- kubernetes核心概念
摘抄自: https://www.cnblogs.com/zhenyuyaodidiao/p/6500720.html 1.基础架构 1.1 Master Master节点上面主要由四个模块组成:A ...
- Kubernetes核心概念总结
目录贴:Kubernetes学习系列 1.基础架构 1.1 Master Master节点上面主要由四个模块组成:APIServer.scheduler.controller manager.etcd ...
- 入门 - 复习Kubernetes核心概念 (八)
本文将会简单介绍Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概 ...
随机推荐
- 【异步编程】Part2:掌控SynchronizationContext避免deadlock
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原 ...
- 1366 - Incorrect string value:'\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' a 错误修改
把name的字符集修改成 utf8 ,然后把表关了从新打开,就可以了 如果还不行,就从新创表,在创表的时候修改name的字符集 如果还不行,就修改my.ini 它在你的mysql安装路径里 [mysq ...
- CODING 告诉你硅谷的研发项目管理之道系列(6)
写在前面 优秀的研发管理者是怎么工作的,如何更加高效地管理研发团队?这些一直是 CODING关注的重要话题,我们不断地打磨 CODING 研发系统来让开发更简单.近期我们精心挑选了几篇硅谷科技公司研发 ...
- according to tld or attribute directive in tag file attribute *** does not accept any expressions
http://stackoverflow.com/questions/13428788/according-to-tld-or-attribute-directive-in-tag-file-attr ...
- luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号
因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...
- C.One Piece
链接:https://ac.nowcoder.com/acm/contest/908/C 题意: Luffy once saw a particularly delicious food, but h ...
- bzoj1095: [ZJOI2007]Hide 捉迷藏 动态点分治学习
好迷啊...感觉动态点分治就是个玄学,蜜汁把树的深度缩到logn (静态)点分治大概是递归的时候分类讨论: 1.答案经过当前点,暴力(雾)算 2.答案不经过当前点,继续递归 由于原树可以长的奇形怪状( ...
- centos下svnadmin的部署过程
1. 安装SVN #yum –y install subversion 2. 安装openjdk #yum –y list java* #yum –y install java-1.8.0 ...
- .net C#实现 中文转Unicode、Unicode转中文 及与js对应关系
中文转Unicode:HttpUtility.UrlEncodeUnicode(string str); 转换后中文格式:"%uxxxx" 举例:"柳_abc123&q ...
- [RDL]中多行组列组占比报表制作
结果如下: 生意额占比表达式:=iif(Fields!生意额.Value is nothing,"",Fields!生意额.Value/sum(Fields!生意额.Value, ...