centos 7.9mini 然后3台两核4g的机器(7.x 无所谓)
firewalld和iptables只是一个工具,真正实现防火墙功能的是内核的netfilter(防火墙)
kubelet 需要在每个节点都装
容器中的文件都是临时存在的
数据券是由kubelet 去实现的
hostpath 挂载的目录是看pod在哪个节点上
k8s搭建遇到的问题:
1、没改kubeadm init初始化失败
大部分都是kubelet起不来,原因:swap、cgroups驱动没改systemd、docker及cri-dockerd没运行。可以使用journalctl -u kubelet -f 查看一下日志。
2、calico镜像下载的问题,一般情况下是网络的问题,可以尝试先docker pull试试,或者找个网络好的机器下载下来然后再上传。
cni 容器网络接口
cri 容器运行时接口
k8s在同一节点上面只能运行一个容器引擎
每个容器都是通过shim-runc去维护的
docker带containerd,不用再去单独去装了
containerd 是k8s 开发的
kubelet --help | grep runtime 可以查看k8s是否支持docker。有remote就是不支持的。
/etc/kubernetes 主要保存k8s组件的配置文件(基本上是安装目录)
/var/lib/kubelet 是kubelet 主要的目录
强者不畏惧变数
k8s 里面一切皆为资源
通常是一个项目或者一个团队才放一个命名空间
kubectl apply -f . 那个点表示当前目录的所有yaml文件。
recycle (回收),pv删除,目录里面的数据删除,但目录还在。
回收策略相对于pvc来说,删除pv不会影响后面的目录
clusterIP 为None的话表示不为它分配ip(也叫无头服务)
volumeClaimTemplates: 仅能使用在StatefulSet 上面。
service.命名空间.svc.cluster.local 访问域名的格式
etcd 默认是2m,configmap和secret 不会出现什么问题
准入控制插件在/etc/kubernetes/manifests/kube-apiserver.yaml 里
面
prometheus 是不用安装数据库的,里面的tsdb数据库是存储的
service discovery 是prometheus 的服务发现
deployment 部署的是通过service 的域名去连接的
StatefulSet 部署的是通过每个pod的域名去连接的
StatefulSet 部署的角色(比如mysql的主服务器,从服务器)需要自我去区分(区别角色也就是去区别配置文件,ip,节点标识,数据储存什么的。如mysql的主服务器和从服务器的配置文件是不一样的)
内部是集群往k8s上面去布基本上都是有状态应用,比如lnmp(pod之间是不对等的,而且需要通信)
kubectl get cs 查看master组件的状态
所有执行的命令都是经过api-server
有部署kubelet 的都称之为节点
kubectl get nodes 后面的版本号是kubelet 的版本号
kubectl top -> apiserver -> metric-server(pod) -> kubelet(cadvisor)->容器
docker load < 1.tar 表示导入镜像
kubectl get apiservices 查看一下api里面其中的服务(主要查看外部的服务注入到里面)
master组件: kube-controller-manager kube-apiserver kube-scheduler
node组件: kube-proxy kubelet
容器的创建销毁,挂载都是由kubelet 去执行的
kubectl logs pod 查看的pods 日志是由docker去存放的
/var/lib/docker/containers/ 是容器的临时工作目录
kubectl logs --> apiserver --> kubelet --> docker (xxx-json.log)
kubectl exec -it n1 – bash 然后cd logs 也可以查看日志
kubectl top pods --sort-by=cpu
create 只创建不更新
apply 创建和更新
status 与用户没有任何关系,是k8s保留输出状态用的
kubectl explain deployment.spec.template.spec 表示查看写deployment下面的spec下面的template下面的spec的yaml文件字段写什么
json 和yaml文件是可以相互转换的,比如kubectl get pods n1 -oyaml 可以写成kubectl get pods n1 -ojson
edit 保存之后就生效。
kubectl set image deployment web1 -n test nginx=nginx:1.16 --record 表示升级命名空间test下面的deployment下面的web1 的镜像为nginx:1.16 其中–record 表示记录其中升级的配置。
rollout 查看历史版本
rs 可以看到历史版本号与rs对应关系,从rs可以再得知当前对应的镜像。(可以使用 kubectl describe rs web1 -n test
kubectl rollout undo deployment/web1 -n test --to-revision=2 表示回滚到版本2
kubectl rollout undo deployment/web1 -n test 表示回滚到上一层
pod 是k8s中最小的调度单元
pod 的ip是不固定的,重建就会变。
kubectl logs pod1 -c pod1 表示查看pod1里面容器pod1的日志
web-8667899c97-z6w9d 其中第一个deployment 创建的名字,第二个866* 是rs 的名字,最后一个是随机字符串。
k8s 里面的pod 不能重启,删除然后再重新建就是重启。
只有deployment 才有rs 。 rs是控制副本数的
always 会重建容器,而不是pod
kubelet 发起的健康检查
| 带表示的是多行,你可以在下面写任意的数据,json和yaml都可以写
键值一般情况下都是以变量的方式注入,多行数据一般是以数据卷的方式挂载到容器上
items:
- key 表示在comfigmap 上面定义的key
path 表示数据卷挂载到目录的名字,如redis.conf
:24 可以直接进入24行里面
sublime.txt
generic 的类型是Opaque
ca.crt和ca.key 属于根证书,其他的是客户端证书
kubectl --kubeconfig=aliang.kubeconfig get pods 表示使用aliang这个证书配置文件去查看pod
空值是核心组,kubectl api-resources 查看版本是v1,然后后面什么都没有就是核心组
在rabc.yaml 文件里面写的要加s,如deployment要写成deployments
kubectl --as=system:serviceaccount:test:aliang get pods -n test
表示用服务账号aliang命名空间test 来查看pod
通常情况下get和list 都加,因为实际上使用get通常都是list( 在调用api的时候好像有区分)
初始容器不支持健康检查
kubelet 是负责容器生命周期管理的
kubelet 起来之后,即使集群没有起来也能运行pod
kubelet 不能使用deployment部署pod,因为集群还没有起来。因为deployment 是由controller-manager这个组件支持的,scheduler 是负责调度的
/etc/kubernetes/manifests 这个下面的yaml文件,可以让kubelet去创建。想让那个节点上的kubelet 去创建,你就把yaml文件放到那个节点上的/etc/kubernetes/manifests 下面
list-watch 是订阅与发布的一种机制.
1、kubectl 想api-service发送创建pod请求,然后api-server把pod配置 写入etcd,然后etcd再给api-server最后反馈给你创建了pod。
2、scheduler 收到api-server有新的pod的事件,scheduler根据自身调度算法选择一个合适的节点,并打标记pod=k8s-node1
3.kubelet 收到分配到自己节点的pod,调用docker api创建容器,并获取容器状态汇报给apiserver
集群中任何数据的变化 api-server都会写入Etcd数据库
kubectl get pods 就是查看etcd 数据库的
kube-proxy 是控制容器网络的,主要负责service 的创建
controller-manager 负责控制器的创建,例如deployment
requests 必须小于等于lists的值
sp可以实现pod水平扩容,vp可以实现pod横向扩容
给pod 打上标签他就会分配有标签的node上面,没有则不分配
在同一个节点上面打的标签key不能一样,value可以一样
第一次匹配的label,然后节点上没有标签然后没有分配成功,后续继续再给node打上标签也是可以分配成功的。
单个pod的备份是不是打包容器(可以使用yaml文件,deployment会拉起多个,也可以用etcd备份)
controllers 称之为控制器
{} 代表的是所有pod
kube-apiserver 所有的操作都是对接的etcd
etcd的ip为什么是宿主机的ip,因为它共享了宿主机的网络
hostNetwork: true 表示使用的是宿主机的网络
2380 端口是集群内部通信需要
2379 是数据端口,程序都是根据这个端口去读写数据的,也就是etcd的端口
6443 是apiserver 入口的地址
etcdctl 的包是etcd
etcd 备份很快,如有几十m和和几个g可能的话也就十几秒
etcd 备份的是全部,mv备份的应该etcd
升级是先升级master,然后再升级node
基本上都是三个月一个版本,然后第三个版本会基本上保障第三个版本适用的。如1.23 保障1.22和1.21版本。 基本上不要跨大版本升级,如1.21升级到1.24。
一般公司用的前面一两年的版本,基本上和最新版差5个版本。
为什么要升级呢: 当前版本有bug,对新版本有功能需求,纯属癖好
master 默认打的有污点,所以业务pod不会分配给master,只有系统的一些pod才会分配给它
在生产环境中尽量的不要使用pod
pod 如果没有指定标签的话也会分配到带有标签的node上面
污点可以只配置一个key,不过大部分也是key:value出现
nodeselector与tain 是分别独立的,两者都用都必须都满足
如果加上污点容忍,pod也不会分配到指定的污点上面,只不过随机分配的时候会分配到上面
strategy: {} 是关于滚动升级的参数
operator: “Equal” 是等于的意思
confd+consul 是服务发现的一个产品,confd动态更新负载均衡的文件,cousul是去读confd的文件然后再加载
service 不通的话,最多的可能性是service 的标签和pod的标签不一样,导致分发错pod或者连接不上了。
kubectl expose 的时候必须是pod已经创建好的了,而create service 不需要先创建pod
svc是纯4层的东西
loadbalancer 是针对公有云平台的
service 默认的转发是由iptables 去实现的,是默认的一种行为。docker也是。
iptables都是从上到下
ipvsadm -L -n 大L是列出规则,而n是解析里面的名称
iptables 主要是防火墙,ipvs主要是负载均衡
100台以下用iptables
100台以上用ipvs
service 的地址可以自己配置,建议交给系统。因为自己配的可能会冲突。
service 支持会话保持功能
toa应用可以获取源端ip
Completed 是一个完成的状态,不是错误。
域名.pem 是域名证书 ca.pem 是根证书
ingress 可以设置副本数,默认是一个。
用daemonset 部署ingress共享主机网络模式(作业)
logs 是从docker中获取日志的,pending 不可以查看,可以使用describe查看
comfigerror 可能是数据券错误,挂载的文件没有正确挂载
pod正常吗,可以看有没有重启,可以访问一下看能不能访问到
service是否关联pod,可以kubectl get ep查看一下有没有连接到正确的ip地址和端口
dns解析不了,你可以去查看corndns有没有正常运行,kube-proxy有没有正常运行,cni网络插件是否正常工作
四层就是IP+端口
七层就是Url的
java应用大部分目录都在src 里面
要去看连接的是什么数据库,前端用的什么,有没有用缓存等等,还有其他的可以问问开发
maven 是java的编译工具
clean package 清理之前的残留,记录。 -Dmaven.test.skip表示跳过一些单元测试
maven 的配置文件在 /etc/maven/settings.xml 的文件里
unzip -d 是指定目录的
镜像是什么: 打包整个操作系统的文件和目录,即包括应用以及它运行所需要的依赖
镜像文件不包括操作系统和系统内核,它共享宿主机内核。
创建好镜像可以先在docker 上面跑跑,看看行不,可以的话再上k8s
公开镜像拉取不需要登录,上传镜像不管是公开还是私有都需要登录
k8s拉取私有镜像提示要登录,在docker上面登录是没用的,需要
resources: {} 这个字段是写资源配额的
资源限制和pod存活、就绪检查一般都会配置上的
subpath 是挂载到子路径里面去的,不会覆盖掉容器原有目录的内容
没有信用卡,护照是不是要填中文名字
升级etcd的时候版本号后面加上-00
鼠标放上去会有个复制按钮
ubuntu 可以装etcdctl 这个命令,不行的话就装etcd
systemctl cat kubelet 是查看kubelet service 的
可以通过kubectl get nodes 查看集群名字
部署有可能是deployment
pod 不支持在线添加容器,只有deployment 支持
ready 有几个尝试一下vim写进去
容器之间的共享都要使用emtpdir
ingress ip和域名都可以访问,只不过访问的不是你创建的ingress那个ip,而是创建的ingresscontroller这个ip和端口。可以使用kubectl get svc -n ingress-nginx 去查看。绑定的service 的类型NodePort个ClusterIP都可以。
grep -c 表示打印行数
wget http://49.232.8.65/yaml/components.yaml
metrics-server 的中国源,
lizhenliang/metrics-server:v0.4.1
kubectl delete pods nginx-76d6c9b8c-gv472 --grace-period=0 --force 表示强制删除pod --grace-period=0 表示删除pod的延迟时间为0秒 --force表示强制,相当于kill -9
想要补全在k8s 文档里面搜索bash
docker-compose up -d 是启动所有的容器
docker-compose ps 是查看所有的容器
docker-compose stop 是关闭所有的容器
jenkins 主要实现的是一个自动发布的角色(自动构建镜像,自动发布,自动部署)
gitlab 也支持ssh 协议拉取代码
git add . 是将代码提交到仓库的暂存区
git commit -m ‘all’ 提交到本地仓库里
git push -u origin master 推送到镜像仓库
8080 是Jenkins 图形访问的端口,50000 是之间的分布式架构进行通信的,容器启动后数据会存储在/var/jenkins_home的目录,所以该目录需要pv持久化。
jenkins 可以用tomcat,java断渣,k8s部署。
lts 是Jenkins官方长久维护的镜像
pod 一直Terminating 可以重启pod 所在节点的kubelet
安装jenkins 的时候尽量选择选择插件来安装,因为选择第一个推荐的话会拖延你Jenkins 初始化的速度,可以后面用插件的时候再单独的去装。
Jenkins 都是一些插件化,模块化的页面。就是说你用一些功能就要装对应的插件。默认的都是一些基本的。提到一些安全性的问题可以忽略它。
如果Jenkins下载插件比较慢的话可以用sed 替换下Jenkins目录下面的/updates/default.json 源
Jenkins file 是pipeline 脚本
.m2 是maven 的缓存目录
alertmanager 是prometheus 的告警功能
node_exporter 是监控k8s集群node节点的状态
pushgateway 是把自定义的监控数据发送给prometheus
main 的分支不是很稳定的
kubectl get all 是查看当前命名空间下所有的资源
helm 是k8s包的管理工具,主要解决安装k8s一些依赖的问题
cluster-admin 是集群的管理角色
tsdb 是prometheus 的数据库
prometheus 监控的数据存在磁盘里面
kubectl create service externalname nginx --external-name nginx.db.svc --dry-run=client -oyaml 表示创建一个service 准备代理外部的服务