写点什么

如果云是水滴,Kubernetes 就是水滴管理平台

发布于: 2020 年 12 月 21 日

摘要:云是由很多小水滴组成的,把每一个计算机想象成小水滴,联合起来就形成了云。一般水滴先出现,然后出现管理水滴的平台(如 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-servicespec:    selector:    app: MyAppports:- protocol: TCP,  port: 20403,  targetPort: 9083
复制代码

4. ConfigMap

ConfigMap 用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件;ConfigMap 跟 secret 很类似,但它可以更方便地处理不包含敏感信息的字符串;

使用 volume 将 ConfigMap 作为文件或目录直接挂载

如下表示将创建的 ConfigMap 直接挂载至 Pod 的/etc/config 目录下

apiVersion: v1kind: Podmetadata:    name: vol-test-podspec:    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: v1kind: Podmetadata:    name: with-node-affinityspec:    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: v1kind: Podmetadata:    name: with-pod-affinityspec:    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
复制代码

注:本文纯属个人观点,部分图片如有雷同,纯属意外

 

点击关注,第一时间了解华为云新鲜技术~


发布于: 2020 年 12 月 21 日阅读数: 108
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
如果云是水滴,Kubernetes就是水滴管理平台