New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
动手学习Kubernetes #21
Comments
K8S 如何调试日志:查看pod日志
查看pod的生命周期的事件
查看pod重启的原因依然通过describe 命令 Containers.[*].Last State 一节
比如,上节可以看到Container因为内存太多,被OOMKilled了 查看k8s的资源使用需要安装heapster
摘除某个pod进行debug使用label机制,对Pod进行标记。在Service定义中,我们添加 status: serving字段。当需要摘下某个Pod做Debug,而又不影响整个服务,可以:
此时kubelet就会把这个Pod从Service的后端列表中删掉。等到Debug完,想恢复?再改回去就好了:
k8s 进入容器进行调试格式
比如
kubernates 工具
参考
|
Kubernetes 证书介绍证书集群相关证书类型
根据认证对象可以将证书分成三类:服务器证书server cert,客户端证书client cert,对等证书peer cert(表示既是server cert又是client cert),在kubernetes 集群中需要的证书种类如下: etcd 节点需要标识自己服务的server cert,也需要client cert与etcd集群其他节点交互,当然可以分别指定2个证书,也可以使用一个对等证书 工具CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。 Github 地址: https://github.com/cloudflare/cfssl 官网地址: https://pkg.cfssl.org/ 安装curl -s -L -o /bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
curl -s -L -o /bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
curl -s -L -o /bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x /bin/cfssl* 使用例子参考 |
kubernates 监控介绍HeapsterHeapster是Kubernetes旗下的一个项目,Heapster是一个收集者,并不是采集 1.Heapster可以收集Node节点上的cAdvisor数据:CPU、内存、网络和磁盘 heapster已经被官方废弃(k8s 1.11版本中,HPA已经不再从hepaster获取数据) CPU内存、HPA指标: 改为metrics-server 架构图报警
Event监控工具
node检测
变更管理
理解kubernates
|
Kubernetes网络CNI首先我们介绍一下什么是 CNI,它的全称是 Container Network Interface,即容器网络的 API 接口。 它是 K8s 中标准的一个调用网络实现的接口。Kubelet 通过这个标准的 API 来调用不同的网络插件以实现不同的网络配置方式,实现了这个接口的就是 CNI 插件,它实现了一系列的 CNI API 接口。常见的 CNI 插件包括 Calico、flannel、Terway、Weave Net 以及 Contiv。 如何使用CNIK8s 通过 CNI 配置文件来决定使用什么 CNI。 基本的使用方法为: 首先在每个结点上配置 CNI 配置文件(/etc/cni/net.d/xxnet.conf),其中 xxnet.conf 是某一个网络配置文件的名称; 安装 CNI 配置文件中所对应的二进制插件; 在这个节点上创建 Pod 之后,Kubelet 就会根据 CNI 配置文件执行前两步所安装的 CNI 插件; CNI 插件Overlay 模式的典型特征是容器独立于主机的 IP 段,这个 IP 段进行跨主机网络通信时是通过在主机之间创建隧道的方式,将整个容器网段的包全都封装成底层的物理网络中主机之间的包。该方式的好处在于它不依赖于底层网络; 路由模式中主机和容器也分属不同的网段,它与 Overlay 模式的主要区别在于它的跨主机通信是通过路由打通,无需在不同主机之间做一个隧道封包。但路由打通就需要部分依赖于底层网络,比如说要求底层网络有二层可达的一个能力; Underlay 模式中容器和宿主机位于同一层网络,两者拥有相同的地位。容器之间网络的打通主要依靠于底层网络。因此该模式是强依赖于底层能力的。 那个插件适合我网络策略1、VxLan 多CNI适配插件网络解决方案
DNS网络ipvs和iptablesComparing kube-proxy modes: iptables or IPVS? – Project Calico 参考
|
Kubectl 操作docker覆盖EntryPoint和CMD
功能覆盖对照表:
参考 |
Kubernetes Sidecarsexample
参考 |
Kubernates 安全安全框架
参考 |
Kubernetes 迁移资源 |
Kubernates Operater |
Kubernates 管理root磁盘不够,docker镜像丢失了k8s 在磁盘不够的时候,默认会自动清理镜像 磁盘容量足够,但是k8s仍然有好多处于evicted如何修改docker和k8s相关数据到volumek8s会检查nodefs和imagefs, 其中imagefs 检测 /var/lib/docker所在的磁盘符, nodefs,检测/var/lib/kublet所在的盘符, nodefs 可以通过使用kubectl --root-dir来完成 node status's Ready,SchedulingDisabledkubectl uncordon 磁盘容量规划
参考 |
Kuberenetes Event参考 |
kubernetes 排错pod 排错pod排错方法
kubectl get pod <pod-name> -o yaml
kubectl logs <pod-name> [-c <container-name>] 常见pod 异常状态处理
service 排错Replication Controllers排错参考 |
Kubernetes Kubelet介绍kubelet 是运行在每个节点上的主要的“节点代理”,它按照 PodSpec 中的描述工作。 PodSpec 是用来描述一个 pod 的 YAML 或者 JSON 对象。kubelet 通过各种机制(主要通过 apiserver )获取一组 PodSpec 并保证在这些 PodSpec 中描述的容器健康运行。kubelet 不管理不是由 Kubernetes 创建的容器。 除了来自 apiserver 的 PodSpec ,还有 3 种方式可以将容器清单提供给 kubelet 。 文件:在命令行指定的一个路径,在这个路径下的文件将被周期性的监视更新,默认监视周期是 20 秒并可以通过参数配置。 HTTP端点:在命令行指定的一个HTTP端点,该端点每 20 秒被检查一次并且可以通过参数配置检查周期。 HTTP服务:kubelet 还可以监听 HTTP 服务并响应一个简单的 API 来创建一个新的清单。 参考 |
Kubectl介绍什么是kubectl ?kubectl是Kubernetes API的客户端, 可以和kubernetes API Server沟通,完成对kubernetes的相关操作 常用命令
内部原理kubernate的内部组成Kubernetes由一系列独立组件构成,这些组件会在集群的节点上作为单独的进程运行。一些组件运行在master节点,一些组件运行在worker节点,每个组件都有其特定功能。 在master节点上,有以下重要组件: 存储后端:存储资源定义(通常使用etcd) API Server:提供Kubernetes API并管理存储后端 Controller manager:确保资源状态与规范相匹配 Scheduler:将Pod调度到worker节点 在worker节点上最重要的组件为: 理解kubectl 基本操作原理假如执行下面的语句 kubectl create -f replicaset.yaml kubectl向_create ReplicaSet API端点_发出了HTTP POST请求, 发送replicaset资源的定义,然后API Server 保存相关定义 kubernetes 基本工作原理1、kuberetes的所有组件都是资源,后端存储(etcd)维护了资源的状态 使用技巧1. 自动补全2. 迅速查看资源规范官方文档位于1.13 doc, 但是会十分繁琐,kubectl explain命令专门用于解决这个问题, 基本格式如下 kubectl explain resource\[.field\] [--recursive] # 默认命令展示一层 recursive可以显示所有级别 如果不确定有哪些资源,使用 kubectl api-resources 使用例子
3. 自定义列输出格式4. 轻松在集群和命名空间之间切换5. 时候用自动生成的别名保存输入6. 使用插件扩展kubectl插件介绍
kubectl 替代工具
参考
|
Config Map介绍Container技术(例如Docker)提供了三种简易方式来为运行在container中的应用提供configuration:
为容器设置环境变量设置configmap的所有Entryspec:
containers:
- image: some-image
envFrom:
- prefix: CONFIG_
configMapRef:
name: my-config-map 设置configmap中的一个EntryapiVersion: v1
kind: Pod
metadata:
name: fortune-args-from-configmap
spec:
containers:
- image: luksa/fortune:args
env:
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: fortune-config
key: sleep-interval
args: ["$(INTERVAL)"] 问题
解决办法:gopaddle-io/configurator: Synchronize ConfigMaps & Secrets across Deployment Rollouts watcher参考 |
Operatorscontroller在 k8s中的作用Operator框架参考 |
Prob 健康监测pod的生命周期参考Pod Lifecycle官方文档,Pod的LifeCycle定义如下
pod 创建流程如下
Pod Conditions每一个Pod都有一个PodStatus,是通过一个PodCondtions数组,来表示Pod的状态,每一个PodCondition有6个可能的字段
Pod重启策略
如果 restartpolicy 没有设置,那么默认值是 Always。RC 和 DaemonSet 必须指定重启策略为 Always。 Pod 常见状态转换场景
Pod的Liveness和Readiness探针探针介绍kublet负责管理pod的生命周期,在创建Pod的时候负责初始化Init Containers,创建业务Containers,在主程序刚刚启动的时候可以指定一个post start 主程序启动开始后执行一些操作,在主程序结束前可以指定一个 pre stop 表示主程序结束前执行的一些操作。在pod创建完成后提供了两类定时探针Liveness P探针和Readiness 探针如下图 Liveness 探针
Liveness探针用来指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。Kubelet使用liveness probe(存活探针)来确定何时重启容器。例如,当应用程序处于运行状态但无法做进一步操作,liveness探针将捕获到deadlock,重启处于该状态下的容器,使应用程序在存在bug的情况下依然能够继续运行下去。 Readiness 探针
Readiness探针指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success。Kubelet使用readiness probe(就绪探针)来确定容器是否已经就绪可以接受流量。只有当Pod中的容器都处于就绪状态时kubelet才会认定该Pod处于就绪状态。该信号的作用是控制哪些Pod应该作为service的后端。如果Pod处于非就绪状态,那么它们将会被从service的load balancer中移除。 Startup 探针Startup探针用来显示应用是否已经启动。如果Startup 探针提供了,那么其他的探针在startup成功之前,是被禁止的,如果Startup探针失败,kubelet会kill掉Pod,然后具体操作,参考Pod的 Pod探针的探测方式和结果探针支持以下集中探测方式
对应的探测结果有三种
liveness探针使用示例
apiVersion: v1
kind: Pod
metadata:
name: liveness-tcp
labels:
app: liveness
spec:
containers:
- name: liveness
image: nginx
livenessProbe:
initialDelaySeconds: 15
periodSeconds: 20
tcpSocket:
port: 80 readiness 探针使用例子基本和liveness探针使用一样,这里不再详述 apiVersion: v1
kind: Pod
metadata:
name: springboot
labels:
app: springboot
spec:
containers:
- name: springboot
image: mydlqclub/springboot-helloworld:0.0.1
ports:
- name: server
containerPort: 8080
- name: management
containerPort: 8081
readinessProbe:
initialDelaySeconds: 20
periodSeconds: 5
timeoutSeconds: 10
httpGet:
scheme: HTTP
port: 8081
path: /actuator/health 参考
|
容器管理
|
云原生与应用 |
k8s工具 octant:一个集群状态展示的 dashboard sonobuoy:一个 K8s 分析工具 |
镜像管理镜像缩减
pull through失败镜像处理
镜像缓存管理OCI镜像拉取gitops |
配置文件格式与规范验证升级 |
mark |
使用kubectl + yaml配置部署docker
定义deployment.tpl
deployment的生成脚本
定义service.tpl
生成service.yaml的脚本
脚本使用
依赖属性, 通过发版平台来定义
参数传递,通过环境变量
The text was updated successfully, but these errors were encountered: