参考:OpenShift 4 - CRC(Codeready Container)单机版

OpenShift / RHEL / DevSecOps 汇总目录

一、关于 CRC - Codeready Container(最新名称 OpenShift Local)

1.1 CRC功能定位

通常一套正式的OpenShift集群至少需要3个物理或虚拟节点,这对于一般技术人员学习产品或开发大多数应用显然是比较高的环境。为了降低OpenShift开发学习的门槛,Redhat为用户提供了一个可以单机运行的OpenShift(Codeready Container - CRC)环境。CRC是直接运行在虚拟机中,当我们下载虚拟机并启动后,一个OpenShift环境就运行起来了

1.2 准备运行环境

1.2.1 运行环境要求

CRC是一个最小的OpenShift环境,运行过程需要的所有资源需要在线下载,因此他必须在一个能访问Internet的环境中运行。RedHat目前提供Linux-KVM、Mac-HyperKit和Windows-HyperV三种格式的CRC虚拟机文件,我们可以根据自己的环境下载对应的CRC文件。

另外你还需要一个 https://developers.redhat.com 的有效用户,用来下载允许 CRC 从 RedHat 网站拉取镜像的 pull secret 文件。

运行CRC的最低硬件环境如下,但是为了能够更好地运行,建议能提供更多的资源。

  • 4 vCPUs
  • 10 GB 空余内存
  • 35 GB 存储

注意如果运行 CRC 的宿主机也是一个虚拟机,需要打开虚拟化软件的嵌套功能,以允许在宿主虚拟机中运行CRC虚拟机

如果使用Linux作为CRC的宿主机操作系统,建议使用 RHEL/CentOS 7.5 或更高版本(本文使用的是RHEL 7.8),并最好安装图形化桌面。如果使用其它 Linux,可参见“参考文档”。

CRC 4.11 安装的软件条件:

  •  Windows

        Windows 10 Update(1709)或者更新版本,但是不包括 Windows 10 家庭版.

  • macOS

        macOS 10.12 Sierra或者更新版

  • Linux

        •CRC支持 Red Hat Enterprise Linux/CentOS 7.5 或者更新版
        • Ubuntu 18.04 LTS 和 Debian 10 没有官方支持

1.2.2 创建用户

请用 root 用户完成以下操作。

创建一个用户(例如 “crc”),并将他加入到“wheel”组中(会自动拥有sudoer)。

$ useradd crc -G wheel

1.2.3 安装KVM虚拟化组件

RHEL/CentOS 的环境可以分别执行以下命令安装CRC所需要的 libvirt 和 NetworkManager 组件:

$ yum install -y virt-manager libvirt libvirt-python python-virtinst libvirt-client
$ yum install -y qemu-kvm qemu-img
$ yum install -y NetworkManager

如果使用 KVM虚拟机安装运行CRC,需要KVM虚拟机开启虚拟化支持,详情参考《在 Centos7 的KVM虚拟机上启用嵌套虚拟化》 

1.3 下载CRC和Pull Secret

  CRC和Pull Secret下载地址:console.redhat.com

1.3.1 下载CRC 

1.3.2 下载Pull Secret

请用 crc 用户完成以下操作:
https://mirror.openshift.com/pub/openshift-v4/clients/crc/latest/下载Linux、Mac和Windows平台的CRC虚拟机文件。本文使用的基于RHEL的Linux环境,因此下载 crc-linux-amd64.tar.xz 文件即可。

$ curl -o ~/crc-linux-amd64.tar.xz https://mirror.openshift.com/pub/openshift-v4/clients/crc/2.8.0/crc-linux-amd64.tar.xz
$ tar -xvf ~/crc-linux-amd64.tar.xz
$ cd ~/crc-linux-2.8.0-amd64
$ export PATH=$PATH:~/crc-linux-2.8.0-amd64

登录 https://cloud.redhat.com/openshift/install/pull-secret,然后下载pull secret到“~/crc-linux-2.6.0-amd64”目录下pull-secret.json文件。

二、安装运行CRC

请用 crc 用户完成以下操作。

2.1 第一次运行

可以用下命令查看所有crc的运行参数,并且设置相关参数。

$ crc config
$ crc config set cpus 8
$ crc config set memory 20480
$ crc config set disk-size 100
$ crc config set kubeadmin-password openshift
$ crc config set pull-secret-file pull-secret.json
$ crc config set enable-cluster-monitoring true
$ crc config set consent-telemetry no
$ crc config view 

设置CRC运行环境,这一步会用下载的文件解压出VM运行文件。

$ crc setup

然后执行命令启动CRC的虚机,也可以在启动是指定运行参数,其中

  • “-c”指的是使用cpu的数量;
  • “-m”指定的虚机使用内存量,单位是MB;
  • “-d”指定的虚机使用存储空间,单位是GB;
  • ”-p“指定pull secret文件的。

2.1.1 常用的CRC命令: 

$ crc start
$ crc start -c 8 -m 20480 -d 100 -p pull-secret.json

# 查看运行状态
$ crc status
# 输出:
CRC VM:          Running
OpenShift:       Running (v4.11.7)
Podman:
Disk Usage:      22.39GB of 42.4GB (Inside the CRC VM)
Cache Usage:     16.43GB
Cache Directory: /home/openshift/.crc/cache

# 查看登录信息
$ crc console --credentials
# 输出:
To login as a regular user, run 'oc login -u developer -p developer https://api.crc.testing:6443'.
To login as an admin, run 'oc login -u kubeadmin -p openshift https://api.crc.testing:6443'

# 查看ip
$ crc ip
# 输出:
192.168.130.11

注: 

如果报错:
 Error creating machine: Error in driver during machine creation: virError(Code=9, Domain=20, Message='操作失败: 使用 uuid crc 的域 '501538bf-d959-4767-9751-561d71283c50' 已存在'   

解决办法:
    将crc KVM虚拟机删除即可:
    $ virsh list --all
    $ virsh undefine crc

在CRC虚拟机启动完成后会显示以下提示,其中说明了缺省的kubeadmin用户、密码和API-Server的访问地址。

The server is accessible via web console at:
  https://console-openshift-console.apps-crc.testing
 
Log in as administrator:
  Username: kubeadmin
  Password: openshift
 
Log in as user:
  Username: developer
  Password: developer
 
Use the 'oc' command line interface:
  $ eval $(crc oc-env)
  $ oc login -u developer https://api.crc.testing:6443

查看OpenShift的控制台访问地址。

$ crc console --url

2.1.2 常用的OC命令

1. 登录:
	oc login 
	oc login -u kubeadmin -p openshift https://api.crc.testing:6443

1.1 查看project列表	
	oc projects
	
2. 创建一个新项目:
	oc new-project ProjectName 创建一个项目(ProjectName新建的项目名) 

3. 查看当前项目下的pod: 
	oc get pod 

4. 查看project: 
	oc get project 

5. 进入一个project: 
	oc project projectname 
6. build 一份代码镜像: oc new-build (GitHub clone地址) 

7. 再一次build bcname: oc start-build (代码更新之后可使用该命令再次build代码),bcname通过 oc get bc获取 

8. 获取bcname: oc get bc 

9. run一个镜像: oc run dcname –image=xxx ,dcname为项目名,xxx为全的镜像名,通过oc get is 查看 

10. 将pod映射成一个service: oc expose dc dcname –port=xxx 

11. 将一个服务映射出域名: oc expose svc svcname –hostname=xxx,将一个服务器映射成域名,支持http/https协议,svcname可以不写默认与dcname相同 

12. 查看pod日志: oc logs -f podname 

13. 查看pod详细状态信息: oc describe pod podname 

14. 删除,获取,编辑: oc get/delete/edit pod/bc/dc/svc/route 

15. 查看域名映射: oc get route 

16. 暂时停止服务: oc scale –replicas=0 dc dcname 

17. 查看运行dc的yaml: oc export dc dcname 

18. 进入openshift中运行的pod: oc rsh podname bash 

19. 获取token: oc whoami -t

20.下载文件到本地或者上传本地文件到pod:

$ oc rsync <source> <destination> [-c <container>]
For example, to copy a local directory to a pod directory:

$ oc rsync /home/user/source devpod1234:/src
Or to copy a pod directory to a local directory:

$ oc rsync devpod1234:/src /home/user/source

2.2 关闭和再次运行

关闭CRC虚拟机

$ crc stop

再次运行CRC的时候需要注意:如果在宿主机中配置了下文中的DNS服务,在重新启动CRC前需要先关闭DNS服务,在CRC启动成功后再运行DNS服务即可。

三、访问CRC的OpenShift

3.1 从本地访问

在安装完CRC后缺省只能通过以下命令在运行虚拟机的宿主机中访问到运行在虚拟机中的OpenShift。

$ oc login -u <USERNAME> -p <PASSWORD> https://api.crc.testing:6443

可以在宿主机中执行以下命令,获得访问OpenShift Web Console的地址。

$ crc console --url

以上OpenShift的api-server和web console地址中的域名是在运行CRC的宿主机上通过hosts文件解析的。我们可以查看宿主机的hosts文件确认增加了以下内容。注意以下CRC虚机使用的IP地址是固定的“192.168.130.11”。

$ cat /etc/hosts
192.168.130.11 api.crc.testing oauth-openshift.apps-crc.testing console-openshift-console.apps-crc.testing default-route-openshift-image-registry.apps-crc.testing

3.2 从远程访问

为了能够从远程的其它节点访问到运行在宿主机中的CRC,需要解决远程“访问路径”和“域名解析”问题。本文分别使用HAProxy和hosts解决上述问题。

在这里插入图片描述


请用root 用户完成以下操作。

3.2.1 打通访问路径

我们在宿主机上运行HAProxy,用它作为代理来打通外部远程节点和运行在CRC虚拟机中OpenShift的访问路径。请用root 用户完成以下操作。

a. 安装haproxy

$ yum install -y haproxy

配置haproxy。先获得运行CRC的虚机IP地址(注意:该IP地址是KVM使用的地址,只能在宿主机上访问到),然后将其设置到haproxy的配置中,最后重启haproxy服务。

$ export CRC_IP=$(crc ip)
$ tee /etc/haproxy/haproxy.cfg &>/dev/null << EOF
global
    debug

defaults
    log global
    mode http
    timeout connect 5000
    timeout client 500000
    timeout server 500000

frontend apps
    bind 0.0.0.0:80
    option tcplog
    mode tcp
    default_backend apps

backend apps
    mode tcp
    balance roundrobin
    server webserver1 ${CRC_IP}:80 check

frontend apps_ssl
    bind 0.0.0.0:443
    option tcplog
    mode tcp
    default_backend apps_ssl

backend apps_ssl
    mode tcp
    balance roundrobin
    option ssl-hello-chk
    server webserver1 ${CRC_IP}:443 check

frontend api
    bind 0.0.0.0:6443
    option tcplog
    mode tcp
    default_backend api

backend api
    mode tcp
    balance roundrobin
    option ssl-hello-chk
    server webserver1 ${CRC_IP}:6443 check
EOF
 
$ systemctl restart haproxy
$ systemctl status haproxy

注意:如果haproxy启动报告“Starting frontend api: cannot bind socket [0.0.0.0:6443]”的错误,可以执行以下命令:

$ setsebool -P haproxy_connect_any=1

b. 配置宿主机的防火墙和SELinux。

# 永久关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld

# 永久关闭selinux
$ setenforce 0
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

$ systemctl start firewalld
$ firewall-cmd --add-port=80/tcp --permanent
$ firewall-cmd --add-port=6443/tcp --permanent
$ firewall-cmd --add-port=443/tcp --permanent
$ systemctl restart firewalld
$ yum -y install policycoreutils-python-utils
$ semanage port -a -t http_port_t -p tcp 6443

3.2.2 实现域名解析

为了让远程节点能访问到CRC虚机中的域名,需要在运行CRC的宿主机上安装DNS服务,然后将远程节点的DNS指向CRC宿主机上。请用root 用户完成以下操作。

a. 首先在运行CRC的宿主机上安装并配置DNS服务,使其能对“crc.testing”和“apps-crc.testing”域名解析。其中 “NAME_SERVER” 设为运行CRC虚拟机的宿主机地址。

$ yum -y install bind bind-utils

$ systemctl enable named --now
$ systemctl status named
$ systemctl stop named
$ systemctl start named
$ systemctl restart named

$ export NAME_SERVER=192.168.203.171
$ cp /etc/named.conf{,_bak}
$ sed -i -e "s/listen-on port.*/listen-on port 53 { any; };/" /etc/named.conf
$ sed -i -e "s/allow-query.*/allow-query { any; };/" /etc/named.conf
$ sed -i '/recursion yes;/a \
        forward first; \
        forwarders { 114.114.114.114; 8.8.8.8; };' /etc/named.conf
$ sed -i -e "s/dnssec-enable.*/dnssec-enable no;/" /etc/named.conf
$ sed -i -e "s/dnssec-validation.*/dnssec-validation no;/" /etc/named.conf 
 
$ cat >> /etc/named.rfc1912.zones << EOF
zone "crc.testing" IN {
        type master;
        file "crc.testing.zone";
        allow-update { none; };
};

zone "apps-crc.testing" IN {
        type master;
        file "apps-crc.testing.zone";
        allow-update { none; };
};
EOF
 
$ cat > /var/named/crc.testing.zone << EOF
\$TTL 1D
@       IN SOA  crc.testing. admin.crc.testing. (    
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry 
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns.crc.testing.          
*       IN A    ${NAME_SERVER}
EOF
 
$ cat > /var/named/apps-crc.testing.zone << EOF
\$TTL 1D
@       IN SOA  apps-crc.testing. admin.apps-crc.testing. (    
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry 
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns.apps-crc.testing.          
*       IN A    ${NAME_SERVER}
EOF
 
$ systemctl restart named

b. 将远程节点的 dns 指向运行CRC的宿主机的地址(即“${NAME_SERVER}”)

这样远程节点就可以解析 “crc.testing” 和 “apps-crc.testing” 域名了。

$ vi /etc/resolv.conf
# 修改如下内容:
DNS1=10.111.101.133

3.2.3 从远程节点访问CRC的OpenShift

在远程节点上访问CRC中的OpenShift。

$ oc login -u <USERNAME> -p <PASSWORD> https://api.crc.ocp:6443

# use:
$ oc login -u kubeadmin -p openshift https://api.crc.testing:6443

在远程节点上用浏览器访问 https://console-openshift-console.apps-crc.testing/

3.3 登录运行 CRC 的虚拟机

运行CRC的虚拟机IP地址统一是192.168.130.11,我们可以用虚拟机对应的私钥登录这个虚拟机。

$ ssh -i /home/crc/.crc/machines/crc/id_ecdsa core@192.168.130.11
Red Hat Enterprise Linux CoreOS 49.83.202102090044-0
  Part of OpenShift 4.11, RHCOS is a Kubernetes native operating system
  managed by the Machine Config Operator (`clusteroperator/machine-config`).
 
WARNING: Direct SSH access to machines is not recommended; instead,
make configuration changes via `machineconfig` objects:
  https://docs.openshift.com/container-platform/4.9/architecture/architecture-rhcos.html
 
---
[core@crc-l6qvn-master-0 ~]

四、自动安装配置CRC的Shell脚本

可以将以下内容保存在运行CRC虚机的宿主机上,然后使用非root用户按照shell运行,即可完成CRC下载、安装和远程访问的设置。
 

注意

  1. 请用运行CRC虚机的宿主机的IP替换以下“<YOUR_IP>”。
  2. 请通过CRC_VERSION参数指定使用的CRC版本号。
  3. 请通过CPU、MEMORY_SIZE、DISK_SIZE参数设置CRC使用资源量(其中内存的单位是MB,存储单位是GB)。以下是最小的资源使用量。
  4. 以下shell脚本不包含准备libvirt环境。如需要安装,请参见本文开始部分。

自动安装脚本:

export NAME_SERVER=<YOUR_IP>
##将常用变量写入~/.bashrc文件
cat << EOF >> ~/.bashrc
export CRC_PATH=/apps/crc
export CRC_VERSION=2.8.0
export CPU=8
export MEMORY_SIZE=20480
export DISK_SIZE=100
export PATH=\${CRC_PATH}:\$PATH
EOF
source ~/.bashrc
#-----------------------------------------------------------------------------------------------------
##下载最新版CRC文件并解压到指定目录
sudo mkdir -p ${CRC_PATH}
sudo curl http://mirror.openshift.com/pub/openshift-v4/x86_64/clients/crc/latest/crc-linux-amd64.tar.xz -o ${CRC_PATH}/crc-linux-amd64.tar.xz
sudo tar -xvf ${CRC_PATH}/crc-linux-amd64.tar.xz -C ${CRC_PATH}
sudo mv ${CRC_PATH}/crc-linux-${CRC_VERSION}-amd64/* ${CRC_PATH}
sudo rm -rf ${CRC_PATH}/crc-linux-${CRC_VERSION}-amd64
sudo rm -f ${CRC_PATH}/crc-linux-amd64.tar.xz
sudo chmod -R 757 ${CRC_PATH}
#-----------------------------------------------------------------------------------------------------
##从redhat网站获得pull secret
read -p "Please input the pull secret string from https://cloud.redhat.com/openshift/install/pull-secret:" PULL_SECRET
echo ${PULL_SECRET} > ${CRC_PATH}/pull-secret.json
#-----------------------------------------------------------------------------------------------------
##可选,配置yum repo
cat << EOF > ~/myrepo.repo
[base]
name=CentOS-7 - Base
baseurl=http://mirrors.163.com/centos/7/os/x86_64/
gpgcheck=0

[updates]
name=CentOS-7 - Updates
baseurl=http://mirrors.163.com/centos/7/updates/x86_64/
gpgcheck=0

[extras]
name=CentOS-7 - Extras
baseurl=http://mirrors.163.com/centos/7/extras/x86_64/
gpgcheck=0

EOF

sudo mv ~/myrepo.repo /etc/yum.repos.d/
#-----------------------------------------------------------------------------------------------------

sudo yum -y install NetworkManager
sudo yum -y install policycoreutils-python
sudo yum -y install haproxy
#-----------------------------------------------------------------------------------------------------
##配置启动脚本并启动CRC
crc setup
echo "crc start -c \${CPU} -m \${MEMORY_SIZE} -d \${DISK_SIZE} -p \${CRC_PATH}/pull-secret.json" > ~/crc-start
echo "crc oc-env" >> ~/crc-start
echo "crc console --url" >> ~/crc-start
chmod +x ~/crc-start
~/crc-start
#-----------------------------------------------------------------------------------------------------
##设置firewall和SELinux
sudo systemctl stop firewalld
sudo semanage port -a -t http_port_t -p tcp 6443
#-----------------------------------------------------------------------------------------------------
##配置允许远程节点访问CRC的haproxy
sudo cp /etc/haproxy/haproxy.cfg{,.bak}
export CRC_IP=$(crc ip)
sudo tee /etc/haproxy/haproxy.cfg &>/dev/null <<EOF
global
    debug

defaults
    log global
    mode http
    timeout connect 5000
    timeout client 5000
    timeout server 5000

frontend apps
    bind 0.0.0.0:80
    option tcplog
    mode tcp
    default_backend apps

backend apps
    mode tcp
    balance roundrobin
    server webserver1 $CRC_IP:80 check

frontend apps_ssl
    bind 0.0.0.0:443
    option tcplog
    mode tcp
    default_backend apps_ssl

backend apps_ssl
    mode tcp
    balance roundrobin
    option ssl-hello-chk
    server webserver1 $CRC_IP:443 check

frontend api
    bind 0.0.0.0:6443
    option tcplog
    mode tcp
    default_backend api

backend api
    mode tcp
    balance roundrobin
    option ssl-hello-chk
    server webserver1 $CRC_IP:6443 check
EOF

sudo systemctl restart haproxy
#-----------------------------------------------------------------------------------------------------
##配置允许远程节点访问CRC的内部DNS
sudo yum -y install bind bind-utils
sudo systemctl enable named --now

sudo cp /etc/named.conf{,_bak}
sudo sed -i -e "s/listen-on port.*/listen-on port 53 { any; };/" /etc/named.conf
sudo sed -i -e "s/allow-query.*/allow-query { any; };/" /etc/named.conf
sudo sed -i '/recursion yes;/a \
        forward first; \
        forwarders { 114.114.114.114; 8.8.8.8; };' /etc/named.conf
sudo sed -i -e "s/dnssec-enable.*/dnssec-enable no;/" /etc/named.conf
sudo sed -i -e "s/dnssec-validation.*/dnssec-validation no;/" /etc/named.conf

sudo cat >> /etc/named.rfc1912.zones << EOF
zone "crc.testing" IN {
        type master;
        file "crc.testing.zone";
        allow-update { none; };
};

zone "apps-crc.testing" IN {
        type master;
        file "apps-crc.testing.zone";
        allow-update { none; };
};
EOF

sudo cat > /var/named/crc.testing.zone << EOF
\$TTL 1D
@       IN SOA  @    admin.crc.testing. (    
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry 
                                        1W      ; expire
                                        3H )    ; minimum
@       NS      dns.crc.testing.          
*       IN A    ${NAME_SERVER}
EOF

sudo cat > /var/named/apps-crc.testing.zone << EOF
\$TTL 1D
@       IN SOA  @    admin.apps-crc.testing. (    
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry 
                                        1W      ; expire
                                        3H )    ; minimum
@       NS      dns.apps-crc.testing.          
*       IN A    ${NAME_SERVER}
EOF

sudo systemctl restart named

参考

https://access.redhat.com/documentation/en-us/red_hat_codeready_containers
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/virtualization_deployment_and_administration_guide/index
https://developers.redhat.com/content-gateway/rest/mirror/pub/openshift-v4/clients/crc/latest/

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐