容器是Cloud Native的基石,它们之间的关系不言而喻。了解容器对于学习Cloud Native也是十分重要的。近期,京东云Cloud Native的“在线公开课”从理论和实践两个层面为你们分享了Cloud Native相关的技术知识。在本周的周日,咱们还将迎来”Cloud Native时代的应用之路与开源创新“专场技术沙龙。node
所以咱们今天的文章将会和你们分享关于京东云Kubernetes集群的部分最佳实践。感兴趣的小伙伴也能够跟着文档本身动手进行建立。nginx
京东云Kubernetes集群采用管理节点全托管的方式,为用户提供简单易用、高可靠、功能强大的容器管理服务。该产品彻底兼容标准Kubernetes API ,集成京东云网络、存储等插件。Kubernetes集群服务简化了Kubernetes部署、管理,下降了Kubernetes使用门槛,加强应用的可靠性,提高开发的效率,同时,也能更好地帮助用户减小资源投入的成本。api
最佳实践——部署应用浏览器
京东云Kubernetes集群服务集成了京东云云硬盘,您能够在集群中使用京东云云硬盘做为持久化存储;安全
使用京东云云盘定义静态存储网络
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里面。
声明能够指定一个标签选择器来进一步过滤该组卷。只有标签与选择器匹配的卷能够绑定到声明。选择器由两个字段组成:
全部来自 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
复制代码
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 绑定是一对一的映射。
Kubernetes Service
京东云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·