kubernetes 集群命令行工具 kubectl
实现容器化应用的安装和部署
1.kubectl 语法
kubectl [command] [TYPE] [NAME] [flags]
command :指定要对资源执行的操作,例如create.get.describe.delete
TYPE :指定资源类型,资源类型是大小写敏感的,开发者能够以单数,复数和缩略的形式.
NAME :指定资源名称,名称大小写也是敏感的,如果省略名称,则会显示所有的资源.
flags :指定可选参数.例如,可用-s或者-server参数指定Kubernetes API server的地址和端口
2.帮助命令
kubectl --help
3.具体查看某个操作
kubectl get --help
4.目前使用命令
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
kubectl get cs
kubectl get nodes
kubectl apply -f
kubectl get pods -o wide
kubectl label node k8snode1 env_role=prod
kubectl get ing
k8s集群中对资源管理和资源对象编排部署都可以通过yaml文件来解决
kubectl命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署
yaml 文件
资源清单文件
资源编排
1.yaml语法格式
通过缩进表示层级关系
不能使用tab进行缩进,只能使用空格
一般开头缩进2个空格
字符的后面缩进一个空格 比如冒号,逗号等后面
使用—表示新的yaml文件开始
使用#代表注释
2.yaml文件组成部分
1.控制器定义
2.被控制的对象
3.常用字段含义
apiVersion API版本
kind 资源类型
metadata 资源元数据
spec 资源规格
replicas 副本数量
selector 标签选择器
template Pod模板
metadata Pod元数据
spec Pod规格
containers 容器配置
4.如何快速的编写yaml文件
第一种 使用kubectl create 命令生成yaml文件
kubectl create deployment web --image=nginx -o yaml --dry-run=client > lh.yaml
第二种 使用kubectl get 命令导出yaml文件
kubectl get deploy nginx -o=yaml --export > lh2.yaml
k8s核心技术pod
1.pod基本概念
(1)最小部署的单元
(2)包含多个容器(一组容器的集合)
(3)一个pod中容器共享网络命名空间
(4)pod是短暂的
2.pod存在意义
(1)创建容器使用docker,一个docker对应一个容器,一个容器有进程,一个容器运行一个应用程序
(2)pod是多进程设计,运行多个应用程序(一个pod里面可以有多个容器,一个容器里面运行一个应用程序)
(3)pod存在为了亲密性应用(两个应用之间进行交互,网络之间的调用,两个应用需要频繁调用)
3.pod实现机制
(1)共享网络(pod实现共享网络机制 首先创建根容器,然后创建业务容器)
*共享网络:通过Pause容器,把其他业务容器加入到Pause容器里面,
让所有业务容器在同一个名称空间中,可以实现网络共享
(2)共享存储(Pod实现机制 共享存储 pod持久化数据(日志数据 业务数据)持久化存储 volumn数据卷)
*共享存储:引入一个数据卷概念volumn,使用数据卷进行持久化存储
4.镜像拉取策略
ifNotPresent:默认值,镜像在宿主机上不存在时才拉取
Always:每次创建pod都会重新拉取一次镜像
Nerver:pod永远都不会主动拉取这个镜像
5.pod资源限制
requests 调度资源限制
limits 最大资源限制
6.pod重启机制
Always:当容器终止退出后,总是重启容器,默认策略
OnFailure:当容器异常退出(退出状态码非0)时,才重启容器.
Never:当容器终止退出,从不重启容器.
7.pod健康检查
容器检查(应用层面健康检查)
liveenessProbe(存活检查)
如果检查失败,将杀死容器,根据Pod的restartPolicy来操作.
readinessProbe(就绪检查)
如果检查失败,Kuberbetes会把pod从service endpoints中剔除
Probe支持以下三种检查方法
httpGet
发送HTTP请求,返回200~400范围的状态码为成功
Exec
执行shell命令返回状态码是0为成功
Tcpsocket
发起TCP Socket建立成功
8.创建pod流程
Master节点:
Createpod – Apiserver – etcd
Scheduler – Apiserver – etcd – 调度算法,把pod调度某个node节点上
Node 节点:
Kubectl – Apiserver –读取etcd拿到分配给当前节点pod – docker创建容器
9.Pod调度
影响调用的属性
K8s核心技术controller
1.什么是controller
在集群上管理和运行容器的对象
2.Pod和controller关系
Pod是通过controller实现应用的运维,比如伸缩,滚动升级等等
Pod和controller之间通过label标签建立关系(selector)
3.Deployment控制器应用场景
部署无状态应用
管理pod和replicaSet
部署,滚动升级等功能
应用场景:web服务,微服务
4.Deployment 控制器部署应用(yaml)
导出yaml文件
使用yaml部署应用
对外发布(暴露对外端口号)
Kubectl expose deployment web --port=80 --type=NodePort –target-port=80 –name=web1 –o yaml > web1.yaml
5.升级回滚, 弹性伸缩
应用升级
Kubectl set image deployment web Nginx = Nginx1.15
查看升级状态
Kubectl rollout status deployment web
查看历史版本
Kubectl rollout history deployment web
回滚上个版本
Kubectl rollout undo deployment web
回滚到指定版本
Kubectl rollout undo deployment web –to-revision=2
弹性伸缩
Kubectl scale deployment web –replicas =10
6.无状态和有状态
(1)无状态:
认为pod都是一样的
没有顺序要求
不用考虑在哪个node运行
随意进行伸缩和扩展
(2)有状态:
上面因素都需要考虑到
让每个pod独立的,保持pod启动顺序和唯一性
唯一网络标识符,持久储存
有序,比如MySQL主从
7.部署有状态应用(statefueset)
无头service
Clusterip: none
查看pod,每个都是唯一名称
查看创建无头service
Deployment和statefueset区别:有身份的(唯一标识)
根据主机名+按照一定规则生成域名
每个pod有唯一主机名
唯一域名:
格式: 主机名称.service名称.名称空间.svc.cluster.local
Nginx-statefulset-0.nginx.default.svc.cluster.local
8.部署守护进程(DaemonSet)
在每个node上运行一个pod,新加入的node也同样运行在一个pod里面
9.job(一次性任务)
Kind:job
10.cronjob(定时任务)
状态结果执行多次
K8s核心技术service
1.Service存在意义
(1)防止pod失联(服务发现)
(2)定义一组pod访问策略(负载均衡)
2.pod和service关系
根据label和selector标签建立关联的
通过service实现pod负载均衡
Service对外有虚拟ip
3.常用service类型
ClusterIP nodeport loadbalancer
(1) ClusterIP:集群内部进行使用
(2) Nodeport:对外访问应用使用
(3) Loadbalancer:对外访问应用使用,公有云
Node内网部署应用,外网一般不能访问到的
找到一台可以进行外网访问机器,安装Nginx,反向代理
手动把可以访问的节点添加到Nginx里面
LoadBalancer:公有云,把负载均衡,控制器
K8s核心技术Secret
1.作用
加密数据存在etcd里面,让pod容器以挂载volume方式进行访问
2.场景
凭证:base64加密编码
创建secret加密数据
(1)以变量形式挂载到容器中
(2)以volume形式挂载pod容器中
K8s核心技术ConfigMap
1.作用:
存储不加密数据到etcd,让pod以变量或者volume挂载到容器中
2.场景
配置文件
(1) 创建配置文件
(2) 创建configmap
Kubectl create configmap redis –config –from-file=redis.properties
Kubectl get cm
Kubectl describe cm redis-config
(3) 以volume挂载到pod容器中
(4) 以变量形式挂载到pod容器中
创建yaml,变量信息,configmap创建
以变量挂载
K8s核心技术-安全机制
二进制集群搭建测试
K8s核心技术ingress
1.把端口号对外暴露,通过ip地址+端口号进行访问
使用service里面的nodeport实现
2.nodeport缺陷
在每个节点上都会起到端口,在访问时候通过任何节点,通过节点ip+暴露端口号实现访问
意味着每个端口只能使用一次,一个端口对应一个应用
实际访问中都是用域名,根据不同的域名跳转到不同端口服务中
3. ingress和pod关系
pod和ingress是通过service关联的
ingress作为统一入口,由service关联一组pod
4. 使用ingress
第一步 部署ingress controller
第二步 创建ingress规则(使用官方Nginx控制器,实现部署)
5. 使用ingress对外暴露应用
(1)创建Nginx应用,对外暴露端口使用nodeport
kubectl create deployment web --image=nginx
(2)部署ingress controller
查看ingress controller 状态
kubectl get pods -n ingress-nginx
(3) 创建ingress规则
(4) 在windows系统hosts文件中添加域名访问规则
K8s核心技术-helm
引入
(1) 之前方式部署应用基本过程(编写yaml文件 deployment service ingress)
如果使用之前的部署单一应用,少数服务的应用,比较合适
比如部署微服务项目,可能有几十个服务,每个服务都有一套yaml文件,需要维护大量的yaml文件,版本管理也会特别不方便
(1) 使用helm可以把这些文件yaml作为一个整体管理
(2) 实现yaml文件高效的复用
(3) 使用helm应用级别的版本管理
Helm介绍
Helm是k8s的包管理工具,就像Linux下的包管理器,类似yum/apt等,可以很方便的将之前打包好的yaml文件部署到k8s上
3.Helm三个重要概念
(1)helm是一个命令行客户端工具
(2)chart 把yaml打包,是yaml集合
(3)release 基于chart部署实体,应用级别的版本管理
4.helm2019之前v3版本区别
(1)v3版本删除tiller(架构变化)
(2)release可以在不同命名空间重用
(3)将chart推送到docker仓库中
helm repo remove stable
helm repo add stable https://apphub.aliyuncs.com/stable
helm repo update
使用helm快速部署应用
第一步 使用命令搜索应用
Helm search repo 名称(weave)
第二步 根据搜索内容选择安装
Helm install 安装之后名称 搜索之后应用名称
查看安装之后状态
Helm list
Helm status 安装之后 名称
修改service文件,type改为nodeport
如何自己创建chart
使用命令创建chart
Helm create chart名称
Chart.yaml : 当前chart属性配置信息
Templates: 编写的yaml文件放到这个目录中
Values,yaml: yamll文件可以使用全局变量
在templates文件夹创建两个yaml文件
Deployment.yaml
Service.yaml
安装mychart
Helm install 服务名称 mychart
应用升级
Heml upgrade chart 名称
10.实现yaml高效复用
通过传递参数,动态渲染模板,yaml内容动态传入参数生成
在chart有values.yaml文件,定义yaml文件全局变量
(1) 在values.yaml定义变量的和值
(2) 在具体yaml文件中获取变量的值
Yaml文件大体有几个地方不同
Image
Tag
Label
Port
Replicas
(1) 在values.yaml定义变量和值
(2) 在templates的yaml文件使用values.yaml定义变量
通过表达式形式使用全局变量
{{.Values.变量名称}}
{{.Release.Name}}
K8s核心技术----持久化存储
数据卷emptydir,是本地存储,pod重启,数据不在了,需要对数据持久化存储
(2)设置挂载路径
(3)挂载路径需要创建出来
第二步 在k8s集群node节点安装nfs
第三步 在nfs服务器启动nfs服务
第四步 在k8s集群部署应用使用nfs持久网络存储
2. Pv和pvc
Pod监控
容器指标
应用程序
2监控平台搭建方案(prometheus + grafana)
(1) prometheus
开源的
监控,报警,数据库
以http协议周期性抓取被监控组件状态
不需要复杂的集成过程,使用http接口接入就可以了
(2) grafana
开源的数据分析和可视化工具
支持多种数据源
(3) 第一步 部署prometheus
第二步 部署grafana
第三步 打开grafana,配置数据源,导入显示模板