Kubernetes抛砖引玉

举报
蒋小鱼 发表于 2020/09/19 15:20:42 2020/09/19
【摘要】 新人初入K8s江湖,站在巨人的肩膀上,有点不成熟的想法,做了一点浅浅的实践,为后来人抛砖引玉。

一、云计算独立宇宙

image.png

1.云是由很多小水滴组成的,把每一个计算机想象成小水滴,联合起来就形成了云;传统的水滴就是VMDocker的出现,改变了小水滴的粒度

2.水滴独立可运行,内部完整 ( VMDocker容器)

3.一般水滴先出现,然后出现管理水滴的平台(如OpenStackKubernetes

二、Kubernetes简介

1.Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful,Kubernetes提供了应用部署,规划,更新,维护的一种机制

2.Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让dlcatalog一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让dlcatalog一直提供服务)

3.Kubenetes中,所有的容器均在Pod中运行,一个Pod可以承载一个或者多个相关的容器

三、Kubernetes典型名词

1600499686656031870.png


1.Pod

Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod;一个Pod是一个容器环境下的“逻辑主机”,一个Pod是由多个相关的并且共享磁盘的容器组成;在同一个Pod里,容器之间的端口不能重复,否则Pod会起不来,或者起来后无限重启

2. Node

NodePod真正运行的主机,可以是物理机,也可以是虚拟机;为了管理Pod,每个Node节点上至少要运行container runtime(比如Docker)、kubeletkube-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=MyAppPod会被分配一个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用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件;ConfigMapsecret很类似,但它可以更方便地处理不包含敏感信息的字符串;

使用volumeConfigMap作为文件或目录直接挂载

如下表示将创建的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资源花式调度

image.png


1.       指定Node节点调度

有三种方式指定 Pod 只运行在指定的 Node 节点上

方式一:

nodeSelector:只调度到匹配指定labelNode

方式二:

nodeAffinity:功能更丰富的 Node 选择器,比如支持集合操作

nodeAffinity 目前支持两种:requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution,分别代表必须满足条件和优选条件

比如下面的例子代表调度到包含标签 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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。