生产环境kubernetes使用持久化卷GlusterFS

在生产环境使用 Kubernetes ,绕不过去的一个问题就是持久化卷。 如果是使用阿里 ACK 托管平台的话,可以用 OSS 来持久化卷,如果是自搭的 kubernetes,那么存储就需要仔细考虑了。 ceph比较复杂,容易出故障。nfs 也不可用,毛病多多。minio倒是可以。 这种情况下使用双副本的 GlusterFS 就是不错的选择。 生产环境就不能随意了,最好不要使用 Heketi,因为凡是要持久化的东西,都是比较重要的东西,最好都有 yaml 记录。 GlusterFS 的搭建就不说了。说说实际使用过程: 一、装GFS,生产新卷 安装就不说了,我们的GFS有两个节点,172.19.20.18 和 172.19.20.36,我们强制建立一个两副本的卷: kuaijian-vol gluster volume create kuaijian-vol replica 2 transport tcp 172.19.20.18:/glusterfs/kuaijian-vol 172.19.20.36:/glusterfs/kuaijian-vol force 二、为k8s产生GFS的endingpoint和service cat << EOF >> ep-svc.yaml --- apiVersion: v1 kind: Service metadata: name: gfs-cluster_svc spec: ports: - port: 1 --- apiVersion: v1 kind: Endpoints metadata: name: gfs-cluster_svc subsets: - addresses: - ip: 172.19.20.18 ports: - port: 1 - addresses: - ip: 172.19.20.36 ports: - port: 1 EOF kubectl apply -f ep-svc.yaml 这里要提一个概念,通常情况下 service 是通过 selector 标签来选择对应的 pod 来增加 endingpoint 的。如下: ...

2021年11月10日 · 2 分钟 · 272 字 · 八戒

kubernetes生产环境使用filebeat sidecar收集日志

在生产环境中,ES 通常是不会在 k8s 集群中存在的,一般 MySQL 和 Elasticsearch 都是独立在 k8s 之外。 那么无论哪种 pod,要甩日志到 ES,最轻量的方案肯定是用 filebeat 甩过去了。 当然,如果是阿里的 ACK,logtail 和 logstore 配搭已经非常不错了,根本用不到 filebeat 和 ES。 可但是,我们不想为阿里 sls、logstore 出钱买单,就只能用 filebeat + ES 了 说一下 filebeat 的 sidecar 边车(僚机)用法: 如上图所示,简单说就是起一个 filebeat 的 logging-agent 边车(僚机),边车和主应用之间共享某个文件夹(mountPath),达到收集主应用日志并发送到 ES,而不用动 app-container 分毫。 我们以部署一个 Tomcat 应用为例来说明: 一、打造 filebeat 边车镜像 首先准备 Dockerfile FROM alpine:3.12 ARG VERSION=7.15.1 COPY docker-entrypoint.sh / RUN set -x \ && cd /tmp \ && wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-${VERSION}-linux-x86_64.tar.gz \ && tar xzvf filebeat-${VERSION}-linux-x86_64.tar.gz \ && mv filebeat-${VERSION}-linux-x86_64 /opt \ && rm /tmp/* \ && chmod +x /docker-entrypoint.sh ENV PATH $PATH:/opt/filebeat-${VERSION}-linux-x86_64 WORKDIR /opt/filebeat-${VERSION}-linux-x86_64 ENTRYPOINT ["/docker-entrypoint.sh"] 我们以 alphine:3.12 为底版,然后下载 filebeat 7.15.1的二进制包并释放到 /opt 下,最后指定入口文件 /docker-entrypoint.sh ...

2021年11月10日 · 2 分钟 · 369 字 · 八戒

haproxy一个端口跑多个服务

我们选择 haproxy 1.8 版本以上的,编译安装到路径 /export/servers/haproxy make TARGET=linux2628 PREFIX=/export/servers/haproxy USE_GETADDRINFO=1 USE_ZLIB=1 USE_REGPARM=1 USE_OPENSSL=1 \ USE_SYSTEMD=1 USE_PCRE=1 USE_PCRE_JIT=1 USE_NS=1 make install PREFIX=/export/servers/haproxy 编辑 haproxy.conf 配置文件: global maxconn 5120 chroot /export/servers/haproxy daemon quiet nbproc 2 pidfile /tmp/haproxy.pid defaults timeout connect 5s timeout client 50s timeout server 20s listen http bind :80 timeout client 1h tcp-request inspect-delay 2s acl is_http req_proto_http tcp-request content accept if is_http server server-http :8080 use_backend ssh if !is_http backend ssh mode tcp timeout server 1h server server-ssh :22 解释一下:我们在 8080 端口开了 http 服务,在 22 端口开了 ssh 服务,80端口由 haproxy 做代理转发,首先判断客户端请求是否是 http 请求,如果是就转发到 8080 端口,如果不是,就转发到 22 端口,这样就实现了 80 端口同时跑 http 和 ssh 两个服务。 ...

2021年11月10日 · 1 分钟 · 102 字 · 八戒

sslh的一个端口同时跑多个服务

Ucloud的机器在两会期间干脆端口全灭,firewall设置进来的端口全关闭!!!!!! 还好有个Global ssh的服务,可以 ssh ubuntu@111.129.37.89.ipssh.net 登录上去,注意,直接ssh ubuntu@111.129.37.89是不通的。 那我们就搭建一个SSLH服务,可以把ssh和openvpn以及ssl服务统统塞到一个端口22里 动手吧 1、修改openssh的端口 从22端口改成2222,千万别重启,22这会先得归ssh用 2、安装sslh sudo apt install sslh vi /etc/default/sslh 找到Run=no 改成Run=yes 然后到下面,按需配置(不跑443的话可以不配) DAEMON_OPTS="--user sslh --listen 0.0.0.0:22 --ssh 127.0.0.1:2222 --ssl 127.0.0.1:443 --openvpn 127.0.0.1:1194 --pidfile /var/run/sslh/sslh.pid --timeout 5" 3、配置sslh并且重启服务器 sudo systemctl enable sslh sudo reboot 就搞定了

2021年11月10日 · 1 分钟 · 43 字 · 八戒

Nginx的一个端口同时跑SSH和HTTPS服务

这个要求挺古怪的,背景是防火墙只开了 nginx 443 端口。我也想同时 ssh 登录进去,但是F5没开IP 就只能这么干了,让 Nginx 一个端口跑多个服务 在 nginx.conf 加一段,stream 配置,nginx 的 ip 是 192.168.8.110: #Multi Ports stream { upstream ssh { server 192.168.8.112:22; } upstream https { server 192.168.8.111:443; } map $ssl_preread_protocol $upstream { default ssh; "TLSv1.2" https; "TLSv1.3" https; "TLSv1.1" https; "TLSv1.0" https; } # SSH and SSL on the same port server { listen 443; proxy_pass $upstream; ssl_preread on; } } 测试一下: ...

2021年11月09日 · 1 分钟 · 75 字 · 八戒

Kubernetes创建普通账号

kubernetes 装好正常运行一段时间后,会出现要把研发和运维权限分开的场景: 比如: 给某个用户某一指定名称空间下的管理权限 给用户赋予集群的只读权限 … 非常麻烦,我们这里不讨论过多的概念,从运维的角度出发,简单实用化 我们需要明确三个RBAC最基本的概念 Role: 角色,它定义了一组规则,定义了一组对Kubernetes API对象的操作权限 RoleBinding: 定义了"被作用者"和"角色"的绑定关系 Subject: 被作用者,既可以是"人",也可以是机器,当然也可以是 Kubernetes 中定义的用户(ServiceAccount主要负责kubernetes内置用户) 我们的操作过程流程如下,首先创建客户端证书;其次创建Role角色;再创建RoleBinding,把Subject和Role绑定,就完事了;最后一步是生成 kubectl 的配置文件。 一、创建客户端证书 我们以已建好的阿里 ACK 为例,或者自建好的 Kubernetes 也行;确定已经有了 .kube/config 配置文件,拥有集群最高权限,并且可以正常执行 kubectl 命令。 首先是生成证书,并向集群提出证书请求并签发,脚本如下: #!/bin/sh useraccount=reader openssl req -new -newkey rsa:4096 -nodes -keyout $useraccount-k8s.key -out $useraccount-k8s.csr -subj "/CN=$useraccount/O=devops" csr=$(cat $useraccount-k8s.csr | base64 | tr -d '\n') cat << EOF > k8s-csr.yaml apiVersion: certificates.k8s.io/v1beta1 kind: CertificateSigningRequest metadata: name: $useraccount-k8s-access spec: groups: - system:authenticated request: $csr usages: - client auth EOF kubectl create -f k8s-csr.yaml kubectl certificate approve $useraccount-k8s-access kubectl get csr $useraccount-k8s-access -o jsonpath='{.status.certificate}' | base64 --decode > $useraccount-k8s-access.crt kubectl config view -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' --raw | base64 --decode - > k8s-ca.crt 解释一下:我们定义了一个用户CN=reader,然后向集群发送了证书请求并签发,最终从集群获得了 reader-k8s-access.crt 的客户端证书和 k8s-ca.crt 的 CA 证书。 ...

2021年11月09日 · 3 分钟 · 427 字 · 八戒

clash的搭建教程

没啊办法,翻墙翻墙还是翻墙。 上游有若干 trojian 、v2ray 、sock5 、http各种各样的代理,这样多种的选择,那么就装一个 clash 客户端就可以全接管了。 说下我们的做法:找个小Linux做旁路由,DNS和网关都设置在这台机器上,局域网内的机器都通过这台上网。 我们用到的是 clash 的 Tproxy redir-host 和 udp-proxy 模式,这种模式比较强大。用就用最强大的。 安装很简单,操作系统 centos 或者 ubuntu 都行,项目地址: https://github.com/Dreamacro/clash 说明书: https://lancellc.gitbook.io/clash/clash-config-file/proxy-groups/load-balance 首先下载二进制文件,现在版本是 v1.7.1,解压后放到 /usr/local/bin 目录下 wget https://github.com/Dreamacro/clash/releases/download/v1.7.1/clash-linux-amd64-v1.7.1.gz gzip -d clash-linux-amd64-v1.7.1.gz chmod 755 clash-linux-amd64-v1.7.1 mv clash-linux-amd64-v1.7.1 /usr/local/bin 然后生成 clash.service cat << EOF >> /etc/systemd/system/clash.service [Unit] Description=clash service After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/clash-linux-amd64-v1.7.1 Restart=on-failure # or always, on-abort, etc [Install] WantedBy=multi-user.target EOF 然后最重要的,就是配置文件了 我这里这个旁路由的设备 IP 地址是 192.168.2.2,网卡设备是 enp2s0 ...

2021年11月08日 · 3 分钟 · 474 字 · 八戒

onedev构建一个实际java spring应用

上篇简单介绍了 onedev ,这篇我们具体拿个 java spring 的项目来实际编译一下 首先必须确认环境: onedev 和 agent 都是用 root 安装运行的,然后已经安装了 docker,且 selinux 设置为 disabled,否则会出权限麻烦。 我们用的例子是 spring 的 petclinic,正常的 build 的步骤如下: git clone https://github.com/spring-projects/spring-petclinic.git cd spring-petclinic ./mvnw package 我们首先在 onedev 的 projects 新建一个项目 spring-boot 然后到 clone 下来的源代码目录下 cd spring-petclinic git init git add . git commit -m "Spring boot demo project" git remote add origin http://192.168.86.101:6610/spring-boot git push --set-upstream origin master 这样就可以在 spring-boot 里看到代码了 然后看上图,有个紫色灯泡,Enable build support by adding.onedev-buildspec.yml,点那个链接 ...

2021年11月08日 · 1 分钟 · 176 字 · 八戒

n2n一种peer to peer的VPN的使用

vpn的搭建一直是一个难解的题目,openvpn、ipsec、tinc 都在用,都不够简洁。 n2n 是一种 peer to peer 端到端的 vpn,搭建起来非常简单方便。必备利器 首先了解一下概念 n2n 的 vpn 分为两种角色,Supernode 超级节点和 Edgenode 边缘节点。 很简单,Supernode 最好是公网地址,需要开放端口供其它节点连接上来;剩余的 Edgenode 可以没有公网地址,各个 Edgenode 边缘节点之间会尝试绕过 Supernode 直接连接。这大大提高了节点之间通讯的效率。通讯是加密的,非常安全。 安装的话完全不用安装,直接一个命令就搞定了。 https://github.com/ntop/n2n 弄出两个可执行文件 supernode 和 edge 就好了 超级节点: /usr/local/bin/supernode -p 11111 -v 边缘节点: /usr/local/bin/edge -d n2n0 -c ThisisaSecret2012 -k Fuck2020 -a 192.168.0.2 -l 41.22.59.112:11111 -f 参数解释: -d 生成的虚拟网卡的命名 -c community-name 同一组vpn节点的密码。大家看到启动 supernode 的时候没有任何参数,supdernode 只负责转发,且支持多组不同的 vpn。这里就是用来区分不同的 vpn 组的。 -k 密码,节点之间通讯是用的 twofish 加密算法 -a 节点的ip -l supernode的ip和端口 -f 放到后台 daemon 执行 这样就建立好了,系统中会多出一张 n2n0 的网卡。 ...

2021年11月05日 · 1 分钟 · 77 字 · 八戒

一站式Git软件onedev的安装使用

其实一直在用 github、gitlab、jenkins,但是 github 时不时的抽风, gitlab 的 runner 套 Docker in docker 的方法委实很难用。 所以 CI/CD 这一块反倒挺喜欢阿里云效这种简便易行的。但确实找不到其他合适且类似的软件。 从 V2EX 上看到一个老哥发的 onedev,是一个一站式的开源软件,这不就试试先 以 centos7 为例,安装过程如下: 一、安装 java 1.8 版本 rpm -ivh jdk-8u201-linux-x64.rpm 二、安装 git 高版本 缺省 centos7 和 epel 带的 git 版本太低,不符合要求,得加个新的源装新版本 yum -y install https://packages.endpoint.com/rhel/7/os/x86_64/endpoint-repo-1.7-1.x86_64.rpm yum -y install git curl 三、安装配置 onedev https://github.com/theonedev/onedev 下载压缩包,然后解压运行 bin/server.sh start ,很简洁,不错! 运行完打开 http://192.168.86.101:6610 进行初始配置,就两步就 ok 了。 三、例子 我们是要在正式生产环境用的,所以在 projects 新建一个项目 spring-boot,以 spring-petclinic 为例: 然后到源代码目录下 ...

2021年11月05日 · 1 分钟 · 117 字 · 八戒