京东云Kubernetes集群最佳实践

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

所以咱们今天的文章将会和你们分享关于京东云Kubernetes集群的部分最佳实践。感兴趣的小伙伴也能够跟着文档本身动手进行建立。nginx

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

最佳实践——部署应用浏览器


部署持久化存储

京东云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
复制代码

参数说明:app

一、如您须要在京东云Kubernetes集群服务中使用京东云云硬盘做为持久化存储,请在PersistentVolume定义时,指定插件jdcloudElasticBlockStore;负载均衡

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

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

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

五、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. 建立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,为应用提供安全、可靠的网络。

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

一、建立支持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
复制代码

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

kubectl create -f myservice.yaml
复制代码

三、建立一组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
复制代码

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

五、查看已建立成功的Deployment,执行如下命令:

kubectl get pods -l run=myapp -o wide
复制代码

返回结果以下:

NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-nginx   2         2         2            2           4m
复制代码

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

kubectl get pods -l run=myapp -o wide
复制代码

返回结果以下:

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
复制代码

七、查看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

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

kubectl get ep servicetest
返回

NAME          ENDPOINTS                       AGE
servicetest   172.16.0.10:80,172.16.0.42:80   28m
复制代码

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

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

·END·

相关文章
相关标签/搜索