kubeasz快速部署二进制k8s集群
1 | # https://github.com/easzlab/kubeasz/blob/master/docs/setup/quickStart.md |
1 | # https://github.com/easzlab/kubeasz/blob/master/docs/setup/quickStart.md |
负载均衡:haproxy lvs nginx,调度算法和具体区别
监控服务zabbix:主被动模式和自定义监控项及模板
web服务器:nginx php tomcat apache,动静分离,location,优化配置,apache三种运行模式的区别,tomcat的java选项
数据库:mysql主从 数据备份恢复 读写分离 双主 结合业务与开发拆库拆表
iptables:源地址,目标地址转换 端口转换 访问禁止等
熟练使用jenkins
nfs等数据共享,实线基于共享存储的动静分离lnmp等web环境
内核参数调优 公有云使用 网络知识 vmware docker 熟练k8s运行各种服务 kvm openstack 熟练shell脚本 微服务,实现业务高并发,稳定性,横向扩容
gitlab+jenkins:结合或python实现代码自动化部署与回滚
elk:各种业务日志收集雨分析,展示,故障定位
熟练python 微服务 自动化 良好的故障定位及排除能力 安全技术 业务流程异步处理 分布式web集群 弹性扩容 业务自治愈 多数据中心业务管理
zookeeper启动时报错,日志提示“Java heap space”
按照网上的办法,应该是需要配置zookeeper的JVM
配置文件在那里呢?请查看文件路径:zookeeper/bin/zkEnv.sh
配置文件路径在zookeeper/conf/java.env,如果java.env该文件不存在,那么就创建该文件
1 | #!/bin/sh |
确保设置一个合理的JVM堆大小,如果设置太大,会让内存与磁盘进行交换,这将使ZK的性能大打折扣。例如一个4G内存的机器的,如果你把JVM的堆大小设置为4G或更大,那么会使频繁发生内存与磁盘空间的交换,通常设置成3G就可以了。当然,为了获得一个最好的堆大小值,在特定的使用场景下进行一些压力测试。
运行zookeeper时,使用jmap -heap ${pid} 命令查看内存情况如下
使用nginx 对Jenkins做反向代理,nginx使用https协议,Jenkins使用http访问,用https://jenkins.com 访问可以正常进入首页,在首页里点击其他功能页时,跳转会自动请求协议为http的协议。所以我们需要将跳转其他功能页时,使用的协议也修改为https。
需要在nginx配置中加入 proxy_set_header X-Forwarded-Proto $scheme; 这个请求头。
1 | server { |
在Kuberetes应用中,一般都是通过Ingress来暴露HTTP/HTTPS的服务。但是在实际应用中,还是有不少应用是TCP长连接的,这个是否也是可以通过Ingress来暴露呢?大家知道Kubernetes社区默认带了一个Nginx的Ingress的,而它本身又是支持TCP做反向代理的。所以也就能支持TCP方式的Ingress的。
具体可以参考:
https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/
Ingress Controller在启动时会去watch两个configmap(一个tcp,一个 udp),里面记录了后面需要反向代理的TCP的服务以及暴露的端口。如果里面的key-value发生变换,Ingress controller会去更改Nginx的配置,增加对应的TCP的listen的server以及对应的后端的upstream。
加速前:
1 | git clone https://github.com/prometheus-operator/kube-prometheus.git |
加速后
1 | git clone https://github.com.cnpmjs.org/prometheus-operator/kube-prometheus.git |
Pod 时区同步
往往都会遇到修改 Pod 时区的需求,更多的需求是要求所有的 Pod 都在同一个时区,比如我们所在的东8区,一般我们可以通过环境变量或者挂载主机的时区文件到 Pod 中来实现同步,但是这样需要我们对每一个 Pod 手动做这样的操作,一个更好的方式就是利用 PodPreset 来预设。首先启用 PodPreset:在 kube-apiserver 启动参数 -runtime-config 增加 settings.k8s.io/v1alpha1=true; 然后在 –admission-control 增加 PodPreset 启用。最后重启 kube-apiserver 即表示启用成功。可以通过如下命令查看是否启用成功:
1 | $ kubectl get podpresets |
然后创建一个 PodPresents 资源对象:
1 | apiVersion: settings.k8s.io/v1alpha1 |
这里需要注意的地方是,一定需要写 selector…matchLabels,但是 matchLabels 为空,表示应用于所有容器,这个就是我们想要的,创建上面这个资源对象,然后我们去创建一个普通的 Pod 可以查看下是否注入了上面的 TZ 这个环境变量。需要注意的是,PodPreset 是 namespace 级别的对象,其作用范围只能是同一个命名空间下的容器。
Dockerfile 中添加交互式命令
一个有趣的问题,需要在 Dockerfile 里面添加交互式的命令,类似于我们平时安装软件的时候输入 yes,我们可以通过 yum install -y 来默认安装,避免用户输入,但是有的时候没办法避免的时候,一定需要输入交互命令的时候应该咋办呢?能想到的一个比较好的办法是暂时在 Dockerfile 中不添加这条交互式命令,先制作一个镜像,然后使用这个镜像运行一个容器,然后到容器中去运行这个交互式命令,然后配置完后 commit 下这个容器成一个新的镜像即可。
如果pod长期不重启,容器输出到 emptydir 的日志文件,有什么好的清理办法呢?
v1.7 + 支持对基于本地存储(如 hostPath, emptyDir, gitRepo 等)的容量进行调度限额。为了支持这个特性,Kubernetes 将本地存储分为两类:
storage.kubernetes.io/overlay,即 /var/lib/docker 的大小storage.kubernetes.io/scratch,即 /var/lib/kubelet 的大小 Kubernetes 根据 storage.kubernetes.io/scratch 的大小来调度本地存储空间,而根据 storage.kubernetes.io/overlay 来调度容器的存储。比如为容器请求 64MB 的可写层存储空间:
1 | apiVersion: v1 |