三艾云 Kubernetes 集群最佳实践

三艾云 Kubernetes 集群最佳实践

三艾云 Kubernetes 集群最佳实践

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

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

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

最佳实践 —— 部署应用


部署持久化存储

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

使用云盘定义静态存储

1. 创建 PV

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

参数说明:

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。

1apiVersion: v1 2kind: PersistentVolumeClaim 3metadata: 4 name: pv-static-pvc 5spec: 6 accessModes: 7 - ReadWriteOnce 8 storageClassName: "" 9 resources: 10 requests: 11 storage: 30Gi 12 selector: 13 matchLabels: 14 type: jdcloud-ebs
  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

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

查看集群的 PVC

kubectl get pvc

输出

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

查看集群的 PV

kubectl get pv

输出

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 文件定义如下:

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

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

kubectl create -f myservice.yaml

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

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

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

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

kubectl get pods -l run=myapp -o wide

返回结果如下:

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

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

kubectl get pods -l run=myapp -o wide

返回结果如下:

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

7、查看 Service 详情:

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

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

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

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

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

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

点赞
收藏

评论区

加载中...

相关推荐

EMR本地盘实例大规模数据集测试

阿里云最佳实践频道:【点击查看更多上云最佳实践(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fbp.aliyun.com%2F)】这里有丰富的企业上云最佳实践,从典型场景入门,提供一系列项目实践方案,降低企业上云门槛的同时满足您的需求!场景描述

OpenKruise:阿里巴巴 双11 全链路应用的云原生部署基座

简介:Kruise是Cruise的谐音,'K'forKubernetes,寓意Kubernetes上应用的航行和自动巡行,它满载着阿里巴巴多年在大规模应用部署、发布与管理最佳实践,以及阿里云Kubernetes服务数千客户的需求沉淀。来源|阿里巴巴云原生公众号(https://www.oschina.net/acti

2019 年,容器技术生态会发生些什么?

作者:阿里云智能事业部高级技术专家张磊1. Kubernetes项目被采纳度将持续增长作为“云原生”(CloudNative)理念落地的核心,Kubernetes项目已经成为了构建容器化平台体系的默认选择。但是,不同于一个只能生产资源的集群管理工具,Kubernetes项目最大的价值,乃在于它从一开始就提倡的声明式API和以此为

K8s

kubernetes(简称 K8s)是一个开源的,用于管理云平台中多个主机上的容器化的应用。在之前的文章中,我介绍如何通过 Docker 为我们提供的实验网站 PlaywithKubernetes(PWK)来搭建 Kubernetes 集群(点击查看)。    但如果每次学习时都需要重新搭建一个 K8s 集群还是很麻烦。好在 Kubernetes 

Dubbo 3.0 前瞻之对接 Kubernetes 原生服务

Kubernetes是当前全球最流行的容器服务平台,在Kubernetes集群中,Dubbo应用的部署方式往往需要借助第三方注册中心实现服务发现。Dubbo与Kubernetes的调度体系的结合,可以让原本需要管理两套平台的运维成本大大减低,而且Dubbo适配了Kubernetes原生服务也可以让框架本身更加融入云原生体系。基于D

15分钟在阿里云Kubernetes服务上快速建立Jenkins X Platform并运用GitOps管理应用发布

本文主要介绍如何在阿里云容器服务Kubernetes上快速安装部署JenkinsXPlatform并结合demo实践演示GitOps的操作流程。注意:本文中使用的jx工具、cloudenvironments等做过改造用以适配阿里云Kubernetes容器服务,并未在自建Kubernetes集群中做过验证。先决条件:首先,