前言
最近很多老铁找我,问有没有适合企业培训用的k8s课件,为了节省大家自己整理资料所花费的时间,我整理了一篇文档,可适用于企业内部培训使用,获取完整pdf可关注公众号领取。
培训内容包括如下
Kubernetes是什么?
kubernetes功能
Kubernetes优点
Kubernetes组件讲解
Kubernetes架构
关键词解释-pod,service,deploymentd等
简单使用
Kubernetes是什么?
Kubernetes是一个开源的容器管理平台,简称k8s,用于管理多个主机上的容器化应用程序 ,提供了应用程序的快速部署、扩缩容,升级和回滚的能力;利用service可以实现服务发现,负载均衡以及转发,通过ingress可以实现七层负载均衡等功能;Kubernetes这个名字源于希腊语,意思是舵手或飞行员,谷歌在2014年开放了Kubernetes项目,Kubernetes建立在谷歌十五年生产经验的基础上而对广大用户开放使用,目前社区活跃度也很高。对于初学者,上面概念比较难以理解,那么可以把他翻译成成如下几句话:
1.可以批量管理docker容器 2.可以对应用升级和回滚 3.可以实现七层和四层负载均衡 4.可以实现服务的自动发现 5.可以快速部署我们想要的应用 6.能够自动对当前的架构进行扩容和缩容等操作
Kubernetes功能
应用健康检测 应用实例复制 水平自动扩展 命名和发现 负载均衡 滚动更新 资源监控 日志访问 自检和调试 识别和认证
Kubernetes优点
1.灵活部署 kubernetes支持在多种平台部署,可在私有云,公有云,混合云下部署 2.安全高效 基于rbac做认证授权,精确控制对k8s资源的操作权限 3.负载均衡 支持四层和7层负载均衡 4.多租户网络隔离 通过namespace可实现多个用户环境,网络,资源之间的隔离 5.很好的自愈能力 自动布置,自动重启,自动复制,自动扩展
Kubernetes组件讲解
1.master节点组件
1)apiserver
提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制,负责接收、解析、处理请求。
2)scheduler
调度器,负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。
3)kube-controller-manager
控制器,负责维护集群的状态,检查pod的健康状态,比如故障检测、自动扩展、滚动更新等一些操作;
4)etcd
etcd是一个key/value形式的键值存储,保存了整个kubernetes集群的状态,在kubernetes中使用etcd时,需要对etcd做备份,保证高可用,整个kubernetes系统中一共有两个服务需要用到etcd用来协同和存储配置,分别是:
(1)网络插件calico,对于其它网络插件也需要用到etcd存储网络的配置信息
(2)kubernetes本身,包括各种对象的状态和元信息配置
注意:网络插件操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API,所以在下面我们执行etcdctl的时候需要设置ETCDCTL_API环境变量,该变量默认值为2,表示使用v2版本的api,v3表示使用v3版本的api
5)docker
是一个容器引擎,用于运行容器
2.node节点组件,工作节点组件
1)kubelet
负责与master节点的apiserver进行通信的,接收到客户的请求,进行创建Pod,管理Pod,启动pod等相关操作
2)kube-proxy
k8s代理,是在群集中的每个节点上运行的网络代理,kube-proxy负责请求转发,一旦发现了某一个Service关联的Pod信息发生了改变(如IP、Port等),由Kube-Proxy就会把变化后的service转换成IPVS或IPtables规则中,完成对后端pod的负载均衡
3)docker
是一个容器引擎,用于运行容器
3.附加组件
1)coredns
k8s1.11之前使用的是kubedns
1.11之后才有coredns
coredns是一个DNS服务器,能够为Kubernetesservices提供DNS记录
2)dashboard
k8s的web界面,通过这个界面可以对k8s资源进行操作
3)IngressController
七层负载均衡控制器,可以创建nginx或者traefik这种七层负载应用,实现域名和https访问
4)prometheus+alertmanager+Grafana监控k8s集群和物理节点
5)elk
采集pod和容器日志
Kubernetes架构
k8s的物理结构是master/node模式,架构图如下所示:
master一般是三个节点或者五个节点做高可用,根据集群规模来定,master高可用指的是对apiserver做高可用或者对master的物理节点做高可用,node可以有多个节点,专门用来部署应用的。
关键词解释
Pod 篮子 container 装在篮子里的蛋
label 标签 label selector 标签选择器,通过标签选择关联的资源
Deployment Deployment为Pod和ReplicaSet(下一代Replication Controller)提供声明式更新
Service 服务,提供代理和负载均衡 namespace 资源隔离
简单使用
#编写一个yaml文件
cat redis-master-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: redis-master labels: app: redis spec: selector: matchLabels: app: redis role: master tier: backend replicas: 1 template: metadata: labels: app: redis role: master tier: backend spec: containers: - name: master image: kubeguide/redis-master ports: - containerPort: 6379
kubectl apply -f redis-master-deployment.yaml
cat redis-master-service.yaml
apiVersion: v1 kind: Service metadata: name: redis-master labels: app: redis role: master tier: backend spec: ports: - port: 6379 targetPort: 6379 selector: app: redis role: master tier: backend
kubectl apply -f redis-master-service.yaml
cat redis-slave-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: redis-slave labels: app: redis spec: selector: matchLabels: app: redis role: slave tier: backend replicas: 1 template: metadata: labels: app: redis role: slave tier: backend spec: containers: - name: slave image: kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: dns ports: - containerPort: 6379
kubectl apply redis-slave-deployment.yaml
cat redis-slave-service.yam
apiVersion: v1 kind: Service metadata: name: redis-slave labels: app: redis role: slave tier: backend spec: ports: - port: 6379 selector: app: redis role: slave tier: backend
kubectl apply -f redis-slave-service.yaml
cat frontend-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: frontend labels: app: guestbook spec: selector: matchLabels: app: guestbook tier: frontend replicas: 1 template: metadata: labels: app: guestbook tier: frontend spec: containers: - name: php-redis image: kubeguide/guestbook-php-frontend env: - name: GET_HOSTS_FROM value: dns ports: - containerPort: 80
kubectl apply -f frontend-deployment.yaml
cat frontend-service.yaml
apiVersion: v1 kind: Service metadata: name: frontend labels: app: guestbook tier: frontend spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30001 selector: app: guestbook tier: frontend
kubectl apply -f frontend-service.yaml
#查看frontd的service
kubectl get svc
显示如下:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend NodePort 10.111.215.185 <none> 80:30001/TCP 17s
在浏览器输入,master节点ip:30001,即可出现如下界面
结果演示