摘要:云是由不少小水滴组成的,把每个计算机想象成小水滴,联合起来就造成了云。通常水滴先出现,而后出现管理水滴的平台(如OpenStack,Kubernetes)。
1.云是由不少小水滴组成的,把每个计算机想象成小水滴,联合起来就造成了云;传统的水滴就是VM;Docker的出现,改变了小水滴的粒度node
2.水滴独立可运行,内部完整 (如 VM,Docker容器)json
3.通常水滴先出现,而后出现管理水滴的平台(如OpenStack,Kubernetes)api
1.Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单而且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制app
2.Kubernetes一个核心的特色就是可以自主的管理容器来保证云平台中的容器按照用户的指望状态运行着(好比用户想让dlcatalog一直运行,用户不须要关心怎么去作,Kubernetes会自动去监控,而后去重启,新建,总之,让dlcatalog一直提供服务)dom
3.在Kubenetes中,全部的容器均在Pod中运行,一个Pod能够承载一个或者多个相关的容器函数
在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod;一个Pod是一个容器环境下的“逻辑主机”,一个Pod是由多个相关的而且共享磁盘的容器组成;在同一个Pod里,容器之间的端口不能重复,不然Pod会起不来,或者起来后无限重启ui
Node是Pod真正运行的主机,能够是物理机,也能够是虚拟机;为了管理Pod,每一个Node节点上至少要运行container runtime(好比Docker)、kubelet和kube-proxy服务;Node本质上不是Kubernetes来建立的,Kubernetes只是管理Node上的资源;虽然能够经过manifest建立一个Node对象(以下json所示),但Kubernetes也只是去检查是否真的是有这么一个Node,若是检查失败,也不会往上调度Pod云计算
{ "kind": "Node", "apiVersion": "v1", "metadata": { "name": "10.63.90.18", "labels": { "name": "my-first-k8s-node" } } }
Service是一个抽象的概念,是K8s里面的精华;每一个K8s上的App,均可以申请集群内部的“名号”,用来表明本身;K8s就会给你的App分配一个Service许可证,许可证上面带着“假IP”,任何集群内部只要访问这个IP,就等于访问你的Appspa
假设咱们拥有一些Pod,每一个Pod都开放了9083端口,而且都带有一个标签app=MyApp;以下这段json代码会建立一个新的Service对象,名称为my-dlcatalog-metastore-service,而且会链接目标端口9083;而且带有标签app=MyApp的Pod会被分配一个ip地址,这个ip是给kube-proxy使用的,集群内部只要访问这个ip,就等于访问你的App;须要注意的是,K8s里面的Pod实际ip通常没什么用3d
kind: Service, apiVersion: v1, metadata: name: my-dlcatalog-metastore-service spec: selector: app: MyApp ports: - protocol: TCP, port: 20403, targetPort: 9083
ConfigMap用于保存配置数据的键值对,能够用来保存单个属性,也能够用来保存配置文件;ConfigMap跟secret很相似,但它能够更方便地处理不包含敏感信息的字符串;
使用volume将ConfigMap做为文件或目录直接挂载
以下表示将建立的ConfigMap直接挂载至Pod的/etc/config目录下
apiVersion: v1 kind: Pod metadata: name: vol-test-pod spec: containers: - name: test-container image: 10.63.30.148:20202/ei_cnnroth7a/jwsdlcatalog-x86_64:1.0.1.20200918144530 command: [ "/bin/sh", "bin/start_server.sh" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: special-config restartPolicy: Never
指定Node节点调度
有三种方式指定 Pod 只运行在指定的 Node 节点上
方式一:
nodeSelector:只调度到匹配指定label的Node上
方式二:
nodeAffinity:功能更丰富的 Node 选择器,好比支持集合操做
nodeAffinity 目前支持两种:requiredDuringSchedulingIgnoredDuringExecution与preferredDuringSchedulingIgnoredDuringExecution,分别表明必须知足条件和优选条件
好比下面的例子表明调度到包含标签 http://kubernetes.io/e2e-az-name 而且值为 e2e-az1 或 e2e-az2 的 Node 上,而且优选还带有标签 another-node-label-key=another-node-label-value 的 Node
apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value containers: - name: with-node-affinity image: 10.63.30.148:20202/ei_cnnroth7a/jwsdlcatalog-x86_64:1.0.1.20200918144530
方式三:
podAffinity:调度到知足条件的 Pod 所在的 Node 上
podAffinity 基于 Pod 的标签来选择 Node,仅调度到知足条件 Pod 所在的 Node 上,支持 podAffinity 和 podAntiAffinity
这个功能比较绕,如下面的两个例子做为讲解:
第一个例子表示:
若是一个 “Node 所在 Zone 中包含至少一个带有 security=S1 标签且运行中的 Pod”,那么能够调度到该 Node;不调度到 “包含至少一个带有 security=S2 标签且运行中 Pod” 的 Node 上
apiVersion: v1 kind: Pod metadata: name: with-pod-affinity spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: failure-domain.beta.kubernetes.io/zone podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: security operator: In values: - S2 topologyKey: kubernetes.io/hostname containers: - name: with-node-affinity image: 10.63.30.148:20202/ei_cnnroth7a/jwsdlcatalog-x86_64:1.0.1.20200918144530
第二个例子表示:
若是一个 “Node 所在 Zone 中包含至少一个带有 appVersion= jwsdlcatalog-x86_64-1.0.1.20200918144530标签且运行中的 Pod”,那么推荐不调度到该 Node;不调度到 “包含至少一个带有app= jwsdlcatalog-x86_64标签且运行中 Pod” 的 Node 上
spec: restartPolicy: Always #pod重启策略 securityContext: runAsUser: 2000 fsGroup: 2000 affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: matchExpressions: - key: appVersion operator: In values: - concat: - get_input: IMAGE_NAME - '-' - get_input: IMAGE_VERSION #numOfMatchingPods: "2" #必定不要加此字段,此字段是华为本身的实现,社区没有接纳 topologyKey: "failure-domain.beta.kubernetes.io/zone" weight: 100 requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - get_input: IMAGE_NAME numOfMatchingPods: "1" topologyKey: "kubernetes.io/hostname" containers: - image: concat: - get_input: IMAGE_ADDR #拼接镜像的地址(#用拼接函数解决数字型参数问题) - "/" - get_input: IMAGE_NAME #拼接镜像的地址(#用拼接函数解决数字型参数问题) - ":" - get_input: IMAGE_VERSION #拼接镜像的地址(#用拼接函数解决数字型参数问题) name: jwsdlcatalog
注:本文纯属我的观点,部分图片若有雷同,纯属意外