commit
3e6edbbac5
|
@ -1,8 +1,8 @@
|
|||
# Kubernetes Handbook
|
||||
|
||||
[Kubernetes](http://kubernetes.io)是Google基于[Borg](https://research.google.com/pubs/pub43438.html)开源的容器编排调度引擎,作为[CNCF](http://cncf.io)(Cloud Native Computing Foundation)最重要的组件之一,它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,kubernetes可以帮你将系统自动地达到和维持在这个状态。Kubernetes作为云原生应用的基石,相当于一个云操作系统,其重要性不言而喻。
|
||||
[Kubernetes](http://kubernetes.io)是Google基于[Borg](https://research.google.com/pubs/pub43438.html)开源的容器编排调度引擎,作为[CNCF](http://cncf.io)(Cloud Native Computing Foundation)最重要的组件之一,它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,Kubernetes可以帮你将系统自动地达到和维持在这个状态。Kubernetes作为云原生应用的基石,相当于一个云操作系统,其重要性不言而喻。
|
||||
|
||||
本书记录了本人从零开始学习和使用Kubernetes的心路历程,着重于经验分享和总结,同时也会有相关的概念解析,希望能够帮助大家少踩坑,少走弯路,还会指引大家关于关注kubernetes生态周边,如微服务构建、DevOps、大数据应用、Service Mesh、Cloud Native等领域。
|
||||
本书记录了本人从零开始学习和使用Kubernetes的心路历程,着重于经验分享和总结,同时也会有相关的概念解析,希望能够帮助大家少踩坑,少走弯路,还会指引大家关于关注Kubernetes生态周边,如微服务构建、DevOps、大数据应用、Service Mesh、Cloud Native等领域。
|
||||
|
||||
本书的主题不仅限于Kubernetes,还包括以下几大主题:
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
|||
- 将微服务与Service Mesh架构
|
||||
- Kubernetes与微服务结合实践
|
||||
|
||||
起初写作本书时,安装的所有组件、所用示例和操作等皆基于**Kubernetes1.6+** 版本,同时我们也将密切关注kubernetes的版本更新,随着它的版本更新升级,本书中的kubernetes版本和示例也将随之更新。
|
||||
起初写作本书时,安装的所有组件、所用示例和操作等皆基于**Kubernetes1.6+** 版本,同时我们也将密切关注kubernetes的版本更新,随着它的版本更新升级,本书中的Kubernetes版本和示例也将随之更新。
|
||||
|
||||
GitHub 地址:https://github.com/rootsongjc/kubernetes-handbook
|
||||
|
||||
|
|
461
SUMMARY.md
461
SUMMARY.md
|
@ -1,246 +1,247 @@
|
|||
# 目录
|
||||
# Summary
|
||||
|
||||
### 前言
|
||||
## 前言
|
||||
|
||||
- [序言](README.md)
|
||||
- [CNCF - 云原生计算基金会简介](cloud-native/cncf.md)
|
||||
* [序言](README.md)
|
||||
* [CNCF - 云原生计算基金会简介](cloud-native/cncf.md)
|
||||
|
||||
### 云原生
|
||||
## 云原生
|
||||
|
||||
- [Play with Kubernetes](cloud-native/play-with-kubernetes.md)
|
||||
- [Kubernetes与云原生应用概览](cloud-native/kubernetes-and-cloud-native-app-overview.md)
|
||||
- [云原生应用之路——从Kubernetes到Cloud Native](cloud-native/from-kubernetes-to-cloud-native.md)
|
||||
- [云原生编程语言](cloud-native/cloud-native-programming-languages.md)
|
||||
- [云原生编程语言Ballerina](cloud-native/cloud-native-programming-language-ballerina.md)
|
||||
- [云原生编程语言Pulumi](cloud-native/cloud-native-programming-language-pulumi.md)
|
||||
- [云原生的未来](cloud-native/the-future-of-cloud-native.md)
|
||||
* [Play with Kubernetes](cloud-native/play-with-kubernetes.md)
|
||||
* [Kubernetes与云原生应用概览](cloud-native/kubernetes-and-cloud-native-app-overview.md)
|
||||
* [云原生应用之路——从Kubernetes到Cloud Native](cloud-native/from-kubernetes-to-cloud-native.md)
|
||||
* [云原生编程语言](cloud-native/cloud-native-programming-languages.md)
|
||||
* [云原生编程语言Ballerina](cloud-native/cloud-native-programming-language-ballerina.md)
|
||||
* [云原生编程语言Pulumi](cloud-native/cloud-native-programming-language-pulumi.md)
|
||||
* [云原生的未来](cloud-native/the-future-of-cloud-native.md)
|
||||
|
||||
### 概念与原理
|
||||
## 概念与原理
|
||||
|
||||
- [Kubernetes架构](concepts/index.md)
|
||||
- [设计理念](concepts/concepts.md)
|
||||
- [Etcd解析](concepts/etcd.md)
|
||||
- [开放接口](concepts/open-interfaces.md)
|
||||
- [CRI - Container Runtime Interface(容器运行时接口)](concepts/cri.md)
|
||||
- [CNI - Container Network Interface(容器网络接口)](concepts/cni.md)
|
||||
- [CSI - Container Storage Interface(容器存储接口)](concepts/csi.md)
|
||||
- [Kubernetes中的网络]()
|
||||
- [Kubernetes中的网络解析——以flannel为例](concepts/networking.md)
|
||||
- [Kubernetes中的网络解析——以calico为例](concepts/calico.md)
|
||||
- [资源对象与基本概念解析](concepts/objects.md)
|
||||
- [Pod状态与生命周期管理](concepts/pod-state-and-lifecycle.md)
|
||||
- [Pod概览](concepts/pod-overview.md)
|
||||
- [Pod解析](concepts/pod.md)
|
||||
- [Init容器](concepts/init-containers.md)
|
||||
- [Pause容器](concepts/pause-container.md)
|
||||
- [Pod安全策略](concepts/pod-security-policy.md)
|
||||
- [Pod的生命周期](concepts/pod-lifecycle.md)
|
||||
- [Pod Hook](concepts/pod-hook.md)
|
||||
- [Pod Preset](concepts/pod-preset.md)
|
||||
- [Pod中断与PDB(Pod中断预算)](concepts/pod-disruption-budget.md)
|
||||
- [集群资源管理](concepts/cluster.md)
|
||||
- [Node](concepts/node.md)
|
||||
- [Namespace](concepts/namespace.md)
|
||||
- [Label](concepts/label.md)
|
||||
- [Annotation](concepts/annotation.md)
|
||||
- [Taint和Toleration(污点和容忍)](concepts/taint-and-toleration.md)
|
||||
- [垃圾收集](concepts/garbage-collection.md)
|
||||
- [控制器](concepts/controllers.md)
|
||||
- [Deployment](concepts/deployment.md)
|
||||
- [StatefulSet](concepts/statefulset.md)
|
||||
- [DaemonSet](concepts/daemonset.md)
|
||||
- [ReplicationController和ReplicaSet](concepts/replicaset.md)
|
||||
- [Job](concepts/job.md)
|
||||
- [CronJob](concepts/cronjob.md)
|
||||
- [Horizontal Pod Autoscaling](concepts/horizontal-pod-autoscaling.md)
|
||||
- [自定义指标HPA](concepts/custom-metrics-hpa.md)
|
||||
- [服务发现](concepts/service-discovery.md)
|
||||
- [Service](concepts/service.md)
|
||||
- [Ingress](concepts/ingress.md)
|
||||
- [Traefik Ingress Controller](concepts/traefik-ingress-controller.md)
|
||||
- [身份与权限控制](concepts/authentication-and-permission.md)
|
||||
- [ServiceAccount](concepts/serviceaccount.md)
|
||||
- [RBAC——基于角色的访问控制](concepts/rbac.md)
|
||||
- [NetworkPolicy](concepts/network-policy.md)
|
||||
- [存储](concepts/storage.md)
|
||||
- [Secret](concepts/secret.md)
|
||||
- [ConfigMap](concepts/configmap.md)
|
||||
- [ConfigMap的热更新](concepts/configmap-hot-update.md)
|
||||
- [Volume](concepts/volume.md)
|
||||
- [Persistent Volume(持久化卷)](concepts/persistent-volume.md)
|
||||
- [Storage Class](concepts/storageclass.md)
|
||||
- [本地持久化存储](concepts/local-persistent-storage.md)
|
||||
- [集群扩展](concepts/extension.md)
|
||||
- [使用自定义资源扩展API](concepts/custom-resource.md)
|
||||
- [Aggregated API Server](concepts/aggregated-api-server.md)
|
||||
- [APIService](concepts/apiservice.md)
|
||||
- [Service Catalog](concepts/service-catalog.md)
|
||||
- [资源调度](concepts/scheduling.md)
|
||||
* [Kubernetes架构](concepts/index.md)
|
||||
* [设计理念](concepts/concepts.md)
|
||||
* [Etcd解析](concepts/etcd.md)
|
||||
* [开放接口](concepts/open-interfaces.md)
|
||||
* [CRI - Container Runtime Interface(容器运行时接口)](concepts/cri.md)
|
||||
* [CNI - Container Network Interface(容器网络接口)](concepts/cni.md)
|
||||
* [CSI - Container Storage Interface(容器存储接口)](concepts/csi.md)
|
||||
* Kubernetes中的网络
|
||||
* [Kubernetes中的网络解析——以flannel为例](concepts/networking.md)
|
||||
* [Kubernetes中的网络解析——以calico为例](concepts/calico.md)
|
||||
* [资源对象与基本概念解析](concepts/objects.md)
|
||||
* [Pod状态与生命周期管理](concepts/pod-state-and-lifecycle.md)
|
||||
* [Pod概览](concepts/pod-overview.md)
|
||||
* [Pod解析](concepts/pod.md)
|
||||
* [Init容器](concepts/init-containers.md)
|
||||
* [Pause容器](concepts/pause-container.md)
|
||||
* [Pod安全策略](concepts/pod-security-policy.md)
|
||||
* [Pod的生命周期](concepts/pod-lifecycle.md)
|
||||
* [Pod Hook](concepts/pod-hook.md)
|
||||
* [Pod Preset](concepts/pod-preset.md)
|
||||
* [Pod中断与PDB(Pod中断预算)](concepts/pod-disruption-budget.md)
|
||||
* [集群资源管理](concepts/cluster.md)
|
||||
* [Node](concepts/node.md)
|
||||
* [Namespace](concepts/namespace.md)
|
||||
* [Label](concepts/label.md)
|
||||
* [Annotation](concepts/annotation.md)
|
||||
* [Taint和Toleration(污点和容忍)](concepts/taint-and-toleration.md)
|
||||
* [垃圾收集](concepts/garbage-collection.md)
|
||||
* [控制器](concepts/controllers.md)
|
||||
* [Deployment](concepts/deployment.md)
|
||||
* [StatefulSet](concepts/statefulset.md)
|
||||
* [DaemonSet](concepts/daemonset.md)
|
||||
* [ReplicationController和ReplicaSet](concepts/replicaset.md)
|
||||
* [Job](concepts/job.md)
|
||||
* [CronJob](concepts/cronjob.md)
|
||||
* [Horizontal Pod Autoscaling](concepts/horizontal-pod-autoscaling.md)
|
||||
* [自定义指标HPA](concepts/custom-metrics-hpa.md)
|
||||
* [服务发现](concepts/service-discovery.md)
|
||||
* [Service](concepts/service.md)
|
||||
* [Ingress](concepts/ingress.md)
|
||||
* [Traefik Ingress Controller](concepts/traefik-ingress-controller.md)
|
||||
* [身份与权限控制](concepts/authentication-and-permission.md)
|
||||
* [ServiceAccount](concepts/serviceaccount.md)
|
||||
* [RBAC——基于角色的访问控制](concepts/rbac.md)
|
||||
* [NetworkPolicy](concepts/network-policy.md)
|
||||
* [存储](concepts/storage.md)
|
||||
* [Secret](concepts/secret.md)
|
||||
* [ConfigMap](concepts/configmap.md)
|
||||
* [ConfigMap的热更新](concepts/configmap-hot-update.md)
|
||||
* [Volume](concepts/volume.md)
|
||||
* [Persistent Volume(持久化卷)](concepts/persistent-volume.md)
|
||||
* [Storage Class](concepts/storageclass.md)
|
||||
* [本地持久化存储](concepts/local-persistent-storage.md)
|
||||
* [集群扩展](concepts/extension.md)
|
||||
* [使用自定义资源扩展API](concepts/custom-resource.md)
|
||||
* [Aggregated API Server](concepts/aggregated-api-server.md)
|
||||
* [APIService](concepts/apiservice.md)
|
||||
* [Service Catalog](concepts/service-catalog.md)
|
||||
* [资源调度](concepts/scheduling.md)
|
||||
|
||||
### 用户指南
|
||||
## 用户指南
|
||||
|
||||
- [用户指南](guide/index.md)
|
||||
- [资源对象配置](guide/resource-configuration.md)
|
||||
- [配置Pod的liveness和readiness探针](guide/configure-liveness-readiness-probes.md)
|
||||
- [配置Pod的Service Account](guide/configure-pod-service-account.md)
|
||||
- [Secret配置](guide/secret-configuration.md)
|
||||
- [管理namespace中的资源配额](guide/resource-quota-management.md)
|
||||
- [命令使用](guide/command-usage.md)
|
||||
- [docker用户过度到kubectl命令行指南](guide/docker-cli-to-kubectl.md)
|
||||
- [kubectl命令概览](guide/using-kubectl.md)
|
||||
- [kubectl命令技巧大全](guide/kubectl-cheatsheet.md)
|
||||
- [使用etcdctl访问kubernetes数据](guide/using-etcdctl-to-access-kubernetes-data.md)
|
||||
- [集群安全性管理](guide/cluster-security-management.md)
|
||||
- [管理集群中的TLS](guide/managing-tls-in-a-cluster.md)
|
||||
- [kubelet的认证授权](guide/kubelet-authentication-authorization.md)
|
||||
- [TLS bootstrap](guide/tls-bootstrapping.md)
|
||||
- [创建用户认证授权的kubeconfig文件](guide/kubectl-user-authentication-authorization.md)
|
||||
- [IP伪装代理](guide/ip-masq-agent.md)
|
||||
- [使用kubeconfig或token进行用户身份认证](guide/auth-with-kubeconfig-or-token.md)
|
||||
- [Kubernetes中的用户与身份认证授权](guide/authentication.md)
|
||||
- [Kubernetes集群安全性配置最佳实践](guide/kubernetes-security-best-practice.md)
|
||||
- [访问Kubernetes集群](guide/access-kubernetes-cluster.md)
|
||||
- [访问集群](guide/access-cluster.md)
|
||||
- [使用kubeconfig文件配置跨集群认证](guide/authenticate-across-clusters-kubeconfig.md)
|
||||
- [通过端口转发访问集群中的应用程序](guide/connecting-to-applications-port-forward.md)
|
||||
- [使用service访问群集中的应用程序](guide/service-access-application-cluster.md)
|
||||
- [从外部访问Kubernetes中的Pod](guide/accessing-kubernetes-pods-from-outside-of-the-cluster.md)
|
||||
- [Cabin - Kubernetes手机客户端](guide/cabin-mobile-dashboard-for-kubernetes.md)
|
||||
- [Kubernetic - Kubernetes桌面客户端](guide/kubernetes-desktop-client.md)
|
||||
- [Kubernator - 更底层的Kubernetes UI](guide/kubernator-kubernetes-ui.md)
|
||||
- [在Kubernetes中开发部署应用](guide/application-development-deployment-flow.md)
|
||||
- [适用于kubernetes的应用开发部署流程](guide/deploy-applications-in-kubernetes.md)
|
||||
- [迁移传统应用到Kubernetes中——以Hadoop YARN为例](guide/migrating-hadoop-yarn-to-kubernetes.md)
|
||||
- [使用StatefulSet部署用状态应用](guide/using-statefulset.md)
|
||||
* [用户指南](guide/index.md)
|
||||
* [资源对象配置](guide/resource-configuration.md)
|
||||
* [配置Pod的liveness和readiness探针](guide/configure-liveness-readiness-probes.md)
|
||||
* [配置Pod的Service Account](guide/configure-pod-service-account.md)
|
||||
* [Secret配置](guide/secret-configuration.md)
|
||||
* [管理namespace中的资源配额](guide/resource-quota-management.md)
|
||||
* [命令使用](guide/command-usage.md)
|
||||
* [docker用户过度到kubectl命令行指南](guide/docker-cli-to-kubectl.md)
|
||||
* [kubectl命令概览](guide/using-kubectl.md)
|
||||
* [kubectl命令技巧大全](guide/kubectl-cheatsheet.md)
|
||||
* [使用etcdctl访问kubernetes数据](guide/using-etcdctl-to-access-kubernetes-data.md)
|
||||
* [集群安全性管理](guide/cluster-security-management.md)
|
||||
* [管理集群中的TLS](guide/managing-tls-in-a-cluster.md)
|
||||
* [kubelet的认证授权](guide/kubelet-authentication-authorization.md)
|
||||
* [TLS bootstrap](guide/tls-bootstrapping.md)
|
||||
* [创建用户认证授权的kubeconfig文件](guide/kubectl-user-authentication-authorization.md)
|
||||
* [IP伪装代理](guide/ip-masq-agent.md)
|
||||
* [使用kubeconfig或token进行用户身份认证](guide/auth-with-kubeconfig-or-token.md)
|
||||
* [Kubernetes中的用户与身份认证授权](guide/authentication.md)
|
||||
* [Kubernetes集群安全性配置最佳实践](guide/kubernetes-security-best-practice.md)
|
||||
* [访问Kubernetes集群](guide/access-kubernetes-cluster.md)
|
||||
* [访问集群](guide/access-cluster.md)
|
||||
* [使用kubeconfig文件配置跨集群认证](guide/authenticate-across-clusters-kubeconfig.md)
|
||||
* [通过端口转发访问集群中的应用程序](guide/connecting-to-applications-port-forward.md)
|
||||
* [使用service访问群集中的应用程序](guide/service-access-application-cluster.md)
|
||||
* [从外部访问Kubernetes中的Pod](guide/accessing-kubernetes-pods-from-outside-of-the-cluster.md)
|
||||
* [Cabin - Kubernetes手机客户端](guide/cabin-mobile-dashboard-for-kubernetes.md)
|
||||
* [Kubernetic - Kubernetes桌面客户端](guide/kubernetes-desktop-client.md)
|
||||
* [Kubernator - 更底层的Kubernetes UI](guide/kubernator-kubernetes-ui.md)
|
||||
* [在Kubernetes中开发部署应用](guide/application-development-deployment-flow.md)
|
||||
* [适用于kubernetes的应用开发部署流程](guide/deploy-applications-in-kubernetes.md)
|
||||
* [迁移传统应用到Kubernetes中——以Hadoop YARN为例](guide/migrating-hadoop-yarn-to-kubernetes.md)
|
||||
* [使用StatefulSet部署用状态应用](guide/using-statefulset.md)
|
||||
|
||||
### 最佳实践
|
||||
## 最佳实践
|
||||
|
||||
- [最佳实践概览](practice/index.md)
|
||||
- [在CentOS上部署Kubernetes集群](practice/install-kubernetes-on-centos.md)
|
||||
- [创建TLS证书和秘钥](practice/create-tls-and-secret-key.md)
|
||||
- [创建kubeconfig文件](practice/create-kubeconfig.md)
|
||||
- [创建高可用etcd集群](practice/etcd-cluster-installation.md)
|
||||
- [安装kubectl命令行工具](practice/kubectl-installation.md)
|
||||
- [部署master节点](practice/master-installation.md)
|
||||
- [安装flannel网络插件](practice/flannel-installation.md)
|
||||
- [部署node节点](practice/node-installation.md)
|
||||
- [安装kubedns插件](practice/kubedns-addon-installation.md)
|
||||
- [安装dashboard插件](practice/dashboard-addon-installation.md)
|
||||
- [安装heapster插件](practice/heapster-addon-installation.md)
|
||||
- [安装EFK插件](practice/efk-addon-installation.md)
|
||||
- [使用kubeadm快速构建测试集群](practice/install-kubernetes-with-kubeadm.md)
|
||||
- [使用kubeadm在Ubuntu Server 16.04上快速构建测试集群](practice/install-kubernetes-on-ubuntu-server-16.04-with-kubeadm.md)
|
||||
- [服务发现与负载均衡](practice/service-discovery-and-loadbalancing.md)
|
||||
- [安装Traefik ingress](practice/traefik-ingress-installation.md)
|
||||
- [分布式负载测试](practice/distributed-load-test.md)
|
||||
- [网络和集群性能测试](practice/network-and-cluster-perfermance-test.md)
|
||||
- [边缘节点配置](practice/edge-node-configuration.md)
|
||||
- [安装Nginx ingress](practice/nginx-ingress-installation.md)
|
||||
- [安装配置DNS](practice/dns-installation.md)
|
||||
- [安装配置Kube-dns](practice/configuring-dns.md)
|
||||
- [安装配置CoreDNS](practice/coredns.md)
|
||||
- [运维管理](practice/operation.md)
|
||||
- [Master节点高可用](practice/master-ha.md)
|
||||
- [服务滚动升级](practice/service-rolling-update.md)
|
||||
- [应用日志收集](practice/app-log-collection.md)
|
||||
- [配置最佳实践](practice/configuration-best-practice.md)
|
||||
- [集群及应用监控](practice/monitor.md)
|
||||
- [数据持久化问题](practice/data-persistence-problem.md)
|
||||
- [管理容器的计算资源](practice/manage-compute-resources-container.md)
|
||||
- [集群联邦](practice/federation.md)
|
||||
- [存储管理](practice/storage.md)
|
||||
- [GlusterFS](practice/glusterfs.md)
|
||||
- [使用GlusterFS做持久化存储](practice/using-glusterfs-for-persistent-storage.md)
|
||||
- [使用Heketi作为kubernetes的持久存储GlusterFS的external provisioner](practice/using-heketi-gluster-for-persistent-storage.md)
|
||||
- [在OpenShift中使用GlusterFS做持久化存储](practice/storage-for-containers-using-glusterfs-with-openshift.md)
|
||||
- [GlusterD-2.0](practice/glusterd-2.0.md)
|
||||
- [Ceph](practice/ceph.md)
|
||||
- [用Helm托管安装Ceph集群并提供后端存储](practice/ceph-helm-install-guide-zh.md)
|
||||
- [使用Ceph做持久化存储](practice/using-ceph-for-persistent-storage.md)
|
||||
- [OpenEBS](practice/openebs.md)
|
||||
- [使用OpenEBS做持久化存储](practice/using-openebs-for-persistent-storage.md)
|
||||
- [Rook](practice/rook.md)
|
||||
- [NFS](practice/nfs.md)
|
||||
- [利用NFS动态提供Kubernetes后端存储卷](practice/using-nfs-for-persistent-storage.md)
|
||||
- [集群与应用监控](practice/monitoring.md)
|
||||
- [Heapster](practice//heapster.md)
|
||||
- [使用Heapster获取集群和对象的metric数据](practice/using-heapster-to-get-object-metrics.md)
|
||||
- [Prometheus](practice/prometheus.md)
|
||||
- [使用Prometheus监控kubernetes集群](practice/using-prometheus-to-monitor-kuberentes-cluster.md)
|
||||
- [使用Vistio监控Istio服务网格中的流量](practice/vistio-visualize-your-istio-mesh.md)
|
||||
- [服务编排管理](practice/services-management-tool.md)
|
||||
- [使用Helm管理kubernetes应用](practice/helm.md)
|
||||
- [构建私有Chart仓库](practice/create-private-charts-repo.md)
|
||||
- [持续集成与发布](practice/ci-cd.md)
|
||||
- [使用Jenkins进行持续集成与发布](practice/jenkins-ci-cd.md)
|
||||
- [使用Drone进行持续集成与发布](practice/drone-ci-cd.md)
|
||||
- [更新与升级](practice/update-and-upgrade.md)
|
||||
- [手动升级Kubernetes集群](practice/manually-upgrade.md)
|
||||
- [升级dashboard](practice/dashboard-upgrade.md)
|
||||
* [最佳实践概览](practice/index.md)
|
||||
* [在CentOS上部署Kubernetes集群](practice/install-kubernetes-on-centos.md)
|
||||
* [创建TLS证书和秘钥](practice/create-tls-and-secret-key.md)
|
||||
* [创建kubeconfig文件](practice/create-kubeconfig.md)
|
||||
* [创建高可用etcd集群](practice/etcd-cluster-installation.md)
|
||||
* [安装kubectl命令行工具](practice/kubectl-installation.md)
|
||||
* [部署master节点](practice/master-installation.md)
|
||||
* [安装flannel网络插件](practice/flannel-installation.md)
|
||||
* [部署node节点](practice/node-installation.md)
|
||||
* [安装kubedns插件](practice/kubedns-addon-installation.md)
|
||||
* [安装dashboard插件](practice/dashboard-addon-installation.md)
|
||||
* [安装heapster插件](practice/heapster-addon-installation.md)
|
||||
* [安装EFK插件](practice/efk-addon-installation.md)
|
||||
* [使用kubeadm快速构建测试集群](practice/install-kubernetes-with-kubeadm.md)
|
||||
* [使用kubeadm在Ubuntu Server 16.04上快速构建测试集群](practice/install-kubernetes-on-ubuntu-server-16.04-with-kubeadm.md)
|
||||
* [服务发现与负载均衡](practice/service-discovery-and-loadbalancing.md)
|
||||
* [安装Traefik ingress](practice/traefik-ingress-installation.md)
|
||||
* [分布式负载测试](practice/distributed-load-test.md)
|
||||
* [网络和集群性能测试](practice/network-and-cluster-perfermance-test.md)
|
||||
* [边缘节点配置](practice/edge-node-configuration.md)
|
||||
* [安装Nginx ingress](practice/nginx-ingress-installation.md)
|
||||
* [安装配置DNS](practice/dns-installation.md)
|
||||
* [安装配置Kube-dns](practice/configuring-dns.md)
|
||||
* [安装配置CoreDNS](practice/coredns.md)
|
||||
* [运维管理](practice/operation.md)
|
||||
* [Master节点高可用](practice/master-ha.md)
|
||||
* [服务滚动升级](practice/service-rolling-update.md)
|
||||
* [应用日志收集](practice/app-log-collection.md)
|
||||
* [配置最佳实践](practice/configuration-best-practice.md)
|
||||
* [集群及应用监控](practice/monitor.md)
|
||||
* [数据持久化问题](practice/data-persistence-problem.md)
|
||||
* [管理容器的计算资源](practice/manage-compute-resources-container.md)
|
||||
* [集群联邦](practice/federation.md)
|
||||
* [存储管理](practice/storage.md)
|
||||
* [GlusterFS](practice/glusterfs.md)
|
||||
* [使用GlusterFS做持久化存储](practice/using-glusterfs-for-persistent-storage.md)
|
||||
* [使用Heketi作为kubernetes的持久存储GlusterFS的external provisioner](practice/using-heketi-gluster-for-persistent-storage.md)
|
||||
* [在OpenShift中使用GlusterFS做持久化存储](practice/storage-for-containers-using-glusterfs-with-openshift.md)
|
||||
* [GlusterD-2.0](practice/glusterd-2.0.md)
|
||||
* [Ceph](practice/ceph.md)
|
||||
* [用Helm托管安装Ceph集群并提供后端存储](practice/ceph-helm-install-guide-zh.md)
|
||||
* [使用Ceph做持久化存储](practice/using-ceph-for-persistent-storage.md)
|
||||
* [OpenEBS](practice/openebs.md)
|
||||
* [使用OpenEBS做持久化存储](practice/using-openebs-for-persistent-storage.md)
|
||||
* [Rook](practice/rook.md)
|
||||
* [NFS](practice/nfs.md)
|
||||
* [利用NFS动态提供Kubernetes后端存储卷](practice/using-nfs-for-persistent-storage.md)
|
||||
* [集群与应用监控](practice/monitoring.md)
|
||||
* [Heapster](practice//heapster.md)
|
||||
* [使用Heapster获取集群和对象的metric数据](practice/using-heapster-to-get-object-metrics.md)
|
||||
* [Prometheus](practice/prometheus.md)
|
||||
* [使用Prometheus监控kubernetes集群](practice/using-prometheus-to-monitor-kuberentes-cluster.md)
|
||||
* [使用Vistio监控Istio服务网格中的流量](practice/vistio-visualize-your-istio-mesh.md)
|
||||
* [服务编排管理](practice/services-management-tool.md)
|
||||
* [使用Helm管理kubernetes应用](practice/helm.md)
|
||||
* [构建私有Chart仓库](practice/create-private-charts-repo.md)
|
||||
* [持续集成与发布](practice/ci-cd.md)
|
||||
* [使用Jenkins进行持续集成与发布](practice/jenkins-ci-cd.md)
|
||||
* [使用Drone进行持续集成与发布](practice/drone-ci-cd.md)
|
||||
* [更新与升级](practice/update-and-upgrade.md)
|
||||
* [手动升级Kubernetes集群](practice/manually-upgrade.md)
|
||||
* [升级dashboard](practice/dashboard-upgrade.md)
|
||||
|
||||
### 领域应用
|
||||
## 领域应用
|
||||
|
||||
- [领域应用概览](usecases/index.md)
|
||||
- [微服务架构](usecases/microservices.md)
|
||||
- [微服务中的服务发现](usecases/service-discovery-in-microservices.md)
|
||||
- [使用Java构建微服务并发布到Kubernetes平台](usecases/microservices-for-java-developers.md)
|
||||
- [Spring Boot快速开始指南](usecases/spring-boot-quick-start-guide.md)
|
||||
- [Service Mesh 服务网格](usecases/service-mesh.md)
|
||||
- [Istio](usecases/istio.md)
|
||||
- [安装并试用Istio service mesh](usecases/istio-installation.md)
|
||||
- [配置请求的路由规则](usecases/configuring-request-routing.md)
|
||||
- [安装和拓展Istio service mesh](usecases/install-and-expand-istio-mesh.md)
|
||||
- [集成虚拟机](usecases/integrating-vms.md)
|
||||
- [Istio中sidecar的注入规范及示例](usecases/sidecar-spec-in-istio.md)
|
||||
- [如何参与Istio社区及注意事项](usecases/istio-community-tips.md)
|
||||
- [Istio 教程](usecases/istio-tutorial.md)
|
||||
- [Linkerd](usecases/linkerd.md)
|
||||
- [Linkerd 使用指南](usecases/linkerd-user-guide.md)
|
||||
- [Conduit](usecases/conduit.md)
|
||||
- [Condiut概览](usecases/conduit-overview.md)
|
||||
- [安装Conduit](usecases/conduit-installation.md)
|
||||
- [Envoy](usecases/envoy.md)
|
||||
- [Envoy的架构与基本术语](usecases/envoy-terminology.md)
|
||||
- [Envoy作为前端代理](usecases/envoy-front-proxy.md)
|
||||
- [Envoy mesh教程](usecases/envoy-mesh-in-kubernetes-tutorial.md)
|
||||
- [大数据](usecases/big-data.md)
|
||||
- [Spark standalone on Kubernetes](usecases/spark-standalone-on-kubernetes.md)
|
||||
- [运行支持Kubernetes原生调度的Spark程序](usecases/running-spark-with-kubernetes-native-scheduler.md)
|
||||
- [Serverless架构](usecases/serverless.md)
|
||||
- [理解Serverless](usecases/understanding-serverless.md)
|
||||
- [FaaS-函数即服务](usecases/faas.md)
|
||||
- [OpenFaaS快速入门指南](usecases/openfaas-quick-start.md)
|
||||
- [边缘计算](usecases/edge-computing.md)
|
||||
- [人工智能](usecases/ai.md)
|
||||
* [领域应用概览](usecases/index.md)
|
||||
* [微服务架构](usecases/microservices.md)
|
||||
* [微服务中的服务发现](usecases/service-discovery-in-microservices.md)
|
||||
* [使用Java构建微服务并发布到Kubernetes平台](usecases/microservices-for-java-developers.md)
|
||||
* [Spring Boot快速开始指南](usecases/spring-boot-quick-start-guide.md)
|
||||
* [Service Mesh 服务网格](usecases/service-mesh.md)
|
||||
* [Istio](usecases/istio.md)
|
||||
* [安装并试用Istio service mesh](usecases/istio-installation.md)
|
||||
* [配置请求的路由规则](usecases/configuring-request-routing.md)
|
||||
* [安装和拓展Istio service mesh](usecases/install-and-expand-istio-mesh.md)
|
||||
* [集成虚拟机](usecases/integrating-vms.md)
|
||||
* [Istio中sidecar的注入规范及示例](usecases/sidecar-spec-in-istio.md)
|
||||
* [如何参与Istio社区及注意事项](usecases/istio-community-tips.md)
|
||||
* [Istio 教程](usecases/istio-tutorial.md)
|
||||
* [Linkerd](usecases/linkerd.md)
|
||||
* [Linkerd 使用指南](usecases/linkerd-user-guide.md)
|
||||
* [Conduit](usecases/conduit.md)
|
||||
* [Condiut概览](usecases/conduit-overview.md)
|
||||
* [安装Conduit](usecases/conduit-installation.md)
|
||||
* [Envoy](usecases/envoy.md)
|
||||
* [Envoy的架构与基本术语](usecases/envoy-terminology.md)
|
||||
* [Envoy作为前端代理](usecases/envoy-front-proxy.md)
|
||||
* [Envoy mesh教程](usecases/envoy-mesh-in-kubernetes-tutorial.md)
|
||||
* [大数据](usecases/big-data.md)
|
||||
* [Spark standalone on Kubernetes](usecases/spark-standalone-on-kubernetes.md)
|
||||
* [运行支持Kubernetes原生调度的Spark程序](usecases/running-spark-with-kubernetes-native-scheduler.md)
|
||||
* [Serverless架构](usecases/serverless.md)
|
||||
* [理解Serverless](usecases/understanding-serverless.md)
|
||||
* [FaaS-函数即服务](usecases/faas.md)
|
||||
* [OpenFaaS快速入门指南](usecases/openfaas-quick-start.md)
|
||||
* [边缘计算](usecases/edge-computing.md)
|
||||
* [人工智能](usecases/ai.md)
|
||||
|
||||
### 开发指南
|
||||
## 开发指南
|
||||
|
||||
- [开发指南概览](develop/index.md)
|
||||
- [SIG和工作组](develop/sigs-and-working-group.md)
|
||||
- [开发环境搭建](develop/developing-environment.md)
|
||||
- [本地分布式开发环境搭建(使用Vagrant和Virtualbox)](develop/using-vagrant-and-virtualbox-for-development.md)
|
||||
- [单元测试和集成测试](develop/testing.md)
|
||||
- [client-go示例](develop/client-go-sample.md)
|
||||
- [Operator](develop/operator.md)
|
||||
- [operator-sdk](develop/operator-sdk.md)
|
||||
- [高级开发指南](develop/advance-developer.md)
|
||||
- [社区贡献](develop/contribute.md)
|
||||
- [Minikube](develop/minikube.md)
|
||||
* [开发指南概览](develop/index.md)
|
||||
* [SIG和工作组](develop/sigs-and-working-group.md)
|
||||
* [开发环境搭建](develop/developing-environment.md)
|
||||
* [本地分布式开发环境搭建(使用Vagrant和Virtualbox)](develop/using-vagrant-and-virtualbox-for-development.md)
|
||||
* [单元测试和集成测试](develop/testing.md)
|
||||
* [client-go示例](develop/client-go-sample.md)
|
||||
* [Operator](develop/operator.md)
|
||||
* [operator-sdk](develop/operator-sdk.md)
|
||||
* [高级开发指南](develop/advance-developer.md)
|
||||
* [社区贡献](develop/contribute.md)
|
||||
* [Minikube](develop/minikube.md)
|
||||
|
||||
### 附录
|
||||
## 附录
|
||||
|
||||
* [附录说明](appendix/index.md)
|
||||
* [Kubernetes中的应用故障排查](appendix/debug-kubernetes-services.md)
|
||||
* [Kubernetes相关资讯和情报链接](appendix/material-share.md)
|
||||
* [Docker最佳实践](appendix/docker-best-practice.md)
|
||||
* [使用技巧](appendix/tricks.md)
|
||||
* [问题记录](appendix/issues.md)
|
||||
* [Kubernetes版本更新日志](appendix/kubernetes-changelog.md)
|
||||
* [Kubernetes1.7更新日志](appendix/kubernetes-1.7-changelog.md)
|
||||
* [Kubernetes1.8更新日志](appendix/kubernetes-1.8-changelog.md)
|
||||
* [Kubernetes1.9更新日志](appendix/kubernetes-1.9-changelog.md)
|
||||
* [Kubernetes1.10更新日志](appendix/kubernetes-1.10-changelog.md)
|
||||
* [Kubernetes及云原生年度总结及展望](appendix/summary-and-outlook.md)
|
||||
* [Kubernetes与云原生2017年年终总结及2018年展望](appendix/kubernetes-and-cloud-native-summary-in-2017-and-outlook-for-2018.md)
|
||||
* [Kubernetes认证服务提供商(KCSP)说明](appendix/about-kcsp.md)
|
||||
* [认证Kubernetes管理员(CKA)说明](appendix/about-CKA-Candidate.md)
|
||||
|
||||
- [附录说明](appendix/index.md)
|
||||
- [Kubernetes中的应用故障排查](appendix/debug-kubernetes-services.md)
|
||||
- [Kubernetes相关资讯和情报链接](appendix/material-share.md)
|
||||
- [Docker最佳实践](appendix/docker-best-practice.md)
|
||||
- [使用技巧](appendix/tricks.md)
|
||||
- [问题记录](appendix/issues.md)
|
||||
- [Kubernetes版本更新日志](appendix/kubernetes-changelog.md)
|
||||
- [Kubernetes1.7更新日志](appendix/kubernetes-1.7-changelog.md)
|
||||
- [Kubernetes1.8更新日志](appendix/kubernetes-1.8-changelog.md)
|
||||
- [Kubernetes1.9更新日志](appendix/kubernetes-1.9-changelog.md)
|
||||
- [Kubernetes1.10更新日志](appendix/kubernetes-1.10-changelog.md)
|
||||
- [Kubernetes及云原生年度总结及展望](appendix/summary-and-outlook.md)
|
||||
- [Kubernetes与云原生2017年年终总结及2018年展望](appendix/kubernetes-and-cloud-native-summary-in-2017-and-outlook-for-2018.md)
|
||||
- [Kubernetes认证服务提供商(KCSP)说明](appendix/about-kcsp.md)
|
||||
- [认证Kubernetes管理员(CKA)说明](appendix/about-cka-candidate.md)
|
||||
|
|
|
@ -12,20 +12,20 @@ CNCF作为一个厂商中立的基金会,致力于Github上的快速成长的
|
|||
|
||||
关于CNCF的使命与组织方式请参考[CNCF宪章](https://www.cncf.io/about/charter/),概括的讲CNCF的使命包括以下三点:
|
||||
|
||||
- 容器化包装。
|
||||
- 通过中心编排系统的动态资源管理。
|
||||
- 面向微服务。
|
||||
* 容器化包装。
|
||||
* 通过中心编排系统的动态资源管理。
|
||||
* 面向微服务。
|
||||
|
||||
CNCF这个角色的作用是推广技术,形成社区,开源项目管理与推进生态系统健康发展。
|
||||
|
||||
另外CNCF组织由以下部分组成:
|
||||
|
||||
- **会员**:白金、金牌、银牌、最终用户、学术和非赢利成员,不同级别的会员在治理委员会中的投票权不同。
|
||||
- **理事会**:负责事务管理
|
||||
- **TOC(技术监督委员会)**:技术管理
|
||||
- **最终用户社区**:推动CNCF技术的采纳并选举最终用户技术咨询委员会
|
||||
- **最终用户技术咨询委员会**:为最终用户会议或向理事会提供咨询
|
||||
- **营销委员会**:市场推广
|
||||
* **会员**:白金、金牌、银牌、最终用户、学术和非赢利成员,不同级别的会员在治理委员会中的投票权不同。
|
||||
* **理事会**:负责事务管理
|
||||
* **TOC(技术监督委员会)**:技术管理
|
||||
* **最终用户社区**:推动CNCF技术的采纳并选举最终用户技术咨询委员会
|
||||
* **最终用户技术咨询委员会**:为最终用户会议或向理事会提供咨询
|
||||
* **营销委员会**:市场推广
|
||||
|
||||
## CNCF项目成熟度分级与毕业条件
|
||||
|
||||
|
@ -33,13 +33,13 @@ CNCF这个角色的作用是推广技术,形成社区,开源项目管理与
|
|||
|
||||
成熟度级别(Maturity Level)包括以下三种:
|
||||
|
||||
- inception(初级)
|
||||
- incubating(孵化中)
|
||||
- graduated(毕业)
|
||||
* inception(初级)
|
||||
* incubating(孵化中)
|
||||
* graduated(毕业)
|
||||
|
||||
是否可以成为CNCF项目需要通过Technical Oversight Committee (技术监督委员会)简称[TOC](https://github.com/cncf/toc),投票采取fallback策略,即**回退策略**,先从最高级别(graduated)开始,如果2/3多数投票通过的话则确认为该级别,如果没通过的话,则进行下一低级别的投票,如果一直到inception级别都没得到2/3多数投票通过的话,则拒绝其进入CNCF项目。
|
||||
是否可以成为CNCF项目需要通过Technical Oversight Committee \(技术监督委员会)简称[TOC](https://github.com/cncf/toc),投票采取fallback策略,即**回退策略**,先从最高级别(graduated)开始,如果2/3多数投票通过的话则确认为该级别,如果没通过的话,则进行下一低级别的投票,如果一直到inception级别都没得到2/3多数投票通过的话,则拒绝其进入CNCF项目。
|
||||
|
||||
当前所有的CNCF项目可以访问https://www.cncf.io/projects/ 。
|
||||
当前所有的CNCF项目可以访问[https://www.cncf.io/projects/](https://www.cncf.io/projects/) 。
|
||||
|
||||
项目所达到相应成熟度需要满足的条件和投票机制见下图:
|
||||
|
||||
|
@ -49,19 +49,22 @@ CNCF这个角色的作用是推广技术,形成社区,开源项目管理与
|
|||
|
||||
TOC(Technical Oversight Committee)作为CNCF中的一个重要组织,它的作用是:
|
||||
|
||||
- 定义和维护技术视野
|
||||
- 审批新项目加入组织,为项目设定概念架构
|
||||
- 接受最终用户的反馈并映射到项目中
|
||||
- 调整组件见的访问接口,协调组件之间兼容性
|
||||
* 定义和维护技术视野
|
||||
* 审批新项目加入组织,为项目设定概念架构
|
||||
* 接受最终用户的反馈并映射到项目中
|
||||
* 调整组件见的访问接口,协调组件之间兼容性
|
||||
|
||||
TOC成员通过选举产生,见[选举时间表](https://github.com/cncf/toc/blob/master/process/election-schedule.md)。
|
||||
|
||||
参考CNCF TOC:https://github.com/cncf/toc
|
||||
参考CNCF TOC:[https://github.com/cncf/toc](https://github.com/cncf/toc)
|
||||
|
||||
## 参考
|
||||
|
||||
- https://www.cncf.io
|
||||
- https://www.cncf.io/projects/graduation-criteria/
|
||||
- https://www.cncf.io/about/charter/
|
||||
- https://github.com/cncf/landscape
|
||||
- https://github.com/cncf/toc
|
||||
* [https://www.cncf.io](https://www.cncf.io)
|
||||
* [https://www.cncf.io/projects/graduation-criteria/](https://www.cncf.io/projects/graduation-criteria/)
|
||||
* [https://www.cncf.io/about/charter/](https://www.cncf.io/about/charter/)
|
||||
* [https://github.com/cncf/landscape](https://github.com/cncf/landscape)
|
||||
* [https://github.com/cncf/toc](https://github.com/cncf/toc)
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Kubernetes与云原生应用概览
|
||||
|
||||
几个月前Mesos已经宣布支持kubernetes,而在2017年10月份的DockerCon EU上Docker公司宣布同时官方支持Swarm和Kubernetes容器编排,kubernetes已然成为容器编排调度的标准。
|
||||
几个月前Mesos已经宣布支持Kubernetes,而在2017年10月份的DockerCon EU上,Docker公司宣布官方同时支持Swarm和Kubernetes容器编排,Kubernetes已然成为容器编排调度的标准。
|
||||
|
||||
作为全书的开头,首先从历史、生态和应用角度介绍一下kubernetes与云原生应用,深入浅出,高屋建瓴,没有深入到具体细节,主要是为了给初次接触kubernetes的小白扫盲,具体细节请参考链接。
|
||||
作为全书的开头,首先从历史、生态和应用角度介绍一下Kubernetes与云原生应用,深入浅出,高屋建瓴,没有深入到具体细节,主要是为了给初次接触Kubernetes的小白扫盲,具体细节请参考链接。
|
||||
|
||||
## 从云计算到微服务再到云原生计算
|
||||
|
||||
|
@ -18,9 +18,9 @@
|
|||
|
||||
云计算包含的内容十分繁杂,也有很多技术和公司牵强附会说自己是云计算公司,说自己是做云的,实际上可能风马牛不相及。说白了,云计算就是一种配置资源的方式,根据资源配置方式的不同我们可以把云计算从宏观上分为以下三种类型:
|
||||
|
||||
- IaaS:这是为了想要建立自己的商业模式并进行自定义的客户,例如亚马逊的EC2、S3存储、Rackspace虚拟机等都是IaaS。
|
||||
- PaaS:工具和服务的集合,对于想用它来构建自己的应用程序或者想快速得将应用程序部署到生产环境而不必关心底层硬件的用户和开发者来说是特别有用的,比如Cloud Foundry、Google App Engine、Heroku等。
|
||||
- SaaS:终端用户可以直接使用的应用程序。这个就太多,我们生活中用到的很多软件都是SaaS服务,只要基于互联网来提供的服务基本都是SaaS服务,有的服务是免费的,比如Google Docs,还有更多的是根据我们购买的Plan和使用量付费,比如GitHub、各种云存储。
|
||||
* IaaS:这是为了想要建立自己的商业模式并进行自定义的客户,例如亚马逊的EC2、S3存储、Rackspace虚拟机等都是IaaS。
|
||||
* PaaS:工具和服务的集合,对于想用它来构建自己的应用程序或者想快速得将应用程序部署到生产环境而不必关心底层硬件的用户和开发者来说是特别有用的,比如Cloud Foundry、Google App Engine、Heroku等。
|
||||
* SaaS:终端用户可以直接使用的应用程序。这个就太多,我们生活中用到的很多软件都是SaaS服务,只要基于互联网来提供的服务基本都是SaaS服务,有的服务是免费的,比如Google Docs,还有更多的是根据我们购买的Plan和使用量付费,比如GitHub、各种云存储。
|
||||
|
||||
### 微服务介绍
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
|||
|
||||
要想了解微服务的详细内容推荐阅读《微服务设计》(Sam Newman著),我写过这本书的读书笔记 - [微服务设计读书笔记](https://jimmysong.io/posts/microservice-reading-notes/)。
|
||||
|
||||
下文中会谈到kubernetes与微服务的关系,其中kubernetes的service天生就适合于微服务。
|
||||
下文中会谈到Kubernetes与微服务的关系,其中Kubernetes的service天生就适合于微服务。
|
||||
|
||||
### 云原生概念介绍
|
||||
|
||||
|
@ -38,7 +38,7 @@
|
|||
|
||||
云原生准确来说是一种文化,更是一种潮流,它是云计算的一个必然导向。它的意义在于让云成为云化战略成功的基石,而不是阻碍,如果业务应用上云之后开发和运维人员比原先还痛苦,成本还高的话,这样的云我们宁愿不上。
|
||||
|
||||
自从云的概念开始普及,许多公司都部署了实施云化的策略,纷纷搭建起云平台,希望完成传统应用到云端的迁移。但是这个过程中会遇到一些技术难题,上云以后,效率并没有变得奇高,故障也没有迅速定位。
|
||||
自从云的概念开始普及,许多公司都部署了实施云化的策略,纷纷搭建起云平台,希望完成传统应用到云端的迁移。但是这个过程中会遇到一些技术难题,上云以后,效率并没有变得更高,故障也没有迅速定位。
|
||||
|
||||
为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题,云原生这一概念横空出世。云原生可以改进应用开发的效率,改变企业的组织结构,甚至会在文化层面上直接影响一个公司的决策。
|
||||
|
||||
|
@ -46,12 +46,12 @@
|
|||
|
||||
综上所述,云原生应用应该具备以下几个关键词:
|
||||
|
||||
- 敏捷
|
||||
- 可靠
|
||||
- 高弹性
|
||||
- 易扩展
|
||||
- 故障隔离保护
|
||||
- 不中断业务持续更新
|
||||
* 敏捷
|
||||
* 可靠
|
||||
* 高弹性
|
||||
* 易扩展
|
||||
* 故障隔离保护
|
||||
* 不中断业务持续更新
|
||||
|
||||
以上特性也是云原生区别于传统云应用的优势特点。
|
||||
|
||||
|
@ -59,15 +59,15 @@
|
|||
|
||||
## Kubernetes与云原生的关系
|
||||
|
||||
Kuberentes可以说是乘着docker和微服务的东风,一经推出便迅速蹿红,它的很多设计思想都契合了微服务和云原生应用的设计法则,这其中最著名的就是开发了[Heroku](https://www.heroku.com) PaaS平台的工程师们总结的 [Twelve-factor App](https://12factor.net/)了。
|
||||
Kuberentes可以说是乘着Docker和微服务的东风,一经推出便迅速蹿红,它的很多设计思想都契合了微服务和云原生应用的设计法则,这其中最著名的就是开发了[Heroku](https://www.heroku.com) PaaS平台的工程师们总结的 [Twelve-factor App](https://12factor.net/)了。
|
||||
|
||||
下面我将讲解Kubernetes设计时是如何按照了十二因素应用法则,并给出kubernetes中的应用示例,并附上一句话简短的介绍。
|
||||
下面我将讲解Kubernetes设计时是如何按照了十二因素应用法则,并给出Kubernetes中的应用示例,并附上一句话简短的介绍。
|
||||
|
||||
### Kubernetes介绍
|
||||
|
||||
[Kubernetes](http://kubernetes.io)是Google基于[Borg](https://research.google.com/pubs/pub43438.html)开源的容器编排调度引擎,作为[CNCF](http://cncf.io)(Cloud Native Computing Foundation)最重要的组件之一,它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,kubernetes可以帮你将系统自动得达到和维持在这个状态。
|
||||
[Kubernetes](http://kubernetes.io)是Google基于[Borg](https://research.google.com/pubs/pub43438.html)开源的容器编排调度引擎,作为[CNCF](http://cncf.io)(Cloud Native Computing Foundation)最重要的组件之一,它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,Kubernetes可以帮你将系统自动得达到和维持在这个状态。
|
||||
|
||||
更直白的说,Kubernetes用户可以通过编写一个yaml或者json格式的配置文件,也可以通过工具/代码生成或直接请求kubernetes API创建应用,该配置文件中包含了用户想要应用程序保持的状态,不论整个kubernetes集群中的个别主机发生什么问题,都不会影响应用程序的状态,你还可以通过改变该配置文件或请求kubernetes API来改变应用程序的状态。
|
||||
更直白的说,Kubernetes用户可以通过编写一个yaml或者json格式的配置文件,也可以通过工具/代码生成或直接请求Kubernetes API创建应用,该配置文件中包含了用户想要应用程序保持的状态,不论整个Kubernetes集群中的个别主机发生什么问题,都不会影响应用程序的状态,你还可以通过改变该配置文件或请求Kubernetes API来改变应用程序的状态。
|
||||
|
||||
### 12因素应用
|
||||
|
||||
|
@ -83,11 +83,11 @@ Kuberentes可以说是乘着docker和微服务的东风,一经推出便迅速
|
|||
|
||||
**2.依赖**
|
||||
|
||||
显式得声明代码中的依赖,使用软件包管理工具声明,比如Go中的Glide。
|
||||
显式的声明代码中的依赖,使用软件包管理工具声明,比如Go中的Glide。
|
||||
|
||||
**3.配置**
|
||||
|
||||
将配置与代码分离,应用部署到kubernetes中可以使用容器的环境变量或ConfigMap挂载到容器中。
|
||||
将配置与代码分离,应用部署到Kubernetes中可以使用容器的环境变量或ConfigMap挂载到容器中。
|
||||
|
||||
**4.后端服务**
|
||||
|
||||
|
@ -103,7 +103,7 @@ Kuberentes可以说是乘着docker和微服务的东风,一经推出便迅速
|
|||
|
||||
**7.端口绑定**
|
||||
|
||||
在kubernetes中每个Pod都有独立的IP,每个运行在Pod中的应用不必关心端口是否重复,只需在service中指定端口,集群内的service通过配置互相发现。
|
||||
在Kubernetes中每个Pod都有独立的IP,每个运行在Pod中的应用不必关心端口是否重复,只需在service中指定端口,集群内的service通过配置互相发现。
|
||||
|
||||
**8.并发**
|
||||
|
||||
|
@ -111,11 +111,11 @@ Kuberentes可以说是乘着docker和微服务的东风,一经推出便迅速
|
|||
|
||||
**9.易处理**
|
||||
|
||||
快速启动和优雅终止可最大化健壮性,kuberentes优秀的[Pod生存周期控制](https://jimmysong.io/posts/pod-lifecycle/)。
|
||||
快速启动和优雅终止可最大化健壮性,Kuberentes优秀的[Pod生存周期控制](https://jimmysong.io/posts/pod-lifecycle/)。
|
||||
|
||||
**10.开发环境与线上环境等价**
|
||||
|
||||
在kubernetes中可以创建多个namespace,使用相同的镜像可以很方便的复制一套环境出来,镜像的使用可以很方便的部署一个后端服务。
|
||||
在Kubernetes中可以创建多个namespace,使用相同的镜像可以很方便的复制一套环境出来,镜像的使用可以很方便的部署一个后端服务。
|
||||
|
||||
**11.日志**
|
||||
|
||||
|
@ -129,31 +129,31 @@ Kuberentes可以说是乘着docker和微服务的东风,一经推出便迅速
|
|||
|
||||
**API优先**
|
||||
|
||||
- 服务间的合约
|
||||
- 团队协作的规约
|
||||
- 文档化、规范化
|
||||
- RESTful或RPC
|
||||
* 服务间的合约
|
||||
* 团队协作的规约
|
||||
* 文档化、规范化
|
||||
* RESTful或RPC
|
||||
|
||||
**监控**
|
||||
|
||||
- 实时监控远程应用
|
||||
- 应用性能监控(APM)
|
||||
- 应用健康监控
|
||||
- 系统日志
|
||||
- 不建议在线Debug
|
||||
* 实时监控远程应用
|
||||
* 应用性能监控(APM)
|
||||
* 应用健康监控
|
||||
* 系统日志
|
||||
* 不建议在线Debug
|
||||
|
||||
**认证授权**
|
||||
|
||||
- 不要等最后才去考虑应用的安全性
|
||||
- 详细设计、明确声明、文档化
|
||||
- Bearer token、OAuth、OIDC认证
|
||||
- 操作审计
|
||||
* 不要等最后才去考虑应用的安全性
|
||||
* 详细设计、明确声明、文档化
|
||||
* Bearer token、OAuth、OIDC认证
|
||||
* 操作审计
|
||||
|
||||
详见[High Level Cloud Native From Kevin Hoffman](https://jimmysong.io/posts/high-level-cloud-native-from-kevin-hoffman/)。
|
||||
|
||||
## Kubernetes中的资源管理与容器设计模式
|
||||
|
||||
Kubernetes通过声明式配置,真正让开发人员能够理解应用的状态,并通过同一份配置可以立马启动一个一模一样的环境,大大提高了应用开发和部署的效率,其中kubernetes设计的多种资源类型可以帮助我们定义应用的运行状态,并使用资源配置来细粒度得明确限制应用的资源使用。
|
||||
Kubernetes通过声明式配置,真正让开发人员能够理解应用的状态,并通过同一份配置可以立马启动一个一模一样的环境,大大提高了应用开发和部署的效率,其中Kubernetes设计的多种资源类型可以帮助我们定义应用的运行状态,并使用资源配置来细粒度的明确限制应用的资源使用。
|
||||
|
||||
而容器生态的成熟是 Kubernetes 诞生的前提,在谈到容器的设计模式之前我们先来了解下容器生态,请看下图:
|
||||
|
||||
|
@ -165,18 +165,18 @@ Kubernetes通过声明式配置,真正让开发人员能够理解应用的状
|
|||
|
||||
Kubernetes提供了多种资源对象,用户可以根据自己应用的特性加以选择。这些对象有:
|
||||
|
||||
| 类别 | 名称 |
|
||||
| :--- | ---------------------------------------- |
|
||||
| 资源对象 | Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaling |
|
||||
| 配置对象 | Node、Namespace、Service、Secret、ConfigMap、Ingress、Label、ThirdPartyResource、 ServiceAccount |
|
||||
| 存储对象 | Volume、Persistent Volume |
|
||||
| 类别 | 名称 |
|
||||
| :--- | --- |
|
||||
| 资源对象 | Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaler |
|
||||
| 配置对象 | Node、Namespace、Service、Secret、ConfigMap、Ingress、Label、CustomResourceDefinition、 ServiceAccount |
|
||||
| 存储对象 | Volume、Persistent Volume |
|
||||
| 策略对象 | SecurityContext、ResourceQuota、LimitRange |
|
||||
|
||||
在 Kubernetes 系统中,*Kubernetes 对象* 是持久化的条目。Kubernetes 使用这些条目去表示整个集群的状态。特别地,它们描述了如下信息:
|
||||
在 Kubernetes 系统中,_Kubernetes 对象_ 是持久化的条目。Kubernetes 使用这些条目去表示整个集群的状态。特别地,它们描述了如下信息:
|
||||
|
||||
- 什么容器化应用在运行(以及在哪个 Node 上)
|
||||
- 可以被应用使用的资源
|
||||
- 关于应用如何表现的策略,比如重启策略、升级策略,以及容错策略
|
||||
* 什么容器化应用在运行(以及在哪个 Node 上)
|
||||
* 可以被应用使用的资源
|
||||
* 关于应用如何表现的策略,比如重启策略、升级策略,以及容错策略
|
||||
|
||||
Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,可以有效地告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的 **期望状态**。
|
||||
|
||||
|
@ -186,14 +186,14 @@ Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernete
|
|||
|
||||
两层的资源限制与配置
|
||||
|
||||
- Pod级别,最小的资源调度单位
|
||||
- Namespace级别,限制资源配额和每个Pod的资源使用区间
|
||||
* Pod级别,最小的资源调度单位
|
||||
* Namespace级别,限制资源配额和每个Pod的资源使用区间
|
||||
|
||||
请参考[Kubernetes中的ResourceQuota和LimitRange配置资源限额](https://jimmysong.io/posts/kubernetes-resourcequota-limitrange-management/)
|
||||
|
||||
## 管理Kubernetes集群
|
||||
|
||||
手工部署Kubernetes是一个很艰巨的活,你需要了解网络配置、docker的安装与使用、镜像仓库的构建、角色证书的创建、kubernetes的基本原理和构成、kubernetes应用程序的yaml文件编写等。
|
||||
手工部署Kubernetes是一个很艰巨的活,你需要了解网络配置、Docker的安装与使用、镜像仓库的构建、角色证书的创建、Kubernetes的基本原理和构成、Kubernetes应用程序的yaml文件编写等。
|
||||
|
||||
我编写了一本[kubernetes-handbook](https://jimmysong.io/kubernetes-handbook/)可供大家免费阅读,该书记录了本人从零开始学习和使用Kubernetes的心路历程,着重于经验分享和总结,同时也会有相关的概念解析,希望能够帮助大家少踩坑,少走弯路。
|
||||
|
||||
|
@ -203,15 +203,15 @@ Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernete
|
|||
|
||||
**集群详情**
|
||||
|
||||
- Kubernetes 1.6.0
|
||||
- Docker 1.12.5(使用yum安装)
|
||||
- Etcd 3.1.5
|
||||
- Flanneld 0.7 vxlan 网络
|
||||
- TLS 认证通信 (所有组件,如 etcd、kubernetes master 和 node)
|
||||
- RBAC 授权
|
||||
- kublet TLS BootStrapping
|
||||
- kubedns、dashboard、heapster(influxdb、grafana)、EFK(elasticsearch、fluentd、kibana) 集群插件
|
||||
- 私有docker镜像仓库[harbor](https://github.com/vmware/harbor)(请自行部署,harbor提供离线安装包,直接使用docker-compose启动即可)
|
||||
* Kubernetes 1.6.0
|
||||
* Docker 1.12.5(使用yum安装)
|
||||
* Etcd 3.1.5
|
||||
* Flanneld 0.7 vxlan 网络
|
||||
* TLS 认证通信 \(所有组件,如 etcd、kubernetes master 和 node\)
|
||||
* RBAC 授权
|
||||
* kubelet TLS BootStrapping
|
||||
* kubedns、dashboard、heapster\(influxdb、grafana\)、EFK\(elasticsearch、fluentd、kibana\) 集群插件
|
||||
* 私有Docker镜像仓库[Harbor](https://github.com/vmware/harbor)(请自行部署,Harbor提供离线安装包,直接使用docker-compose启动即可)
|
||||
|
||||
**步骤介绍**
|
||||
|
||||
|
@ -229,12 +229,12 @@ Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernete
|
|||
|
||||
### 服务发现与负载均衡
|
||||
|
||||
Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载均衡机制,提供了Service资源,并通过kube-proxy配合cloud provider来适应不同的应用场景。随着kubernetes用户的激增,用户场景的不断丰富,又产生了一些新的负载均衡机制。目前,kubernetes中的负载均衡大致可以分为以下几种机制,每种机制都有其特定的应用场景:
|
||||
Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载均衡机制,提供了Service资源,并通过kube-proxy配合cloud provider来适应不同的应用场景。随着Kubernetes用户的激增,用户场景的不断丰富,又产生了一些新的负载均衡机制。目前,Kubernetes中的负载均衡大致可以分为以下几种机制,每种机制都有其特定的应用场景:
|
||||
|
||||
- **Service**:直接用Service提供cluster内部的负载均衡,并借助cloud provider提供的LB提供外部访问
|
||||
- **Ingress**:还是用Service提供cluster内部的负载均衡,但是通过自定义LB提供外部访问
|
||||
- **Service Load Balancer**:把load balancer直接跑在容器中,实现Bare Metal的Service Load Balancer
|
||||
- **Custom Load Balancer**:自定义负载均衡,并替代kube-proxy,一般在物理部署Kubernetes时使用,方便接入公司已有的外部服务
|
||||
* **Service**:直接用Service提供cluster内部的负载均衡,并借助cloud provider提供的LB提供外部访问
|
||||
* **Ingress**:还是用Service提供cluster内部的负载均衡,但是通过自定义LB提供外部访问
|
||||
* **Service Load Balancer**:把load balancer直接跑在容器中,实现Bare Metal的Service Load Balancer
|
||||
* **Custom Load Balancer**:自定义负载均衡,并替代kube-proxy,一般在物理部署Kubernetes时使用,方便接入公司已有的外部服务
|
||||
|
||||
详见[Kubernetes Handbook - 服务发现与负载均衡](https://jimmysong.io/kubernetes-handbook/practice/service-discovery-and-loadbalancing.html)。
|
||||
|
||||
|
@ -248,11 +248,11 @@ Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载
|
|||
2. 将代码提交到远程仓库
|
||||
3. 用户在发布应用时需要填写git仓库地址和分支、服务类型、服务名称、资源数量、实例个数,确定后触发Jenkins自动构建
|
||||
4. Jenkins的CI流水线自动编译代码并打包成docker镜像推送到Harbor镜像仓库
|
||||
5. Jenkins的CI流水线中包括了自定义脚本,根据我们已准备好的kubernetes的YAML模板,将其中的变量替换成用户输入的选项
|
||||
6. 生成应用的kubernetes YAML配置文件
|
||||
7. 更新Ingress的配置,根据新部署的应用的名称,在ingress的配置文件中增加一条路由信息
|
||||
5. Jenkins的CI流水线中包括了自定义脚本,根据我们已准备好的Kubernetes的YAML模板,将其中的变量替换成用户输入的选项
|
||||
6. 生成应用的Kubernetes YAML配置文件
|
||||
7. 更新Ingress的配置,根据新部署的应用的名称,在Ingress的配置文件中增加一条路由信息
|
||||
8. 更新PowerDNS,向其中插入一条DNS记录,IP地址是边缘节点的IP地址。关于边缘节点,请查看[边缘节点配置](https://jimmysong.io/kubernetes-handbook/practice/edge-node-configuration.html)
|
||||
9. Jenkins调用kubernetes的API,部署应用
|
||||
9. Jenkins调用Kubernetes的API,部署应用
|
||||
|
||||
### 日志收集与监控
|
||||
|
||||
|
@ -266,9 +266,9 @@ Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载
|
|||
|
||||
Kubernetes是一个多租户的云平台,因此必须对用户的权限加以限制,对用户空间进行隔离。Kubernetes中的隔离主要包括这几种:
|
||||
|
||||
- 网络隔离:需要使用网络插件,比如[calico](https://www.projectcalico.org/)。
|
||||
- 资源隔离:kubernetes原生支持资源隔离,pod就是资源就是隔离和调度的最小单位,同时使用[namespace](https://jimmysong.io/kubernetes-handbook/concepts/namespace.html)限制用户空间和资源限额。
|
||||
- 身份隔离:使用[RBAC-基于角色的访问控制](https://jimmysong.io/kubernetes-handbook/guide/rbac.html),多租户的身份认证和权限控制。
|
||||
* 网络隔离:需要使用网络插件,比如[calico](https://www.projectcalico.org/)。
|
||||
* 资源隔离:kubernetes原生支持资源隔离,pod就是资源就是隔离和调度的最小单位,同时使用[namespace](https://jimmysong.io/kubernetes-handbook/concepts/namespace.html)限制用户空间和资源限额。
|
||||
* 身份隔离:使用[RBAC-基于角色的访问控制](https://jimmysong.io/kubernetes-handbook/guide/rbac.html),多租户的身份认证和权限控制。
|
||||
|
||||
## 如何开发Kubernetes原生应用步骤介绍
|
||||
|
||||
|
@ -285,8 +285,8 @@ Kubernetes是一个多租户的云平台,因此必须对用户的权限加以
|
|||
|
||||
我写了两个示例用于演示,开发部署一个伪造的 metric 并显示在 web 页面上,包括两个service:
|
||||
|
||||
- [k8s-app-monitor-test](https://github.com/rootsongjc/k8s-app-monitor-test):生成模拟的监控数据,发送http请求,获取json返回值
|
||||
- [K8s-app-monitor-agent](https://github.com/rootsongjc/k8s-app-monitor-agent):获取监控数据并绘图,访问浏览器获取图表
|
||||
* [k8s-app-monitor-test](https://github.com/rootsongjc/k8s-app-monitor-test):生成模拟的监控数据,发送http请求,获取json返回值
|
||||
* [K8s-app-monitor-agent](https://github.com/rootsongjc/k8s-app-monitor-agent):获取监控数据并绘图,访问浏览器获取图表
|
||||
|
||||
**定义API生成API文档**
|
||||
|
||||
|
@ -294,8 +294,6 @@ Kubernetes是一个多租户的云平台,因此必须对用户的权限加以
|
|||
|
||||
![API文档](../images/k8s-app-monitor-test-api-doc.jpg)
|
||||
|
||||
|
||||
|
||||
详见:[如何开发部署kubernetes native应用](https://jimmysong.io/posts/creating-cloud-native-app-with-kubernetes/)。
|
||||
|
||||
## 如何迁移到云原生应用架构
|
||||
|
@ -310,11 +308,11 @@ Kubernetes是一个多租户的云平台,因此必须对用户的权限加以
|
|||
|
||||
主要讨论的应用程序架构包括:
|
||||
|
||||
- 十二因素应用程序:云原生应用程序架构模式的集合
|
||||
- 微服务:独立部署的服务,只做一件事情
|
||||
- 自助服务的敏捷基础设施:快速,可重复和一致地提供应用环境和后台服务的平台
|
||||
- 基于API的协作:发布和版本化的API,允许在云原生应用程序架构中的服务之间进行交互
|
||||
- 抗压性:根据压力变强的系统
|
||||
* 十二因素应用程序:云原生应用程序架构模式的集合
|
||||
* 微服务:独立部署的服务,只做一件事情
|
||||
* 自助服务的敏捷基础设施:快速,可重复和一致地提供应用环境和后台服务的平台
|
||||
* 基于API的协作:发布和版本化的API,允许在云原生应用程序架构中的服务之间进行交互
|
||||
* 抗压性:根据压力变强的系统
|
||||
|
||||
详见:[迁移到云原生应用架构](https://jimmysong.io/migrating-to-cloud-native-application-architectures/)
|
||||
|
||||
|
@ -339,8 +337,8 @@ Kubernetes是一个多租户的云平台,因此必须对用户的权限加以
|
|||
|
||||
Service mesh现在一般被翻译作服务网格,目前主流的Service mesh有如下两款:
|
||||
|
||||
- [Istio](https://istio.io):IBM、Google、Lyft共同开源,详细文档见[Istio官方文档中文版](http://istio.doczh.cn/)
|
||||
- [Linkerd](https://linkerd.io):原Twitter工程师开发,现为[CNCF](https://cncf.io)中的项目之一
|
||||
* [Istio](https://istio.io):IBM、Google、Lyft共同开源,详细文档见[Istio官方文档中文版](http://istio.doczh.cn/)
|
||||
* [Linkerd](https://linkerd.io):原Twitter工程师开发,现为[CNCF](https://cncf.io)中的项目之一
|
||||
|
||||
### 什么是Service mesh
|
||||
|
||||
|
@ -354,8 +352,8 @@ Service mesh现在一般被翻译作服务网格,目前主流的Service mesh
|
|||
|
||||
两款Service mesh各有千秋,我分别写了他们的使用案例指南:
|
||||
|
||||
- [微服务管理框架service mesh——Linkerd安装试用笔记](https://jimmysong.io/posts/linkerd-user-guide/)
|
||||
- [微服务管理框架service mesh——Istio安装试用笔记](https://jimmysong.io/posts/istio-installation/)
|
||||
* [微服务管理框架service mesh——Linkerd安装试用笔记](https://jimmysong.io/posts/linkerd-user-guide/)
|
||||
* [微服务管理框架service mesh——Istio安装试用笔记](https://jimmysong.io/posts/istio-installation/)
|
||||
|
||||
更多关于 Service Mesh 的内容请访问 [Service Mesh 中文网](http://www.servicemesh.cn)。
|
||||
|
||||
|
@ -410,7 +408,7 @@ Kubernetes全局监控图2
|
|||
|
||||
### Spark on Kubernetes
|
||||
|
||||
TL;DR https://jimmysong.io/spark-on-k8s
|
||||
TL;DR [https://jimmysong.io/spark-on-k8s](https://jimmysong.io/spark-on-k8s)
|
||||
|
||||
Spark原生支持standalone、mesos和YARN资源调度,现已支持Kubernetes原生调度,详见[运行支持kubernetes原生调度的spark程序-Spark on Kubernetes](https://jimmysong.io/posts/running-spark-with-kubernetes-native-scheduler/)。
|
||||
|
||||
|
@ -470,7 +468,10 @@ Spark原生支持standalone、mesos和YARN资源调度,现已支持Kubernetes
|
|||
|
||||
## 参考
|
||||
|
||||
- [迁移到云原生应用架构指南](https://jimmysong.io/migrating-to-cloud-native-application-architectures)
|
||||
- [Cloud Native Go - 已由电子工业出版社出版](https://jimmysong.io/cloud-native-go)
|
||||
- [Cloud Native Python - 将由电子工业出版社出版](https://jimmysong.io/posts/cloud-native-python)
|
||||
- [Istio Service Mesh 中文文档](http://istio.doczh.cn/)
|
||||
* [迁移到云原生应用架构指南](https://jimmysong.io/migrating-to-cloud-native-application-architectures)
|
||||
* [Cloud Native Go - 已由电子工业出版社出版](https://jimmysong.io/cloud-native-go)
|
||||
* [Cloud Native Python - 将由电子工业出版社出版](https://jimmysong.io/posts/cloud-native-python)
|
||||
* [Istio Service Mesh 中文文档](http://istio.doczh.cn/)
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue