Openshift 4.4 静态 IP 离线安装系列:初始安装

Openshift 4.4 静态 IP 离线安装系列:初始安装

上篇文章准备了离线安装 OCP 所需要的离线资源,包括安装镜像、所有样例 Image Stream 和 OperatorHub 中的所有 RedHat Operators。本文就开始正式安装 OCP(Openshift Container Platform) 集群,包括 DNS 解析、负载均衡配置、ignition 配置文件生成和集群部署。

OCP 安装期间需要用到多个文件:安装配置文件、Kubernetes 部署清单、Ignition 配置文件(包含了 machine types)。安装配置文件将被转换为 Kubernetes 部署清单,然后将清单包装到 Ignition 配置文件中。 安装程序使用这些 Ignition 配置文件来创建 Openshift 集群。运行安装程序时,所有原始安装配置文件都会修改,因此在安装之前应该先备份文件。

1. 安装过程

在安装 OCP 时,我们需要有一台引导主机(Bootstrap)。这个主机可以访问所有的 OCP 节点。引导主机启动一个临时控制平面,它启动 OCP 集群的其余部分然后被销毁。引导主机使用 Ignition 配置文件进行集群安装引导,该文件描述了如何创建 OCP 集群。安装程序生成的 Ignition 配置文件包含 24 小时后过期的证书,所以必须在证书过期之前完成集群安装。

引导集群安装包括如下步骤:

  • 引导主机启动并开始托管 Master 节点启动所需的资源。
  • Master 节点从引导主机远程获取资源并完成引导。
  • Master 节点通过引导主机构建 Etcd 集群。
  • 引导主机使用新的 Etcd 集群启动临时 Kubernetes 控制平面。
  • 临时控制平面在 Master 节点启动生成控制平面。
  • 临时控制平面关闭并将控制权传递给生产控制平面。
  • 引导主机将 OCP 组件注入生成控制平面。
  • 安装程序关闭引导主机。

引导安装过程完成以后,OCP 集群部署完毕。然后集群开始下载并配置日常操作所需的其余组件,包括创建计算节点、通过 Operator 安装其他服务等。

创建引导主机、控制平面和计算节点

2. 准备服务器资源

服务器规划如下:

  • 三个控制平面节点,安装 Etcd、控制平面组件和 Infras 基础组件。
  • 两个计算节点,运行实际负载。
  • 一个引导主机,执行安装任务,集群部署完成后可删除。
  • 一个基础节点,用于准备上节提到的离线资源,同时用来部署 DNS 和负载均衡。
  • 一个镜像节点,用来部署私有镜像仓库 Quay
主机类型操作系统HostnamevCPU内存存储IPFQDN
镜像节点RHEL 7.6registry48GB150GB192.168.57.70registry.openshift4.example.com
基础节点RHEL 7.6bastion416GB120GB192.168.57.60bastion.openshift4.example.com
引导主机RHCOSbootstrap416GB120GB192.168.57.61bootstrap.openshift4.example.com
控制平面RHCOSmaster1416GB120GB192.168.57.62master1.openshift4.example.com
控制平面RHCOSmaster2416GB120GB192.168.57.63master2.openshift4.example.com
控制平面RHCOSmaster3416GB120GB192.168.57.64master3.openshift4.example.com
计算节点RHCOS 或 RHEL 7.6worker128GB120GB192.168.57.65worker1.openshift4.example.com
计算节点RHCOS 或 RHEL 7.6worker228GB120GB192.168.57.66worke2.openshift4.example.com

3. 防火墙配置

接下来看一下每个节点的端口号分配。

所有节点(计算节点和控制平面)之间需要开放的端口:

协议端口作用
ICMPN/A测试网络连通性
TCP9000-9999节点的服务端口,包括 node exporter 使用的 9100-9101 端口和 Cluster Version Operator 使用的 9099 端口
 10250-10259Kubernetes 预留的默认端口
 10256openshift-sdn
UDP4789VXLAN 协议或 GENEVE 协议的通信端口
 6081VXLAN 协议或 GENEVE 协议的通信端口
 9000-9999节点的服务端口,包括 node exporter 使用的 9100-9101 端口
 30000-32767Kubernetes NodePort

控制平面需要向其他节点开放的端口:

协议端口作用
TCP2379-2380Etcd 服务端口
 6443Kubernetes API

除此之外,还要配置两个四层负载均衡器,一个用来暴露集群 API,一个用来暴露 Ingress:

端口作用内部外部描述
6443引导主机和控制平面使用。在引导主机初始化集群控制平面后,需从负载均衡器中手动删除引导主机xxKubernetes API server
22623引导主机和控制平面使用。在引导主机初始化集群控制平面后,需从负载均衡器中手动删除引导主机 xMachine Config server
443Ingress Controller 或 Router 使用xxHTTPS 流量
80Ingress Controller 或 Router 使用xxHTTP 流量

4. 配置 DNS

按照官方文档,使用 UPI 基础架构的 OCP 集群需要以下的 DNS 记录。在每条记录中,<cluster_name> 是集群名称,<base_domain> 是在 install-config.yaml 文件中指定的集群基本域,如下表所示:

组件DNS记录描述
Kubernetes APIapi.<cluster_name>.<base_domain>.此 DNS 记录必须指向控制平面节点的负载均衡器。此记录必须可由集群外部的客户端和集群中的所有节点解析。
 api-int.<cluster_name>.<base_domain>.此 DNS 记录必须指向控制平面节点的负载均衡器。此记录必须可由集群外部的客户端和集群中的所有节点解析。
Routes*.apps.<cluster_name>.<base_domain>.DNS 通配符记录,指向负载均衡器。这个负载均衡器的后端是 Ingress router 所在的节点,默认是计算节点。此记录必须可由集群外部的客户端和集群中的所有节点解析。
etcdetcd-<index>.<cluster_name>.<base_domain>.OCP 要求每个 etcd 实例的 DNS 记录指向运行实例的控制平面节点。etcd 实例由 值区分,它们以 0 开头,以 n-1 结束,其中 n 是集群中控制平面节点的数量。集群中的所有节点必须都可以解析此记录。
 _etcd-server-ssl._tcp.<cluster_name>.<base_domain>.因为 etcd 使用端口 2380 对外服务,因此需要建立对应每台 etcd 节点的 SRV DNS 记录,优先级 0,权重 10 和端口 2380

DNS 服务的部署方法由很多种,我当然推荐使用 CoreDNS,毕竟云原生标配。由于这里需要添加 SRV 记录,所以需要 CoreDNS 结合 etcd 插件使用。以下所有操作在基础节点上执行。

首先通过 yum 安装并启动 etcd:

$ yum install -y etcd
$ systemctl enable etcd --now复制代码

然后下载 CoreDNS 二进制文件:

$ wget https://github.com/coredns/coredns/releases/download/v1.6.9/coredns_1.6.9_linux_amd64.tgz
$ tar zxvf coredns_1.6.9_linux_amd64.tgz
$ mv coredns /usr/local/bin复制代码

创建 Systemd Unit 文件:

$ cat > /etc/systemd/system/coredns.service <<EOF
[Unit]
Description=CoreDNS DNS server
Documentation=https://coredns.io
After=network.target[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
User=coredns
WorkingDirectory=~
ExecStart=/usr/local/bin/coredns -conf=/etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure[Install]
WantedBy=multi-user.target
EOF复制代码

新建 coredns 用户:

$ useradd coredns -s /sbin/nologin复制代码

新建 CoreDNS 配置文件:

$ cat > /etc/coredns/Corefile <<EOF
.:53 {  # 监听 TCP 和 UDP 的 53 端口template IN A apps.openshift4.example.com {match .*apps\.openshift4\.example\.com # 匹配请求 DNS 名称的正则表达式answer "{{ .Name }} 60 IN A 192.168.57.60" # DNS 应答fallthrough}etcd {   # 配置启用 etcd 插件,后面可以指定域名,例如 etcd test.com {path /skydns # etcd 里面的路径 默认为 /skydns,以后所有的 dns 记录都存储在该路径下endpoint http://localhost:2379 # etcd 访问地址,多个空格分开fallthrough # 如果区域匹配但不能生成记录,则将请求传递给下一个插件# tls CERT KEY CACERT # 可选参数,etcd 认证证书设置}prometheus  # 监控插件cache 160loadbalance   # 负载均衡,开启 DNS 记录轮询策略forward . 192.168.57.1log # 打印日志
}
EOF复制代码

其中 template 插件用来实现泛域名解析。

启动 CoreDNS 并设置开机自启:

$ systemctl enable coredns --now复制代码

验证泛域名解析:

$ dig +short apps.openshift4.example.com @127.0.0.1
192.168.57.60$ dig +short x.apps.openshift4.example.com @127.0.0.1
192.168.57.60复制代码

添加其余 DNS 记录:

$ alias etcdctlv3='ETCDCTL_API=3 etcdctl'
$ etcdctlv3 put /skydns/com/example/openshift4/api '{"host":"192.168.57.60","ttl":60}'
$ etcdctlv3 put /skydns/com/example/openshift4/api-int '{"host":"192.168.57.60","ttl":60}'$ etcdctlv3 put /skydns/com/example/openshift4/etcd-0 '{"host":"192.168.57.62","ttl":60}'
$ etcdctlv3 put /skydns/com/example/openshift4/etcd-1 '{"host":"192.168.57.63","ttl":60}'
$ etcdctlv3 put /skydns/com/example/openshift4/etcd-2 '{"host":"192.168.57.64","ttl":60}'$ etcdctlv3 put /skydns/com/example/openshift4/_tcp/_etcd-server-ssl/x1 '{"host":"etcd-0.openshift4.example.com","ttl":60,"priority":0,"weight":10,"port":2380}'
$ etcdctlv3 put /skydns/com/example/openshift4/_tcp/_etcd-server-ssl/x2 '{"host":"etcd-1.openshift4.example.com","ttl":60,"priority":0,"weight":10,"port":2380}'
$ etcdctlv3 put /skydns/com/example/openshift4/_tcp/_etcd-server-ssl/x3 '{"host":"etcd-2.openshift4.example.com","ttl":60,"priority":0,"weight":10,"port":2380}'# 除此之外再添加各节点主机名记录
$ etcdctlv3 put /skydns/com/example/openshift4/bootstrap '{"host":"192.168.57.61","ttl":60}'
$ etcdctlv3 put /skydns/com/example/openshift4/master1 '{"host":"192.168.57.62","ttl":60}'
$ etcdctlv3 put /skydns/com/example/openshift4/master2 '{"host":"192.168.57.63","ttl":60}'
$ etcdctlv3 put /skydns/com/example/openshift4/master3 '{"host":"192.168.57.64","ttl":60}'
$ etcdctlv3 put /skydns/com/example/openshift4/worker1 '{"host":"192.168.57.65","ttl":60}'
$ etcdctlv3 put /skydns/com/example/openshift4/worker2 '{"host":"192.168.57.66","ttl":60}'
$ etcdctlv3 put /skydns/com/example/openshift4/registry '{"host":"192.168.57.70","ttl":60}'复制代码

验证 DNS 解析:

$ yum install -y bind-utils
$ dig +short api.openshift4.example.com @127.0.0.1
192.168.57.60$ dig +short api-int.openshift4.example.com @127.0.0.1
192.168.57.60$ dig +short etcd-0.openshift4.example.com @127.0.0.1
192.168.57.62
$ dig +short etcd-1.openshift4.example.com @127.0.0.1
192.168.57.63
$ dig +short etcd-2.openshift4.example.com @127.0.0.1
192.168.57.64$ dig +short -t SRV _etcd-server-ssl._tcp.openshift4.example.com @127.0.0.1
10 33 2380 etcd-0.openshift4.example.com.
10 33 2380 etcd-1.openshift4.example.com.
10 33 2380 etcd-2.openshift4.example.com.$ dig +short bootstrap.openshift4.example.com @127.0.0.1
192.168.57.61
$ dig +short master1.openshift4.example.com @127.0.0.1
192.168.57.62
$ dig +short master2.openshift4.example.com @127.0.0.1
192.168.57.63
$ dig +short master3.openshift4.example.com @127.0.0.1
192.168.57.64
$ dig +short worker1.openshift4.example.com @127.0.0.1
192.168.57.65
$ dig +short worker2.openshift4.example.com @127.0.0.1
192.168.57.66复制代码

5. 配置负载均衡

负载均衡我选择使用 Envoy,先准备配置文件:

Bootstrap

# /etc/envoy/envoy.yaml
node:id: node0cluster: cluster0
dynamic_resources:lds_config:path: /etc/envoy/lds.yamlcds_config:path: /etc/envoy/cds.yaml
admin:access_log_path: "/dev/stdout"address:socket_address:address: "0.0.0.0"port_value: 15001复制代码

LDS

# /etc/envoy/lds.yaml
version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.config.listener.v3.Listenername: listener_openshift-api-serveraddress:socket_address:address: 0.0.0.0port_value: 6443filter_chains:- filters:- name: envoy.tcp_proxytyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxystat_prefix: openshift-api-servercluster: openshift-api-serveraccess_log:name: envoy.access_loggers.filetyped_config:"@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLogpath: /dev/stdout
- "@type": type.googleapis.com/envoy.config.listener.v3.Listenername: listener_machine-config-serveraddress:socket_address:address: "::"ipv4_compat: trueport_value: 22623filter_chains:- filters:- name: envoy.tcp_proxytyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxystat_prefix: machine-config-servercluster: machine-config-serveraccess_log:name: envoy.access_loggers.filetyped_config:"@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLogpath: /dev/stdout
- "@type": type.googleapis.com/envoy.config.listener.v3.Listenername: listener_ingress-httpaddress:socket_address:address: "::"ipv4_compat: trueport_value: 80filter_chains:- filters:- name: envoy.tcp_proxytyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxystat_prefix: ingress-httpcluster: ingress-httpaccess_log:name: envoy.access_loggers.filetyped_config:"@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLogpath: /dev/stdout
- "@type": type.googleapis.com/envoy.config.listener.v3.Listenername: listener_ingress-httpsaddress:socket_address:address: "::"ipv4_compat: trueport_value: 443filter_chains:- filters:- name: envoy.tcp_proxytyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxystat_prefix: ingress-httpscluster: ingress-httpsaccess_log:name: envoy.access_loggers.filetyped_config:"@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLogpath: /dev/stdout复制代码

CDS

# /etc/envoy/cds.yaml
version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.config.cluster.v3.Clustername: openshift-api-serverconnect_timeout: 1stype: strict_dnsdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINload_assignment:cluster_name: openshift-api-serverendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.57.61port_value: 6443- endpoint:address:socket_address:address: 192.168.57.62port_value: 6443- endpoint:address:socket_address:address: 192.168.57.63port_value: 6443- endpoint:address:socket_address:address: 192.168.57.64port_value: 6443
- "@type": type.googleapis.com/envoy.config.cluster.v3.Clustername: machine-config-serverconnect_timeout: 1stype: strict_dnsdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINload_assignment:cluster_name: machine-config-serverendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.57.61port_value: 22623- endpoint:address:socket_address:address: 192.168.57.62port_value: 22623- endpoint:address:socket_address:address: 192.168.57.63port_value: 22623- endpoint:address:socket_address:address: 192.168.57.64port_value: 22623
- "@type": type.googleapis.com/envoy.config.cluster.v3.Clustername: ingress-httpconnect_timeout: 1stype: strict_dnsdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINload_assignment:cluster_name: ingress-httpendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.57.65port_value: 80- endpoint:address:socket_address:address: 192.168.57.66port_value: 80
- "@type": type.googleapis.com/envoy.config.cluster.v3.Clustername: ingress-httpsconnect_timeout: 1stype: strict_dnsdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINload_assignment:cluster_name: ingress-httpsendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.57.65port_value: 443- endpoint:address:socket_address:address: 192.168.57.66port_value: 443复制代码

配置看不懂的去看我的电子书:Envoy 中文指南

启动 Envoy

$ podman run -d --restart=always --name envoy --net host -v /etc/envoy:/etc/envoy envoyproxy/envoy复制代码

6. 安装准备

生成 SSH 私钥并将其添加到 agent

在安装过程中,我们会在基础节点上执行 OCP 安装调试和灾难恢复,因此必须在基础节点上配置 SSH key,ssh-agent 将会用它来执行安装程序。

基础节点上的 core 用户可以使用该私钥登录到 Master 节点。部署集群时,该私钥会被添加到 core 用户的 ~/.ssh/authorized_keys 列表中。

密钥创建步骤如下:

① 创建无密码验证的 SSH key:

$ ssh-keygen -t rsa -b 4096 -N '' -f ~/.ssh/new_rsa复制代码

② 启动 ssh-agent 进程作为后台任务:

$ eval "$(ssh-agent -s)"复制代码

③ 将 SSH 私钥添加到 ssh-agent

$ ssh-add ~/.ssh/new_rsa复制代码

后续集群安装过程中,有一步会提示输入 SSH public key,届时使用前面创建的公钥 new_rsa.pub 就可以了。

获取安装程序

如果是在线安装,还需要在基础节点上下载安装程序。但这里是离线安装,安装程序在上篇文章中已经被提取出来了,所以不需要再下载。

创建安装配置文件

首先创建一个安装目录,用来存储安装所需要的文件:

$ mkdir /ocpinstall复制代码

自定义 install-config.yaml 并将其保存在 /ocpinstall 目录中。配置文件必须命名为 install-config.yaml。配置文件内容:

apiVersion: v1
baseDomain: example.com
compute:
- hyperthreading: Enabledname: workerreplicas: 0
controlPlane:hyperthreading: Enabledname: masterreplicas: 3
metadata:name: openshift4
networking:clusterNetwork:- cidr: 10.128.0.0/14hostPrefix: 23networkType: OpenShiftSDNserviceNetwork:- 172.30.0.0/16
platform:none: {}
fips: false
pullSecret: '{"auths": ...}'
sshKey: 'ssh-rsa ...'
additionalTrustBundle: |-----BEGIN CERTIFICATE-----省略,注意这里要前面空两格-----END CERTIFICATE-----
imageContentSources:
- mirrors:- registry.openshift4.example.com/ocp4/openshift4source: quay.io/openshift-release-dev/ocp-release
- mirrors:- registry.openshift4.example.com/ocp4/openshift4source: quay.io/openshift-release-dev/ocp-v4.0-art-dev复制代码
  • baseDomain : 所有 Openshift 内部的 DNS 记录必须是此基础的子域,并包含集群名称。
  • compute : 计算节点配置。这是一个数组,每一个元素必须以连字符 - 开头。
  • hyperthreading : Enabled 表示启用同步多线程或超线程。默认启用同步多线程,可以提高机器内核的性能。如果要禁用,则控制平面和计算节点都要禁用。
  • compute.replicas : 计算节点数量。因为我们要手动创建计算节点,所以这里要设置为 0。
  • controlPlane.replicas : 控制平面节点数量。控制平面节点数量必须和 etcd 节点数量一致,为了实现高可用,本文设置为 3。
  • metadata.name : 集群名称。即前面 DNS 记录中的 <cluster_name>
  • cidr : 定义了分配 Pod IP 的 IP 地址段,不能和物理网络重叠。
  • hostPrefix : 分配给每个节点的子网前缀长度。例如,如果将 hostPrefix 设置为 23,则为每一个节点分配一个给定 cidr 的 /23 子网,允许 $510 (2^{32 - 23} - 2)$ 个 Pod IP 地址。
  • serviceNetwork : Service IP 的地址池,只能设置一个。
  • pullSecret : 上篇文章使用的 pull secret,可通过命令 cat /root/pull-secret.json|jq -c 来压缩成一行。
  • sshKey : 上面创建的公钥,可通过命令 cat ~/.ssh/new_rsa.pub 查看。
  • additionalTrustBundle : 私有镜像仓库 Quay 的信任证书,可在镜像节点上通过命令 cat /data/quay/config/ssl.cert 查看。
  • imageContentSources : 来自前面 oc adm release mirror 的输出结果。

备份安装配置文件,便于以后重复使用:

$ cd /ocpinstall
$ cp install-config.yaml  install-config.yaml.20200604复制代码

创建 Kubernetes 部署清单

创建 Kubernetes 部署清单后 install-config.yaml 将被删除,请务必先备份此文件!

创建 Kubernetes 部署清单文件:

$ openshift-install create manifests --dir=/ocpinstall复制代码

修改 manifests/cluster-scheduler-02-config.yml 文件,将 mastersSchedulable 的值设为 flase,以防止 Pod 调度到控制节点。

创建 Ignition 配置文件

创建 Ignition 配置文件后 install-config.yaml 将被删除,请务必先备份此文件!

$ cp install-config.yaml.20200604 install-config.yaml
$ openshift-install create ignition-configs --dir=/ocpinstall复制代码

生成的文件:

├── auth
│   ├── kubeadmin-password
│   └── kubeconfig
├── bootstrap.ign
├── master.ign
├── metadata.json
└── worker.ign复制代码

准备一个 HTTP 服务,这里选择使用 Nginx:

$ yum install -y nginx复制代码

修改 Nginx 的配置文件 /etc/nginx/nginx/.conf,将端口改为 8080(因为负载均衡器已经占用了 80 端口)。然后启动 Nginx 服务:

$ systemctl enable nginx --now复制代码

将 Ignition 配置文件拷贝到 HTTP 服务的 ignition 目录:

$ mkdir /usr/share/nginx/html/ignition
$ cp -r *.ign /usr/share/nginx/html/ignition/复制代码

获取 RHCOS 的 BIOS 文件

下载用于裸机安装的 BIOS 文件,并上传到 Nginx 的目录:

$ mkdir /usr/share/nginx/html/install
$ wget https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.4/latest/rhcos-4.4.3-x86_64-metal.x86_64.raw.gz -O /usr/share/nginx/html/install/rhcos-4.4.3-x86_64-metal.x86_64.raw.gz复制代码

获取 RHCOS 的 ISO 文件

本地下载 RHCOS 的 ISO 文件:mirror.openshift.com/pub/openshi…,然后上传到 vSphere。步骤如下:

① 首先登陆 vSphere,然后点击『存储』。 

② 选择一个『数据存储』,然后在右边的窗口中选择『上载文件』。

③ 选择刚刚下载的 ISO 文件,上传到 ESXI 主机。

7. 安装集群

Bootstrap

最后开始正式安装集群,先创建 bootstrap 节点虚拟机,操作系统选择『Red Hat Enterprise Linux 7 (64-Bit)』,并挂载之前上传的 ISO,按照之前的表格设置 CPU 、内存和硬盘,打开电源,然后按照下面的步骤操作:

① 在 RHCOS Installer 安装界面按 Tab 键进入引导参数配置选项。

② 在默认选项 coreos.inst = yes 之后添加(由于无法拷贝粘贴,请输入仔细核对后再回车进行):

ip=192.168.57.61::192.168.57.1:255.255.255.0:bootstrap.openshift4.example.com:ens192:none nameserver=192.168.57.60 coreos.inst.install_dev=sda coreos.inst.image_url=http://192.168.57.60:8080/install/rhcos-4.4.3-x86_64-metal.x86_64.raw.gz coreos.inst.ignition_url=http://192.168.57.60:8080/ignition/bootstrap.ign 复制代码

其中 ip=... 的含义为 ip=$IPADDRESS::$DEFAULTGW:$NETMASK:$HOSTNAMEFQDN:$IFACE:none

如图所示:

③ 如果安装有问题会进入 emergency shell,检查网络、域名解析是否正常,如果正常一般是以上参数输入有误,reboot 退出 shell 回到第一步重新开始。

安装成功后从基础节点通过命令 ssh -i ~/.ssh/new_rsa core@192.168.57.61 登录 bootstrap 节点,然后验证:

  • 网络配置是否符合自己的设定:
    • hostname
    • ip route
    • cat /etc/resolv.conf
  • 验证是否成功启动 bootstrap 相应服务:
    • podman ps 查看服务是否以容器方式运行
    • 使用 ss -tulnp 查看 6443 和 22623 端口是否启用。

这里简单介绍一下 bootstrap 节点的启动流程,它会先通过 podman 跑一些容器,然后在容器里面启动临时控制平面,这个临时控制平面是通过 CRIO 跑在容器里的,有点绕。。直接看命令:

$ podman ps -a --no-trunc --sort created --format "{{.Command}}"start --tear-down-early=false --asset-dir=/assets --required-pods=openshift-kube-apiserver/kube-apiserver,openshift-kube-scheduler/openshift-kube-scheduler,openshift-kube-controller-manager/kube-controller-manager,openshift-cluster-version/cluster-version-operator
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml
render --dest-dir=/assets/cco-bootstrap --cloud-credential-operator-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:244ab9d0fcf7315eb5c399bd3fa7c2e662cf23f87f625757b13f415d484621c3
bootstrap --etcd-ca=/assets/tls/etcd-ca-bundle.crt --etcd-metric-ca=/assets/tls/etcd-metric-ca-bundle.crt --root-ca=/assets/tls/root-ca.crt --kube-ca=/assets/tls/kube-apiserver-complete-client-ca-bundle.crt --config-file=/assets/manifests/cluster-config.yaml --dest-dir=/assets/mco-bootstrap --pull-secret=/assets/manifests/openshift-config-secret-pull-secret.yaml --etcd-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:aba3c59eb6d088d61b268f83b034230b3396ce67da4f6f6d49201e55efebc6b2 --kube-client-agent-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:8eb481214103d8e0b5fe982ffd682f838b969c8ff7d4f3ed4f83d4a444fb841b --machine-config-operator-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:31dfdca3584982ed5a82d3017322b7d65a491ab25080c427f3f07d9ce93c52e2 --machine-config-oscontent-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:b397960b7cc14c2e2603111b7385c6e8e4b0f683f9873cd9252a789175e5c4e1 --infra-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:d7862a735f492a18cb127742b5c2252281aa8f3bd92189176dd46ae9620ee68a --keepalived-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:a882a11b55b2fc41b538b59bf5db8e4cfc47c537890e4906fe6bf22f9da75575 --coredns-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:b25b8b2219e8c247c088af93e833c9ac390bc63459955e131d89b77c485d144d --mdns-publisher-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:dea1fcb456eae4aabdf5d2d5c537a968a2dafc3da52fe20e8d99a176fccaabce --haproxy-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:7064737dd9d0a43de7a87a094487ab4d7b9e666675c53cf4806d1c9279bd6c2e --baremetal-runtimecfg-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:715bc48eda04afc06827189883451958d8940ed8ab6dd491f602611fe98a6fba --cloud-config-file=/assets/manifests/cloud-provider-config.yaml --cluster-etcd-operator-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9f7a02df3a5d91326d95e444e2e249f8205632ae986d6dccc7f007ec65c8af77
render --prefix=cluster-ingress- --output-dir=/assets/ingress-operator-manifests
/usr/bin/cluster-kube-scheduler-operator render --manifest-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:187b9d29fea1bde9f1785584b4a7bbf9a0b9f93e1323d92d138e61c861b6286c --asset-input-dir=/assets/tls --asset-output-dir=/assets/kube-scheduler-bootstrap --config-output-file=/assets/kube-scheduler-bootstrap/config
/usr/bin/cluster-kube-controller-manager-operator render --manifest-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:187b9d29fea1bde9f1785584b4a7bbf9a0b9f93e1323d92d138e61c861b6286c --asset-input-dir=/assets/tls --asset-output-dir=/assets/kube-controller-manager-bootstrap --config-output-file=/assets/kube-controller-manager-bootstrap/config --cluster-config-file=/assets/manifests/cluster-network-02-config.yml
/usr/bin/cluster-kube-apiserver-operator render --manifest-etcd-serving-ca=etcd-ca-bundle.crt --manifest-etcd-server-urls=https://localhost:2379 --manifest-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:187b9d29fea1bde9f1785584b4a7bbf9a0b9f93e1323d92d138e61c861b6286c --manifest-operator-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:718ca346d5499cccb4de98c1f858c9a9a13bbf429624226f466c3ee2c14ebf40 --asset-input-dir=/assets/tls --asset-output-dir=/assets/kube-apiserver-bootstrap --config-output-file=/assets/kube-apiserver-bootstrap/config --cluster-config-file=/assets/manifests/cluster-network-02-config.yml
/usr/bin/cluster-config-operator render --config-output-file=/assets/config-bootstrap/config --asset-input-dir=/assets/tls --asset-output-dir=/assets/config-bootstrap
/usr/bin/cluster-etcd-operator render --etcd-ca=/assets/tls/etcd-ca-bundle.crt --etcd-metric-ca=/assets/tls/etcd-metric-ca-bundle.crt --manifest-etcd-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:aba3c59eb6d088d61b268f83b034230b3396ce67da4f6f6d49201e55efebc6b2 --etcd-discovery-domain=test.example.com --manifest-cluster-etcd-operator-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9f7a02df3a5d91326d95e444e2e249f8205632ae986d6dccc7f007ec65c8af77 --manifest-setup-etcd-env-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:31dfdca3584982ed5a82d3017322b7d65a491ab25080c427f3f07d9ce93c52e2 --manifest-kube-client-agent-image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:8eb481214103d8e0b5fe982ffd682f838b969c8ff7d4f3ed4f83d4a444fb841b --asset-input-dir=/assets/tls --asset-output-dir=/assets/etcd-bootstrap --config-output-file=/assets/etcd-bootstrap/config --cluster-config-file=/assets/manifests/cluster-network-02-config.yml
render --output-dir=/assets/cvo-bootstrap --release-image=registry.openshift4.example.com/ocp4/openshift4@sha256:4a461dc23a9d323c8bd7a8631bed078a9e5eec690ce073f78b645c83fb4cdf74
/usr/bin/grep -oP Managed /manifests/0000_12_etcd-operator_01_operator.cr.yaml复制代码
$ crictl podsPOD ID              CREATED             STATE               NAME                                                                  NAMESPACE                             ATTEMPT
17a978b9e7b1e       3 minutes ago       Ready               bootstrap-kube-apiserver-bootstrap.openshift4.example.com             kube-system                           24
8a0f79f38787a       3 minutes ago       Ready               bootstrap-kube-scheduler-bootstrap.openshift4.example.com             kube-system                           4
1a707da797173       3 minutes ago       Ready               bootstrap-kube-controller-manager-bootstrap.openshift4.example.com    kube-system                           4
0461d2caa2753       3 minutes ago       Ready               cloud-credential-operator-bootstrap.openshift4.example.com            openshift-cloud-credential-operator   4
ab6519286f65a       3 minutes ago       Ready               bootstrap-cluster-version-operator-bootstrap.openshift4.example.com   openshift-cluster-version             2
457a7a46ec486       8 hours ago         Ready               bootstrap-machine-config-operator-bootstrap.openshift4.example.com    default                               0
e4df49b4d36a1       8 hours ago         Ready               etcd-bootstrap-member-bootstrap.openshift4.example.com                openshift-etcd                        0复制代码

如果验证无问题,则可以一边继续下面的步骤一边观察日志:journalctl -b -f -u bootkube.service

RHCOS 的默认用户是 core,如果想获取 root 权限,可以执行命令 sudo su(不需要输入密码)。

Master

控制节点和之前类似,先创建虚拟机,然后修改引导参数,引导参数调整为:

ip=192.168.57.62::192.168.57.1:255.255.255.0:master1.openshift4.example.com:ens192:none nameserver=192.168.57.60 coreos.inst.install_dev=sda coreos.inst.image_url=http://192.168.57.60:8080/install/rhcos-4.4.3-x86_64-metal.x86_64.raw.gz coreos.inst.ignition_url=http://192.168.57.60:8080/ignition/master.ign 复制代码

控制节点安装成功后会重启一次,之后同样可以从基础节点通过 SSH 密钥登录。

然后重复相同的步骤创建其他两台控制节点,注意修改引导参数(IP 和主机名)。先不急着创建计算节点,先在基础节点执行以下命令完成生产控制平面的创建:

$ openshift-install --dir=/ocpinstall wait-for bootstrap-complete --log-level=debugDEBUG OpenShift Installer 4.4.5
DEBUG Built from commit 15eac3785998a5bc250c9f72101a4a9cb767e494
INFO Waiting up to 20m0s for the Kubernetes API at https://api.openshift4.example.com:6443...
INFO API v1.17.1 up
INFO Waiting up to 40m0s for bootstrapping to complete...
DEBUG Bootstrap status: complete
INFO It is now safe to remove the bootstrap resources复制代码

待出现 It is now safe to remove the bootstrap resources 提示之后,从负载均衡器中删除引导主机,本文使用的是 Envoy,只需从 cds.yaml 中删除引导主机的 endpoint,然后重新加载就好了。

观察引导节点的日志:

$ journalctl -b -f -u bootkube.service...
Jun 05 00:24:12 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:12.108179       1 waitforceo.go:67] waiting on condition EtcdRunningInCluster in etcd CR /cluster to be True.
Jun 05 00:24:21 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:21.595680       1 waitforceo.go:67] waiting on condition EtcdRunningInCluster in etcd CR /cluster to be True.
Jun 05 00:24:26 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:26.250214       1 waitforceo.go:67] waiting on condition EtcdRunningInCluster in etcd CR /cluster to be True.
Jun 05 00:24:26 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:26.306421       1 waitforceo.go:67] waiting on condition EtcdRunningInCluster in etcd CR /cluster to be True.
Jun 05 00:24:29 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:29.097072       1 waitforceo.go:64] Cluster etcd operator bootstrapped successfully
Jun 05 00:24:29 bootstrap.openshift4.example.com bootkube.sh[12571]: I0605 00:24:29.097306       1 waitforceo.go:58] cluster-etcd-operator bootstrap etcd
Jun 05 00:24:29 bootstrap.openshift4.example.com podman[16531]: 2020-06-05 00:24:29.120864426 +0000 UTC m=+17.965364064 container died 77971b6ca31755a89b279fab6f9c04828c4614161c2e678c7cba48348e684517 (image=quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9f7a02df3a5d91326d95e444e2e249f8205632ae986d6dccc7f007ec65c8af77, name=recursing_cerf)
Jun 05 00:24:29 bootstrap.openshift4.example.com bootkube.sh[12571]: bootkube.service complete复制代码

Worker

计算节点和之前类似,先创建虚拟机,然后修改引导参数,引导参数调整为:

ip=192.168.57.65::192.168.57.1:255.255.255.0:worker1.openshift4.example.com:ens192:none nameserver=192.168.57.60 coreos.inst.install_dev=sda coreos.inst.image_url=http://192.168.57.60:8080/install/rhcos-4.4.3-x86_64-metal.x86_64.raw.gz coreos.inst.ignition_url=http://192.168.57.60:8080/ignition/worker.ign 复制代码

计算节点安装成功后也会重启一次,之后同样可以从基础节点通过 SSH 密钥登录。

然后重复相同的步骤创建其他计算节点,注意修改引导参数(IP 和主机名)。

登录集群

可以通过导出集群 kubeconfig 文件以默认系统用户身份登录到集群。kubeconfig 文件包含有关 CLI 用于将客户端连接到正确的集群和 API Server 的集群信息,该文件在 OCP 安装期间被创建。

$ mkdir ~/.kube
$ cp /ocpinstall/auth/kubeconfig ~/.kube/config
$ oc whoami
system:admin复制代码

批准 CSR

将节点添加到集群时,会为添加的每台节点生成两个待处理证书签名请求(CSR)。必须确认这些 CSR 已获得批准,或者在必要时自行批准。

$ oc get nodeNAME                             STATUS   ROLES           AGE     VERSION
master1.openshift4.example.com   Ready    master,worker   6h25m   v1.17.1
master2.openshift4.example.com   Ready    master,worker   6h39m   v1.17.1
master3.openshift4.example.com   Ready    master,worker   6h15m   v1.17.1
worker1.openshift4.example.com   NotReady worker          5h8m    v1.17.1
worker2.openshift4.example.com   NotReady worker          5h9m    v1.17.1复制代码

输出列出了创建的所有节点。查看挂起的证书签名请求(CSR),并确保添加到集群的每台节点都能看到具有 Pending 或 Approved 状态的客户端和服务端请求。针对 Pending 状态的 CSR 批准请求:

$ oc adm certificate approve xxx复制代码

或者执行以下命令批准所有 CSR:

$ oc get csr -ojson | jq -r '.items[] | select(.status == {} ) | .metadata.name' | xargs oc adm certificate approve复制代码

Operator 自动初始化

控制平面初始化后,需要确认所有的 Operator 都处于可用的状态,即确认所有 Operator 的 Available 字段值皆为 True

$ oc get clusteroperatorsNAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
authentication                             4.4.5     True        False         False      150m
cloud-credential                           4.4.5     True        False         False      7h7m
cluster-autoscaler                         4.4.5     True        False         False      6h12m
console                                    4.4.5     True        False         False      150m
csi-snapshot-controller                    4.4.5     True        False         False      6h13m
dns                                        4.4.5     True        False         False      6h37m
etcd                                       4.4.5     True        False         False      6h19m
image-registry                             4.4.5     True        False         False      6h12m
ingress                                    4.4.5     True        False         False      150m
insights                                   4.4.5     True        False         False      6h13m
kube-apiserver                             4.4.5     True        False         False      6h15m
kube-controller-manager                    4.4.5     True        False         False      6h36m
kube-scheduler                             4.4.5     True        False         False      6h36m
kube-storage-version-migrator              4.4.5     True        False         False      6h36m
machine-api                                4.4.5     True        False         False      6h37m
machine-config                             4.4.5     True        False         False      6h36m
marketplace                                4.4.5     True        False         False      6h12m
monitoring                                 4.4.5     True        False         False      6h6m
network                                    4.4.5     True        False         False      6h39m
node-tuning                                4.4.5     True        False         False      6h38m
openshift-apiserver                        4.4.5     True        False         False      6h14m
openshift-controller-manager               4.4.5     True        False         False      6h12m
openshift-samples                          4.4.5     True        False         False      6h11m
operator-lifecycle-manager                 4.4.5     True        False         False      6h37m
operator-lifecycle-manager-catalog         4.4.5     True        False         False      6h37m
operator-lifecycle-manager-packageserver   4.4.5     True        False         False      6h15m
service-ca                                 4.4.5     True        False         False      6h38m
service-catalog-apiserver                  4.4.5     True        False         False      6h38m
service-catalog-controller-manager         4.4.5     True        False         False      6h39m
storage                                    4.4.5     True        False         False      6h12m复制代码

如果 Operator 不正常,需要进行问题诊断和修复。

完成安装

最后一步,完成集群的安装,执行以下命令:

$ openshift-install --dir=/ocpinstall wait-for install-complete --log-level=debug复制代码

注意最后提示访问 Web Console 的网址及用户密码。如果密码忘了也没关系,可以查看文件 /ocpinstall/auth/kubeadmin-password 来获得密码。

本地访问 Web Console,需要添加 hosts:

192.168.57.60 console-openshift-console.apps.openshift4.example.com
192.168.57.60 oauth-openshift.apps.openshift4.example.com复制代码

浏览器访问 https://console-openshift-console.apps.openshift4.example.com,输入上面输出的用户名密码登录。首次登录后会提示:

You are logged in as a temporary administrative user. Update the Cluster OAuth configuration to allow others to log in.复制代码

我们可以通过 htpasswd 自定义管理员账号,步骤如下:

① htpasswd -c -B -b users.htpasswd admin xxxxx

② 将 users.htpasswd 文件下载到本地。

③ 在 Web Console 页面打开 Global Configuration

然后找到 OAuth,点击进入,然后添加 HTPasswd 类型的 Identity Providers,并上传 users.htpasswd 文件。

④ 退出当前用户,注意要退出到如下界面:

选择 htpasswd,然后输入之前创建的用户名密码登录。

如果退出后出现的就是用户密码输入窗口,实际还是 kube:admin 的校验,如果未出现如上提示,可以手动输入 Web Console 地址来自动跳转。

⑤ 登录后貌似能看到 Administrator 菜单项,但访问如 OAuth Details 仍然提示:

oauths.config.openshift.io "cluster" is forbidden: User "admin" cannot get resource "oauths" in API group "config.openshift.io" at the cluster scope复制代码

因此需要授予集群管理员权限:

$ oc adm policy add-cluster-role-to-user cluster-admin admin复制代码

Web Console 部分截图:

如果想删除默认账号,可以执行以下命令:

$ oc -n kube-system delete secrets kubeadmin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue + Element UI 实现 登陆注册基本demo实例

Vue Element UI 实现权限管理系统 前端篇&#xff08;二&#xff09;&#xff1a;Vue Element 案例 导入项目 打开 Visual Studio Code&#xff0c;File --> add Folder to Workspace&#xff0c;导入我们的项目。 安装 Element 安装依赖 Element 是国内饿了么公司提供…

svn 客户端批量备份数据(图+文)

缘由 商业用途的规则&#xff0c;数据与谨慎便成了不可替代的王道&#xff0c;我今天也说svn&#xff0c;在客户端批量备份数据。 前提 考虑跨平台与易用性&#xff0c;选择批处理&#xff08;.bat&#xff09;&#xff0c;既然是批处理&#xff0c;少不了的便是命令和执行命…

Vue项目 报错TypeError [ERR INVALID ARG TYPE]: The “path“ argument must be of type string

# Vue项目 报错TypeError [ERR INVALID ARG TYPE]: The “path“ argument must be of type string 卡了半天&#xff0c;原来是sassloader版本过高导致的&#xff0c; 解决方法: 回退7.版本npm uninstall sass-loader&#xff08;卸载当前版本&#xff09; npm install sass…

使用python来访问Hadoop HDFS存储实现文件的操作

在调试环境下&#xff0c;咱们用hadoop提供的shell接口测试增加删除查看&#xff0c;但是不利于复杂的逻辑编程查看文件内容www.xiaorui.cc用python访问hdfs是个很头疼的事情。。。。这个是pyhdfs的库import pyhdfs fs pyhdfs.connect("192.168.1.1", 9000) pyhdfs.…

vue+axios请求时设置request header请求头(带上token)

vueaxios请求时设置请求头&#xff08;带上token&#xff09; 1.在vue中&#xff0c;向后台发送请求&#xff0c;不管是get或post&#xff0c;url要带上userId&#xff0c;headers要带上token值&#xff08;本地存储的token&#xff0c;window.localStorage[‘token’]&#x…

LINQ能不能用系列(一)LINQ to Object 效率比对

前言 简介&#xff1a;LINQ&#xff0c;语言集成查询&#xff08;Language INtegrated Query&#xff09;是一组用于c#和Visual Basic语言的扩展。 分类&#xff1a;LINQ to Object, LINQ to XML, LINQ to SQL, LINQ to DataSet&#xff0c;LINQ to ADO.NET。 相关&#xff…

防雷避险手册

为什么80%的码农都做不了架构师&#xff1f;>>> 防雷避险手册 防雷避险手册.pdf 转载于:https://my.oschina.net/tadcat/blog/148504

OpenCV调用YOLOv4进行目标检测

目标检测就是对目标进行动态实时跟踪定位&#xff0c;常见的目标检测算法有 R-CNN、Fast R-CNN、Faster R-CNN、SSD、Yolo 等&#xff0c;其中 Yolo 的速度和精确度都比较高&#xff0c;且只需训练一次&#xff0c;使用起来比较方便。 这里我们就使用官方现成的模型来检测图片…

2024年3月电子学会青少年编程等级考试时间安排

1考试方式 1. 在线居家考试&#xff08;全国&#xff09;&#xff1b; 2. 对于符合线下考试要求的考试服务网点&#xff0c;经地方实地调研报学会总部批准后&#xff0c;可组织线下考试。 2报名时间 报名时间&#xff1a;2023年12月21日-2024年3月12日16:00&#xff1b; 考…

scan-cvs-user.sh

为什么80%的码农都做不了架构师&#xff1f;>>> scan-cvs-user.sh #! /bin/sh export LC_ALLzh_CN.UTF-8 cd /bin2/ sh scan-cvs-user-daily.sh > scan-cvs-user-daily.sh.log 2>&1 /usr/bin/mutt -s "scan-cvs-user-daily" scm-svr-mtrsc…

LINQ能不能用系列(二)LINQ to SQL 效率比对

前言 很多人听说过LINQ TO SQL与ADO.NET传统方式用于不同的环境&#xff0c;LINQ TO SQL与ADO.NET传统方式也没有可比性&#xff0c;就像公交车与私家车一样&#xff0c;虽然是车但用途完全不同&#xff0c;但很少有人去探究&#xff0c;究竟为什么他们不同&#xff0c;他们不…

libgdx游戏引擎开发笔记(十三)SuperJumper游戏例子的讲解(篇七)----各个物体的创建及其碰撞检测...

接着上一篇&#xff0c;我们完成后续的扫尾工作&#xff1a;游戏中个物体创建及其碰撞检测,分数保存&#xff0c;音效处理。1.World类&#xff1a;&#xff08;加入所有物体&#xff0c;及其碰撞检测&#xff0c;代码里有详细注解&#xff09;package com.zhf.mylibgdx; import…

Sql Server内置函数实现MD5加密

实例 MD5加密“123456”&#xff1a; HashBytes(MD5,123456) 结果&#xff1a;0xE10ADC3949BA59ABBE56E057F20F883E &#xff08;提示&#xff1a;看完最后&#xff0c;结果要进行转换。&#xff09; 函数 函数描述返回值 HashBytes HashBytes (加密方式, 待加密的值)加密方…

Ubuntu16.04 Caffe 编译安装步骤记录

历时一周终于在 ubuntu16.04 系统成功安装 caffe 并编译&#xff0c;网上有很多教程&#xff0c;但是某些步骤并没有讲解详尽&#xff0c;导致配置过程总是出现各种各样匪夷所思的问题&#xff0c;尤其对于新手而言更是欲哭无泪&#xff0c;在我饱受折磨后决定把安装步骤记录下…

oracle11g arm,想知道ARM11架构?这篇介绍告诉你

实际上&#xff0c;处理器采用的架构才是影响处理器性能的关键因素。手机中采用的ARM架构&#xff0c;从最早的ARM9到下一代的Cortex-A15&#xff0c;已经经历了多次的更新换代&#xff0c;每一次的升级都带来了性能的大幅提升&#xff0c;那么它们各自的性能到底怎么样呢?今天…

C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载)

前言 C# 用IP地址&#xff08;123.125.114.144&#xff09;查询位置&#xff08;北京市百度公司&#xff09;的东西&#xff0c;非常好用也非常方便&#xff0c;可手动升级刷新IP库&#xff0c;一次编码永久收益&#xff0c;可支持winform、asp.net等程序。 本文使用的IP库为…

常用Sql整理笔记

一、多行结果转换为一行&#xff0c;用逗号隔开。 mssql代码如下&#xff1a; 点击打开 -- 多行select tid from typeinfo where pid4-- 一行select STUFF((Select ,Convert(varchar(50),tid) FROM typeinfo where pid4 FOR XML PATH()),1,1,) as tid sqlite代码如下&#xff…

oracle中视图窗粉色的,Oracle 11g日常操作与维护手册

# /oracle/crs/bin/srvctl config nodeapps -a -n linux1RAC安装完以后&#xff0c;可以修改两个节点的VIP。前提是修改后的VIP必须没有被其他系统使用掉。正确的修改方法如下&#xff1a;步骤1&#xff1a;使用srvctl修改VIP进入/crs/bin目录下执行如下命令&#xff1a;# ./sr…

3D手势姿态跟踪算法:手机端实时检测,多个手势同时捕捉

就在不久前&#xff0c;Google 人工智能实验室宣布&#xff0c;他们在「实时手部跟踪」方面取得了新的进展&#xff0c;并将这项新技术运用在了 MediaPipe 中&#xff0c;这也是 AI 计算机视觉任务的一大突破。这一技术不光可以在手机上实现实时捕捉性能&#xff0c;甚至可以同…

Windows服务的快速搭建与调试(C#图解)

目录 一、什么是Windows 服务&#xff1f; 二、创建Windows 服务与安装/卸载批处理。 三、调试Windows 服务。 正文 一、什么是Windows 服务&#xff1f; 答&#xff1a;Microsoft Windows 服务&#xff08;即&#xff0c;以前的 NT 服务&#xff09;使您能够创建在它们自…