Q's blog

一些个人文档笔记

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# https://github.com/easzlab/kubeasz/blob/master/docs/setup/quickStart.md
yum update
yum install git python-pip -y
pip install pip --upgrade -i https://mirrors.aliyun.com/pypi/simple/
pip install ansible==2.6.18 netaddr==0.7.19 -i https://mirrors.aliyun.com/pypi/simple/
ssh-keygen -t rsa -b 2048 -N '' -f ~/.ssh/id_rsa

#安装docker
#略

# 下载工具脚本easzup,举例使用kubeasz版本2.2.1
export release=2.2.1
curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/easzup
chmod +x ./easzup
./easzup -D -d 19.03.5 -k v1.16.9

# 安装集群
./easzup -S
# 使用默认配置安装 aio 集群
docker exec -it kubeasz easzctl start-aio
.验证安装
如果提示kubectl: command not found,退出重新ssh登录一下,环境变量生效即可

$ kubectl version # 验证集群版本
$ kubectl get node # 验证节点就绪 (Ready) 状态
$ kubectl get pod -A # 验证集群pod状态,默认已安装网络插件、coredns、metrics-server等
$ kubectl get svc -A # 验证集群服务状态

初中级运维工程师:

负载均衡: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
2
3
4
5
#!/bin/sh
export JAVA_HOME=/usr/java/jdk # 这是你JDK安装路劲
#export JAVA_HOME=/home/jdk1.8.0_131
# heap size MUST be modified according to cluster environment
export JVMFLAGS="-Xms512m -Xmx1024m $JVMFLAGS" #这里是需要设置的内存大小

确保设置一个合理的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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 443 ssl;
server_name jenkins.flashwhale.com;
charset utf-8;
ssl_certificate /etc/nginx/cert/jenkins/1_flashwhale.com_bundle.crt;
ssl_certificate_key /etc/nginx/cert/jenkins/2_flashwhale.com.key;

location ~ /* {
proxy_pass http://jenkins;
proxy_set_header X-Rea $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name jenkins.flashwhale.com;

rewrite ^(.*)$ https://$host$1 permanent;
}
upstream jenkins {
server 127.0.0.1:8080;
keepalive 64;
}

问题

在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
2
3
4
5
6
7
8
9
10
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
name: tz-env
spec:
selector:
matchLabels:
env:
- name: TZ
values: Asia/Shanghai

这里需要注意的地方是,一定需要写 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
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
name: ls1
spec:
restartPolicy: Never
containers:
- name: hello
image: busybox
command: ["df"]
resources:
requests:
storage.kubernetes.io/overlay: 64Mi
阅读全文 »
0%