• 三艾云 Kubernetes 集群最佳实践


    三艾云 Kubernetes 集群最佳实践

    三艾云 Kubernetes 集群最佳实践

    容器是 Cloud Native 的基石,它们之间的关系不言而喻。了解容器对于学习 Cloud Native 也是十分重要的。近期,三艾云 Cloud Native 的 “在线公开课” 从理论和实践两个层面为大家分享了 Cloud Native 相关的技术知识。在本周的周日,我们还将迎来”Cloud Native 时代的应用之路与开源创新 “专场技术沙龙。

    因此我们今天的文章将会和大家分享关于三艾云 Kubernetes 集群的部分最佳实践。感兴趣的小伙伴也可以跟着文档自己动手进行创建。

    三艾云 Kubernetes 集群采用管理节点全托管的方式,为用户提供简单易用、高可靠、功能强大的容器管理服务。该产品完全兼容标准 Kubernetes API ,集成三艾云网络、存储等插件。Kubernetes 集群服务简化了 Kubernetes 部署、管理,降低了 Kubernetes 使用门槛,增强应用的可靠性,提升开发的效率,同时,也能更好地帮助用户减少资源投入的成本。

    最佳实践 —— 部署应用


    部署持久化存储

    三艾云 Kubernetes 集群服务集成了三艾云云硬盘,您可以在集群中使用三艾云云硬盘作为持久化存储;

    使用云盘定义静态存储

    1. 创建 PV

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: pv-static
      labels:
        type: jdcloud-ebs
    spec:
      capacity:
        storage: 30Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      jdcloudElasticBlockStore:
        volumeID: vol-ogcbkdjg7x
        fsType: xfs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    参数说明:

    1、如您需要在三艾云 Kubernetes 集群服务中使用三艾云云硬盘作为持久化存储,请在 PersistentVolume 定义时,指定插件 jdcloudElasticBlockStore;

    2、VolumeID:指定同地域下为 Kubernetes 集群服务提供持久化存储的云硬盘 ID;

    3、Fstype:指定文件系统类型;目前仅支持 ext4 和 xfs 两种;

    4、Capacity:PV 将具有特定的存储容量。这是使用 PV 的容量属性设置的;

    5、PersistentVolume 可以以资源提供者支持的任何方式挂载到主机上。

    三艾云云硬盘目前只支持一种模式 ReadWriteOnce—— 该卷可以被单个节点以读 / 写模式挂载;

    访问模式包括: ReadWriteOnce—— 该卷可以被单个节点以读 / 写模式挂载

    在命令行中,访问模式缩写为: RWO - ReadWriteOnce 三艾云为 PersistentVolume 提供了插件,插件类型为:jdcloudElasticBlockStore

    注:

    • 由于云硬盘限制一个云硬盘只能同时挂载一个云主机,在使用基于 PVC 的 Pod 时,建议使用 replicas=1 来创建一个部署集。StatefulSet 可解决多副本问题。
    • Pod 迁移,PVC 迁移 (卸载旧实例 / 挂载新实例) 默认 35 秒。
    • 通过 Deployment 部署,删除 Deployment 之后,可重新挂载原有 PVC 到新的 Pod 里面。

    2. 创建 PVC

    声明可以指定一个标签选择器来进一步过滤该组卷。只有标签与选择器匹配的卷可以绑定到声明。选择器由两个字段组成:

    所有来自 MatchLabels 和 MatchExpressions 的要求都被 “与” 在一起 —— 它们必须全部满足才能匹配。

    本例使用 MatchLabels 作为过滤条件,将匹配的 PersistentVolume 绑定到 Persistent Volume Claim。

    MatchLabels:Volume 必须有具有该值的标签

    matchExpressions:这是一个要求列表,通过指定关键字,值列表以及与关键字和值相关的运算符组成。有效的运算符包括 In、NotIn、Exists 和 DoesNotExist。

    访问模式包括:ReadWriteOnce—— 该卷可以被单个节点以读 / 写模式挂载。

    在命令行中,访问模式缩写为:RWO - ReadWriteOnce

    三艾云为 Persistent Volume 提供了插件,插件类型为:jdcloudElasticBlockStore

    注:副本数只能指定 1。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pv-static-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: ""
      resources:
        requests:
          storage: 30Gi
      selector:
        matchLabels:
          type: jdcloud-ebs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 创建 Pod

    kind: Pod apiVersion: v1 metadata: name: pod-static spec: volumes: - name: pv-static persistentVolumeClaim: claimName: pv-static-pvc containers: - name: busybox-static image: busybox command: - sleep - “600” imagePullPolicy: Always volumeMounts: - mountPath: “/usr/share/mybusybox/” name: pv-static

    使用三艾云云盘定义动态存储

    当集群中的静态 PV 都不匹配新建的 Persistent Volume Claim 时,集群可能会尝试动态地为 PVC 创建卷。

    关于三艾云云硬盘规格:

    创建 PVC

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc1
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: jdcloud-ssd
      resources:
        requests:
          storage: 20Gi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    查看集群的 PVC

    kubectl get pvc

    输出

    NAME                                         STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc1                                         Bound     pvc-73d8538b-ebd6-11e8-a857-fa163eeab14b   20Gi       RWO            jdcloud-ssd    18s
    
    • 1
    • 2

    查看集群的 PV

    kubectl get pv
    
    • 1

    输出

    NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-73d8538b-ebd6-11e8-a857-fa163eeab14b 20Gi RWO Delete Bound default/pvc1 jdcloud-ssd 2m

    基于 Storage Class jdcloud-ssd,为 PVC 创建了卷。一旦 PV 和 PVC 绑定后,Persistent Volume Claim 绑定是排他性的,不管它们是如何绑定的。 PVC 跟 PV 绑定是一对一的映射。

    2 部署 Service

    Kubernetes Service

    • Kubernetes Service 定义了这样一种抽象:一个 Pod 的逻辑分组,一种可以访问它们的策略 - 通常称为微服务。这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector(查看下面了解,为什么可能需要没有 Selector 的 Service)实现的。一个 Service 在 Kubernetes 中是一个 REST 对象,和 Pod 类似。像所有的 REST 对象一样, Service 定义可以基于 POST 方式,请求 API Server 创建新的实例。

    三艾云cnaaa Kubernetes 集成负载均衡服务,支持创建 Load Balance 类型的 Service,为应用提供安全、可靠的网络。

    • 创建的负载均衡会占用本地域的负载均衡配额,需要保证有足够配额。

    1、创建支持 Load Balance 类型的 Service,命名为 myservice.yaml 文件定义如下:

    kind: Service
    apiVersion: v1
    metadata:
      name: servicetest
      labels:
        run: myapp
    spec:
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 30062
      type: LoadBalancer
      selector:
         run: myapp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2、执行 Kubectl 创建命令,创建一个 Service;其中使用相应的 YAML 文件名称替换:

    kubectl create -f myservice.yaml
    
    • 1

    3、创建一组 Nginx Pod,mynginx.yaml 文件定义如下:

    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: my-nginx
    spec:
      selector:
        matchLabels:
          run: myapp
      replicas: 2
      template:
        metadata:
          labels:
            run: myapp
        spec:
          containers:
          - name: my-nginx
            image: nginx
            ports:
            - containerPort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4、执行 Kubectl 创建命令,创建一个 Deployment;其中使用相应的 YAML 文件名称替换 kubectl create -f mynginx.yaml

    5、查看已创建成功的 Deployment,执行以下命令:

    kubectl get pods -l run=myapp -o wide
    
    • 1

    返回结果如下:

    NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    my-nginx   2         2         2            2           4m
    
    • 1
    • 2

    6、查看相应的 Pod 运行状态,

    kubectl get pods -l run=myapp -o wide
    
    • 1

    返回结果如下:

    NAME                        READY     STATUS    RESTARTS   AGE       IP            NODE
    my-nginx-864b5bfdc7-6297s   1/1       Running   0          23m       172.16.0.10   k8s-node-vmtwjb-0vy9nuo0ym
    my-nginx-864b5bfdc7-lr7gq   1/1       Running   0          23m       172.16.0.42   k8s-node-vm25q1-0vy9nuo0ym
    
    • 1
    • 2
    • 3

    7、查看 Service 详情:

    kubectl describe service servicetest 可以查看绑定到 Service 的 Endpoints:

    Name:                     servicetest
    Namespace:                default
    Labels:                   run=myapp
    Annotations:              
    Selector:                 run=myapp
    Type:                     LoadBalancer
    IP:                       172.16.61.58
    LoadBalancer Ingress:     114.67.227.25
    Port:                       80/TCP
    TargetPort:               80/TCP
    NodePort:                   30062/TCP
    Endpoints:                172.16.0.10:80,172.16.0.42:80
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:
      Type     Reason                      Age                From                Message
      ----     ------                      ----               ----                -------
      Normal   EnsuringLoadBalancer        11m (x9 over 26m)  service-controller  Ensuring load balancer
      Normal   EnsuredLoadBalancer         10m                service-controller  Ensured load balancer
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    注:Load Balancer Ingress:114.67.227.25 为外部公网 IP

    8、执行如下命令查询绑定到 service 的 enpoints 列表:

    kubectl get ep servicetest
    返回
    
    NAME          ENDPOINTS                       AGE
    servicetest   172.16.0.10:80,172.16.0.42:80   28m
    
    • 1
    • 2
    • 3
    • 4
    • 5

    9、在浏览器中输入与 Service 关联的 Load Balance 公网 IP 及端口,看到如下页面,即表明 Nginx 服务正常。

  • 相关阅读:
    Spring MVC框架学习指南来了,让你快速掌握
    RTES - 3 - Quiz 1
    农业银行半年报:一份检验韧性的优质答卷
    深入总结MyBatis
    解决requests库进行爬虫ip请求时遇到的错误的方法
    (Java高级教程)第一章Java多线程基础-第一节5:wait和notify
    搭建本地MQTT服务器
    【深入了解操作系统进程:它们的角色、管理和重要性】
    【Linux】 linux | docker | 安装nacos
    GBase 8c V3.0.0数据类型——data_part
  • 原文地址:https://blog.csdn.net/weixin_43770745/article/details/127408013