摘要: 云是由很多小水滴组成的,把每一个计算机设想成小水滴,联结起来就造成了云。个别水滴先呈现,而后呈现治理水滴的平台(如 OpenStack,Kubernetes)。
一、云计算–独立宇宙
1. 云是由很多小水滴组成的,把每一个计算机设想成小水滴,联结起来就造成了云;传统的水滴就是 VM;Docker 的呈现,扭转了小水滴的粒度
2. 水滴独立可运行,外部残缺 (如 VM,Docker 容器)
3. 个别水滴先呈现,而后呈现治理水滴的平台(如 OpenStack,Kubernetes)
二、Kubernetes 简介
1.Kubernetes 是一个开源的,用于治理云平台中多个主机上的容器化的利用,Kubernetes 的指标是让部署容器化的利用简略并且高效(powerful),Kubernetes 提供了利用部署,布局,更新,保护的一种机制
2.Kubernetes 一个外围的特点就是可能自主的治理容器来保障云平台中的容器依照用户的冀望状态运行着(比方用户想让 dlcatalog 始终运行,用户不须要关怀怎么去做,Kubernetes 会主动去监控,而后去重启,新建,总之,让 dlcatalog 始终提供服务)
3. 在 Kubenetes 中,所有的容器均在 Pod 中运行,一个 Pod 能够承载一个或者多个相干的容器
三、Kubernetes 典型名词
1.Pod
在 Kubernetes 中,最小的治理元素不是一个个独立的容器,而是 Pod;一个 Pod 是一个容器环境下的“逻辑主机”,一个 Pod 是由多个相干的并且共享磁盘的容器组成;在同一个 Pod 里,容器之间的端口不能反复,否则 Pod 会起不来,或者起来后有限重启
2. Node
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”}
}
}
3. Service
Service 是一个形象的概念,是 K8s 外面的精髓;每个 K8s 上的 App,都能够申请集群外部的“名号”,用来代表本人;K8s 就会给你的 App 调配一个 Service 许可证,许可证下面带着“假 IP”,任何集群外部只有拜访这个 IP,就等于拜访你的 App
假如咱们领有一些 Pod,每个 Pod 都凋谢了 9083 端口,并且都带有一个标签 app=MyApp;如下这段 json 代码会创立一个新的 Service 对象,名称为 my-dlcatalog-metastore-service,并且会连贯指标端口 9083;并且带有标签 app=MyApp 的 Pod 会被调配一个 ip 地址,这个 ip 是给 kube-proxy 应用的,集群外部只有拜访这个 ip,就等于拜访你的 App;须要留神的是,K8s 外面的 Pod 理论 ip 个别没什么用
kind: Service,
apiVersion: v1,
metadata:
name: my-dlcatalog-metastore-service
spec:
selector:
app: MyApp
ports: – protocol: TCP,
port: 20403,
targetPort: 9083
4. ConfigMap
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
四、Kubernetes 资源花式调度
指定 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
注:本文纯属个人观点,局部图片如有雷同,纯属意外
点击关注,第一工夫理解华为云陈腐技术~