整理自-Kubernetes系列IBM微讲堂

 

 

第1课:Kubernetes初探

简要介绍K8s平台、主要功能和社区开发情况,并通过分析企业云平台需求总结企业在应用和搭建K8s平台时需要解决的各种问题,从而引出系列课程。

讲师:

Doug Davis 目前就职于IBM Digital Business Group的开源与开放标准项目组,专注于开源云计算技术(例如Docker与Kubernetes)的开发与研究。在他的职业生涯中,曾参与过许多开源项目与开放标准的研发工作,包括Cloud Foundry、 Apache Axis、CIMI以及大部分SOAP相关的标准等。目前,他还代表IBM在许多国际标准组织中,如DMTF、OASIS、W3C等,担任要职。
View Code

 

• 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文化的构建。
View Code

安装:①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的功能集
创建nginxDeploy 部署一个nginx的单实例
检查Deploy 查看该部署的运行状况
服务发现 如何从外部访问
部署管理 水平扩展或收缩实例以及滚动升级和回滚
删除资源 释放不再需要的资源

 

第3课:Kubernetes的资源调度

介绍K8s中调度器模块的基本实现,包括调度场景和功能等,从而帮助用户理解如何配置K8s资源以实现自定义的资源分配。

讲师:


马达,IBM 软件架构师,Kubernetes Maintainer, Mesos Contributior。吉林大学硕士,主修分布式系统, 网格计算。现任职于IBM系统中心,在资源管理,资源调度及分布式计算方面有10多年的经验。
View Code

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 为大家做中文讲座。
View Code

有点偏题


 

第5课:Kubernetes的网络管理

本讲介绍了目前K8s平台的主要网络解决方案,包括Kube-Proxy、CNI等模块,并介绍Kubernetes与目前流行的Calico平台的集成从而实现网络隔离

讲师

邱见,目前就职于IBM系统软件部Platform Computing部门,专注于基于docker和kubernetes的私有云平台开发。曾经在OpenStack、Mesos,Kubernetes等开源项目中做出过积极贡献。
View Code

有干货,C 

容器网络
  • 每个POD分配单独的Ip地址
  •使用NetworkPolicy实现访问控制
负载均衡( Service IP
  •内部的虚拟Ip映射到后端多个容器
外部访问
  •外部负载均衡
  •Ingress的反向代理

Container NetworkInterface (CNI) 容器网络
Kubernetes 使用CNI插件来组建容器网络
POD的创建和销毁时kubernetes将调用CNI插件的接口来生成网络配置
CNI插件将生成虚拟NIC将其挂载在主机网络之上并和PODnamespace关联
Kubernetes创建PodCNI提供网络的过程主要分三个步骤
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的代码开发和中国社区建设。
View Code

 k8s存储的应用场景

应用程序/服务存储状态数据存取等
应用程序/服务配置⽂件读取秘钥配置等
不同应用程序间或者应⽤程序内进程间共享数据

一个例子

需求

部署一个Nginx服务并在/var/nginx-data目录下存储用户上传的数据

解决使用AWS的弹性存储卷并将其挂载至K8s容器指定目录

 

 

 

 已支持的相关存储模块

Persistent VolumePersistent Volume Claim

前者代表正在的硬盘,后者代表硬盘的声明

 

PVPVC & 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"
PVC PV StorageClass
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
View Code

各相关模块组件的后台实现....

 

一个简单的例子:

在虚拟机中启动一个all-in-one K8s集群以及配置一个NFS服务器
通过NFS暴露一个共享目录
创建PV,PVCPod, 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: ""
PVC.yaml

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
pv.yaml

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
pod.yaml

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私有云平台上的应用编排和部署工作。
View Code

日志的分类

  • 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社区有关讨论和开发。
View Code

 操作演示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以及TillerRESTful 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项目的开发工作。
View Code

英文+中文字幕

 

 


 第10课:Kubernetes的企业实践

本讲在前九讲的基础上总结了目前企业应用Kubernetes所存在的各种问题,介绍了IBM基于Kubernetes搭建的下一代私有云平台ICp

讲师

刘光亚,IBM高级产品架构师,IBM全球技术学院成员,Istio Maintainer,Kubernetes Member,Apache Mesos Committer & PMC Member,主要负责开源软件在IBM产品及客户落地。
View Code

 

 

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


 

posted @ 2018-03-15 15:21  Cslc-DaweiJ  阅读(493)  评论(0)    收藏  举报