一. 资源清单

1. 集群的资源

命名空间级别: 指定命名空间下可以看到

集群级别: 整个集群可以看到

元数据型: 通过指标操作

2. 常用字段

k8s的yaml文件中常用的字段

apiVersion:              k8s api的版本,使用kubectl api-version查询
kind:                    yaml文件定义的资源类型和角色,比如Pod
metadata:                元数据对象 固定值就写metadata
metadata.name:           元数据对象的名字,比如Pod的名字
metadata.namespace:      元数据对象的命名空间
Spec:                    详细定义对象,固定值就写Spec
spec.containers[]:       spec对象的容器列表定义,是个列表
spec.containers[].name:  定义容器的名字
spec.containers[].image: 定义镜像的名字
spec.containers[].imagePullPolicy:  定义镜像拉取的策略 Always、Nerver、IfNitPrese
spec.containers[].command[]:        指定容器启动命令
spec.containers[].args[]:           指定容器启动命令参数
spec.containers[].workingDir:       指定容器工作目录
spec.containers[]ports[]:           指定容器用到的端口列表
spec.containers[].ports[].name:     指定容器端口名称
spec.containers[].ports[].containersPort:  指定容器监听的端口号
spec.containers[]ports[].hostPort:         指定容器所在主机需要监听的端口号
spec.containers[].ports[].portocol:        指定端口协议 tcp udp
spec.containers[].env[]:                   指定容器运行前需要设置的环境变量列表
spec.containers[].env[].name:              指定环境变量名称
spec.containers[]env[].value:              指定环境变量的值
spec.restartPolicy:      定义容器重启的策略 Always、OnFailure
spec.nodeSelector:       定义node的label过滤标签
spec.imagePillSecrets:   定义pull镜像时secret名称
spec.hostNetwork:        定义是否使用主机网络模式
......

3. 容器的生命周期

3.1 探针:是kubelet对容器执行的定期诊断,由node上的kubelet调用

ExecAction:     在容器内执行指定命令,退出码为0则诊断成功
TcpSocketAction:对指定 端口 上的容器的 IP 进行检查,端口开通则诊断成功
HTTPGetAction:  对指定 端口和路径 上的容器的 IP 执行http get请求,返回状态码大于等于200小于400则诊断成功
livenessProbe:  指示容器是否正常运行,如果探测失败,kubelet会杀死容器根据重启策略进行重启
readinessProbe: 指示容器是否准备好服务请求

3.2 Pod的status状态

pending:  Pod已被k8s结束,但有容器尚未创建,等待中
running:  Pod已经被绑定在node上 所有容器都已经创建,至少一个容器正在运行
succeeded:Pod中所有容器都被成功终止,并且不会重启
failed:   Pod中所有容器都终止,指示有一个容器因为失败终止
unkonw:   某些原因无法获取Pod状态,一般是与node节点通信失败


二. 控制器

1. 控制器的类型

  • ReplicaSet:RS 确保容器的副本数,自动创建容器和自动回收容器
  • Deployment:管理ReplicaSet,支持滚动更新和滚动回滚。deployment创建RS,RS创建Pod

                      滚动更新时deployment会创建新的RS,但不删除旧的RS,在新的RS中使用新镜像创建pod
                      滚动回滚时deployment使用旧的RS创建旧的pod

  • HPA:平滑扩展,控制RS和deployment。
  • StatefulSet:为了解决有状态服务的问题 (RS和deployment是为了解决无状态服务)
  1. 稳定的持久化存储:pod重新调度之后还能访问到持久化数据,基于PVC实现
  2. 稳定的网络标志:pod重新调度之后,podname和hostname不变,基于headless service实现
  3. 有序部署:pod启动是有顺序的,例如先启动mysql--apache--nginx
  4. 有序产出:pod删除是有顺序的,例如先删除nginx--apache--mysql
  • DaemonSet:守护进程。确保全部或者一些Node上运行一个pod的副本,当有node加入集群时,也会为它们新增一个pod
  • Job:执行一次的任务,保证批处理任务的的一个或多个pod成功介绍
  • CronJob:周期性的执行任务

2. 控制器实例

Deployment部署nginx

vim deployment.yaml              # 创建deployment.yaml
apiVersion: apps/v1              # 声明api版本
kind: Deployment                 # 定义资源类型
metadata:                        # 资源的元数据,用于标识描述这个资源
  name: deployment-nginx         # 定义资源的name
spec:                            # deployment的spec
  replicas: 3                    # 期望运行Pod数量
  selector:                      # 选择器,定义标签
    matchLabels:                # 匹配标签
	  app: nginx                 # 定义标签为 app,值为 nginx
  template:                      # Pod模板
    metadata:                    # Pod的元数据
	  labels:                    # 标签
	    app: nginx               # Pod的标签,用于被svc deployment 的selector选中
	spec:                        # template的spec,可以写多个containers
	  containers:                # 容器列表
	  - name: nginx              # 容器的名称
	    image: nginx:v1          # 使用的镜像
		ports:                   # 容器暴露的端口列表
		- containerPort: 80      # 容器监听的端口
kubectl apply -f deployment.yaml  # 以deployment.yaml文件创建资源
kubectl get deployment            # 查看deployment.yaml创建的deployment,name为定义的deployment-nginx
kubectl get rs                    # 查看由deployment创建的rs,name为deployment-nginx开头
kubectl get pod                   # 查看有rs创建的Pod,name为rs的name开头     

3. 更新与回滚

3.1. 更新Pod版本

更新Pod版本
方法1.
将deployment.yaml中的image: nginx:v1 改为 image: nginx:v2
kubectl apply -f deployment.yaml    # 重新应用yaml文件

方法2.
使用命令行更新指定命名空间下的Pod版本
kubectl set image deployment/deployment-nginx nginx=nginx:v2 -n default

查看更新状态
kubectl rollout status deployment/deployment-nginx

3.2. 回滚Pod版本

回滚Pod版本
方法1.
回滚到上一个版本
kubectl rollout undo deployment deployment-nginx

方法2.
回滚到指定版本
kubectl rollout history deployment deployment-nginx              # 查看历史版本号
kubectl rollout undo deployment deployment-nginx --to-revision=1 # 回滚到revision=1的版本
kubectl rollout status deployment deployment-nginx               # 查看回滚状态

3.3. 确认当前Pod镜像版本

方法1:查看 Pod 使用的镜像
kubectl get pods -l app=nginx -o jsonpath='{range .items[*]}{.spec.containers[0].image}{"\n"}{end}'

# 方法2:查看 Deployment 详情
kubectl describe deployment deployment-nginx | grep Image

Kubernetes

基本概念:     Pod、控制器类型、网络通讯模式
kubernetes:   安装
资源清单:     资源 资源清单的语法 编写pod  pod生命周期 
pod控制器:    各种控制器的特点 使用定义方式
服务发现:     syc原理  构建方式
存储:         多种存储类型的特点  不同环境中选择合适的存储方案
调度器:       调度过程  自定义调度器
集群安全机制: 集群认证、鉴权、访问控制的原理流程
HELM:         原理  模板  插件
运维:         源码修改   高可用构建




无状态服务:随时可以加入集群工作   DBMS
有状态服务:需要实时进行数据更新存储,抽离集群之后无法工作  LVS


            kubectl、web ui、etcd、internet、firewalld
master节点:scheduler、apiserver、replication contller
node节点:kubelet、kube-proxy、docker



apiserver:    所有服务访问的统一入口,相当与消息转发中心
CrontrollerManager(控制器): 选择合适的节点进行分配任务
etcd:         分布式键值存储服务,键值对数据库,为整个分布式集群存储一些构建数据,协助分布式集群的正常运行和恢复,存储k8s的主要参数谢谢(持久化)
kuberlet:     直接与容器交互,实现容器的生命周期管理,将k8s的指令转化为容器能听懂的命令
kube-proxy:   负责写入规制至 iptables、lvs实现映射
coredns:      可以为集群中的svc创建一个域名ip的对应关系解析
dashboard:    给k8s提供一个B/S结构访问体系
ingress:      实现七层代理
federation:    提供一个可以跨集群中心的k8s统一管理功能
prometheus:    提供k8s集群的监控能力
elk:           提供k8s集群日志同意分析接入平台










------kubernetes基本概念------

Pod概念
k8s中最小的控制单元
pod中网络是共享的,存储是共享的
自主式Pod:      没人控制的pod
控制器管理的Pod:k8s控制的pod,有k8s拉起


Pod控制器:
ReplicationController:RC 确保容器的副本数,自动创建容器和自动回收容器(不使用)
ReplicaSet:RS 确保容器的副本数,自动创建容器和自动回收容器
Deployment:管理ReplicaSet,支持滚动更新和滚动回滚。deployment创建RS,RS创建Pod
            滚动更新时deployment会创建新的RS,但不删除旧的RS,在新的RS中使用新镜像创建pod
			滚动回滚时deployment使用旧的RS创建旧的pod
HPA:平滑扩展,仅适用于RS和deployment。根据RS定义

StatefulSet:为了解决有状态服务的问题 (RS和deployment是为了解决无状态服务)
1.稳定的持久化存储:pod重新调度之后还能访问到持久化数据,基于PVC实现
2.稳定的网络标志:pod重新调度之后,podname和hostname不变,基于headless service实现
3.有序部署:pod启动是有顺序的,例如先启动mysql--apache--nginx
4.有序产出:pod删除是有顺序的,例如先删除nginx--apache--mysql

DaemonSet:守护进程。确保全部或者一些Node上运行一个pod的副本,当有node加入集群时,也会为它们新增一个pod
Job:执行一次的任务,保证批处理任务的的一个或多个pod成功介绍
cron job:周期性的执行任务



服务发现:service
负载pod的ip地址,通过pod的标签进行代理绑定


网络通讯方式:
同一个pod之间的docker:使用localhost访问
同一台服务器上的pod: 使用Docker0网桥直接转发,不经过flannel
不同服务器上的pod:使用flannel转发
pod和service:使用lvs转发




------kubernetes安装------
1.
2.docker安装
3.kubeadm安装
4.主节点初始化
5.从节点加入集群
6.flannel网络部署
7.harbor仓库安装
8.kubernetes命令
kubectl get svc
kubectl run
kubectl get pod -o wide
kubectl delect pod xxxx






------资源清单------
1.集群的资源
命名空间级别: 指定命名空间下可以看到
集群级别: 整个集群可以看到
元数据型: 通过指标操作


2.资源清单 yaml格式


3.常用字段
apiVersion:              k8s api的版本,使用kubectl api-version查询
kind:                    yaml文件定义的资源类型和角色,比如Pod
metadata:                元数据对象 固定值就写metadata
metadata.name:           元数据对象的名字,比如Pod的名字
metadata.namespace:      元数据对象的命名空间
Spec:                    详细定义对象,固定值就写Spec
spec.containers[]:       spec对象的容器列表定义,是个列表
spec.containers[].name:  定义容器的名字
spec.containers[].image: 定义镜像的名字
spec.containers[].imagePullPolicy:  定义镜像拉取的策略 Always、Nerver、IfNitPrese
spec.containers[].command[]:        指定容器启动命令
spec.containers[].args[]:           指定容器启动命令参数
spec.containers[].workingDir:       指定容器工作目录
spec.containers[]ports[]:           指定容器用到的端口列表
spec.containers[].ports[].name:     指定容器端口名称
spec.containers[].ports[].containersPort:  指定容器监听的端口号
spec.containers[]ports[].hostPort:         指定容器所在主机需要监听的端口号
spec.containers[].ports[].portocol:        指定端口协议 tcp udp
spec.containers[].env[]:                   指定容器运行前需要设置的环境变量列表
spec.containers[].env[].name:              指定环境变量名称
spec.containers[]env[].value:              指定环境变量的值
spec.restartPolicy:      定义容器重启的策略 Always、OnFailure
spec.nodeSelector:       定义node的label过滤标签
spec.imagePillSecrets:   定义pull镜像时secret名称
spec.hostNetwork:        定义是否使用主机网络模式
......


4.容器生命周期




探针:时kubelet对容器执行的定期诊断,由node上的kubelet调用
ExecAction:     在容器内执行指定命令,退出码为0则诊断成功
TcpSocketAction:对指定 端口 上的容器的 IP 进行检查,端口开通则诊断成功
HTTPGetAction:  对指定 端口和路径 上的容器的 IP 执行http get请求,返回状态码大于等于200小于400则诊断成功
livenessProbe:  指示容器是否正常运行,如果探测失败,kubelet会杀死容器根据重启策略进行重启
readinessProbe: 指示容器是否准备好服务请求



Pod的status状态
pending:  Pod已被k8s结束,但有容器尚未创建,等待中
running:  Pod已经被绑定在node上 所有容器都已经创建,至少一个容器正在运行
succeeded:Pod中所有容器都被成功终止,并且不会重启
failed:   Pod中所有容器都终止,指示有一个容器因为失败终止
unkonw:   某些原因无法获取Pod状态,一般是与node节点通信失败








------控制器------
ReplicaSet:RS 确保容器的副本数,自动创建容器和自动回收容器
Deployment:管理ReplicaSet,支持滚动更新和滚动回滚。deployment创建RS,RS创建Pod
            滚动更新时deployment会创建新的RS,但不删除旧的RS,在新的RS中使用新镜像创建pod
			滚动回滚时deployment使用旧的RS创建旧的pod
HPA:平滑扩展,控制RS和deployment。

StatefulSet:为了解决有状态服务的问题 (RS和deployment是为了解决无状态服务)
1.稳定的持久化存储:pod重新调度之后还能访问到持久化数据,基于PVC实现
2.稳定的网络标志:pod重新调度之后,podname和hostname不变,基于headless service实现
3.有序部署:pod启动是有顺序的,例如先启动mysql--apache--nginx
4.有序产出:pod删除是有顺序的,例如先删除nginx--apache--mysql

DaemonSet:守护进程。确保全部或者一些Node上运行一个pod的副本,当有node加入集群时,也会为它们新增一个pod
Job:执行一次的任务,保证批处理任务的的一个或多个pod成功介绍
cron job:周期性的执行任务


Deployment部署nginx:

vim deployment.yaml              # 创建deployment.yaml
apiVersion: apps/v1              # 声明api版本
kind: Deployment                 # 定义资源类型
metadata:                        # 资源的元数据,用于标识描述这个资源
  name: deployment-nginx         # 定义资源的name
spec:                            # deployment的spec
  replicas: 3                    # 期望运行Pod数量
  selector:                      # 选择器,定义标签
    matchLabels:                # 匹配标签
	  app: nginx                 # 定义标签为 app,值为 nginx
  template:                      # Pod模板
    metadata:                    # Pod的元数据
	  labels:                    # 标签
	    app: nginx               # Pod的标签,用于被svc deployment 的selector选中
	spec:                        # template的spec,可以写多个containers
	  containers:                # 容器列表
	  - name: nginx              # 容器的名称
	    image: nginx:v1          # 使用的镜像
		ports:                   # 容器暴露的端口列表
		- containerPort: 80      # 容器监听的端口

kubectl apply -f deployment.yaml # 以deployment.yaml文件创建资源
kubectl get deployment           # 查看deployment.yaml创建的deployment,name为定义的deployment-nginx
kubectl get rs                   # 查看由deployment创建的rs,name为deployment-nginx开头
kubectl get pod                  # 查看有rs创建的Pod,name为rs的name开头     


更新Pod版本
方法1.
将deployment.yaml中的image: nginx:v1 改为 image: nginx:v2
kubectl apply -f deployment.yaml    # 重新应用yaml文件
方法2.
使用命令行更新指定命名空间下的Pod版本
kubectl set image deployment/deployment-nginx nginx=nginx:v2 -n default
查看更新状态
kubectl rollout status deployment/deployment-nginx

回滚Pod版本
方法1.
回滚到上一个版本
kubectl rollout undo deployment deployment-nginx
方法2.
回滚到指定版本
kubectl rollout history deployment deployment-nginx              # 查看历史版本号
kubectl rollout undo deployment deployment-nginx --to-revision=1 # 回滚到revision=1的版本
kubectl rollout status deployment deployment-nginx               # 查看回滚状态


确认当前Pod镜像版本
方法1:查看 Pod 使用的镜像
kubectl get pods -l app=nginx -o jsonpath='{range .items[*]}{.spec.containers[0].image}{"\n"}{end}'
# 方法2:查看 Deployment 详情
kubectl describe deployment deployment-nginx | grep Image



Service(SVC)服务发现:
负责监控Pod的信息,根据标签匹配Pod,用作负载均衡和流量转发(RR轮询)到Pod上。当有Pod重启时,读取Pod的信息并记录SVC的负载队列中,相当与F5
SVC只提供4层负载均衡能力,只能通过IP和端口的方式进行转发,不能通过域名的方式进行转发
ClusterIP:自动分配一个集群内部的IP,集群内的Pod通过访问这个SVC的ip来访问SVC后面的Pod
NodePort: 在ClusterIP的基础上,为SVC在每台机器上绑定一个端口(端口映射),运行外部需求访问Pod内部

为什么不使用DNS进行负载均衡,而是使用SVC
DNS会在客户端进行缓存,当Pod重启时无法更新信息

SVC使用的代理模式:通过防火墙规则进行转发
iptables反向代理模式
ipvs反向代理模式


Ingress-nginx:代替了nginx,需要nginx-ingress-controller镜像
通过ServiceName参数绑定SVC的IP端口来分发到SVC

http访问
第三方访问域名 ---> ingress域名+端口。域名绑定IP,通过标签绑定SVC,将流量转发到指定的SVC ---> SVC通过iptables/ipvs规则将流量转发到指定的Pod上,通过标签绑定Pod ---> Pod由deployment创建








































Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐