admin管理员组

文章数量:1438181

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

  1. 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正常

本文标签: Kubernetes学习笔记(一)