ITPub博客

首页 > 云计算 > Docker/K8 > 京东云Kubernetes集群最佳实践

京东云Kubernetes集群最佳实践

原创 Docker/K8 作者:京东云技术新知 时间:2019-03-25 21:54:48 0 删除 编辑

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

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



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





最佳实践——部署应用




1

部署持久化存储


京东云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、如您需要在京东云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。

M atchLabels: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



3.  创建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


查看集群的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


  查看集群的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 创建新的实例。


京东云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

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

kubectl create -f myservice.yaml

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

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

kubectl create -f mynginx.yaml

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

kubectl  get pods -l run=myapp -o wide

 返回结果如下:


NAME       DESIRED   CURRENT   UP-
TO-DATE   AVAILABLE   AGE

my-nginx    2          2          2             2            4m

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

kubectl 
get pods -l run=myapp -o wide

返回结果如下:


NAME                        READY     STATUS    RESTARTS   AGE       IP            NODE

my-nginx-864b5bfdc7- 6297s    1/ 1       Running               23m        172.16.0.10   k8s-node-vmtwjb-0vy9nuo0ym
my-nginx-864b5bfdc7-lr7gq    1/ 1       Running               23m        172.16.0.42   k8s-node-vm25q1-0vy9nuo0ym
7、查看service

7、查看Service详情:


kubectl describe service servicetest

可以查看绑定到Service的Endpoints:


Name:                     servicetest

Namespace:                default
Labels:                   run=myapp
Annotations:              <none>
Selector:                 run=myapp
Type:                     LoadBalancer
IP:                       172.16.61.58
LoadBalancer Ingress:     114.67.227.25
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  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

注: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   28 m

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

欢迎点击“ 京东云 ”了解更多精彩内容


·END·


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69912185/viewspace-2639309/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
京东科技开发者(Developer of JD Technology)是京东科技集团旗下为AI、云计算、IoT等相关领域开发者提供技术分享交流的平台。平台将发布京东产品技术信息、行业技术内容、技术活动及大赛等资讯。拥抱技术,与开发者携手预见未来!

注册时间:2019-03-06

  • 博文量
    488
  • 访问量
    237736