Kubernetes学习笔记(一)
一、Kubernetes 核心概念
1、Kubernetes集群架构与组件
2、Master组件:
kube-apiserver
Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APISer ver处理后再提交给Etcd存储。
kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。例如Deployment、Ser vice
kube-scheduler
根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
etcd
分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
3、Node组件
kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
第三方容器引擎
容器引擎,运行容器, 例如docker、containerd、podman
4、kubeconfig配置文件
kubectl使用kubeconfig认证文件连接K8s集群,使用kubectl config指令生成kubeconfig文件。
二、 kubectl管理命令
1、命令列表:
2、基本资源概念:
举例子:
[root@k8s-master ~]# kubectl create deployment web1 --image=nginx
镜像来源:
1)如果镜像地址里不带域名或IP,说明是从Docker Hub(hub.docker)上下载的
2)如果镜像地址里带域名或IP,说明是从对应的镜像仓库的下载的。
[root@k8s-master ~]# kubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort
--port #Service自身端口,现在用不到,后面会讲
--target-port #目标端口,即容器中服务运行的端口
--type #Service类型
#查看pod
#查看deployment
#查看service
用任何work节点加暴漏的端口访问
标签:
kubectl get pods --show-labels # 查看Pod标签
kubectl get pods -l app=web-demo # 根据标签过滤Pod
3、命名空间(Namespace):
Kubernetes将资源对象逻辑上隔离,从而形成多个虚拟集群。
应用场景:
• 资源分类管理,可根据不同团队、项目划分命名空间
• 基于命名空间权限授权
(1)查看k8s下的所有命名空间:
kubectl get namespace
• default:默认命名空间
• kube-system:K8s系统方面的命名空间
• kube-public:公开的命名空间,谁都可以访问
• kube-node-lease:K8s内部命名空间
查看不同的命名空间下的pod
(2)两种方法指定资源所属的命名空间:
• 命令行加 -n
• yaml资源元数据里指定namespace字段
[root@k8s-master ~]# kubectl create namespace team-a #创建命名空间
namespace/team-a created
[root@k8s-master ~]# kubectl create deployment web2 --image=nginx --replicas=3 -n team-a
deployment.apps/web2 created #在新的命名空间下创建deployment
[root@k8s-master ~]# kubectl expose deployment web2 --port=80 --type=NodePort --target-port=80 --type=NodePort -n team-a #通过service暴漏端口
service/web2 exposed
#在新的命名空间下查看pod,service
可以通过任何node节点加暴漏的端口访问
三、应用程序deployment
生命周期:
1、Deployment定义:
创建命名空间:
[root@k8s-master web-demo]# kubectl create namespace demo
namespace/demo created
创建Deployment资源部署应用镜像:
[root@k8s-master ~]# kubectl create deployment web-demo1 --image=nginx --replicas=3 -n demo
[root@k8s-master ~]# kubectl get pods -n demo
创建Service对外暴露Pod:
[root@k8s-master web-demo]# kubectl expose deployment web-demo1 --port=80 --target-port=80 --type=NodePort --name=web -n demo
查看service状态:
[root@k8s-master web-demo]# kubectl get service -n demo
2、YAML文件编排
K8s是一个容器编排引擎,使用YAML文件编排要部署应用,因此在学习之前,应先了解YAML语法格式:
• 缩进表示层级关系
• 不支持制表符“tab”缩进,使用空格缩进
• 通常开头缩进 2 个空格
• 字符后缩进 1 个空格,如冒号、逗号等
• “---” 表示YAML格式,一个文件的开始
• “#”注释
1、deployment的yaml
等同于:kubectl create deployment web-demo --image=nginx --replicas=3 -n demo
kubectl get endpoints -n demo #查看service关联的后端pod
kubectl create -f xxx.yaml #创建
kubectl apply -f xxx.yaml #创建+更新
kubectl rollout restart deployment web2 #重启deployment
kubectl rollout restart ds calico-node -n calico-system #重启网络
定义标签:
(1)一般推荐定义两个,由项目和应用组成,例如
project: ec # 键:值,可任意定义
app: portal
- matchLabels必须与下面labels保持一致,否则apply会报错。
2、service的yaml
等同于:kubectl expose deployment web-demo --port=80 --target-port=80 --type=NodePort -n demo
3、将你需要创建的资源描述到YAML文件中,然后进行创建、更新和卸载。
部署:kubectl apply -f xxx.yaml
卸载:kubectl delete -f xxx.yaml
4、资源字段太多,记不住怎么办?
(1)用create命令生成yaml文件:
[root@k8s-master ~]# kubectl create deployment web-demo --image=web-demo:v1 --replicas=3 -n demo --dry-run=client -o yaml >deployment-tpl.yaml
[root@k8s-master ~]# vim deployment-tpl.yaml
(2)用get命令导出
[root@k8s-master ~]# kubectl get deployment -n demo
NAME READY UP-TO-DATE AVAILABLE AGE
web-demo 3/3 3 3 3h47m
web-demo-v2 3/3 3 3 173m
[root@k8s-master ~]# kubectl get deployment web-demo -n demo -o yaml > deployment-export.yaml
(3) 获取资源下的字段
kubectl explain deployment
kubectl explain deployment.spec.template.spec.containers
3、版本升级:
应用升级是一个常见的操作,通常在应用引入新功能、修复错误,会将新版本发布到线上。在Kubernetes中应用升级有两种方式:
•方法一: 修改YAML文件里image字段,修改为新镜像地址,然后kubectl apply -f xxx.yaml
•方法二:kubectl set image deployment/<名称> <容器名称>=<新的镜像地址>
例子:
创建一个nginx为1.16版本的nginx的deployment
[root@k8s-master ~]# kubectl create deployment web-nginx --image=nginx:1.16 --replicas=3 -n demo
通过service暴漏出来
[root@k8s-master ~]# kubectl expose deployment web-nginx --port=80 --target-port=80 --type=NodePort -n demo
查看pod和service
任意一个节点访问nginx是1.16版本
查看命名空间demo 里面的service后端关联的pod对应的IP
[root@k8s-master ~]# kubectl get ep -n demo
查看pod的IP地址
[root@k8s-master ~]# kubectl get pods -o wide -n demo
查看pod的IP是对应的
(1)方法一:升级
[root@k8s-master ~]# kubectl create deployment web-nginx --image=nginx:1.16 --replicas=3 -n demo --dry-run=client -o yaml > web-nginx-deploy.yaml #生成yaml文件
将这里改成1.17版本:
[root@k8s-master ~]# kubectl apply -f web-nginx-deploy.yaml #更新nginx版本
查看nginx已经运行
版本已经变成1.17
(2)方法二:
nginx 由1.18版本升级为1.20版本
[root@k8s-master ~]# kubectl set image deployment web-nginx nginx=nginx:1.20 -n demo
模拟浏览器访问nginx;1秒中访问一次
[root@k8s-node2 ~]# for i in {1..2000};do curl -I http://192.168.183.148:32376 -s |grep Server;sleep 1;done
看到nginx是逐步被替换成高版本,逐步过渡,不会出现中断,不会影响业务
4、滚动升级定义:
[root@k8s-master ~]# kubectl describe deployment web-nginx -n demo #查看滚动升级的过程
nginx:1.16->nginx1.17
replicaset(简称RS),up扩展副本数,down缩容副本数
nginx1.16版本:web-nginx-5c49c474b6 副本数为3(旧RS)
nginx1.17版本:web-nginx-7d9cddf4cf副本数为1(新RS)
旧(RS)由3设置为2
新(RS)由1设置为2
旧(RS)由2设置为1
新(RS)由2设置为3
旧(RS)由1设置为0
旧版本Pod副本数不断减少,新版本Pod副本数不断增加,直到新版完全替换旧版本的数量。
5、应用发布失败回滚:
应用升级失败时,执行回滚操作是一个关键的步骤,以确保你的应用程序能够恢复到之前稳定的状态。
kubectl关于回滚命令如下:
# 查看历史发布版本
kubectl rollout history deployment/<名称>
每次升级完后建议给这个升级设置说明,方便回滚时查看:
kubectl annotate deployment/web kubernetes.io/change-cause="这是v2版本"
# 回滚上一个版本
kubectl rollout undo deployment/<名称>
[root@k8s-master ~]# kubectl rollout undo deployment web-nginx -n demo
deployment.apps/web-nginx rolled back
检验:
# 回滚历史指定版本
kubectl rollout undo deployment/<名称> --to-revision=<版本号>
6、应用扩容/缩容
例子:pod扩容为10个:
[root@k8s-master ~]# kubectl scale deployment web-nginx --replicas=10 -n demo
新启动7个:
pod改成5个,
[root@k8s-master ~]# kubectl scale deployment web-nginx --replicas=5 -n demo
7、项目下线:
[root@k8s-master ~]# kubectl delete deployment web-demo -n demo
再次查看已经没有了
四、k8s 内部监控与日志
1、查看资源集群状态和详细信息:
查看master组件状态:
查看node状态:
kubectl get node
查看资源的详细:
kubectl describe <资源类型> <资源名称>
查看资源信息:(当前命名空间的资源列表)
kubectl get <资源类型> <资源名称> # -o wide、-o yaml
查看某一个pod资源详情,并以yaml格式
查看节点或者pod的详细信息,加上-o wide后可以显示更详细的信息。
2、管理K8s组件日志
k8s各节点的组件:
Mater节点:apiserver、controller-manager、scheduler、etcd
Node节点:kubelet,kube-proxy,docker。
systemd守护进程管理的组件:
journalctl -u kubelet
Pod部署的组件:
[root@k8s-master ~]# kubectl logs kube-proxy-lzjxg -n kube-system
系统日志:
[root@k8s-master~]# tail/var/log/messages
3、管理K8s应用日志
查看容器标准输出日志:
kubectl logs <Pod名称>
kubectl logs -f <Pod名称>
标准输出在宿主机的路径:
/var/lib/docker/containers/<container-id>/<container-id>-json.log
查看日志的方法:以第一个容器为例子:
查看这个容器工作在node1上面:
在node1搜索到该容器的id
根据标准输出在宿主机的路径,查看日志:
日志文件,进入到终端日志目录查看:
kubectl exec -it <Pod名称> -- bash
根据实际服务的日志目录查看日志:
4、监控集群资源利用率
metrics-server工作流程:kubectl top --> apiserver --> metrics-server-->各个节点kubectl内置cadvisor获取容器资源指标。
执行时会提示错误:error: Metrics API not available
这是因为这个命令需要由metric-server服务提供数据,而这个服务默认没有
在node节点上拉去metrics-server服务:
[root@k8s-node1 ~]# docker pull lizhenliang/metrics-server:v0.6.1
v0.6.1: Pulling from lizhenliang/metrics-server
下载metrics-server.yaml并上传到master
[root@k8s-master ~]# kubectl apply -f metrics-server.yaml #部署一下
在kube-system命名空间下查看:
查看Node资源消耗:
kubectl top node <node name>
查看Pod资源消耗:
kubectl top pod <pod name>
查看cpu和内存的使用情况:
查看metrics-server的状态true正常