Q's blog

一些个人文档笔记

问题描述

使用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
阅读全文 »

k8s上不同服务之间可以通过service的域名来互相访问。域名的解析是一般是通过在集群中的kube-dns来完成有时候,我们希望给运行在k8s上的Pod增加一些域名的解析(例如宿主机的主机名),但操作dns模块也不太方便,那么k8s上有没有想linux主机那样可以直接在host文件设置域名解析呢,容易想到的是,将域名记录到容器镜像的/etc/hosts文件,这样容器运行时就可以正确解析了。然而这样是不行的。k8s会管理这个文件,打到镜像里的文件实际并不会起作用。举个例子。

阅读全文 »

有的时候我们可能希望从 Prometheus 中删除一些不需要的数据指标,或者只是单纯的想要释放一些磁盘空间。Prometheus 中的时间序列只能通过 HTTP API 来进行管理。

阅读全文 »

除了 Kubernetes 核心组件 apiserver、scheduler、controller-manager 之外,还有很多插件必须运行在一个普通的集群节点上。这些插件对于一个功能完备的集群来说是非常关键的,例如 Heapster、DNS 以及 Dashboard 等等。 如果一个关键的插件被移除(类似升级这样具有副作用的其它操作)、或者变成挂起状态(例如当集群利用率过高,或者由于其它原因导致节点上可用资源的总量发生变化)、集群可能会停止正常工作。

为了保证核心组件的运行优先级最大化,就需要用到 CriticalPod,即标记为关键插件,这样就可以保证关键插件的最优先调度,标记为关键插件的方法如下:

  • 1.需要在 apiserver 参数中启用 ExperimentalCriticaPodAnnotation这个 Feature Gate
  • 2.Pod 必须隶属于kube-system 这个 namespace
  • 3.必须加上 scheduler.alpha.kubernetes.io/critical-pod="" 这个 Annotation
0%