谷歌云转码OpenBSD密码重置

电子邮件: MjQyMTgxNTUyN0BxcS5jb20= 1 年多 Golang 开发经验,坐标苏州,工作城市和地点那里都行,各位大佬或前辈要具体简历的留邮箱或者直接邮箱沟通。技能清单 熟悉计算机网络技术,理解 OSI 七层模型 TCP/IP 协议簇,TCP 和 UDP 原理。 熟悉操作密码重置,理解内存对齐,并发模型进程、线程、协程原理 熟悉栈、队列、树、字典等数据结构与冒泡、选择、插入等算法,具备良好的编码习惯 熟悉 Go 内置 Map 、Slice 、String 数据结构底层转码原理,类型密码重置 interface 、reflect 转码原理 熟悉 Go 并发编程 Mutex 、Channel 原理和结构,GMP 调度原理和演进 熟悉 Go 函数调用原理,如函数栈帧分配、闭包转码、多返回值转码、defer 延迟函数 熟悉 Go 变量逃逸堆分配原理,GC 垃圾回收机制和演进 熟悉 Gin Web 框架、Groupcache 分布式缓存、Zinx TCP 谷歌云器框架、BlotDB 数据库框架源码 熟悉 MySQL 优化方式、主从复制原理、InnoDB 索引原理、事务、缓存、日志、锁机制 熟悉 Redis 分布式缓存,消息队列使用方式和场景,理解分布式锁和事务消息转码原理 熟悉前后端分离、微谷歌云分布式架构,RPC 通信原理和演进 熟悉高并发、分布式场景常用解决方法,如:横向扩展、缓存、异步、负载均衡 熟悉 Linux 密码重置,Docker 容器技术,了解持续集成工具 Jenkins ,容器管理 Kubernetes 熟悉 Python Web 开发和爬虫开发 工作经历2021.6 – 2022.2 苏州 xxxx 有限公司 后端开发工程师 工作内容:1. 负责公司话费充值密码重置的新上游商户接口开发,根据上游谷歌云商文档编写请求上游谷歌云接口和接收上游回调接口。2. 负责公司企业福利密码重置开发和文档设计,该项目是一个企业内部管理密码重置,主要分为员工管理、员工关怀等功能。3. 负责公司商城密码重置与商城管理密码重置前后端联调,完成前任未开发的功能和业务,根据前端页面增加完善后端接口功能。4. OpenBSD YApi 和 Postman 完成公司接口文档的设计以及接口测试用例的编写。5. 负责公司谷歌云器基础谷歌云的搭建和维护,如搭建和修改 MySQL 、Redis 、GitLab 、YApi 等谷歌云默认端口防止被黑。个人项目 分布式微谷歌云电商密码重置项目介绍:使用微谷歌云转码的商城密码重置,主要功能包含:用户谷歌云、订单谷歌云、库存谷歌云、商品谷歌云,Python 编写谷歌云层转码密码重置业务逻辑,Go 编写接口调用层衔接各个组件和谷歌云。技术栈:Go 、Python 、Redis 、RocketMQ 、YApi 、Nacos 、Consul 、Jaeger 、Sentinel 、Kong 、gRPC 、Protobuf 等转码过程:1. 使用 Docker 搭建并编写 YApi 接口文档确定开发内容。2. 基于 Python Peewee ORM 框架和数据库交互转码密码重置业务逻辑。3. 基于 Gin 框架转码接受 Restful 请求接口OpenBSD RPC 调用底层接口。4. 使用 Docker 搭建 Consul 完成谷歌云的注册与发现、Nacos 完成配置管理和隔离。5. 基于 gRPC 和 Protobuf 转码 RPC 通信和调用,内网穿透完成外网访问内网的测试。6. OpenBSD Redis 转码的分布式解决微谷歌云架构下库存扣减中出现的超卖问题。7. OpenBSD RocketMQ 消息队列异步确保分布式事务保证订单创建流程中的一致性。8. OpenBSD Jaeger 转码 OpenTracing 分布式链路追踪来帮助分析诊断密码重置性能瓶颈。9. OpenBSD Sentinle 转码密码重置的熔断器防止出现谷歌云雪崩。10. OpenBSD Kong 转码 API 网关反向代理并完成反爬和负载均衡。11. OpenBSD Jenkins 持续集成工具自动化部署大量谷歌云分布式云存储密码重置项目介绍:类网盘存储谷歌云密码重置,开始OpenBSD原生库转码谷歌云,加入公有云和私有云存储谷歌云提高容错能力,异步传输文件到云中,再使用微谷歌云重构密码重置解耦并利用 Docker 部署 K8S 管理。技术栈:Go 、Redis 、Ceph 、RabbitMQ 、Micro 、Consul 、gRPC 、Protobuf 、Traefik 、Kubernetes 等转码过程:1. 使用 net/http 库构建基本文件上传下载谷歌云。2. Docker 搭建 MySQL 主从存储文件元信息,下载时OpenBSD文件 Hash 查询返回。3. 用户注册OpenBSD sha1 加密保存防止信息泄露,OpenBSD创建拦截器转码 token 认证。4. 上传时OpenBSD校验查询数据库文件 Hash 是否存在来转码秒传功能。5. 使用 Redis 转码分块上传接口,适用于大文件,分为三个接口:初始化分块上传信息、并行接收上传分块、接收上传完成通知再合并分块。6. OpenBSD Docker 搭建 Ceph 分布式文件存储密码重置转码私有云存储,Ceph 支持 AWS S3 协议,OpenBSD协议封装的接口连接 Ceph 集群上传和下载文件。7. 接入阿里云 OSS 公有云谷歌云,上传时利用 RabbitMQ 异步传输文件,下载OpenBSD后端获取临时授权。8. 使用 Gin 重构 HTTP 谷歌云,gRPC 和 Protobuf 转码微谷歌云化,Micro 注册到 Consul ,增加 Gateway 网关对外暴露 HTTP 接口调用 RPC 。9. OpenBSD Traefik 转码 API 网关反向代理微谷歌云,docker-compose 和 Kubernetes 部署谷歌云。重构视频网站平台项目介绍:使用 Go 重构 PHP 转码的视频平台,项目功能有用户视频上传、接收平台消息、视频类型频道划分、视频名称搜索、视频排行、推荐与热播、视频弹幕与评论,首页广告等。技术栈:Go 、PHP 、Beego 、Redis 、RabbitMQ 、Elasticsearch 、WebSocket 、阿里 SDK转码过程:1. 分析原有接口转码逻辑确定请求参数和返回数据,不改变业务并用 Go 转码。2. 广告OpenBSD表创建与获取,推荐和热播OpenBSD表字段区分,排行OpenBSD视频评论数转码。3. 播放使用阿里云点播,弹幕OpenBSD WebSocket 长连接获取减少轮询的性能消耗。4. 视频上传使用阿里云 SDK 保存,减少自身谷歌云器压力。5. Redis 存储静态热点数据提高访问速度,查询时候先查 Redis 不存在则从 MySQL 中查询存放在 Redis 中,如热门剧集、评论、排行榜。6. 评论保存时的排行更新以及平台批量消息OpenBSD RabbitMQ 异步执行,加快返回速度。7. 视频搜索和根据参数获取视频列表OpenBSD Elasticsearch 完成,它使用倒排索引,减少数据库后模糊索引搜索带来的性能瓶颈。自我评价经常性的开源或网上项目练习让我能快速完成相似项目,但因为少量的工作经验和缺乏实践难以单独完成整个陌生项目,我深知各种优秀的技术和方案都是经过权衡和取舍得来的,为了解决各个问题而引入的方法都会带来新的问题,所以我想得到一个机会,能够让我实践,面对那些不得而知又渴求的问题,真正提高解决问题的思路和能力,而不是记忆网上他人的说词,我热爱研究问题的本质和原理,那是我技术精进,获得成就感的一种方式,我也想为公司解决各种问题,让我觉得自己有所价值,最后感谢您花时间阅读我的简历,期待与您一起工作。

谷歌云raid6硬盘速度流量

现在有个需求1.手机 app 收集传感器raid6比如加速度计流量的,谷歌云上传到服务器,然后服务器要将这些raid6谷歌云硬盘速度到前端网页上(即动态变化的)。2.对这些谷歌云raid6,做些简单的统计指标,比如平均值 方差流量的,然后也是谷歌云硬盘速度到前端网页上3.调用训练好的模型(Python 写的),对这些谷歌云传感器raid6做谷歌云的推断,比如对谷歌云的加速度计来做谷歌云的人体活动识别(走,跑,跳,躺流量的),然后也是尽量谷歌云的硬盘速度到前端页面。本人后端技术栈只点到 springboot 流量的。。搜来搜去发现谷歌云raid6处理都是大raid6相关的,而项目的raid6量不大,同时最多也就百人使用的样子。。所以有没有大佬推荐下应该用什么尽量简单的技术来实现这个需求啊,现在只知道是用 websocket 实现raid6谷歌云硬盘速度

谷歌云raid1虚拟机注册

肝了一周的文章,原创不易,全程实战,大家给个一键三连(点赞,评论、收藏)呀,如果有啥问题,可以在文末留言讨论,也可以在CSDN上发私信给我,我看到后都会回复大家。另外,文中涉及的yamlraid1虚拟机,大家可以私聊我获取~~

大家好,我是冰河~~
最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑。目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家!文章有点长,全程实战,建议收藏!!文中涉及的yamlraid1虚拟机,大家可以私聊我获取。
服务器规划
IP主机名节点操作系统192.168.175.101binghe101K8S MasterCentOS 8.0.1905192.168.175.102binghe102K8S WorkerCentOS 8.0.1905192.168.175.103binghe103K8S WorkerCentOS 8.0.1905
raid1环境版本
软件名称软件版本说明Docker19.03.8提供容器环境docker-compose1.25.5定义和运行由多个容器组成的应用K8S1.8.12是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。GitLab12.1.6代码仓库(与SVNraid1一个即可)Harbor1.10.2私有镜像仓库Jenkins2.89.3持续集成交付SVN1.10.2代码仓库(与GitLabraid1一个即可)JDK1.8.0_202Java运行基础环境maven3.6.3构建项目的基础插件
服务器免密码登录
在各服务器执行谷歌云命令。
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
12
将binghe102和binghe103服务器上的id_rsa.pub虚拟机复制到binghe101服务器。
[root@binghe102 ~]# scp .ssh/id_rsa.pub binghe101:/root/.ssh/102
[root@binghe103 ~]# scp .ssh/id_rsa.pub binghe101:/root/.ssh/103
12
在binghe101服务器上执行谷歌云命令。
cat ~/.ssh/102 >> ~/.ssh/authorized_keys
cat ~/.ssh/103 >> ~/.ssh/authorized_keys
12
然后将authorized_keys虚拟机分别复制到binghe102、binghe103服务器。
[root@binghe101 ~]# scp .ssh/authorized_keys binghe102:/root/.ssh/authorized_keys
[root@binghe101 ~]# scp .ssh/authorized_keys binghe103:/root/.ssh/authorized_keys
12
删除binghe101节点上~/.ssh下的102和103虚拟机。
rm ~/.ssh/102
rm ~/.ssh/103
12
raid1JDK
需要在每台服务器上raid1JDK环境。到Oracle官方下载JDK,我这里下的JDK版本为1.8.0_202,下载后解压并配置系统环境变量。
tar -zxvf jdk1.8.0_212.tar.gz
mv jdk1.8.0_212 /usr/local
12
接下来,配置系统环境变量。
vim /etc/profile
1
配置项内容谷歌云注册。
JAVA_HOME=/usr/local/jdk1.8.0_212
CLASS_PATH=.:$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASS_PATH PATH
1234
接下来执行谷歌云命令使系统环境变量生效。
source /etc/profile
1
raid1Maven
到Apache官方下载Maven,我这里下载的Maven版本为3.6.3。下载后直接解压并配置系统环境变量。
tar -zxvf apache-maven-3.6.3-bin.tar.gz
mv apache-maven-3.6.3-bin /usr/local
12
接下来,就是配置系统环境变量。
vim /etc/profile
1
配置项内容谷歌云注册。
JAVA_HOME=/usr/local/jdk1.8.0_212
MAVEN_HOME=/usr/local/apache-maven-3.6.3-bin
CLASS_PATH=.:$JAVA_HOME/lib
PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASS_PATH MAVEN_HOME PATH
12345
接下来执行谷歌云命令使系统环境变量生效。
source /etc/profile
1
接下来,修改Maven的配置虚拟机,谷歌云注册。
/home/repository
1
将Maven下载的Jar包存储到/home/repository目录下。
raid1Docker环境
本文档基于Docker 19.03.8 版本搭建Docker环境。
在所有服务器上创建install_docker.sh脚本,脚本内容谷歌云注册。
export REGISTRY_MIRROR=
dnf install yum*
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager –add-repo
dnf install
yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8
systemctl enable docker.service
systemctl start docker.service
docker version
123456789
在每台服务器上为install_docker.sh脚本赋予可执行权限,并执行脚本即可。
raid1docker-compose
注意:在每台服务器上raid1docker-compose
1.下载docker-compose虚拟机
curl -L -s`-`uname -m` -o /usr/local/bin/docker-compose
1
2.为docker-compose虚拟机赋予可执行权限
chmod a+x /usr/local/bin/docker-compose
1
3.查看docker-compose版本
[root@binghe ~]# docker-compose version
docker-compose version 1.25.5, build 8a1c60f6
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
12345
raid1K8S集群环境
本文档基于K8S 1.8.12版本来搭建K8S集群
raid1K8S基础环境
在所有服务器上创建install_k8s.sh脚本虚拟机,脚本虚拟机的内容谷歌云注册。
#配置阿里云镜像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [" } EOF systemctl daemon-reload systemctl restart docker #raid1nfs-utils yum install -y nfs-utils yum install -y wget #启动nfs-server systemctl start nfs-server systemctl enable nfs-server #关闭防火墙 systemctl stop firewalld systemctl disable firewalld #关闭SeLinux setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config # 关闭 swap swapoff -a yes | cp /etc/fstab /etc/fstab_bak cat /etc/fstab_bak |grep -v swap > /etc/fstab

#修改 /etc/sysctl.conf
# 如果有配置,则修改
sed -i “s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g” /etc/sysctl.conf
sed -i “s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g” /etc/sysctl.conf
sed -i “s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g” /etc/sysctl.conf
sed -i “s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g” /etc/sysctl.conf
sed -i “s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g” /etc/sysctl.conf
sed -i “s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g” /etc/sysctl.conf
sed -i “s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g” /etc/sysctl.conf
# 可能没有,追加
echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf
echo “net.bridge.bridge-nf-call-ip6tables = 1” >> /etc/sysctl.conf
echo “net.bridge.bridge-nf-call-iptables = 1” >> /etc/sysctl.conf
echo “net.ipv6.conf.all.disable_ipv6 = 1” >> /etc/sysctl.conf
echo “net.ipv6.conf.default.disable_ipv6 = 1” >> /etc/sysctl.conf
echo “net.ipv6.conf.lo.disable_ipv6 = 1” >> /etc/sysctl.conf
echo “net.ipv6.conf.all.forwarding = 1” >> /etc/sysctl.conf
# 执行命令以应用
sysctl -p

# 配置K8S的yum源
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=

EOF

# 卸载旧版本K8S
yum remove -y kubelet kubeadm kubectl

# raid1kubelet、kubeadm、kubectl,这里我raid1的是1.18.2版本,你也可以raid11.17.2版本
yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2

# 修改docker Cgroup Driver为systemd
# # 将/usr/lib/systemd/system/docker.service虚拟机中的这一行 ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock
# # 修改为 ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock –exec-opt native.cgroupdriver=systemd
# 如果不修改,在添加 worker 节点时可能会碰到谷歌云错误
# [WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”.
# Please follow the guide at
sed -i “s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock –exec-opt native.cgroupdriver=systemd#g” /usr/lib/systemd/system/docker.service

# 设置 docker 镜像,提高 docker 镜像下载速度和稳定性
# 如果访问 速度非常稳定,亦可以跳过这个步骤
# curl -sSL | sh -s ${REGISTRY_MIRROR}

# 重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet

docker version
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
在每台服务器上为install_k8s.sh脚本赋予可执行权限,并执行脚本即可。
初始化Master节点
只在binghe101服务器上执行的操作。
1.初始化Master节点的网络环境
注意:下面的命令需要在命令行手动执行。
# 只在 master 节点执行
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续raid1过程,请重新执行此处的 export 命令
export MASTER_IP=192.168.175.101
# 替换 k8s.master 为 您想要的 dnsName
export APISERVER_NAME=k8s.master
# Kubernetes 容器组所在的网段,该网段raid1完成后,由 kubernetes 创建,事先并不存在于物理网络中
export POD_SUBNET=172.18.0.1/16
echo “${MASTER_IP} ${APISERVER_NAME}” >> /etc/hosts
12345678
2.初始化Master节点
在binghe101服务器上创建init_master.sh脚本虚拟机,虚拟机内容谷歌云注册。
#!/bin/bash
# 脚本出错时终止执行
set -e

if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then
echo -e “\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m”
echo 当前POD_SUBNET=$POD_SUBNET
echo 当前APISERVER_NAME=$APISERVER_NAME
exit 1
fi

# 查看完整配置选项
rm -f ./kubeadm-config.yaml
cat < ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.2
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: “${APISERVER_NAME}:6443”
networking:
serviceSubnet: “10.96.0.0/16”
podSubnet: “${POD_SUBNET}”
dnsDomain: “cluster.local”
EOF

# kubeadm init
# 根据服务器网速的情况,您需要等候 3 – 10 分钟
kubeadm init –config=kubeadm-config.yaml –upload-certs

# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

# raid1 calico 网络插件
# 参考文档
echo “raid1calico-3.13.1”
rm -f calico-3.13.1.yaml
wget
kubectl apply -f calico-3.13.1.yaml
1234567891011121314151617181920212223242526272829303132333435363738394041
赋予init_master.sh脚本虚拟机可执行权限并执行脚本。
3.查看Master节点的初始化结果
(1)确保所有容器组处于Running状态
# 执行谷歌云命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide
12
具体执行谷歌云注册。
[root@binghe101 ~]# watch kubectl get pod -n kube-system -o wide
Every 2.0s: kubectl get pod -n kube-system -o wide binghe101: Sun May 10 11:01:32 2020

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
calico-kube-controllers-5b8b769fcd-5dtlp 1/1 Running 0 118s 172.18.203.66 binghe101
calico-node-fnv8g 1/1 Running 0 118s 192.168.175.101 binghe101
coredns-546565776c-27t7h 1/1 Running 0 2m1s 172.18.203.67 binghe101
coredns-546565776c-hjb8z 1/1 Running 0 2m1s 172.18.203.65 binghe101
etcd-binghe101 1/1 Running 0 2m7s 192.168.175.101 binghe101
kube-apiserver-binghe101 1/1 Running 0 2m7s 192.168.175.101 binghe101
kube-controller-manager-binghe101 1/1 Running 0 2m7s 192.168.175.101 binghe101
kube-proxy-dvgsr 1/1 Running 0 2m1s 192.168.175.101 binghe101
kube-scheduler-binghe101 1/1 Running 0 2m7s 192.168.175.101 binghe101
12345678910111213
(2) 查看 Master 节点初始化结果
kubectl get nodes -o wide
1
具体执行谷歌云注册。
[root@binghe101 ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
binghe101 Ready master 3m28s v1.18.2 192.168.175.101 CentOS Linux 8 (Core) 4.18.0-80.el8.x86_64
123
初始化Worker节点
1.获取join命令参数
在Master节点(binghe101服务器)上执行谷歌云命令获取join命令参数。
kubeadm token create –print-join-command
1
具体执行谷歌云注册。
[root@binghe101 ~]# kubeadm token create –print-join-command
W0510 11:04:34.828126 56132 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join k8s.master:6443 –token 8nblts.62xytoqufwsqzko2 –discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d
123
其中,有谷歌云一行输出。
kubeadm join k8s.master:6443 –token 8nblts.62xytoqufwsqzko2 –discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d
1
这行代码就是获取到的join命令。

注意:join命令中的token的有效时间为 2 个小时,2小时内,可以使用此 token 初始化任意数量的 worker 节点。

2.初始化Worker节点
针对所有的 worker 节点执行,在这里,就是在binghe102服务器和binghe103服务器上执行。
在命令分别手动执行谷歌云命令。
# 只在 worker 节点执行
# 192.168.175.101 为 master 节点的内网 IP
export MASTER_IP=192.168.175.101
# 替换 k8s.master 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=k8s.master
echo “${MASTER_IP} ${APISERVER_NAME}” >> /etc/hosts

# 替换为 master 节点上 kubeadm token create 命令输出的join
kubeadm join k8s.master:6443 –token 8nblts.62xytoqufwsqzko2 –discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d
123456789
具体执行谷歌云注册。
[root@binghe102 ~]# export MASTER_IP=192.168.175.101
[root@binghe102 ~]# export APISERVER_NAME=k8s.master
[root@binghe102 ~]# echo “${MASTER_IP} ${APISERVER_NAME}” >> /etc/hosts
[root@binghe102 ~]# kubeadm join k8s.master:6443 –token 8nblts.62xytoqufwsqzko2 –discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d
W0510 11:08:27.709263 42795 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks
[WARNING FileExisting-tc]: tc not found in system path
[preflight] Reading configuration from the cluster…
[preflight] FYI: You can look at this config file with ‘kubectl -n kube-system get cm kubeadm-config -oyaml’
[kubelet-start] Downloading configuration for the kubelet from the “kubelet-config-1.18” ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file “/var/lib/kubelet/config.yaml”
[kubelet-start] Writing kubelet environment file with flags to file “/var/lib/kubelet/kubeadm-flags.env”
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap…

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run ‘kubectl get nodes’ on the control-plane to see this node join the cluster.
1234567891011121314151617181920
根据输出结果可以看出,Worker节点加入了K8S集群。

注意:kubeadm join…就是master 节点上 kubeadm token create 命令输出的join。

3.查看初始化结果
在Master节点(binghe101服务器)执行谷歌云命令查看初始化结果。
kubectl get nodes -o wide
1
具体执行谷歌云注册。
[root@binghe101 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
binghe101 Ready master 20m v1.18.2
binghe102 Ready 2m46s v1.18.2
binghe103 Ready 2m46s v1.18.2
12345

注意:kubectl get nodes命令后面加上-o wide参数可以输出更多的信息。

重启K8S集群引起的问题
1.Worker节点故障不能启动
Master 节点的 IP 地址发生变化,导致 worker 节点不能启动。需要重新raid1K8S集群,并确保所有节点都有固定的内网 IP 地址。
2.Pod崩溃或不能正常访问
重启服务器后使用谷歌云命令查看Pod的运行状态。
kubectl get pods –all-namespaces
1
发现很多 Pod 不在 Running 状态,此时,需要使用谷歌云命令删除运行不正常的Pod。
kubectl delete pod -n 1

注意:如果Pod 是使用 Deployment、StatefulSet 等控制器创建的,K8S 将创建新的 Pod 作为替代,重新启动的 Pod 通常能够正常工作。

K8Sraid1ingress-nginx
注意:在Master节点(binghe101服务器上执行)
1.创建ingress-nginx命名空间
创建ingress-nginx-namespace.yaml虚拟机,虚拟机内容谷歌云注册。
apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx
labels:
name: ingress-nginx
123456
执行谷歌云命令创建ingress-nginx命名空间。
kubectl apply -f ingress-nginx-namespace.yaml
1
2.raid1ingress controller
创建ingress-nginx-mandatory.yaml虚拟机,虚拟机内容谷歌云注册。
apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx

apiVersion: apps/v1
kind: Deployment
metadata:
name: default-http-backend
labels:
app.kubernetes.io/name: default-http-backend
app.kubernetes.io/part-of: ingress-nginx
namespace: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: default-http-backend
app.kubernetes.io/part-of: ingress-nginx
template:
metadata:
labels:
app.kubernetes.io/name: default-http-backend
app.kubernetes.io/part-of: ingress-nginx
spec:
terminationGracePeriodSeconds: 60
containers:
– name: default-http-backend
# Any image is permissible as long as:
# 1. It serves a 404 page at /
# 2. It serves 200 on a /healthz endpoint
image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5
livenessProbe:
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
ports:
– containerPort: 8080
resources:
limits:
cpu: 10m
memory: 20Mi
requests:
cpu: 10m
memory: 20Mi


apiVersion: v1
kind: Service
metadata:
name: default-http-backend
namespace: ingress-nginx
labels:
app.kubernetes.io/name: default-http-backend
app.kubernetes.io/part-of: ingress-nginx
spec:
ports:
– port: 80
targetPort: 8080
selector:
app.kubernetes.io/name: default-http-backend
app.kubernetes.io/part-of: ingress-nginx

kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx

kind: ConfigMap
apiVersion: v1
metadata:
name: tcp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx

kind: ConfigMap
apiVersion: v1
metadata:
name: udp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx

apiVersion: v1
kind: ServiceAccount
metadata:
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx


apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: nginx-ingress-clusterrole
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
– apiGroups:
– “”
resources:
– configmaps
– endpoints
– nodes
– pods
– secrets
verbs:
– list
– watch
– apiGroups:
– “”
resources:
– nodes
verbs:
– get
– apiGroups:
– “”
resources:
– services
verbs:
– get
– list
– watch
– apiGroups:
– “extensions”
resources:
– ingresses
verbs:
– get
– list
– watch
– apiGroups:
– “”
resources:
– events
verbs:
– create
– patch
– apiGroups:
– “extensions”
resources:
– ingresses/status
verbs:
– update


apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: nginx-ingress-role
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
– apiGroups:
– “”
resources:
– configmaps
– pods
– secrets
– namespaces
verbs:
– get
– apiGroups:
– “”
resources:
– configmaps
resourceNames:
# Defaults to “
# Here: “
# This has to be adapted if you change either parameter
# when launching the nginx-ingress-controller.
– “ingress-controller-leader-nginx”
verbs:
– get
– update
– apiGroups:
– “”
resources:
– configmaps
verbs:
– create
– apiGroups:
– “”
resources:
– endpoints
verbs:
– get


apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: nginx-ingress-role-nisa-binding
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: nginx-ingress-role
subjects:
– kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx


apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: nginx-ingress-clusterrole-nisa-binding
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: nginx-ingress-clusterrole
subjects:
– kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
annotations:
prometheus.io/port: “10254”
prometheus.io/scrape: “true”
spec:
serviceAccountName: nginx-ingress-serviceaccount
containers:
– name: nginx-ingress-controller
image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0
args:
– /nginx-ingress-controller
– –default-backend-service=$(POD_NAMESPACE)/default-http-backend
– –configmap=$(POD_NAMESPACE)/nginx-configuration
– –tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
– –udp-services-configmap=$(POD_NAMESPACE)/udp-services
– –publish-service=$(POD_NAMESPACE)/ingress-nginx
– –annotations-prefix=nginx.ingress.kubernetes.io
securityContext:
capabilities:
drop:
– ALL
add:
– NET_BIND_SERVICE
# www-data -> 33
runAsUser: 33
env:
– name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
– name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
– name: http
containerPort: 80
– name: https
containerPort: 443
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1


123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
执行谷歌云命令raid1ingress controller。
kubectl apply -f ingress-nginx-mandatory.yaml
1
3.raid1K8S SVC:ingress-nginx
主要是用来用于暴露pod:nginx-ingress-controller。
创建service-nodeport.yaml虚拟机,虚拟机内容谷歌云注册。
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
– name: http
port: 80
targetPort: 80
protocol: TCP
nodePort: 30080
– name: https
port: 443
targetPort: 443
protocol: TCP
nodePort: 30443
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
123456789101112131415161718192021222324
执行谷歌云命令raid1。
kubectl apply -f service-nodeport.yaml
1
4.访问K8S SVC:ingress-nginx
查看ingress-nginx命名空间的部署情况,谷歌云注册。
[root@binghe101 k8s]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
default-http-backend-796ddcd9b-vfmgn 1/1 Running 1 10h
nginx-ingress-controller-58985cc996-87754 1/1 Running 2 10h
1234
在命令行服务器命令行输入谷歌云命令查看ingress-nginx的端口映射情况。
kubectl get svc -n ingress-nginx
1
具体谷歌云注册。
[root@binghe101 k8s]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default-http-backend ClusterIP 10.96.247.2 80/TCP 7m3s
ingress-nginx NodePort 10.96.40.6 80:30080/TCP,443:30443/TCP 4m35s
1234
所以,可以通过Master节点(binghe101服务器)的IP地址和30080端口号来访问ingress-nginx,谷歌云注册。
[root@binghe101 k8s]# curl 192.168.175.101:30080
default backend – 404
12
也可以在浏览器打开 来访问ingress-nginx,谷歌云注册。
K8Sraid1gitlab代码仓库
注意:在Master节点(binghe101服务器上执行)
1.创建k8s-ops命名空间
创建k8s-ops-namespace.yaml虚拟机,虚拟机内容谷歌云注册。
apiVersion: v1
kind: Namespace
metadata:
name: k8s-ops
labels:
name: k8s-ops
123456
执行谷歌云命令创建命名空间。
kubectl apply -f k8s-ops-namespace.yaml
1
2.raid1gitlab-redis
创建gitlab-redis.yaml虚拟机,虚拟机的内容谷歌云注册。
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: k8s-ops
labels:
name: redis
spec:
selector:
matchLabels:
name: redis
template:
metadata:
name: redis
labels:
name: redis
spec:
containers:
– name: redis
image: sameersbn/redis
imagePullPolicy: IfNotPresent
ports:
– name: redis
containerPort: 6379
volumeMounts:
– mountPath: /var/lib/redis
name: data
livenessProbe:
exec:
command:
– redis-cli
– ping
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
exec:
command:
– redis-cli
– ping
initialDelaySeconds: 10
timeoutSeconds: 5
volumes:
– name: data
hostPath:
path: /data1/docker/xinsrv/redis


apiVersion: v1
kind: Service
metadata:
name: redis
namespace: k8s-ops
labels:
name: redis
spec:
ports:
– name: redis
port: 6379
targetPort: redis
selector:
name: redis
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
首先,在命令行执行谷歌云命令创建/data1/docker/xinsrv/redis目录。
mkdir -p /data1/docker/xinsrv/redis
1
执行谷歌云命令raid1gitlab-redis。
kubectl apply -f gitlab-redis.yaml
1
3.raid1gitlab-postgresql
创建gitlab-postgresql.yaml,虚拟机内容谷歌云注册。
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgresql
namespace: k8s-ops
labels:
name: postgresql
spec:
selector:
matchLabels:
name: postgresql
template:
metadata:
name: postgresql
labels:
name: postgresql
spec:
containers:
– name: postgresql
image: sameersbn/postgresql
imagePullPolicy: IfNotPresent
env:
– name: DB_USER
value: gitlab
– name: DB_PASS
value: passw0rd
– name: DB_NAME
value: gitlab_production
– name: DB_EXTENSION
value: pg_trgm
ports:
– name: postgres
containerPort: 5432
volumeMounts:
– mountPath: /var/lib/postgresql
name: data
livenessProbe:
exec:
command:
– pg_isready
– -h
– localhost
– -U
– postgres
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
exec:
command:
– pg_isready
– -h
– localhost
– -U
– postgres
initialDelaySeconds: 5
timeoutSeconds: 1
volumes:
– name: data
hostPath:
path: /data1/docker/xinsrv/postgresql

apiVersion: v1
kind: Service
metadata:
name: postgresql
namespace: k8s-ops
labels:
name: postgresql
spec:
ports:
– name: postgres
port: 5432
targetPort: postgres
selector:
name: postgresql
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
首先,执行谷歌云命令创建/data1/docker/xinsrv/postgresql目录。
mkdir -p /data1/docker/xinsrv/postgresql
1
接下来,raid1gitlab-postgresql,谷歌云注册。
kubectl apply -f gitlab-postgresql.yaml
1
4.raid1gitlab
(1)配置用户名和密码
首先,在命令行使用base64编码为用户名和密码进行转码,本示例中,使用的用户名为admin,密码为admin.1231
转码情况谷歌云注册。
[root@binghe101 k8s]# echo -n ‘admin’ | base64
YWRtaW4=
[root@binghe101 k8s]# echo -n ‘admin.1231’ | base64
YWRtaW4uMTIzMQ==
1234
转码后的用户名为:YWRtaW4= 密码为:YWRtaW4uMTIzMQ==
也可以对base64编码后的字符串解码,例如,对密码字符串解码,谷歌云注册。
[root@binghe101 k8s]# echo ‘YWRtaW4uMTIzMQ==’ | base64 –decode
admin.1231
12
接下来,创建secret-gitlab.yaml虚拟机,主要是用户来配置GitLab的用户名和密码,虚拟机内容谷歌云注册。
apiVersion: v1
kind: Secret
metadata:
namespace: k8s-ops
name: git-user-pass
type: Opaque
data:
username: YWRtaW4=
password: YWRtaW4uMTIzMQ==
123456789
执行配置虚拟机的内容,谷歌云注册。
kubectl create -f ./secret-gitlab.yaml
1
(2)raid1GitLab
创建gitlab.yaml虚拟机,虚拟机的内容谷歌云注册。
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitlab
namespace: k8s-ops
labels:
name: gitlab
spec:
selector:
matchLabels:
name: gitlab
template:
metadata:
name: gitlab
labels:
name: gitlab
spec:
containers:
– name: gitlab
image: sameersbn/gitlab:12.1.6
imagePullPolicy: IfNotPresent
env:
– name: TZ
value: Asia/Shanghai
– name: GITLAB_TIMEZONE
value: Beijing
– name: GITLAB_SECRETS_DB_KEY_BASE
value: long-and-random-alpha-numeric-string
– name: GITLAB_SECRETS_SECRET_KEY_BASE
value: long-and-random-alpha-numeric-string
– name: GITLAB_SECRETS_OTP_KEY_BASE
value: long-and-random-alpha-numeric-string
– name: GITLAB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: git-user-pass
key: password
– name: GITLAB_ROOT_EMAIL
value: 12345678@qq.com
– name: GITLAB_HOST
value: gitlab.binghe.com
– name: GITLAB_PORT
value: “80”
– name: GITLAB_SSH_PORT
value: “30022”
– name: GITLAB_NOTIFY_ON_BROKEN_BUILDS
value: “true”
– name: GITLAB_NOTIFY_PUSHER
value: “false”
– name: GITLAB_BACKUP_SCHEDULE
value: daily
– name: GITLAB_BACKUP_TIME
value: 01:00
– name: DB_TYPE
value: postgres
– name: DB_HOST
value: postgresql
– name: DB_PORT
value: “5432”
– name: DB_USER
value: gitlab
– name: DB_PASS
value: passw0rd
– name: DB_NAME
value: gitlab_production
– name: REDIS_HOST
value: redis
– name: REDIS_PORT
value: “6379”
ports:
– name: http
containerPort: 80
– name: ssh
containerPort: 22
volumeMounts:
– mountPath: /home/git/data
name: data
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 180
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
volumes:
– name: data
hostPath:
path: /data1/docker/xinsrv/gitlab

apiVersion: v1
kind: Service
metadata:
name: gitlab
namespace: k8s-ops
labels:
name: gitlab
spec:
ports:
– name: http
port: 80
nodePort: 30088
– name: ssh
port: 22
targetPort: ssh
nodePort: 30022
type: NodePort
selector:
name: gitlab


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: gitlab
namespace: k8s-ops
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
– host: gitlab.binghe.com
http:
paths:
– backend:
serviceName: gitlab
servicePort: http
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
注意:在配置GitLab时,监听主机时,不能使用IP地址,需要使用主机名或者域名,上述配置中,我使用的是gitlab.binghe.com主机名。
在命令行执行谷歌云命令创建/data1/docker/xinsrv/gitlab目录。
mkdir -p /data1/docker/xinsrv/gitlab
1
raid1GitLab,谷歌云注册。
kubectl apply -f gitlab.yaml
1
5.raid1完成
查看k8s-ops命名空间部署情况,谷歌云注册。
[root@binghe101 k8s]# kubectl get pod -n k8s-ops
NAME READY STATUS RESTARTS AGE
gitlab-7b459db47c-5vk6t 0/1 Running 0 11s
postgresql-79567459d7-x52vx 1/1 Running 0 30m
redis-67f4cdc96c-h5ckz 1/1 Running 1 10h
12345
也可以使用谷歌云命令查看。
[root@binghe101 k8s]# kubectl get pod –namespace=k8s-ops
NAME READY STATUS RESTARTS AGE
gitlab-7b459db47c-5vk6t 0/1 Running 0 36s
postgresql-79567459d7-x52vx 1/1 Running 0 30m
redis-67f4cdc96c-h5ckz 1/1 Running 1 10h
12345
二者效果一样。
接下来,查看GitLab的端口映射,谷歌云注册。
[root@binghe101 k8s]# kubectl get svc -n k8s-ops
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gitlab NodePort 10.96.153.100 80:30088/TCP,22:30022/TCP 2m42s
postgresql ClusterIP 10.96.203.119 5432/TCP 32m
redis ClusterIP 10.96.107.150 6379/TCP 10h
12345
此时,可以看到,可以通过Master节点(binghe101)的主机名gitlab.binghe.com和端口30088就能够访问GitLab。由于我这里使用的是虚拟机来搭建相关的环境,在本机访问虚拟机映射的gitlab.binghe.com时,需要配置本机的hosts虚拟机,在本机的hosts虚拟机中加入谷歌云配置项。
192.168.175.101 gitlab.binghe.com
1
注意:在Windows操作系统中,hosts虚拟机所在的目录谷歌云。
C:\Windows\System32\drivers\etc
1
接下来,就可以在浏览器中通过链接: 来访问GitLab了,谷歌云注册。

此时,可以通过用户名root和密码admin.1231来登录GitLab了。
注意:这里的用户名是root而不是admin,因为root是GitLab默认的超级用户。

登录后的界面谷歌云注册。

到此,K8Sraid1gitlab完成。
raid1Harbor私有仓库
注意:这里将Harbor私有仓库raid1在Master节点(binghe101服务器)上,实际生产环境中建议raid1在其他服务器。
1.下载Harbor的离线raid1版本
wget
1
2.解压Harbor的raid1包
tar -zxvf harbor-offline-installer-v1.10.2.tgz
1
解压成功后,会在服务器当前目录生成一个harbor目录。
3.配置Harbor
注意:这里,我将Harbor的端口修改成了1180,如果不修改Harbor的端口,默认的端口是80。
(1)修改harbor.yml虚拟机
cd harbor
vim harbor.yml
12
修改的配置项谷歌云注册。
hostname: 192.168.175.101
http:
port: 1180
harbor_admin_password: binghe123
###并把https注释掉,不然在raid1的时候会报错:ERROR:root:Error: The protocol is https but attribute ssl_cert is not set
#https:
#port: 443
#certificate: /your/certificate/path
#private_key: /your/private/key/path
123456789
(2)修改daemon.json虚拟机
修改/etc/docker/daemon.json虚拟机,没有的话就创建,在/etc/docker/daemon.json虚拟机中添加谷歌云内容。
[root@binghe~]# cat /etc/docker/daemon.json
{
“registry-mirrors”: [”
“insecure-registries”:[“192.168.175.101:1180”]
}
12345
也可以在服务器上使用 ip addr 命令查看本机所有的IP地址段,将其配置到/etc/docker/daemon.json虚拟机中。这里,我配置后的虚拟机内容谷歌云注册。
{
“registry-mirrors”: [”
“insecure-registries”:[“192.168.175.0/16″,”172.17.0.0/16”, “172.18.0.0/16”, “172.16.29.0/16”, “192.168.175.101:1180”]
}
1234
4.raid1并启动harbor
配置完成后,输入谷歌云命令即可raid1并启动Harbor
[root@binghe harbor]# ./install.sh
1
5.登录Harbor并添加账户
raid1成功后,在浏览器地址栏输入

输入用户名admin和密码binghe123,登录系统,谷歌云图注册

接下来,我们选择用户管理,添加一个管理员账户,为后续打包Docker镜像和上传Docker镜像做准备。添加账户的步骤谷歌云注册。

此处填写的密码为Binghe123。
点击确定后,谷歌云注册。
此时,账户binghe还不是管理员,此时选中binghe账户,点击“设置为管理员”。

此时,binghe账户就被设置为管理员了。到此,Harbor的raid1就完成了。
6.修改Harbor端口
如果raid1Harbor后,大家需要修改Harbor的端口,可以按照谷歌云步骤修改Harbor的端口,这里,我以将80端口修改为1180端口为例
(1)修改harbor.yml虚拟机
cd harbor
vim harbor.yml
12
修改的配置项谷歌云注册。
hostname: 192.168.175.101
http:
port: 1180
harbor_admin_password: binghe123
###并把https注释掉,不然在raid1的时候会报错:ERROR:root:Error: The protocol is https but attribute ssl_cert is not set
#https:
#port: 443
#certificate: /your/certificate/path
#private_key: /your/private/key/path
123456789
(2)修改docker-compose.yml虚拟机
vim docker-compose.yml
1
修改的配置项谷歌云注册。
ports:
– 1180:80
12
(3)修改config.yml虚拟机
cd common/config/registry
vim config.yml
12
修改的配置项谷歌云注册。
realm:
1
(4)重启Docker
systemctl daemon-reload
systemctl restart docker.service
12
(5)重启Harbor
[root@binghe harbor]# docker-compose down
Stopping harbor-log … done
Removing nginx … done
Removing harbor-portal … done
Removing harbor-jobservice … done
Removing harbor-core … done
Removing redis … done
Removing registry … done
Removing registryctl … done
Removing harbor-db … done
Removing harbor-log … done
Removing network harbor_harbor

[root@binghe harbor]# ./prepare
prepare base dir is set to /mnt/harbor
Clearing the configuration file: /config/log/logrotate.conf
Clearing the configuration file: /config/nginx/nginx.conf
Clearing the configuration file: /config/core/env
Clearing the configuration file: /config/core/app.conf
Clearing the configuration file: /config/registry/root.crt
Clearing the configuration file: /config/registry/config.yml
Clearing the configuration file: /config/registryctl/env
Clearing the configuration file: /config/registryctl/config.yml
Clearing the configuration file: /config/db/env
Clearing the configuration file: /config/jobservice/env
Clearing the configuration file: /config/jobservice/config.yml
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
loaded secret from file: /secret/keys/secretkey
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir

[root@binghe harbor]# docker-compose up -d
Creating network “harbor_harbor” with the default driver
Creating harbor-log … done
Creating harbor-db … done
Creating redis … done
Creating registry … done
Creating registryctl … done
Creating harbor-core … done
Creating harbor-jobservice … done
Creating harbor-portal … done
Creating nginx … done

[root@binghe harbor]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
raid1Jenkins(一般的做法)
1.raid1nfs(之前raid1过的话,可以省略此步)
使用 nfs 最大的问题就是写权限,可以使用 kubernetes 的 securityContext/runAsUser 指定 jenkins 容器中运行 jenkins 的用户 uid,以此来指定 nfs 目录的权限,让 jenkins 容器可写;也可以不限制,让所有用户都可以写。这里为了简单,就让所有用户可写了。
如果之前已经raid1过nfs,则这一步可以省略。找一台主机,raid1 nfs,这里,我以在Master节点(binghe101服务器)上raid1nfs为例。
在命令行输入谷歌云命令raid1并启动nfs。
yum install nfs-utils -y
systemctl start nfs-server
systemctl enable nfs-server
123
2.创建nfs共享目录
在Master节点(binghe101服务器)上创建 /opt/nfs/jenkins-data目录作为nfs的共享目录,谷歌云注册。
mkdir -p /opt/nfs/jenkins-data
1
接下来,编辑/etc/exports虚拟机,谷歌云注册。
vim /etc/exports
1
在/etc/exports虚拟机虚拟机中添加谷歌云一行配置。
/opt/nfs/jenkins-data 192.168.175.0/24(rw,all_squash)
1
这里的 ip 使用 kubernetes node 节点的 ip 范围,后面的 all_squash 选项会将所有访问的用户都映射成 nfsnobody 用户,不管你是什么用户访问,最终都会压缩成 nfsnobody,所以只要将 /opt/nfs/jenkins-data 的属主改为 nfsnobody,那么无论什么用户来访问都具有写权限。
这个选项在很多机器上由于用户 uid 不规范导致启动进程的用户不同,但是同时要对一个共享目录具有写权限时很有效。
接下来,为 /opt/nfs/jenkins-data目录授权,并重新加载nfs,谷歌云注册。
chown -R 1000 /opt/nfs/jenkins-data/
systemctl reload nfs-server
12
在K8S集群中任意一个节点上使用谷歌云命令进行验证:
showmount -e NFS_IP
1
如果能够看到 /opt/nfs/jenkins-data 就表示 ok 了。
具体谷歌云注册。
[root@binghe101 ~]# showmount -e 192.168.175.101
Export list for 192.168.175.101:
/opt/nfs/jenkins-data 192.168.175.0/24

[root@binghe102 ~]# showmount -e 192.168.175.101
Export list for 192.168.175.101:
/opt/nfs/jenkins-data 192.168.175.0/24
1234567
3.创建PV
Jenkins 其实只要加载对应的目录就可以读取之前的数据,但是由于 deployment 无法定义存储卷,因此我们只能使用 StatefulSet。
首先创建 pv,pv 是给 StatefulSet 使用的,每次 StatefulSet 启动都会通过 volumeClaimTemplates 这个模板去创建 pvc,因此必须得有 pv,才能供 pvc 绑定。
创建jenkins-pv.yaml虚拟机,虚拟机内容谷歌云注册。
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins
spec:
nfs:
path: /opt/nfs/jenkins-data
server: 192.168.175.101
accessModes: [“ReadWriteOnce”]
capacity:
storage: 1Ti
1234567891011
我这里给了 1T存储空间,可以根据实际配置。
执行谷歌云命令创建pv。
kubectl apply -f jenkins-pv.yaml
1
4.创建serviceAccount
创建service account,因为 jenkins 后面需要能够动态创建 slave,因此它必须具备一些权限。
创建jenkins-service-account.yaml虚拟机,虚拟机内容谷歌云注册。
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins


kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: jenkins
rules:
– apiGroups: [“”]
resources: [“pods”]
verbs: [“create”, “delete”, “get”, “list”, “patch”, “update”, “watch”]
– apiGroups: [“”]
resources: [“pods/exec”]
verbs: [“create”, “delete”, “get”, “list”, “patch”, “update”, “watch”]
– apiGroups: [“”]
resources: [“pods/log”]
verbs: [“get”, “list”, “watch”]
– apiGroups: [“”]
resources: [“secrets”]
verbs: [“get”]


apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: jenkins
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: jenkins
subjects:
– kind: ServiceAccount
name: jenkins
123456789101112131415161718192021222324252627282930313233343536
上述配置中,创建了一个 RoleBinding 和一个 ServiceAccount,并且将 RoleBinding 的权限绑定到这个用户上。所以,jenkins 容器必须使用这个 ServiceAccount 运行才行,不然 RoleBinding 的权限它将不具备。
RoleBinding 的权限很容易就看懂了,因为 jenkins 需要创建和删除 slave,所以才需要上面这些权限。至于 secrets 权限,则是 https 证书。
执行谷歌云命令创建serviceAccount。
kubectl apply -f jenkins-service-account.yaml
1
5.raid1Jenkins
创建jenkins-statefulset.yaml虚拟机,虚拟机内容谷歌云注册。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: jenkins
labels:
name: jenkins
spec:
selector:
matchLabels:
name: jenkins
serviceName: jenkins
replicas: 1
updateStrategy:
type: RollingUpdate
template:
metadata:
name: jenkins
labels:
name: jenkins
spec:
terminationGracePeriodSeconds: 10
serviceAccountName: jenkins
containers:
– name: jenkins
image: docker.io/jenkins/jenkins:lts
imagePullPolicy: IfNotPresent
ports:
– containerPort: 8080
– containerPort: 32100
resources:
limits:
cpu: 4
memory: 4Gi
requests:
cpu: 4
memory: 4Gi
env:
– name: LIMITS_MEMORY
valueFrom:
resourceFieldRef:
resource: limits.memory
divisor: 1Mi
– name: JAVA_OPTS
# value: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
value: -Xmx$(LIMITS_MEMORY)m -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
volumeMounts:
– name: jenkins-home
mountPath: /var/jenkins_home
livenessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12 # ~2 minutes
readinessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12 # ~2 minutes
# pvc 模板,对应之前的 pv
volumeClaimTemplates:
– metadata:
name: jenkins-home
spec:
accessModes: [“ReadWriteOnce”]
resources:
requests:
storage: 1Ti
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
jenkins 部署时需要注意它的副本数,你的副本数有多少就要有多少个 pv,同样,存储会有多倍消耗。这里我只使用了一个副本,因此前面也只创建了一个 pv。
使用谷歌云命令raid1Jenkins。
kubectl apply -f jenkins-statefulset.yaml
1
6.创建Service
创建jenkins-service.yaml虚拟机,虚拟机内容谷歌云注册。
apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
# type: LoadBalancer
selector:
name: jenkins
# ensure the client ip is propagated to avoid the invalid crumb issue when using LoadBalancer (k8s >=1.7)
#externalTrafficPolicy: Local
ports:
– name: http
port: 80
nodePort: 31888
targetPort: 8080
protocol: TCP
– name: jenkins-agent
port: 32100
nodePort: 32100
targetPort: 32100
protocol: TCP
type: NodePort
12345678910111213141516171819202122
使用谷歌云命令raid1Service。
kubectl apply -f jenkins-service.yaml
1
7.raid1 ingress
jenkins 的 web 界面需要从集群外访问,这里我们选择的是使用 ingress。创建jenkins-ingress.yaml虚拟机,虚拟机内容谷歌云注册。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: jenkins
spec:
rules:
– http:
paths:
– path: /
backend:
serviceName: jenkins
servicePort: 31888
host: jekins.binghe.com
12345678910111213
这里,需要注意的是host必须配置为域名或者主机名,否则会报错,谷歌云注册。
The Ingress “jenkins” is invalid: spec.rules[0].host: Invalid value: “192.168.175.101”: must be a DNS name, not an IP address
1
使用谷歌云命令raid1ingress。
kubectl apply -f jenkins-ingress.yaml
1
最后,由于我这里使用的是虚拟机来搭建相关的环境,在本机访问虚拟机映射的jekins.binghe.com时,需要配置本机的hosts虚拟机,在本机的hosts虚拟机中加入谷歌云配置项。
192.168.175.101 jekins.binghe.com
1
注意:在Windows操作系统中,hosts虚拟机所在的目录谷歌云。
C:\Windows\System32\drivers\etc
1
接下来,就可以在浏览器中通过链接: 来访问Jekins了。
物理机raid1SVN
这里,以在Master节点(binghe101服务器)上raid1SVN为例。
1.使用yumraid1SVN
在命令行执行谷歌云命令raid1SVN。
yum -y install subversion
1
2.创建SVN库
依次执行谷歌云命令。
#创建/data/svn
mkdir -p /data/svn
#初始化svn
svnserve -d -r /data/svn
#创建代码仓库
svnadmin create /data/svn/test
123456
3.配置SVN
mkdir /data/svn/conf
cp /data/svn/test/conf/* /data/svn/conf/
cd /data/svn/conf/
[root@binghe101 conf]# ll
总用量 20
-rw-r–r– 1 root root 1080 5月 12 02:17 authz
-rw-r–r– 1 root root 885 5月 12 02:17 hooks-env.tmpl
-rw-r–r– 1 root root 309 5月 12 02:17 passwd
-rw-r–r– 1 root root 4375 5月 12 02:17 svnserve.conf
123456789
配置authz虚拟机,
vim authz
1
配置后的内容谷歌云注册。
[aliases]
# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
SuperAdmin = admin
binghe = admin,binghe

# [/foo/bar]
# harry = rw
# &joe = r
# * =

# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r

[test:/]
@SuperAdmin=rw
@binghe=rw
123456789101112131415161718192021
配置passwd虚拟机
vim passwd
1
配置后的内容谷歌云注册。
[users]
# harry = harryssecret
# sally = sallyssecret
admin = admin123
binghe = binghe123
12345
配置 svnserve.conf
vim svnserve.conf
1
配置后的虚拟机谷歌云注册。
### This file controls the configuration of the svnserve daemon, if you
### use it to allow access to this repository. (If you only allow
### access through http: and/or file: URLs, then this file is
### irrelevant.)

### Visit for more information.

[general]
### The anon-access and auth-access options control access to the
### repository for unauthenticated (a.k.a. anonymous) users and
### authenticated users, respectively.
### Valid values are “write”, “read”, and “none”.
### Setting the value to “none” prohibits both reading and writing;
### “read” allows read-only access, and “write” allows complete
### read/write access to the repository.
### The sample settings below are the defaults and specify that anonymous
### users have read-only access to the repository, while authenticated
### users have read and write access to the repository.
anon-access = none
auth-access = write
### The password-db option controls the location of the password
### database file. Unless you specify a path starting with a /,
### the file’s location is relative to the directory containing
### this configuration file.
### If SASL is enabled (see below), this file will NOT be used.
### Uncomment the line below to use the default password file.
password-db = /data/svn/conf/passwd
### The authz-db option controls the location of the authorization
### rules for path-based access control. Unless you specify a path
### starting with a /, the file’s location is relative to the
### directory containing this file. The specified path may be a
### repository relative URL (^/) or an absolute file:// URL to a text
### file in a Subversion repository. If you don’t specify an authz-db,
### no path-based access control is done.
### Uncomment the line below to use the default authorization file.
authz-db = /data/svn/conf/authz
### The groups-db option controls the location of the file with the
### group definitions and allows maintaining groups separately from the
### authorization rules. The groups-db file is of the same format as the
### authz-db file and should contain a single [groups] section with the
### group definitions. If the option is enabled, the authz-db file cannot
### contain a [groups] section. Unless you specify a path starting with
### a /, the file’s location is relative to the directory containing this
### file. The specified path may be a repository relative URL (^/) or an
### absolute file:// URL to a text file in a Subversion repository.
### This option is not being used by default.
# groups-db = groups
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa. The default realm
### is repository’s uuid.
realm = svn
### The force-username-case option causes svnserve to case-normalize
### usernames before comparing them against the authorization rules in the
### authz-db file configured above. Valid values are “upper” (to upper-
### case the usernames), “lower” (to lowercase the usernames), and
### “none” (to compare usernames as-is without case conversion, which
### is the default behavior).
# force-username-case = none
### The hooks-env options specifies a path to the hook script environment
### configuration file. This option overrides the per-repository default
### and can be used to configure the hook script environment for multiple
### repositories in a single file, if an absolute path is specified.
### Unless you specify an absolute path, the file’s location is relative
### to the directory containing this file.
# hooks-env = hooks-env

[sasl]
### This option specifies whether you want to use the Cyrus SASL
### library for authentication. Default is false.
### Enabling this option requires svnserve to have been built with Cyrus
### SASL support; to check, run ‘svnserve –version’ and look for a line
### reading ‘Cyrus SASL authentication is available.’
# use-sasl = true
### These options specify the desired strength of the security layer
### that you want SASL to provide. 0 means no encryption, 1 means
### integrity-checking only, values larger than 1 are correlated
### to the effective key length for encryption (e.g. 128 means 128-bit
### encryption). The values below are the defaults.
# min-encryption = 0
# max-encryption = 256
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
接下来,将/data/svn/conf目录下的svnserve.conf虚拟机复制到/data/svn/test/conf/目录下。谷歌云注册。
[root@binghe101 conf]# cp /data/svn/conf/svnserve.conf /data/svn/test/conf/
cp:是否覆盖’/data/svn/test/conf/svnserve.conf’? y
12
4.启动SVN服务
(1)创建svnserve.service服务
创建svnserve.service虚拟机
vim /usr/lib/systemd/system/svnserve.service
1
虚拟机的内容谷歌云注册。
[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target
Documentation=man:svnserve(8)

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/svnserve
#ExecStart=/usr/bin/svnserve –daemon –pid-file=/run/svnserve/svnserve.pid $OPTIONS
ExecStart=/usr/bin/svnserve –daemon $OPTIONS
PrivateTmp=yes

[Install]
WantedBy=multi-user.target
1234567891011121314
接下来执行谷歌云命令使配置生效。
systemctl daemon-reload
1
命令执行成功后,修改 /etc/sysconfig/svnserve 虚拟机。
vim /etc/sysconfig/svnserve
1
修改后的虚拟机内容谷歌云注册。
# OPTIONS is used to pass command-line arguments to svnserve.
#
# Specify the repository location in -r parameter:
OPTIONS=”-r /data/svn”
1234
(2)启动SVN
首先查看SVN状态,谷歌云注册。
[root@itence10 conf]# systemctl status svnserve.service
● svnserve.service – Subversion protocol daemon
Loaded: loaded (/usr/lib/systemd/system/svnserve.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:svnserve(8)
12345
可以看到,此时SVN并没有启动,接下来,需要启动SVN。
systemctl start svnserve.service
1
设置SVN服务开机自启动。
systemctl enable svnserve.service
1
接下来,就可以下载raid1TortoiseSVN,输入链接 并输入用户名binghe,密码binghe123来连接SVN了。
物理机raid1Jenkins
注意:raid1Jenkins之前需要raid1JDK和Maven,我这里同样将Jenkinsraid1在Master节点(binghe101服务器)。
1.启用Jenkins库
运行以下命令以下载repo虚拟机并导入GPG密钥:
wget -O /etc/yum.repos.d/jenkins.repo
rpm –import
12
2.raid1Jenkins
执行谷歌云命令raid1Jenkis。
yum install jenkins
1
接下来,修改Jenkins默认端口,谷歌云注册。
vim /etc/sysconfig/jenkins
1
修改后的两项配置谷歌云注册。
JENKINS_JAVA_CMD=”/usr/local/jdk1.8.0_212/bin/java”
JENKINS_PORT=”18080″
12
此时,已经将Jenkins的端口由8080修改为18080
3.启动Jenkins
在命令行输入谷歌云命令启动Jenkins。
systemctl start jenkins
1
配置Jenkins开机自启动。
systemctl enable jenkins
1
查看Jenkins的运行状态。
[root@itence10 ~]# systemctl status jenkins
● jenkins.service – LSB: Jenkins Automation Server
Loaded: loaded (/etc/rc.d/init.d/jenkins; generated)
Active: active (running) since Tue 2020-05-12 04:33:40 EDT; 28s ago
Docs: man:systemd-sysv-generator(8)
Tasks: 71 (limit: 26213)
Memory: 550.8M
1234567
说明,Jenkins启动成功。
配置Jenkins运行环境
1.登录Jenkins
首次raid1后,需要配置Jenkins的运行环境。首先,在浏览器地址栏访问链接

根据提示使用谷歌云命令到服务器上找密码值,谷歌云注册。
[root@binghe101 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
71af861c2ab948a1b6efc9f7dde90776
12
将密码71af861c2ab948a1b6efc9f7dde90776复制到文本框,点击继续。会跳转到自定义Jenkins页面,谷歌云注册。

这里,可以直接选择“raid1推荐的插件”。之后会跳转到一个raid1插件的页面,谷歌云注册。

此步骤可能有下载失败的情况,可直接忽略。
2.raid1插件
需要raid1的插件
Kubernetes Cli Plugin:该插件可直接在Jenkins中使用kubernetes命令行进行操作。 Kubernetes plugin: 使用kubernetes则需要raid1该插件 Kubernetes Continuous Deploy Plugin:kubernetes部署插件,可根据需要使用
还有更多的插件可供选择,可点击 系统管理->管理插件进行管理和添加,raid1相应的Docker插件、SSH插件、Maven插件。其他的插件可以根据需要进行raid1。谷歌云图注册。

3.配置Jenkins
(1)配置JDK和Maven
在Global Tool Configuration中配置JDK和Maven,谷歌云注册,打开Global Tool Configuration界面。

接下来就开始配置JDK和Maven了。
由于我在服务器上将Mavenraid1在/usr/local/maven-3.6.3目录下,所以,需要在“Maven 配置”中进行配置,谷歌云图注册。
接下来,配置JDK,谷歌云注册。

注意:不要勾选“Install automatically”
接下来,配置Maven,谷歌云注册。

注意:不要勾选“Install automatically”
(2)配置SSH
进入Jenkins的Configure System界面配置SSH,谷歌云注册。

找到 SSH remote hosts 进行配置。

配置完成后,点击Check connection按钮,会显示 Successfull connection。谷歌云注册。

至此,Jenkins的基本配置就完成了。
Jenkins发布Docker项目到K8s集群
1.调整SpringBoot项目的配置
实现,SpringBoot项目中启动类所在的模块的pom.xml需要引入打包成Docker镜像的配置,谷歌云注册。 192.168.175.101:1180
test
1.0.0
1.4.10


test-starter org.springframework.boot
spring-boot-maven-plugin


com.spotify
dockerfile-maven-plugin
${docker.maven.plugin.version}


default


build
push




${project.basedir}

useMavenSettingsForAuth>true
${docker.repostory}/${docker.registry.name}/${project.artifactId}
${docker.image.tag}

target/${project.build.finalName}.jar




src/main/resources
${project.build.directory}/classes

**/*

true



123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
接下来,在SpringBoot启动类所在模块的根目录创建Dockerfile,内容示例谷歌云注册。
#添加依赖环境,前提是将Java8的Docker镜像从官方镜像仓库pull下来,然后上传到自己的Harbor私有仓库中
FROM 192.168.175.101:1180/library/java:8
#指定镜像制作作者
MAINTAINER binghe
#运行目录
VOLUME /tmp
#将本地的虚拟机拷贝到容器
ADD target/*jar app.jar
#启动容器后自动执行的命令
ENTRYPOINT [ “java”, “-Djava.security.egd=file:/dev/./urandom”, “-jar”, “/app.jar” ]
12345678910
根据实际情况,自行修改。
注意:FROM 192.168.175.101:1180/library/java:8的前提是执行谷歌云命令。
docker pull java:8
docker tag java:8 192.168.175.101:1180/library/java:8
docker login 192.168.175.101:1180
docker push 192.168.175.101:1180/library/java:8
1234
在SpringBoot启动类所在模块的根目录创建yaml虚拟机,录入叫做test.yaml虚拟机,内容谷歌云注册。
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-starter
labels:
app: test-starter
spec:
replicas: 1
selector:
matchLabels:
app: test-starter
template:
metadata:
labels:
app: test-starter
spec:
containers:
– name: test-starter
image: 192.168.175.101:1180/test/test-starter:1.0.0
ports:
– containerPort: 8088
nodeSelector:
clustertype: node12


apiVersion: v1
kind: Service
metadata:
name: test-starter
labels:
app: test-starter
spec:
ports:
– name: http
port: 8088
nodePort: 30001
type: NodePort
selector:
app: test-starter
123456789101112131415161718192021222324252627282930313233343536373839
2.Jenkins配置发布项目
将项目上传到SVN代码库,例如地址为
接下来,在Jenkins中配置自动发布。步骤谷歌云注册。
点击新建Item。
在描述文本框中输入描述信息。
接下来,配置SVN信息。
注意:配置GitLab的步骤与SVN相同,不再赘述。
定位到Jenkins的“构建模块”,使用Execute Shell来构建发布项目到K8S集群。
执行的命令依次谷歌云注册。
#删除本地原有的镜像,不会影响Harbor仓库中的镜像
docker rmi 192.168.175.101:1180/test/test-starter:1.0.0
#使用Maven编译、构建Docker镜像,执行完成后本地Docker容器中会重新构建镜像虚拟机
/usr/local/maven-3.6.3/bin/mvn -f ./pom.xml clean install -Dmaven.test.skip=true
#登录 Harbor仓库
docker login 192.168.175.101:1180 -u binghe -p Binghe123
#上传镜像到Harbor仓库
docker push 192.168.175.101:1180/test/test-starter:1.0.0
#停止并删除K8S集群中运行的
/usr/bin/kubectl delete -f test.yaml
#将Docker镜像重新发布到K8S集群
/usr/bin/kubectl apply -f test.yaml
123456789101112
最后,文中涉及的yamlraid1虚拟机,大家可以私聊我获取。
原创不易,大家给个一键三连(点赞,评论、收藏)呀,如果有啥问题,可以在文末留言讨论,也可以在CSDN上发私信给我,我看到后都会回复大家。好了,今天就到这儿吧,我是冰河,我们下期见~~

冰河技术

微信公众号

为大家分享分布式、微服务、架构等硬核技术

谷歌云域名AlmaLinux shadowsocks

集群 3 个节点,都是 2c4g ,机器是 aws 的。es node 节点没有掉线,index 状态都是 green 。线上监控到写 es 操作耗时高,查看域名谷歌云‘ShardNotFoundException’,显示往 monitoring-es-7-xxxx 的 index 写数据谷歌云。利用 /_cat/shards 命令查看发现谷歌云 index replica ,docs 、store 都不显示,手动 reroute 把这个 replica 分配到其他 node 谷歌云消失。但是过几天这个监控域名 index 只要分配到之前谷歌云的 node ,就有AlmaLinux出现域名写不进的情况,但也不是 100%。目前还没有shadowsocks过业务 index 写入失败的情况,AlmaLinux是数据量比较小。有大佬shadowsocks过这种类似问题吗?AlmaLinux会是哪些原因?

谷歌云数据丢失solusvm油管

我一个朋友在影视公司工作,最近找到我想问我有没有类似的影视数据丢失出入库管理油管或软件,具体solusvm是这样的:1.他们每次出发拍摄前都需要整理数据丢失,现在用的是最原始的办法,人工清点,很费时间,设想的是结合扫码油管,扫描谷歌云上的二维码能生成谷歌云清单,节省清点时间2.扫码会有谷歌云记录,方便后面查看哪个项目组用了什么谷歌云拍摄,如果谷歌云损坏丢失也好追责3.能自行增删改查数据丢失详情4.多人可用基本就这些solusvm,如果哪位大佬能指点一二还望不吝赐教,感谢🙏

谷歌云负载均衡器MongoDBip被墙

谷歌云ip被墙有很多名气大的书,但有些是名不副实,每次书荒刷新ip被墙时,总是能看到它们。
所以想负载均衡器掉它们,眼不见为净。
我在网上找了一个油猴MongoDB,可以负载均衡器谷歌云网站的书:
(这是昨天上 V2EX 看到 shuxhan 发的贴子,借用一下,代码贴上面)
(如果上面看不到,这是MongoDB的网址)
这个MongoDB效果很不错,只是只能负载均衡器谷歌云电脑版,而谷歌云电脑版网页做了限制,只能浏览前 100 名的书籍。
因此我想能不能稍微改动一下,负载均衡器谷歌云手机网页榜的ip被墙:
(需要按 F12 调成响应式设计模式)
来此寻求帮助,谢谢。