共计 4967 个字符,预计需要花费 13 分钟才能阅读完成。
京东云 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、如您需要在京东云 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
创建 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 AGEpvc-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 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
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 28m
9、在浏览器中输入与 Service 关联的 Load Balance 公网 IP 及端口,看到如下页面,即表明 Nginx 服务正常。
·END·