整理自-Kubernetes系列IBM微讲堂
第1课:Kubernetes初探
简要介绍K8s平台、主要功能和社区开发情况,并通过分析企业云平台需求总结企业在应用和搭建K8s平台时需要解决的各种问题,从而引出系列课程。

讲师:
Doug Davis 目前就职于IBM Digital Business Group的开源与开放标准项目组,专注于开源云计算技术(例如Docker与Kubernetes)的开发与研究。在他的职业生涯中,曾参与过许多开源项目与开放标准的研发工作,包括Cloud Foundry、 Apache Axis、CIMI以及大部分SOAP相关的标准等。目前,他还代表IBM在许多国际标准组织中,如DMTF、OASIS、W3C等,担任要职。
• Journeys IBM对各开源系统的示例,供学习使用
• https://developer.ibm.com/code/journey/run-gitlab-kubernetes/
• https://developer.ibm.com/code/journey/deploy-microprofile-java-microservices-on-kubernetes/
• https://developer.ibm.com/code/events/manage-microservices-traffic-using-istio/
第2课:上手Kubernetes:基本概念、安装和命令行工具kubctl
介绍K8s在不同场景下的安装方式。并通过命令行工具kubectl的介绍和Demo帮助听众了解Kubernetes的主要功能和基本使用场景。

讲师:
赵军伟,现就职于IBM中国研发中心,Application PerformanceManagement产品线架构师。主要专注与原生云应用的架构设计,推动基于容器技术,编排服务的微服务应用的设计和研发,DevOps文化的构建。
安装:①minikube ②kubeadm ③ansible IBM Cloud Private Ce
Kubernetes命令行:kubectl [command] [TYPE] [NAME] [flags]
集群状态:
命令 | 解释 |
kubectl cluster-info | 查看集群信息 |
kubectl version | 显示kubectl命令行及kube服务端的版本 |
kubectl api-version | 显示支持的API版本集合 |
kubectl config view | 显示当前kubectl配置 |
kubectl get no | 查看集群中节点 |
Kubernetes命令行 – 创建新资源
命令 | 解释 |
kubectl create -f <res.yaml> | 按照yaml文件创建资源 |
kubectl run <name> --image=<image> | 使用某镜像创建Deployment |
Kubernetes命令行 – 检查与调试
命令 | 解释 |
kubectl get <type> <name> | 查看某种类型资源 |
kubectl describe <type> <name> | 检查某特定资源实例 |
kubectl logs | 检查某POD的日志(标准输出) |
kubectl exec | 在容器内执行命令 |
其他常用(简写):
kubectl get deploy/deployment
kubectl get rs/replicaset
kubectl get svc/service
kubectl get po/pod
kubectl get ep/endpoints
kubectl get rc/replicationcontroller
kubectl get ns/namespace
Kubernetes命令行 – 部署管理
命令 | 解释 |
kubectl scale | 实现水平扩展或收缩 |
kubectl rollout status | 部署状态变更状态检查 |
kubectl rollout history | 部署的历史 |
kubectl rollout undo | 回滚部署到最近或者某个版本 |
Kubernetes命令行 – 删除资源
命令 | 解释 |
kubectl delete <type> <name> |
Kubernetes命令行 – Live Demo
场景 | 目的 |
集群状态查看 | 检查集群中节点状态和Kube的功能集 |
创建nginx的Deploy | 部署一个nginx的单实例 |
检查Deploy | 查看该部署的运行状况 |
服务发现 | 如何从外部访问 |
部署管理 | 水平扩展或收缩实例以及滚动升级和回滚 |
删除资源 | 释放不再需要的资源 |
第3课:Kubernetes的资源调度
介绍K8s中调度器模块的基本实现,包括调度场景和功能等,从而帮助用户理解如何配置K8s资源以实现自定义的资源分配。

讲师:
马达,IBM 软件架构师,Kubernetes Maintainer, Mesos Contributior。吉林大学硕士,主修分布式系统, 网格计算。现任职于IBM系统中心,在资源管理,资源调度及分布式计算方面有10多年的经验。
PPT价值不高,了解
第4课:Kubernetes的运行时:Kubelet
kubernetes runtime
本讲将从K8s运行时组件Kubelet出发,介绍Kubernetes运行时的基本功能和架构。并通过介绍目前流行的各种容器引擎与Kubernetes的集成帮助开发者和拥护了解K8s CRI项目。

讲师
Michael Brown 目前就职于IBM Digital Business Group 的开源与开放标准项目组,专注于开源云计算技术(例如Open Container Initiative, Docker与Kubernetes 等)的开发与研究。在他的职业生涯中,曾参与过许多开源项目与开放标准的研发工作,包括操作系统、Java 虚拟机、浏览器、中间件和金融产品等相关项目。以下是他个人的自我描述: “ Engineer, IBMer, Inventor, Coach, PC Gamer, and Proud Father. Opinions are my own and not of my employer. ”
邢舟(Tom),目前就职于IBM 中国开源技术与开放标准工程院,专注于开源云计算软件开发和社区建设工作。作为活跃代码贡献者曾经在OpenStack、Cloud Foundry 以及Mesos 等多个开源项目中做出过积极贡献。 目前在Kubernetes 社区工作,负责Kubernetes 的代码开发和中国社区建设。 本次讲座由于作者时区的原因将由邢舟基于Mike Brown 的PPT 为大家做中文讲座。
有点偏题
第5课:Kubernetes的网络管理
本讲介绍了目前K8s平台的主要网络解决方案,包括Kube-Proxy、CNI等模块,并介绍Kubernetes与目前流行的Calico平台的集成从而实现网络隔离

讲师
邱见,目前就职于IBM系统软件部Platform Computing部门,专注于基于docker和kubernetes的私有云平台开发。曾经在OpenStack、Mesos,Kubernetes等开源项目中做出过积极贡献。
有干货,C
• 容器网络
• 每个POD分配单独的Ip地址
• 使用NetworkPolicy实现访问控制
• 负载均衡( Service IP)
• 内部的虚拟Ip映射到后端多个容器
• 外部访问
• 外部负载均衡
• Ingress的反向代理
Container NetworkInterface (CNI) 容器网络
• Kubernetes 使用CNI插件来组建容器网络
• 当POD的创建和销毁时, kubernetes将调用CNI插件的接口来生成网络配置
• CNI插件将生成虚拟NIC, 将其挂载在主机网络之上, 并和POD的namespace关联
在Kubernetes创建Pod后 CNI提供网络的过程主要分三个步骤:
• Kubelet runtime创建network namespace
• Kubelete调用CNI插件, 制定网络类型。网络类型决定哪一个CNI plugin将会被使用。
• CNI调用相应网络类型的插件
• CNI插件将创建veth pair, 检查IPAM类型和数据, 触发IPAM插件, 获取空闲的Ip地址并将地址分配给容器的网络接口
三种网络方案:
Calico Flannel NSX-t
Network Policy
负载均衡( lvs)
三种外部访问方式
• NodePort: Kubernetes 将服务暴露在节点Ip地址的特定端口范围内(30000-32767)
• Loadbalancer: Kubernetes 使用外部IaaScloud provider 动态创建负载均衡将外部请求重定向到PODs
• Ingress Controller : 使用Kubernetesingress提供七层反向代理并支持tls等功能
第6课:Kubernetes的存储管理
本讲介绍了K8s持久化存储平台的基本概念、使用场景、设计架构和目前社区开发状态。并通过对PV Controller等关键存储模块的剖析展示了K8s持久化存储平台的实现细节。

讲师
邢舟(Tom),目前就职于IBM中国开源技术与开放标准工程院,专注于开源云计算软件开发和社区建设工作。作为活跃代码贡献者曾经在OpenStack、Cloud Foundry以及Mesos等多个开源项目中做出过积极贡献。 目前在Kubernetes社区工作,负责Kubernetes的代码开发和中国社区建设。
k8s存储的应用场景
• 应用程序/服务存储状态、 数据存取等
• 应用程序/服务配置⽂件读取、 秘钥配置等
• 不同应用程序间或者应⽤程序内进程间共享数据
一个例子
需求
• 部署一个Nginx服务, 并在/var/nginx-data目录下存储用户上传的数据
• 解决: 使用AWS的弹性存储卷并将其挂载至K8s容器指定目录
已支持的相关存储模块
Persistent Volume与Persistent Volume Claim
前者代表正在的硬盘,后者代表硬盘的声明
PV、 PVC & StorageClass 创建及使用示例yaml

##PVC kind: PersistentVolumeClaim apiVersion: v1 metadata: name: myclaim spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: slow ##PV kind: PersistentVolume apiVersion: v1 metadata: name: pv0003 spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: slow awsElasticBlockStore: volumeID: vol-xxxxxx fsType: ext4 ##StorageClass kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: slow provisioner: kubernetes.io/aws parameters: parameters: type: io1 zone: us-east-1d iopsPerGB: "10"

apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx name: nginx-server volumeMounts: - mountPath: /var/nginx-data name: data-volume volumes: - name: data-volume awsElasticBlockStore: volumeID: vol-xxxxxxxxxxxxxxxxx fsType: ext4 apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: nginx name: nginx-server volumeMounts: - mountPath: /var/nginx-data name: data-volume volumes: - name: data-volume persistentVolumeClaim: claimName: myclaim
各相关模块组件的后台实现....
一个简单的例子:
• 在虚拟机中启动一个all-in-one K8s集群以及配置一个NFS服务器
• 通过NFS暴露一个共享目录
• 创建PV,PVC和Pod, Pod将挂载NFS所暴露的目录
步骤:
1、准备和启动环境
• 基本环境
• ubuntu 16.04
• Docker 1.12.6
• NFS Server
• Kubernetes Master Branch code
• 编译K8s源代码, 启动K8s集群
• sudo hack/local-up-cluster.sh
2、设置NFS Server (创建方法可参考linux分类)红帽RHCE培训-课程3笔记内容2
对外暴露/home/ubuntu/xingzhou/nfs-trial目录, 并在目录下创建文件abc
cat /etc/exports ##相关内容
/home/ubuntu/nfs-trial *(sync,rw)
showmount -e
touch abc
ls .
3、创建PVC
yaml文件:

kind: PersistentVolumeClaim apiVersion: v1 metadata: name: myclaim spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: ""
kubectl create -f pvc.yml
kubectl get pvc
4、创建PV
yaml文件

apiVersion: v1 kind: PersistentVolume metadata: name: mypv spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs: path: /home/ubuntu/nfs-trial server: localhost
kubectl create -f pv.yml
kubectl get pv
kubectl get pvc
5、创建pod
yaml文件

apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name:mycontainer image: nginx imagePullPolicy: IfNotPresent Ports: - containerPort: 80 name: "http-server" volumeMounts: - mountPath: "/var/data" name: data volumes: - name: data persistentVolumeClaim: claimName: myclaim readOnly: true
kubectl create -f pod.yml
kubectl get pod
6、验证挂载目录

kubectl get pod kubectl exec -ti mypod /bin/bash ls/var/data docker ps docker inspect con_id | grep /var/data findmnt
第7课:Kubernetes的日志与监控
介绍ELK日志分析平台及其与K8s/ICp的集成,从而能够在K8s平台上实现日志分析

讲师
杨博华,IBM软件工程师,一直从事监控类产品的开发工作。2015年开始从事Docker,Kubernetes相关技术的研究,开发和实施工作,现负责云基础架构应用编排的开发工作,主要是协助微服务开发团队推进持续部署,持续集成,和在IBM私有云平台上的应用编排和部署工作。
日志的分类
- K8S 的日志
- K8S Cluster 里面部署的应用程序的日志
分析处理
- 常见的方案比如 ELK ElasticSearch + LogStash + Kibana 的方案
收集日志是个挑战:
- 数量多 / 规模大 – 微服务/云化的应用数量动辄成千上万
- 需要考虑性能 / 稳定性 / 扩展性 等等的一系列问题
- 容器化 / 隔离化 – 容器的进程和文件系统和宿主机是隔离的
- 需要考虑如何收集容器化的应用产生的日志的问题
不同的部署方案带来的日志收集挑战
- K8S 的组件部署成 systemd service (二进制日志)
- 需要对 systemd service 的日志进行单独收集
- 增加额外的管理和维护成本
- K8S 的组件部署成 Docker 容器 ( 使用 hyperkube 容器)
- 可以和负载应用程序使用统一的收集方案
- Docker 引擎支持 –live-restore 可以避免成为单点故障源
容器当中的日志怎么收集
- 让每个应用自行上传自己的日志
- 增加应用复杂度 / 增加管理复杂度
- 附加专用日志上传容器( side-car模式)
- 在每一个Pod中包含一个日志上传容器
- 应用容器和日志容器通过共享卷交换日志数据
- 使用Docker引擎的日志收集功能
- 利用Docker Log Driver 收集每个容器的标准输出
- 容器的标准输出会被写到宿主机的日志目录
- 日志上传容器从宿主机的日志目录上传日志
- 将整套日志收集系统从用户应用中分离出来
- 使用deamonset部署
Kafka避免大量进程导致ElasticSearch崩溃。
下述各方案示例图。
cAdvisor / Heapster
Kubernetes Dashboard
Heapster + InfluxDB + Grafana
Heapster + Prometheus + Grafana
APM for DevOps
第8课:Kubernetes的应用部署
介绍K8s Helm/Charts平台以及如何使用Helm命令部署K8s应用,并通过ICp作为实例介绍K8s上应用仓库的搭建

讲师
蔺礼强,IBM私有云产品ICP的开发工程师,专注于基于Kubernetes的私有云平台开发。曾经参与过Mesos社区有关讨论和开发。
操作演示helm部署一组应用,有一些yaml参考文件。
简化部署步骤。
完成手动应用部署后,可参考本节实现部署步骤简化及自动化 应用商店。
安装Helm
Helm 最新release v2.7.2
• https://github.com/kubernetes/helm/releases/tag/v2.7.2
初始化Helm
• 部署Tiller
• 初始化本地 cache
• 舒适化本地 Chart repository
# helm init
Helm RESTful API
Rudder
Helm repository以及Tiller的RESTful API.
https://github.com/AcalephStorage/rudder
Monocular API
Golang Http RESTful API server。
https://github.com/kubernetes-helm/monocular/tree/v0.6.1/src/api
第9课:扩展Kubernetes生态:Service Catalog的概念与应用
本讲从Service Catalog的角度介绍了K8s平台如何与企业传统IT服务相集成,并详细介绍了Service Catalog项目的设计与实现

讲师
Morgan Bauer,IBM软件工程师,目前就职于位于美国加州圣何塞的IBM硅谷实验室。Morgan是Docker项目的Maintainer之一,曾经在许多开源社区工作,目前负责Kubernetes Service Catalog以及相关Cloud Native项目的开发工作。
英文+中文字幕
第10课:Kubernetes的企业实践
本讲在前九讲的基础上总结了目前企业应用Kubernetes所存在的各种问题,介绍了IBM基于Kubernetes搭建的下一代私有云平台ICp

讲师
刘光亚,IBM高级产品架构师,IBM全球技术学院成员,Istio Maintainer,Kubernetes Member,Apache Mesos Committer & PMC Member,主要负责开源软件在IBM产品及客户落地。
1、部署升级
2、helm实现应用商店
3、借助Terraform实现虚拟机和容器混合应用管理
4、胖chart 瘦chart(部分public镜像转为本地)
5、Paas弹性伸缩:原生基于资源的弹性伸缩;基于时间弹性伸缩
6、多集群部署和负载均衡
7、istio微服务治理(流量管理、可观察性、策略执行、服务身份和安全、平台支持、集成和定制...)
8、基于Jenkins的DevOps
9、外部服务对接
与第三方服务对接,参考Service Catalog
根据自己的需求定制service broker
10、镜像仓库管理 harbor
11、多云集成
通过Terraform对接其他云平台
12、Paas云方案特点
上述整理自IBM开源技术社区资料:
https://www.ibm.com/developerworks/community/wikis/home?lang=zh#!/wiki/W30b0c771924e_49d2_b3b7_88a2a2bc2e43/page/Kubernetes%E7%B3%BB%E5%88%97
中文社区相关页面https://www.kubernetes.org.cn/3546.html