搭建K8S集群之Harbor仓库、DNS和ETCD部署

k8s上部署Harbor通过Nginx-Ingress域名访问 k8s部署harbor 阅读详情

在上一篇文章中,我们介绍了K8S集群的整体架构和各角色节点上的组成组件及其作用,在这篇文章中,我们来实际搭建一个K8S集群。

在K8S集群中,各个组件之间通信是通过http/https协议来完成的,而这些都需要我们提供证书,因为在集群中,我们对证书的签发机构并没有什么要求,所以这些用到的证书可以由我们自己来签发,然后我们需要将这些证书配置到各个组件中。这其中是非常复杂的,所以,靠手动来安装各个组件是一件耗时费力的事情,为此,K8S官方提供了一个很方便的安装部署工具,这个工具就是kubeadm,这个工具可以很方便的为我们部署一个K8S集群。但是,使用这个方式部署的K8S,会将除了kubelet组件之外的其他组件都变成容器化,托管到K8S中。而且,这样的方式部署的K8S集群会自动为我们创建各个证书,但是证书有效期默认是一年,证书到期后如果没有更新,将会直接导致K8S集群的瘫痪,这是很麻烦的事情,而且,如果想要解决这个问题,就需要我们更新证书,或者重新编译kubeadm的源码,来更改证书有效期。这在生产环境中,是很难受的事情,一个不小心就得背锅。

所以,基于上述考虑,作为一名运维工程师,这是需要极力避免的事情。为了更好的了解K8S集群,我们最好采用二进制安装的方式,手动的部署各个组件。通过部署的过程,将会对K8S集群有一个更加深入的了解,这样之后在集群出现故障的时候,我们也更容易定位故障点。基于此,本文将采用二进制安装部署的方式,一点一点的来手动部署K8S集群,并且我们要手动的来字签证书。

在之前的文章中,我们只介绍了K8S相关的组件,在生产环境中,仅有K8S还是不够的,还需要有别的必要的软件,比如还需要有私有镜像仓库,用来存储我们的镜像文件。开源的私有仓库有很多,本文采用当前比较流行的Harbor作为私有镜像仓库。

此外,我们在上一篇文章中提到,Pod控制器会自动的为我们去管理pod,由此导致pod的地址可能会发生改变,所以我们引入了service资源这个概念,由kube-proxy组件为我们建立service和pod之间的联系,用户可以直接访问service的名称来访问后端的pod,这个功能其实就是DNS这个过程,所以,我们在K8S集群中还需要一个coredns组件,这个组件为我们提供了解析server名称到pod地址的服务。

一、实验环境要求

本次实验共用到5台服务器,所有服务器都加入host.com这个测试域,此外,还使用到od.com域,此域用于之后镜像仓库相关域名解析,架构图如下:

我们将Master节点和Node节点部署在两台物理服务器上,这样既可以满足Master的冗余,也可以部署多个Node节点,具体的系统要求及配置要求如下:

角色IP系统配置Docker环境
Proxy-110.4.7.11Centos 7.7 64位1vCPU 1G内存No
Proxy-210.4.7.12Centos 7.7 64位1vCPU 1G内存No
K8S-110.4.7.21Centos 7.7 64位1vCPU 2G内存Yes
K8S-210.4.7.22Centos 7.7 64位1vCPU 2G内存Yes
工具服10.4.7.200Centos 7.7 64位1vCPU 2G内存Yes

所有的服务器上要统一关闭selinux及firewalld。所有服务器上要可以连接外网,且所有服务器上要安装如下软件包:

$ yum install epel-release
$ yum install wget net-tools telnet tree nmap sysstat lrzsz dos2unix bind-utils -y

二、部署K8S集群依赖服务

1、部署DNS服务

DNS服务主要用来提供对集群内部域名的解析,比如我们在集群内部访问我们的镜像仓库的时候,就需要解析镜像仓库地址到内网IP上,这就需要我们使用一个内部DNS。如果在生产环境中,我们可以将这些域名解析到我们的域名服务商。根据我们的架构图,我们要在 10.4.7.11 这台服务器上安装我们的DNS服务:

# yum -y install bind
# cat /etc/named.conf 
options {
 listen-on port 53 { 10.4.7.11; };                          # 监听地址改为本机IP,也可以设置为0.0.0.0
 directory  "/var/named";
 dump-file  "/var/named/data/cache_dump.db";
 statistics-file "/var/named/data/named_stats.txt";
 memstatistics-file "/var/named/data/named_mem_stats.txt";
 recursing-file  "/var/named/data/named.recursing";
 secroots-file   "/var/named/data/named.secroots";
 allow-query     { any; };                                  # 允许所有来源地址查询
    forwarders      { 10.4.7.2; };                             # 上级DNS,此处设置为网关地址
 recursion yes;
 dnssec-enable no;                                          # 禁用DNSSEC
 dnssec-validation no;                                      # 禁用DNSSEC
 bindkeys-file "/etc/named.root.key";
 managed-keys-directory "/var/named/dynamic";
 pid-file "/run/named/named.pid";
 session-keyfile "/run/named/session.key";
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {
 type hint;
 file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

修改完成后,添加域:

# cat /etc/named.rfc1912.zones
...
zone "host.com" IN {
        type  master;
        file  "host.com.zone";
        allow-update { 10.4.7.11; };
};

zone "od.com" IN {
        type  master;
        file  "od.com.zone";
        allow-update { 10.4.7.11; };
};

添加解析记录:

# cat /var/named/host.com.zone
$ORIGIN host.com.
$TTL 600 ; 10 minutes
@       IN SOA dns.host.com. dnsadmin.host.com. (
    2019121501 ; serial
    10800      ; refresh (3 hours)
    900        ; retry (15 minutes)
    604800     ; expire (1 week)
    86400      ; minimum (1 day)
    )
   NS   dns.host.com.
$TTL 60 ; 1 minute
dns               A    10.4.7.11
K8S7-11           A    10.4.7.11
K8S7-12           A    10.4.7.12
K8S7-21           A    10.4.7.21
K8S7-22           A    10.4.7.22
K8S7-200          A    10.4.7.200

# cat /var/named/od.com.zone
$ORIGIN od.com.
$TTL 600 ; 10 minutes
@     IN SOA dns.od.com. dnsadmin.od.com. (
    2019121501 ; serial
    10800      ; refresh (3 hours)
    900        ; retry (15 minutes)
    604800     ; expire (1 week)
    86400      ; minimum (1 day)
    )
    NS   dns.od.com.
$TTL 60 ; 1 minute
dns                A    10.4.7.11

添加完成后,检测DNS配置及启动DNS服务:

# named-checkconf
# systemctl start named
# systemctl enable named

搭建完成后,所有服务器上DNS地址指向 10.4.7.11:

# cat /etc/resolv.conf
search host.com
nameserver 10.4.7.11
[root@K8S7-11 ~]# nslookup k8s7-12.host.com
Server:  10.4.7.11
Address: 10.4.7.11#53

Name: K8S7-12.host.com
Address: 10.4.7.12

至此,DNS服务部署完成。

2、部署Harbor私有镜像仓库及创建CA根证书

2.1 制作CA证书

根据架构图,我们需要在 10.4.7.200 服务器上来制作并签发证书,首先需要下载签发证书的工具并为这些工具添加执行权限:

# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl
# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/bin/cfssl-json
# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/bin/cfssl-certinfo
# chmod +x /usr/bin/cfssl*

创建证书目录及CA证书配置文件:

# mkdir /opt/certs
# cat ca-csr.json 
{
    "CN": "Self signed CA",         # common name,浏览器使用该字段验证网站是否合法,一般填写域名,kube-apiserver 从证书中提取该字段作为请求的用户名
    "hosts": [
    ],
    "key": {
        "algo": "rsa",              # 指定了加密算法,一般使用rsa
        "size": 2048
    },
    "names": [
        {
            "C": "CN",              # Country,国家,CN表示中国
            "ST": "beijing",        # State,州,省名称
            "L": "beijing",         # Locality,地区,城市
            "O": "od",              # Organization,组织名称,公司名称,kube-apiserver 从证书中提取该字段作为请求用户所属的组
            "OU": "ops"             # Organization Unit,组织单位名称,公司部门名称
        }
    ],
    "ca": {
        "expiry": "175200h"         # 证书过期时间,此处设置为175200小时后过期,相当于20年后过期
    }
}

在/opt/certs/目录下签发根证书:

# cfssl gencert -initca ca-csr.json | cfssl-json -bare ca
2019/12/15 18:14:22 [INFO] generating a new CA key and certificate from CSR
2019/12/15 18:14:22 [INFO] generate received request
2019/12/15 18:14:22 [INFO] received CSR
2019/12/15 18:14:22 [INFO] generating key: rsa-2048
2019/12/15 18:14:22 [INFO] encoded CSR
2019/12/15 18:14:22 [INFO] signed certificate with serial number 22910580121075577296507048955953452575428349464
# ls
ca.csr  ca-csr.json  ca-key.pem  ca.pem

CA证书是我们的根证书,此后将使用此处生成的CA证书来签发其他的证书。

2.2 部署Harbor服务

在 10.4.7.200 服务器上部署Harbor,用于我们的私有镜像仓库。

安装Docker环境:

# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

准备docker配置文件并创建相关目录:

# mkdir /etc/docker
# cd /etc/docker/
# vim daemon.json
# cat daemon.json 
{
  "graph": "/data/docker",
  "storage-driver": "overlay2",
  "insecure-registries": ["registry.access.redhat.com","quay.io","harbor.od.com"],
  "registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
  "bip": "172.16.200.1/24",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "live-restore": true
}
# mkdir -p /data/docker

启动docker服务:

# systemctl start docker
# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
...

2.3 部署Harbor服务

下载habor软件包:

# mkdir /opt/src
# cd /opt/src/
# wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.3.tgz

解压软件包到/opt/目录,创建软连接指向该软件包,这么做的好处是可以方便软件升级:

# tar -zxf harbor-offline-installer-v1.8.3.tgz -C /opt/
# cd ..
# ls
certs  containerd  harbor  rh  src
# mv harbor harbor_v1.8.3
# ln -s /opt/harbor_v1.8.3/ /opt/harbor

编辑habor的配置文件:/opt/harbor/harbor.yml,修改如下配置并创建相关目录:

# egrep -v '^#|^$|^  #' harbor.yml 
hostname: harbor.od.com                        # 此处修改为harbor地址
http:
  port: 180                                    # harbor端口,默认80,此处改为180端口,80端口使用nginx做转发
harbor_admin_password: Harbor12345
database:
  password: root123
data_volume: /data/harbor                      # habor存储卷位置
clair: 
  updaters_interval: 12
  http_proxy:
  https_proxy:
  no_proxy: 127.0.0.1,localhost,core,registry
jobservice:
  max_job_workers: 10
chart:
  absolute_url: disabled
log:
  level: info
  rotate_count: 50
  rotate_size: 200M
  location: /data/harbor/logs                  # harbor日志目录
_version: 1.8.0
# mkdir -p /data/harbor/logs

安装docker-compose:

# yum -y install docker-compose

运行habor安装脚本/opt/harbor/install.sh,运行成功后,执行docker-compose ps 命令查看结果:

# pwd
/opt/harbor
# ./install.sh 
...
# docker-compose ps
      Name                     Command               State             Ports          
--------------------------------------------------------------------------------------
harbor-core         /harbor/start.sh                 Up                               
harbor-db           /entrypoint.sh postgres          Up      5432/tcp                 
harbor-jobservice   /harbor/start.sh                 Up                               
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up      127.0.0.1:1514->10514/tcp
harbor-portal       nginx -g daemon off;             Up      80/tcp                   
nginx               nginx -g daemon off;             Up      0.0.0.0:180->80/tcp      
redis               docker-entrypoint.sh redis ...   Up      6379/tcp                 
registry            /entrypoint.sh /etc/regist ...   Up      5000/tcp                 
registryctl         /harbor/start.sh                 Up   

安装nginx,做habor的http服务代理:

# yum -y install nginx
# vim /etc/nginx/conf.d/habor.od.com.conf
# cat /etc/nginx/conf.d/habor.od.com.conf 
server {
    listen       80;
    server_name  harbor.od.com;

    client_max_body_size 1000m;

    location / {
        proxy_pass http://127.0.0.1:180;
    }
}

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# systemctl start nginx
# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

# netstat -tnlup | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      111260/nginx: maste 
tcp6       0      0 :::80                   :::*                    LISTEN      111260/nginx: maste 

在 10.4.7.11 自建DNS上添加域名解析,harbor.od.com ==> 10.4.7.200:

# vim /var/named/od.com.zone 
# cat /var/named/od.com.zone 
$ORIGIN od.com.
$TTL 600 ; 10 minutes
@     IN SOA dns.od.com. dnsadmin.od.com. (
    2019121502 ; serial
    10800      ; refresh (3 hours)
    900        ; retry (15 minutes)
    604800     ; expire (1 week)
    86400      ; minimum (1 day)
    )
    NS   dns.od.com.
$TTL 60 ; 1 minute
dns                A    10.4.7.11
harbor         A 10.4.7.200
# named-checkconf 
# systemctl restart named

在宿主机上修改dns地址到10.4.7.11或者修改hosts记录,然后访问 http://10.4.7.11,可以看到如下页面,harbor默认用户名是admin,默认密码是Harbor12345,登录进入系统:

harbor登录成功界面, 当我们成功打开上述页面后,说明我们的harbor已经部署成功。

3、部署ETCD服务

在 10.4.7.12、10.4.7.21、10.4.7.22 上部署ETCD集群,用于K8S存储数据,部署在三台服务器上可以保证高可用,需要注意的是,ETCD服务需要部署奇数个节点,不能部署偶数个节点,否则会导致无法启动服务。

3.1 签发证书

在我们的架构中,etcd集群部署了3个节点,这三个节点之间要保持数据一致,所以需要相互之间都能访问,也就是说某一个节点,既可能是其他节点的server端,也可能是其他节点的client端,所以,在ETCD集群中,通信使用的证书既要用于server的认证,也要用于client认证。使用我们上面生成的自签CA证书来签发新的证书,首先,我们需要准备一个签发证书的策略配置文件,CA将根据这个配置文件来生成具体的证书:

# pwd
/opt/certs
# vim ca-config.json
# cat ca-config.json 
{
    "signing": {
        "default": {
            "expiry": "175200h"
        },
        "profiles": {                   # profiles指定了CA可以签署的证书类型
            "server": {                 # 证书类型名,此处是一个server端证书
                "expiry": "175200h",    # 证书过期时间
                "usages": [
                    "signing",          # 表示可以使用该证书签发其他证书
                    "key encipherment", 
                    "server auth"       # 表示client可以用该CA对server提供的证书进行验证
                ]
            },
            "client": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"       # 表示server端可以用该CA对client提供的证书进行验证
                ]
            },
            "peer": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

创建证书请求文件,使用这个文件向CA申请证书:

# cat etcd-peer-csr.json 
{
    "CN": "k8s-etcd",
    "hosts": [            # 证书的使用范围,只有这里指定的IP使用此证书才可以被认可
        "10.4.7.11",
        "10.4.7.12",
        "10.4.7.21",
        "10.4.7.22"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "beijing",
            "L": "beijing",
            "O": "od",
            "OU": "ops"
        }
    ]
}

签发证书,根据前述,我们需要签发一个技能验证client又能验证server的证书,所以,在签发证书的时候应该指定profile为peer,即ca-config.json文件中的第三个profile:

# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd-peer-csr.json | cfssl-json -bare etcd-peer
2019/12/16 14:22:19 [INFO] generate received request
2019/12/16 14:22:19 [INFO] received CSR
2019/12/16 14:22:19 [INFO] generating key: rsa-2048
2019/12/16 14:22:20 [INFO] encoded CSR
2019/12/16 14:22:20 [INFO] signed certificate with serial number 428525440842853412781261514592315218900681388961
2019/12/16 14:22:20 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, p 10.2.3 ("Information Requirements").   

# ll -h etcd-peer*
-rw-r--r-- 1 root root 1.1K 12月 16 14:22 etcd-peer.csr
-rw-r--r-- 1 root root  363 12月 16 14:17 etcd-peer-csr.json
-rw------- 1 root root 1.7K 12月 16 14:22 etcd-peer-key.pem
-rw-r--r-- 1 root root 1.5K 12月 16 14:22 etcd-peer.pem

至此,我们看到已经签发了etcd-peer这个证书。

3.2 在10.4.7.12上安装etcd

在我们的架构图中,有三个etcd节点,其安装部署过程都是一样的,只需要在不同节点上修改部分配置文件即可,我们先用 10.4.7.12 这个节点来作详细说明。

创建etcd用户:

# useradd -s /sbin/nologin -M etcd

下载etcd并解压:

# mkdir /opt/src
# cd /opt/src/
# wget https://github.com/etcd-io/etcd/releases/download/v3.1.20/etcd-v3.1.20-linux-amd64.tar.gz
# tar -zxf etcd-v3.1.20-linux-amd64.tar.gz -C /opt/
# cd /opt/
# mv etcd-v3.1.20-linux-amd64/ etcd-v3.1.20
# ln -s /opt/etcd-v3.1.20/ /opt/etcd

创建etcd相关的目录:

# mkdir -p /opt/etcd/certs /data/etcd /data/logs/etcd-server

从 10.4.7.200 拷贝证书到/opt/etcd/certs,我们需要拷贝3个证书,分别是:ca.pem、etcd-peer.pem、etcd-peer-key.pem,其中私钥文件etcd-peer-key.pem的权限是600:

# pwd
/opt/etcd/certs
# scp k8s7-200:/opt/certs/ca.pem ./
# scp k8s7-200:/opt/certs/etcd-peer.pem ./
# scp k8s7-200:/opt/certs/etcd-peer-key.pem ./

# ll -h 
总用量 12K
-rw-r--r-- 1 root root 1.4K 12月 16 15:04 ca.pem
-rw------- 1 root root 1.7K 12月 16 15:05 etcd-peer-key.pem
-rw-r--r-- 1 root root 1.5K 12月 16 15:04 etcd-peer.pem

创建ETCD启动脚本:

# pwd
/opt/etcd
# vim /opt/etcd/etcd-server-startup.sh

# cat etcd-server-startup.sh 
#!/bin/sh
./etcd --name etcd-server-7-12 \
       --data-dir /data/etcd/etcd-server \
       --listen-peer-urls https://10.4.7.12:2380 \
       --listen-client-urls https://10.4.7.12:2379,http://127.0.0.1:2379 \
       --quota-backend-bytes 8000000000 \
       --initial-advertise-peer-urls https://10.4.7.12:2380 \
       --advertise-client-urls https://10.4.7.12:2379,http://127.0.0.1:2379 \
       --initial-cluster  etcd-server-7-12=https://10.4.7.12:2380,etcd-server-7-21=https://10.4.7.21:2380,etcd-server-7-22=https://10.4.7.22:2380 \
       --ca-file ./certs/ca.pem \
       --cert-file ./certs/etcd-peer.pem \
       --key-file ./certs/etcd-peer-key.pem \
       --client-cert-auth  \
       --trusted-ca-file ./certs/ca.pem \
       --peer-ca-file ./certs/ca.pem \
       --peer-cert-file ./certs/etcd-peer.pem \
       --peer-key-file ./certs/etcd-peer-key.pem \
       --peer-client-cert-auth \
       --peer-trusted-ca-file ./certs/ca.pem \
       --log-output stdout 

修改etcd相关目录的属组和属主:

# chown -R etcd.etcd /opt/etcd-v3.1.20/
# chown -R etcd.etcd /data/etcd/
# chown -R etcd.etcd /data/logs/etcd-server/

至此,实际上我们已经可以启动etcd服务了,但是如果我们的启动脚本挂了,etcd服务也会一并挂掉,所以我们将进程托管到supervisor服务中,以此来帮我们自动拉起进程。

安装supervisor并启动:

# yum -y install supervisor
# systemctl start supervisord
# systemctl enable supervisord

创建supervisor的托管etcd服务的配置文件:

# cat /etc/supervisord.d/etcd-server.ini
[program:etcd-server-7-12]
command=/opt/etcd/etcd-server-startup.sh                        ; the program (relative uses PATH, can take args)
numprocs=1                                                      ; number of processes copies to start (def 1)
directory=/opt/etcd                                             ; directory to cwd to before exec (def no cwd)
autostart=true                                                  ; start at supervisord start (default: true)
autorestart=true                                                ; retstart at unexpected quit (default: true)
startsecs=30                                                    ; number of secs prog must stay running (def. 1)
startretries=3                                                  ; max # of serial start failures (default 3)
exitcodes=0,2                                                   ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT                                                 ; signal used to kill process (default TERM)
stopwaitsecs=10                                                 ; max num secs to wait b4 SIGKILL (default 10)
user=etcd                                                       ; setuid to this UNIX account to run the program
redirect_stderr=true                                            ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/etcd-server/etcd.stdout.log           ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB                                    ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4                                        ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB                                     ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false                                     ; emit events on stdout writes (default false)

创建supervisor托管,并查看状态,启动supervisor任务后需要等待30秒,当状态为RUNNING时则表示进程正常:

# supervisorctl update
etcd-server-7-12: added process group

# supervisorctl status
etcd-server-7-12                 RUNNING   pid 40471, uptime 0:01:05

至此,10.4.7.12 上的ETCD就部署完成了,接下来,我们需要按照相同方式部署 10.4.7.21、10.4.7.22 两台服务器,但是需要注意修改etcd启动脚本及supervisor配置文件, 以 10.4.7.21 为例:

# cat /opt/etcd/etcd-server-startup.sh
#!/bin/sh
./etcd --name etcd-server-7-21 \                               # 这里要修改
       --data-dir /data/etcd/etcd-server \
       --listen-peer-urls https://10.4.7.21:2380 \                     # 这里要修改
       --listen-client-urls https://10.4.7.21:2379,http://127.0.0.1:2379 \      # 这里要修改
       --quota-backend-bytes 8000000000 \
       --initial-advertise-peer-urls https://10.4.7.21:2380 \            # 这里要修改
       --advertise-client-urls https://10.4.7.21:2379,http://127.0.0.1:2379 \  # 这里要修改
       --initial-cluster  etcd-server-7-12=https://10.4.7.12:2380,etcd-server-7-21=https://10.4.7.21:2380,etcd-server-7-22=https://10.4.7.22:2380 \
       --ca-file ./certs/ca.pem \
       --cert-file ./certs/etcd-peer.pem \
       --key-file ./certs/etcd-peer-key.pem \
       --client-cert-auth  \
       --trusted-ca-file ./certs/ca.pem \
       --peer-ca-file ./certs/ca.pem \
       --peer-cert-file ./certs/etcd-peer.pem \
       --peer-key-file ./certs/etcd-peer-key.pem \
       --peer-client-cert-auth \
       --peer-trusted-ca-file ./certs/ca.pem \
       --log-output stdout

# cat /etc/supervisord.d/etcd-server.ini
[program:etcd-server-7-21]            #这行要修改
...

当三台ETCD节点都运行正常后,我们来检查一下etcd集群的健康状态:

# ./etcdctl cluster-health
member 988139385f78284 is healthy: got healthy result from http://127.0.0.1:2379
member 5a0ef2a004fc4349 is healthy: got healthy result from http://127.0.0.1:2379
member f4a0cb0a765574a8 is healthy: got healthy result from http://127.0.0.1:2379
cluster is healthy

# ./etcdctl member list
988139385f78284: name=etcd-server-7-22 peerURLs=https://10.4.7.22:2380 clientURLs=http://127.0.0.1:2379,https://10.4.7.22:2379 isLeader=false
5a0ef2a004fc4349: name=etcd-server-7-21 peerURLs=https://10.4.7.21:2380 clientURLs=http://127.0.0.1:2379,https://10.4.7.21:2379 isLeader=false
f4a0cb0a765574a8: name=etcd-server-7-12 peerURLs=https://10.4.7.12:2380 clientURLs=http://127.0.0.1:2379,https://10.4.7.12:2379 isLeader=true

此时我们可以看到,三台etcd节点都已经正常工作,其中当前的etcd leader为 10.4.7.12 。至此,我们的ETCD集群就搭建完毕,接下来,我们将开始正式搭建K8S相关组件, 其他服务的安装,请见下回分解。

全桥LLC谐振变换器变频控制工作原理与仿真 全桥LLC谐振变换器以其效率高、全范围软开关、器件电应力小等优点,越来越多地应用于大功率场合。电力电子技术的发展日益追求高频化,所带来的问题是半导体开关器件高频运行时的开关损耗急剧增加。各种软开关电路随之出现。可以有效减小开关损耗,使进一步提高开关频率成为可能。谐振式开关因其可在电流自然过零点开通半导体器件,实现零电压开关,特别适合采用MOSFET作开关的装置。最简单的谐振电路有串联谐振(SRC)和并联谐振(PRC)。SRC只能工作于降压状态,应用受限; 阅读详情

相关推荐

用COMSOL计算复合材料板频散曲线:从建模到绘图全流程

导波在板结构中传播时,不同频率成分的速度不同,即频散现象。理解频散曲线是识别导波模态、确定相速度与群速度的基础,也是无损检测和结构健康监测中信号解读的关键。对于碳纤维增强复合材料等各向异性板,频散关系更加复杂,传统解析方法难以求解,数值仿真成为主流手段。通过COMSOL结合周期性边界条件与特征频率扫描,可以高效计算出复合材料板的频散曲线,进而绘制相速度和群速度随频率变化的图谱,为实验模态识别、换能器激励频率选择提供依据。本文以一个2毫米单向碳纤维板为例,详细介绍几何建模、材料参数设置、网格收敛验证、参数扫描

weixin_31412781的博客 234

配置Harbor的HTTPS访问,及出现x509: cannot validate certificate for 。。 because it doesn‘t contain any IP SANs

配置harbor的https访问。及x509: cannot validate certificate for 192.168.237.141 because it doesn't contain any IP SANs问题。

whaol的博客 1734

“探索thumbdata4文件的奥秘:编程中的神秘存在“

综上所述,thumbdata4文件在编程中是一个常见的存在,与图库应用程序和图片浏览器密切相关。通过使用适当的库和工具,我们可以读取和处理thumbdata4文件中的缩略图数据,以提供更好的用户体验。我们首先读取8字节的块头,其中包含了下一个缩略图块的大小。你可以根据自己的需求来定义对块数据的处理方式,例如将其保存为图像文件或进行其他的分析操作。thumbdata4文件通常以二进制格式存储,其中包含着设备上浏览过的图片的缩略图。因此,你可能需要根据具体的thumbdata4文件结构进行适当的解析和处理。

JieLun_C的博客 792

harbor安装并配置https

Harbor 是一个VMware公司开源的镜像仓库,它使用策略和基于角色的访问控制来保护工件,确保镜像被扫描并且没有漏洞,并将镜像标记为可信。Harbor 是一个 CNCF 毕业项目,它提供合规性、性能和互操作性,以帮助您跨云原生计算平台(如 Kubernetes 和 Docker)一致且安全地管理工件。Habor在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等。

IT 1万+

IEC61850规约客户端软件开发实战(第六章)

IEC 61850标准中的GOOSE(Generic Object Oriented Substation Event,面向通用对象的变电站事件)功能是变电站自动化系统的核心通信机制,主要用于实现智能电子设备(IED)间高可靠性、低延时的实时信号传输。本章简述其核心功能与技术特点。

半青年的博客 1778

外骨骼机器人(二):自适应振荡器

振荡器是一种数学工具,可以用于实时跟踪、预测类周期信号的频率、相位、幅值等,而助行外骨骼机器人需要自动适应人体的行走频率、幅度,两者相结合,就能使助行外骨骼机器人拥有更舒适、更自然的行走步态。 ......

行者无疆的博客 4264

9-通过docker-compose部署的harbor 内部dns如何实现的?

服务名是 DNS 解析的核心,直接定义在的services字段下,每个键名即为可被解析的服务名。操作步骤进入 Harbor 部署目录(通常包含的目录,如查看中的services部分:bashcat docker-compose.yml | grep -A 1 "services:" # 快速定位服务定义# 或直接查看完整服务列表输出示例(Harbor 核心服务名):plaintextnginxregistrypostgresqlredisclair。

xuebo1129927648的博客 151

YOLO环境配置+项目启动全流程(Conda+PyCharm超详解)

YOLO(You Only Look Once)是一个基于深度学习的目标检测算法,广泛应用于智能识别领域。本篇保姆级教学将手把手教你如何从零开始运行一个YOLO项目,适合完全没有基础的新手。

一键难忘的博客 1539

k8s集群外部域名dns解析问题

Overview 业务在机器学习的 GPU 集群访问集群外部域名的算法模型报超时 原因分析 查看了 coredns 的监控和日志,均没有发现异常,通过 ping harbor.fql.com 分析回包非常慢,而且频繁超时,于是抓包,发现 harbor.fql.com 添加了 search 域,因为本身域名只有三位,k8s 的 DNS 的 ndots 默认是5位,所以肯定会添加 search 域去解析域名的 默认配置下的 Pod,ndots 为 5 解决方案 由业务容器通过 Pod 的 dnsConfig 自

runzhliu大数据/容器日记 2325

使用Simulink进行无刷电机霍尔传感器信号处理电路的仿真

位置检测:霍尔传感器可以检测转子的位置,这对于实现无刷电机的电子换向至关重要。提高效率:通过准确的位置信息,可以优化电机的工作状态,提高效率和性能。通过上述步骤,我们简要介绍了如何基于Simulink实现无刷电机霍尔传感器信号处理电路的仿真。

MHD0815的博客 430

老款 NUC 复活计划:装 Ubuntu 部署 OpenClaw 本地 AI

老款 NUC 变身本地 AI 服务器指南 本文详细介绍了如何将老旧华硕 NUC 设备改造为本地 AI 服务器。主要内容包括: 硬件评估:列出老款 NUC 的最低配置要求(i3 6代/8GB内存/256GB SSD),并提供兼容性检查命令和性能预期表 系统准备:指导备份数据、下载 Ubuntu 22.04 LTS 和制作启动盘的方法(Windows/Linux双平台) 安装流程:从 BIOS 设置到 Ubuntu 安装的完整步骤,包括推荐的分区方案 系统优化:禁用不必要的服务、内核参数调优、Swap 配置和

博客 7607

二进制安装Kubernetes(K8s)集群---从零安装教程(无证书)

K8s介绍 Kubernetes一个用于容器集群的自动化部署、扩容以及运维的开源平台。 使用Kubernetes,你可以快速高效地响应客户需求: 动态地对应用进行扩容。 无缝地发布新特性。 仅使用需要的资源以优化硬件使用。 Kubernetes是: 简洁的:轻量级,简单,易上手 可移植的:公有,私有,混合,多重云(multi-cloud) 可扩展的: 模块化, ...

Wielun 2万+

Xilinx DDR3 MIG IP核设计--汇总导航

快速上手Xilinx DDR3 IP核----汇总篇

孤独的单刀 2万+

k8s集群安装

一、K8s介绍1、K8s简介官网链接:https://www.kubernetes.org.cn/k8sKubernetes一个用于容器集群的自动化部署、扩容以及运维的开源平台。 (1)使用Kubernetes,你可以快速高效地响应客户需求:动态地对应用进行扩容。 无缝地发布新特性。 仅使用需要的资源以优化硬件使用。 (2)Kubernetes是:简洁的:轻量级,简单,易上手 可移植的:...

weixin_33851177的博客 441

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

k8s1.15安装详细精华版(环境准备、etcd集群安装、harbor私服搭建、高可用集群部署)

一、环境准备 1、硬件配置 192.168.137.11 CentOS7.7.1908 2核2G+50G存储 192.168.137.12 CentOS7.7.1908 2核2G+50G存储 192.168.137.13 CentOS7.7.1908 2核2G+50G存储 192.168.137.14 Cent...

最美dee时光的博客 1939

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

在Centos7下源码搭建k8s集群

一、环境 总体架构 虚机环境 网络配置之前已有教程https://editor.youkuaiyun.com/md/?articleId=105495302 关闭防火墙和selinux 各虚拟机下载工具 yum groupinstall -y Development\ Tools yum install wget net-tools telnet tree nmap sysstat lrzsz dos2u...

IT_Bigboy_sz的博客 1250

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

kubernetes集群部署

安装环境 172.19.2.49(kube-apiserver,kube-controller-manager,kube-dns,kube-proxy,kubectl,etcd) 172.19.2.50(kubectl,etcd,kube-proxy) 172.19.2.51(kubectl,etcd,kube-proxy) 一、创建 CA 证书和秘钥,并提前设置环境变量 17...

dianxieling5536的博客 171

K8S(01)二进制部署实践-1.15.5

目录系列文章说明1 部署架构1.1 架构图1.2 安装方式选择2 部署准备2.1 准备工作2.2 部署DNS服务bind92.2.1 安装配置DNS服务2.2.2 增加自定义域和对于配置2.2.3 启动并验证DNS服务2.2.4 所有主机修改网络配置2.3 自签发证书环境准备2.3.1 下载安装cfssl2.3.2 生成ca证书文件2.3.3 生成ca证书2.4 docker环境准备2.4.1 安装并配置docker2.4.2 启动docker2.5 部署harbor私有仓库2.5.1 下载并解压2.5.2

一亩三分地 828

centos7二进制部署Kubernetes

centos7部署Kubernetes自建DNS服务(1) 修改主配置文件 /etc/named.conf(2) 区域配置文件/etc/named.rfc1912.zones(3) 主机域配置文件/var/namd/host.com.zone(4) 主机域配置文件/var/namd/od.com.zone(5) 验证解析安装docker(1) 设置镜像仓库地址(2) 配置国内镜像加速文件安装私有仓库harbor(1) 下载安装(2) 修改配置参数(3) 基于docker-compose启动harbor安装n

运维工程师 870

二进制安装k8s day01

环境准备 10.0.0.11 hdss-11.host.com 10.0.0.12 hdss-12.host.com 10.0.0.21 hdss-21.host.com 10.0.0.22 hdss-22.host.com 10.0.0.200 hdss-200.host.com 虚拟机环境 selinux firewalld 内核版本 配置阿里云源: curl -o /e...

侯冰雷的博客 920

K8S二进制部署实践-1.15.5

K8S二进制部署实践-1.15.5

风水道人 1069

Kubernetes(二)-- 搭建(未完待续)

一、部署前规划 1. 操作系统初始化设置 :需要设置好集群机器,关闭防火墙和selinux 2. 创建ca证书和私钥 :集群间通信要加密,那么肯定要有ca的创建,以后就用这一步创建的ca当作证书颁发机构给自己发证书,也可通过配置文件省略 3. docker安装与卸载 :k8s基于docker,要先安装docker 4. harbor安装 :有了docker之后,需要用到docker仓库,这...

weixin_30641999的博客 133

【项目实战15】k8s(1)—k8s的部署(图文详解安装,集群部署过程)

kubernetes的部署一、前言一、简介二、k8s特点二、安装一、配置环境二、安装过程三、初始化集群 一、前言 一、简介 为方便docker的管理,Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合。 (1)Kubernetes的好处: (2)隐藏资源管理和错误处理,用户仅需要关注应用的开发。 服务高可用、高可靠。 (3)可将负载运行在由成千上万的机器联合而成的集群中。 二、k8s特点 Kubernetes主要由以下几个核心组件组成: (1)etcd:保存了整个集群的状态 (2

weixin_48819467的博客 8664

k8s二进制部署环境DNS、harbor仓库、etcd环境准备02

k8s二进制部署环境DNS、harbor仓库、etcd环境准备02 1.2 安装方式选择 Minikube 预览使用,仅供学习 二进制安装(生产首选,新手推荐) kubeadmin安装 简单,用k8s跑k8s自己,熟手推荐 新手不推荐的原因是容易知其然不知其所以然 出问题后找不到解决办法 2 部署准备 2.1 准备工作 准备5台2C/2g/50g虚拟机...

reblue520的专栏 424

《K8S集群运维指南》

《K8S集群运维指南》

东城绝神 8173

RHEL9 基于 kubeadm 部署 Kubernetes 集群

本文基于RHEL 9系统,通过kubeadm工具实现K8S集群的全流程部署。通过本地Harbor私有仓库优化镜像管理,安装cri-dockerd实现Docker与K8S的 CRI 接口兼容。禁用Swap分区并设置Cgroup Driver为Systemd,确保节点资源高效利用。使用kubeadm init初始化集群,指定私有仓库镜像路径及Flannel网络插件的默认CIDR范围。部署Flannel网络后,通过kubeadm join将节点加入集群。最终验证集群状态及Pod调度功能,实现多节点协同工作。

a_2373179473的博客 900
上一篇: 开发中的一些规范
下一篇: Python下小米加步枪lambda和相关函数使用
后场技术
博客等级 码龄11年 156粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值