1. 生成证书
    参考: https://daydayup-cms.pages.dev/https%E8%AF%81%E4%B9%A6%E5%88%B6%E4%BD%9C-%E7%94%B3%E8%AF%B7/
  2. 创建数据目录
    mkdir /gitlab
    cd gitlab; mkdir data config logs
  3. 容器化启动gitlab
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    docker run -tid \
    --hostname gitlab.example.cn \ // 此处为访问的域名,也可以填写IP地址,也可以不填。如果有多个容器在同一个子网中,则容器间可以通过hostname互通。
    -p 443:443 \
    -p 80:80 \
    -p 8022:22 \
    --name gitlab \
    --restart always\
    -v /gitlab/config:/etc/gitlab \
    -v /gitlab/logs:/var/log/gitlab \
    -v /gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest
    注: 上面的端口号映射,建议内外端口号一致。如果不一致,可能会导致webhook触发不可用。
    例如,如果端口映射为-p 8080:80,并在gitlab中配置了webhook地址,指定push事件触发。提交代码后gitlab会向webhook地址发送一条消息,并带上相关的push事件内容,内容中包含了提交的分支相关的信息,此时的端口号为80端口,因为gitlab看到的自己的服务端口为80端口,此时webhook服务到80端口拉取代码时就会失败。因为实际上host对外提供的服务是8080端口。当然,也可以修改gitlab.rb配置文件,修改gitlab的服务端口为8080,然后端口映射为8080:8080,避免占用主机的80端口。

默认的用户名为root, 密码位于容器内的:/etc/gitlab/initial_root_password文件下。登陆后可以在右上角的个人Preference处修改密码。可以使用该账号创建其他账户。

配置webook的报错解决: 报错“requests to local network are not allowed.”,需要使用管理账号登陆,将webhook的地址或者IP填入下面位置。
image.png

域名解析配置: 只需要在容器内/etc/hosts中配置域名解析,无需在主机上配置。

  1. 配置证书
    拷贝步骤1生成的证书到配置文件目录下。
    mkdir /gitlab/config/ssl; cp xxx.key xxx.crt /gitlab/config/ssl
    编辑/gitlab/config/gitlab.rb文件,修改以下内容
    1
    2
    3
    4
    external_url 'https://gitlab.example.cn'
    nginx['redirect_http_to_https'] = true
    nginx['ssl_certificate'] = "/etc/gitlab/ssl/xxx.crt"
    nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/xxx.key"
  2. 重新配置gitlab
    docker exec gitlab gitlab-ctl reconfigure
  3. 前端访问gitlab
    如果配置了域名,需要配置域名解析;如果是IP,则直接访问IP即可。如果要使用https访问,则需要将ca.crt证书加入到系统的根证书中。
  4. 最后,如果你想只允许用户使用https访问,可以参考下面的文章配置一个nginx反向代理。
阅读全文 »

主从架构

JMeter通过线程组来驱动多个线程运行测试脚本对被测服务器发起负载,每一个负载机上都可运行多个线程组。

image.png
分布式压测流程:
1.远程负载机启动Agent程序(JMeter bin目录下的jmeter-server.bat/sh),待控制机连接;
2.控制机连接上远程负载机;
3.控制机发送指令(脚本及启动命令)启动线程(若测试脚本有参数文件及依赖包jar需手动拷贝,jmeter控制机并不会自动复制文件);
4.负载机运行脚本,回传状态(包括测试结果);
5.控制机收集结果并显示。

多说两句(可跳过)

Jmeter是用java编写的工具,分布式压测使用到了java的RMI,也就是java Remote Method Invocation(java 远程方法调用),能够让某个java虚拟机上的对象调用另外一个Java虚拟机中的对象上的方法。两个虚拟机可以运行在相同计算机上的不同进程上,也可以是网络上的不同计算机上。

阅读全文 »

当时起了一个gitlab容器,跑了一段时间后,想要改下端口映射关系。本来停了原来的容器,然后使用新端口重新创建一个容器就可以了,但容器的启动命令里有-v挂载磁盘操作,而我已经忘了当时挂载的是哪个磁盘了,因此想要直接修改容器的端口。网上搜索到的方法如下:

(推荐)修改容器配置文件,重启docker daemon

  1. 停止docker daemon

  2. 修改配置文件: vim /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json,修改PortBindings中的值。

    1
    2
    3
    4
    5
    PortBindings":
    {"80/tcp":[
    {"HostIp":"","HostPort":"8080"}
    ]
    }
  3. 修改config.v2.json文件。(如果容器已经停止了,就不存在该文件,可以不改)

  4. 启动docker daemon,启动容器。

看了下,其实容器挂载的磁盘也可以直接查看hostconfig.json文件找到。。。

docker commit新构建镜像

阅读全文 »

基本的构建命令为: docker build -t name:tag -f Dockerfile .
-t: 表示构建出来的镜像名称
-f: 表示构建使用的dockerfile文件名称
.: 表示构建使用当前路径作为上下文(context),如果你是在根目录/下面构建,不建议使用.(不建议使用根路径作为上下文),因为根路径下面有虚拟文件系统,如/proc之类的,构建的时候会报找不到文件的错误。

contextpath和dockerfile

镜像构建流程为首先将指定的上下文(contextpath)路径下的文件打包,发送到服务端。服务端再将收到的文件解压,然后以解压后的路径作为上下文,进行镜像构建。

docker构建命令中如果没有以-f指定Dockerfile,则以上下文中的Dockerfile文件作为构建文件;如果通过-f指定了Dockerfile文件路径及名称,则在构建上下文中寻找指定的文件。

Dockerfile中常见指令

阅读全文 »

在我们工作场景中,可能需要在容器内使用docker。例如在k8s中,想借助deployment的弹性扩缩容能力来测试harbor的推送镜像性能,此时就需要在容器内进行镜像构造,然后推送。
docker提供了一些相关的镜像给我们进行此类操作,下面做一个简单介绍。

docker:dind

该镜像包含docker client和docker damon。使用方式如下:

docker run -tid --name dind --privileged docker:dind
docker exec -ti dind sh -c "docker ps -a"
首先需要启动dockerd,且要正常使用dockerd,需要指定容器为特权容器--privileged

docker:latest

阅读全文 »

公网机器存在被攻击的风险,经常会出现ssh登录的时候,由于密码输错次数过多而被锁住无法登录的情况。原因是公网IP被攻击,不断尝试ssh登录,导致密码输错次数过多。
规避方法有1. 修改默认端口号为非22端口, 2. 关闭密码登录功能,3. 配置防火墙,只允许指定IP的机器访问。此处介绍关闭密码登录,使用密钥登录方法。

基础操作

  1. 在客户端生成密钥对ssh-keygen,之后一直按回车即可。
  2. 将本地密钥对的公钥上传到服务器。
  • ssh-copy-id -i ~/.ssh/id_rsd.pub root@IP。需要输入服务器的密码。如果ssh默认端口不是22,需要加-p 端口号指定端口。
  • 或者手动复制~/.ssh/id_rsd.pub中的内容到服务器的~/.ssh/authorized_keys文件中。
  1. 直接免密登录。ssh root@IP。可以用-p 端口号-i key_file分别指定端口号和密钥文件。
  2. 关闭密码登录。修改/etc/ssh/sshd_config文件,将PasswordAuthentication yes改为noPubkeyAuthentication yes改为yes(如果为no的话),然后重启sshd服务systemctl restart sshd即可。
阅读全文 »

作用

coreDNS的作用是在集群内提供ServicePod的域名解析服务。coreDNS会监听集群中Service和Pod的创建销毁事件,当Service或Pod被创建时,记录对应的解析记录。当其他Pod需要通过域名访问集群中的Service或Pod时,会向coreDNS服务查询解析记录,然后访问解析到的IP地址。整个流程如下
image.png

K8S服务在部署好coreDNS服务后,会对外暴露一个Service,集群内就可以通过访问该Service的ClusterIP+53端口获取域名解析服务。ClusterIP一般是固定的,在安装kubelet时,会传递--cluster-dns=<cluster-ip> --cluster-domain=<default-local-domain>(默认为cluster.local)参数给kubelet,kubelet在创建Pod时,就会把这两个配置写入到Pod的/etc/resolv.conf文件中。
cat /etc/kubernetes/kubelet可以看到kubelet的配置。

目前k8s支持正向查找(A记录),端口查找(SRV记录),反向IP地址查找(PTR记录)。

K8S中一般只有service和headless service后端的statefulset创建的Pod域名是固定的,其他Pod域名中都带有Pod IP,Pod重启后IP改变域名也会改变,不推荐通过域名访问。

阅读全文 »

DNS解析

DNS解析可以分为正向解析和反向解析,正向解析指将域名(FQDN)解析为IP地址,一个FQDN可能会对应多个IP地址。反向解析指通过IP解析出对应的域名。

DNS协议使用的是53端口。

可以通过nslookup/dig 域名查看域名解析记录。

DNS解析记录类型

阅读全文 »

当集群数量比较多的时候,管理起来比较麻烦。如果是使用云厂商的集群,可以在控制台界面进行管理,但如果是自己搭建的集群,想要在命令行界面管理的话,可以使用kubecm和k9s工具。

kubecm

kubecm可以用来将所有kubeconfig汇集到一起,并方便地进行上下文切换。

安装

可以参考release下载二进制安装。

阅读全文 »

自签证书

如果你使用的时IP而不是域名,只需要将下面的yourdomain.com改成IP地址即可。

  1. 生成CA证书私钥
    openssl genrsa -out ca.key 4096
  2. 生成CA根证书
    1
    2
    3
    4
    openssl req -x509 -new -nodes -sha512 -days 3650 \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
    -key ca.key \
    -out ca.crt
  3. 生成服务器证书私钥
    openssl genrsa -out yourdomain.com.key 4096
  4. 生成证书签名请求
    1
    2
    3
    4
    openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
    -key yourdomain.com.key \
    -out yourdomain.com.csr
  5. 生成 x509 v3扩展文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    cat > v3.ext <<-EOF
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names

    [alt_names]
    DNS.1=yourdomain.com
    DNS.2=yourdomain
    DNS.3=hostname
    DNS.4=www.yourdomain.com
    EOF
    在前面制作证书时,我们使用的域名(CN/Common Name)都是yourdomain.com,如果我们这个域名提供服务有很多,如mail.yourdomain.com用于提供邮件服务,www.yourdomain.com提供网络服务,那就需要给这个域名单独申请一个证书,因为证书里的Common Name字段要和域名一一对应。当域名很多时,申请证书就很麻烦了。解决方法是只生成一个证书,但把证书给多个域名使用。该证书的Common Name,即CN字段为yourdomain.com,然后使用一个扩展文件,指定证书生效的域名有哪些,如上面的yourdomain,hostname,www.mydomain.com等等。
    当然,如果如果你没有域名,只有一个IP,上面的步骤也可以跳过。
    参考FQDN: https://blog.csdn.net/u012842205/article/details/51931017
    参考SAN: https://liaoph.com/openssl-san/ 简单来说,使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。
  6. 通过v3扩展文件来生成服务端证书文件
    1
    2
    3
    4
    5
    openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in yourdomain.com.csr \
    -out yourdomain.com.crt
    以上即可生成自签证书。使用时,将ca.crt文件加入到系统的信任证书中即可。
  7. 如果服务是通过docker容器的形式对外提供,需要将crt证书转换成cert格式的证书。因为docker daemon会把crt后缀的证书当作CA根证书。
  • 生成cert证书:
    openssl x509 -inform PEM -in yourdomain.com.crt -out yourdomain.com.cert
  • 将证书拷贝到docker的证书目录
    1
    2
    3
    cp yourdomain.com.cert /etc/docker/certs.d/yourdomain.com/
    cp yourdomain.com.key /etc/docker/certs.d/yourdomain.com/
    cp ca.crt /etc/docker/certs.d/yourdomain.com/
    注: 如果你使用的nginx默认https端口不是443端口,需要将上述的路径修改成/etc/docker/certs.d/yourdomain.com:portetc/docker/certs.d/harbor_IP:port
  • 重启docker。 systemctl restart docker

完整的脚本如下

阅读全文 »
0%