OpenShift4.2详细安装参考同事王征的安装手册(感谢王征大师的研究和答疑解惑, 大坑文章都已经搞定了,我这里是一些小坑)

https://github.com/wangzheng422/docker_env/blob/master/redhat/ocp4/4.2.disconnect.install.md

因为我这边的环境有些不同,所以这里只是自己的补充记录,详细的需要对照来看.

1.架构

启动的虚拟机通过bridge和主机网络在同一个网段,ip规划保持和文档一致

Bootstrap nodes

192.168.7.12

master-0.ocp4.redhat.ren

192.168.7.13

master-1.ocp4.redhat.ren

192.168.7.14

master-2.ocp4.redhat.ren

192.168.7.15

worker-0.ocp4.redhat.ren

192.168.7.16

worker-1.ocp4.redhat.ren

192.168.7.17

worker-2.ocp4.redhat.ren

192.168.7.18

2.网络

我手头的机器是4台NUC,每台4CPU,32G内存,而4.2OCP集群最少需要3台master, 1个bootstrap,1台作为负载均衡,dns解析等工作,再配上几个worker节点,因此需要的机器在6+以上,采用虚拟机后,OpenShift节点启动以后的跨主机网络连接就是一个问题。

经过尝试,采用的是KVM的Bridge模式,具体设置如下。

在每台机器上设置

  • 添加一个br0
  1. [root@base ocp4]# cat /etc/sysconfig/network-scripts/ifcfg-br0
  2. TYPE=Bridge
  3. BOOTPROTO=static
  4. IPADDR=192.168.7.1
  5. NETMASK=255.255.255.0
  6. GATEWAY=192.168.7.1
  7. ONBOOT=yes
  8. DEFROUTE=yes
  9. NAME=br0
  10. DEVICE=br0
  11. PREFIX=
  • 修改现有的网卡加入br0
  1. [root@base ocp4]# cat /etc/sysconfig/network-scripts/ifcfg-eno1
  2. TYPE=Ethernet
  3. PROXY_METHOD=none
  4. BROWSER_ONLY=no
  5. BOOTPROTO=none
  6. #IPADDR=192.168.7.1
  7. #NETMASK=255.255.255.0
  8. #GATEWAY=192.168.7.1
  9. DEFROUTE=yes
  10. IPV4_FAILURE_FATAL=no
  11. IPV6INIT=yes
  12. IPV6_AUTOCONF=yes
  13. IPV6_DEFROUTE=yes
  14. IPV6_FAILURE_FATAL=no
  15. IPV6_ADDR_GEN_MODE=stable-privacy
  16. NAME=eno1
  17. UUID=4e9504c6-a5c4--88b8-89a153dd66de
  18. DEVICE=eno1
  19. ONBOOT=yes
  20. BRIDGE=br0
  • 重启网络
  1. systemctl restart network

启动以后验证笔记本还能继续连接

  1. [root@base ocp4]# ip a
  2. : lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
  3. link/loopback ::::: brd :::::
  4. inet 127.0.0.1/ scope host lo
  5. valid_lft forever preferred_lft forever
  6. inet6 ::/ scope host
  7. valid_lft forever preferred_lft forever
  8. : eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast master br0 state UP group default qlen
  9. link/ether :1f:c6:9c:: brd ff:ff:ff:ff:ff:ff
  10. : wlp3s0: <BROADCAST,MULTICAST> mtu qdisc noop state DOWN group default qlen
  11. link/ether :c2:c6:f0:c8: brd ff:ff:ff:ff:ff:ff
  12. : br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP group default qlen
  13. link/ether :1f:c6:9c:: brd ff:ff:ff:ff:ff:ff
  14. inet 192.168.7.1/ brd 192.168.7.127 scope global noprefixroute br0
  15. valid_lft forever preferred_lft forever
  16. inet6 fe80::e458:f6ff:fea8:b655/ scope link
  17. valid_lft forever preferred_lft forever
  18. : virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu qdisc noqueue state DOWN group default qlen
  19. link/ether :::6d:9d:9f brd ff:ff:ff:ff:ff:ff
  20. inet 192.168.122.1/ brd 192.168.122.255 scope global virbr0
  21. valid_lft forever preferred_lft forever
  22. : virbr0-nic: <BROADCAST,MULTICAST> mtu qdisc pfifo_fast master virbr0 state DOWN group default qlen
  23. link/ether :::6d:9d:9f brd ff:ff:ff:ff:ff:ff
  24. : vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast master br0 state UNKNOWN group default qlen
  25. link/ether fe:::9c:: brd ff:ff:ff:ff:ff:ff
  26. inet6 fe80::fc54:ff:fe9c:/ scope link
  27. valid_lft forever preferred_lft forever
  28. : vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast master br0 state UNKNOWN group default qlen
  29. link/ether fe:::::de brd ff:ff:ff:ff:ff:ff
  30. inet6 fe80::fc54:ff:fe88:62de/ scope link
  31. valid_lft forever preferred_lft forever

网络生效后,应该生成的虚拟机可以访问主机网络。

  • 建立虚拟机采用的网络
  1. [root@base data]# cat virt-net.xml
  2. <network>
  3. <name>br0</name>
  4. <forward mode='bridge'>
  5. <bridge name ='br0'/>
  6. </forward>
  7. </network>
  1. virsh net-define --file virt-net.xml
  2. virsh net-autostart br0
  3. virsh net-start br0

查看一下

  1. [root@base data]# virsh net-list
  2. Name State Autostart Persistent
  3. ----------------------------------------------------------
  4. br0 active yes yes
  5. default active yes yes

3. Yum源设置

参照3.11来设置yum源,但有一点要注意,尽量用3.11的高版本,之前用3.11.16来设置,结果导致podman build镜像到本地有问题,后来替换成3.11.146版本的yum.

  1. [root@base ocp4]# cat /etc/yum.repos.d/base.repo
  2. [base]
  3. name=base
  4. baseurl=http://192.168.7.1:8080/repo/rhel-7-server-rpms/
  5. enabled=
  6. gpgcheck=
  7. [ansible]
  8. name=ansible
  9. baseurl=http://192.168.7.1:8080/repo/rhel-7-server-ansible-2.6-rpms/
  10. enabled=
  11. gpgcheck=
  12. [extra]
  13. name=extra
  14. baseurl=http://192.168.7.1:8080/repo/rhel-7-server-extras-rpms/
  15. enabled=
  16. gpgcheck=
  17. [ose]
  18. name=ose
  19. baseurl=http://192.168.7.1:8080/repo/rhel-7-server-ose-3.11-rpms/
  20. enabled=
  21. gpgcheck=

4.启动虚拟机和安装过程

指定bridge网络启动,调整了网络和ram的大小

  1. virt-install --name=ocp4-bootstrap --vcpus= --ram= \
  2. --disk path=/data/kvm/ocp4-bootstrap.qcow2,bus=virtio,size= \
  3. --os-variant rhel8. --network bridge=br0,model=virtio \
  4. --boot menu=on --cdrom /data/ocp4/bootstrap-static.iso
  5.  
  6. virt-install --name=ocp4-master0 --vcpus= --ram= \
  7. --disk path=/data/kvm/ocp4-master0.qcow2,bus=virtio,size= \
  8. --os-variant rhel8. --network bridge=br0,model=virtio \
  9. --boot menu=on --cdrom /data/ocp4/master-.iso
  10.  
  11. virt-install --name=ocp4-master1 --vcpus= --ram= \
  12. --disk path=/data/kvm/ocp4-master1.qcow2,bus=virtio,size= \
  13. --os-variant rhel8. --network bridge=br0,model=virtio \
  14. --boot menu=on --cdrom /data/ocp4/master-.iso
  15.  
  16. virt-install --name=ocp4-master2 --vcpus= --ram= \
  17. --disk path=/data/kvm/ocp4-master2.qcow2,bus=virtio,size= \
  18. --os-variant rhel8. --network bridge=br0,model=virtio \
  19. --boot menu=on --cdrom /data/ocp4/master-.iso
  20.  
  21. virt-install --name=ocp4-worker0 --vcpus= --ram= \
  22. --disk path=/data/kvm/ocp4-worker0.qcow2,bus=virtio,size= \
  23. --os-variant rhel8. --network bridge=br0,model=virtio \
  24. --boot menu=on --cdrom /data/ocp4/worker-.iso
  25.  
  26. virt-install --name=ocp4-worker1 --vcpus= --ram= \
  27. --disk path=/data/kvm/ocp4-worker1.qcow2,bus=virtio,size= \
  28. --os-variant rhel8. --network bridge=br0,model=virtio \
  29. --boot menu=on --cdrom /data/ocp4/worker-.iso
  30.  
  31. virt-install --name=ocp4-worker2 --vcpus= --ram= \
  32. --disk path=/data/kvm/ocp4-worker2.qcow2,bus=virtio,size= \
  33. --os-variant rhel8. --network bridge=br0,model=virtio \
  34. --boot menu=on --cdrom /data/ocp4/worker-.iso

等大概5分钟时间bootstrap会ready, 可以ready以后在建立其他虚拟机

等待一段时间后

在helper节点上通过命令查看安装进度

  1. openshift-install wait-for bootstrap-complete --log-level debug

处理完存储后,还是在helper节点

  1. [root@helper ocp4]# openshift-install wait-for install-complete
  2. INFO Waiting up to 30m0s for the cluster at https://api.ocp4.redhat.ren:6443 to initialize...
  3. INFO Waiting up to 10m0s for the openshift-console route to be created...
  4. INFO Install complete!
  5. INFO To access the cluster as the system:admin user when using 'oc', run 'export KUBECONFIG=/root/ocp4/auth/kubeconfig'
  6. INFO Access the OpenShift web-console here: https://console-openshift-console.apps.ocp4.redhat.ren
  7. INFO Login to the console with user: kubeadmin, password: WRTp9-avPVu-IMWLX-KiIQ2

5. 关于bootstrap节点不ready问题

刚开始的时候,haproxy界面中bootstrap一直不ready,登录到helper上去 sudo -i, podman images看到镜像为空。

查看192.168.7.1的registry服务,发现shake hand error.

需要更新install-config.yaml中的additionalTrustBundle,和/etc/crts/redhat.ren.crt 一致

install-config.yaml中需要修改的部分用粗体标出

  1. apiVersion: v1
  2. baseDomain: redhat.ren
  3. compute:
  4. - hyperthreading: Enabled
  5. name: worker
  6. replicas:
  7. controlPlane:
  8. hyperthreading: Enabled
  9. name: master
  10. replicas:
  11. metadata:
  12. name: ocp4
  13. networking:
  14. clusterNetworks:
  15. - cidr: 10.254.0.0/
  16. hostPrefix:
  17. networkType: OpenShiftSDN
  18. serviceNetwork:
  19. - 172.30.0.0/
  20. platform:
  21. none: {}
  22. pullSecret: '{"auths":{"registry.redhat.ren": {"auth": "ZHVtbXk6ZHVtbXk=","email": "noemail@localhost"}}}'
  23. sshKey: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCnejC+QkKXqEOj7lSKxpHnnIxPli2iwNveE9apd0QUFgc3xTyaQWyOqbFEsUzR2MnXV36a89DiOVnecVgXZqVDFrDZDRkMLKJTm2U85AExWE0Lmtkxpmyg5OdpFmTBCutpNy2LigG8LTkMPXIgDrfNF+37/BvKzvWdrhR6/dQwqfMGqfRi+PYscD6nUJG5kAzVugalyw8+Sv9CzS+4BMRCZ4EVKu5bB2wl1bw7KCJc+D0nhnc87qGswJquleT7CGi7N2k6/Q1iK80l1KymmwWcwvh+Yf4Nhdk4cxbeSZmPGBQIQMmOUzK0Q4xs3XZd2WvZd/NYj0D83sSCQGXEUkGL root@helper'
  24. additionalTrustBundle: |
  25. -----BEGIN CERTIFICATE-----
  26. MIIDszCCApugAwIBAgIJAPRFC4yzZOpxMA0GCSqGSIb3DQEBCwUAMHAxCzAJBgNV
  27. BAYTAkNOMQswCQYDVQQIDAJHRDELMAkGA1UEBwwCU1oxGDAWBgNVBAoMD0dsb2Jh
  28. bCBTZWN1cml0eTEWMBQGA1UECwwNSVQgRGVwYXJ0bWVudDEVMBMGA1UEAwwMKi5y
  29. ZWRoYXQucmVuMB4XDTE5MTAxODEwMTAzMFoXDTI5MTAxNTEwMTAzMFowcDELMAkG
  30. A1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJTWjEYMBYGA1UECgwPR2xv
  31. YmFsIFNlY3VyaXR5MRYwFAYDVQQLDA1JVCBEZXBhcnRtZW50MRUwEwYDVQQDDAwq
  32. LnJlZGhhdC5yZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA1Mgq
  33. hGebtpCx93KtaaRw5jDRbxrTdJkZvV6Wyq1BYFRQDKZ3QOcFFOMrLbN7g8Nrw1dl
  34. zgvKLLc1l4god12RgOiM1fOVODoLIk2Z0x2VFbQ7ZIx0jKdKmaNex/fGd/MoLhij
  35. dYtAmZokjs7sw0VNkZLlHzPgR9AXYtJp07zUUL1eRWNTOhO8LxDUviOg2eVy31yW
  36. TrYla1ze7+meTvZs3edr5/dLncZ2PCiyaF6hOEf/t7ev4vA33p6SUY6prgaPaKlb
  37. PiB8+7ZKsucgXd/ikKoCP/0rMcqRSIrpYuudM8Dff8OGxhfL0ChUx3VkKd2t5T3l
  38. N3717qj+siuUb7OLAgMBAAGjUDBOMB0GA1UdDgQWBBTwuyzX5stt+Pyrs7VIr508
  39. 1VMR8zAfBgNVHSMEGDAWgBTwuyzX5stt+Pyrs7VIr5081VMR8zAMBgNVHRMEBTAD
  40. AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBhhicfn9fY+PAxnVNn7R0PscxbYof4DVv3
  41. lqkkO6BCLkHUivljxjU7OYpxkva34vSuK1WVZf74Mbif7NkzVS3EG0+b0h+8EcQ+
  42. Fnv4qyKBfs8LG/V/A0ukAD5AYP098jsj5tmREbnFbMy7UojVEK54w6262iefvg0b
  43. uT5I0Y3jLljIlsxSbX4tTXjX0X/KHXK4PJ7hqdRLXnD4CgWKHjU6yNQS+sZg83VC
  44. jsZpKl5eSBqOdXB1CFteZm571/AXlagcyGf9hvK4fV2ybQoOxgkZt9zyUvtm3myb
  45. S5FAo4B5IvEhkge+jvolj31AWnB4v6GX0TgWotJd52GUpWDJDr5T
  46. -----END CERTIFICATE-----
  47. imageContentSources:
  48. - mirrors:
  49. - registry.redhat.ren/ocp4/openshift4
  50. source: quay.io/openshift-release-dev/ocp-release
  51. - mirrors:
  52. - registry.redhat.ren/ocp4/openshift4
  53. source: quay.io/openshift-release-dev/ocp-v4.-art-dev

6.证书过期问题

登录helper通过命令行去查安装进度

需要重新删除openshift-install create ignition-configs 生成的部分。从下面这段重新开始

  1. /bin/rm -rf *.ign .openshift_install_state.json auth bootstrap master0 master1 master2 worker0 worker1 worker2
  2.  
  3. openshift-install create ignition-configs --dir=/root/ocp4

当然我的问题是各机器的时间不同步,设置完时间同步后问题重新做问题解决。

7.image-registry-storage问题

在安装过程中,需要执行

  1. bash ocp4-upi-helpernode-master/files/nfs-provisioner-setup.sh

去创建nfs-provisioner的project同时部署一个pod,用于创建pvc

等待pod启动完成后(注意查看他的状态)

  1. oc edit configs.imageregistry.operator.openshift.io
  2. # 修改 storage 部分
  3. # storage:
  4. # pvc:
  5. # claim:

把claim置空,之前是指向image-registry-storage的pvc的。修改完成后应该会促使pod创建一个pvc:image-registry-storage

可以通过

  1. oc get pvc --all-namespaces

来查看是否成功。pvc会申请100G的空间,如果磁盘上没有这么多空间的化,pvc就会在pending状态。

  1. oc get clusteroperator image-registry

状态也会是False, image-registry的pod会是Pending状态,导致集群创建无法继续。

如果状态不对,可以先删除pvc,然后再修改configs.imageregistry.operator.openshift.io,会触发创建。

只有当image-registry的co状态为True后,然后再运行

  1. openshift-install wait-for install-complete

等待集群继续往下执行。

8.DNS配置

除了生成的zonefile.db不变外,为了解析registry.redhat.ren,加入registry.zonefile.db

/etc/named.conf

  1. ########### Add what's between these comments ###########
  2. zone "ocp4.redhat.ren" IN {
  3. type master;
  4. file "zonefile.db";
  5. };
  6.  
  7. zone "7.168.192.in-addr.arpa" IN {
  8. type master;
  9. file "reverse.db";
  10. };
  11. ########################################################
  12.  
  13. zone "redhat.ren" IN {
  14. type master;
  15. file "registry.zonefile.db";
  16. };
  1. [root@helper named]# cat registry.zonefile.db
  2. $TTL 1W
  3. @ IN SOA ns1.redhat.ren. root (
  4. ; serial
  5. 3H ; refresh ( hours)
  6. 30M ; retry ( minutes)
  7. 2W ; expiry ( weeks)
  8. 1W ) ; minimum ( week)
  9. IN NS ns1.redhat.ren.
  10. IN MX smtp.redhat.ren.
  11. ;
  12. ;
  13. ns1 IN A 192.168.7.11
  14. smtp IN A 192.168.7.11
  15. ;
  16. registry IN A 192.168.7.1
  17. registry IN A 192.168.7.1
  18. ;
  19. ;EOF
  1. [root@helper named]# cat reverse.db
  2. $TTL 1W
  3. @ IN SOA ns1.ocp4.redhat.ren. root (
  4. ; serial
  5. 3H ; refresh ( hours)
  6. 30M ; retry ( minutes)
  7. 2W ; expiry ( weeks)
  8. 1W ) ; minimum ( week)
  9. IN NS ns1.ocp4.redhat.ren.
  10. ;
  11. ; syntax is "last octet" and the host must have fqdn with trailing dot
  12. IN PTR master-.ocp4.redhat.ren.
  13. IN PTR master-.ocp4.redhat.ren.
  14. IN PTR master-.ocp4.redhat.ren.
  15. ;
  16. IN PTR bootstrap.ocp4.redhat.ren.
  17. ;
  18. IN PTR api.ocp4.redhat.ren.
  19. IN PTR api-int.ocp4.redhat.ren.
  20. ;
  21. IN PTR worker-.ocp4.redhat.ren.
  22. IN PTR worker-.ocp4.redhat.ren.
  23. IN PTR worker-.ocp4.redhat.ren.
  24. ;
  25. IN PTR registry.redhat.ren.
  26. ;EOF

安装完后访问

https://console-openshift-console.apps.ocp4.redhat.ren

美中不足是Operatorhub没有内容,也需要离线安装

在Helper机器上

  1. cd ~/ocp4
  2. export KUBECONFIG=auth/kubeconfig
  3.  
  4. [root@helper ocp4]# oc get nodes
  5. NAME STATUS ROLES AGE VERSION
  6. master-.ocp4.redhat.ren Ready master 71m v1.14.6+c07e432da
  7. master-.ocp4.redhat.ren Ready master 71m v1.14.6+c07e432da
  8. master-.ocp4.redhat.ren Ready master 71m v1.14.6+c07e432da
  9. worker-.ocp4.redhat.ren Ready worker 71m v1.14.6+c07e432da
  10. worker-.ocp4.redhat.ren Ready worker 71m v1.14.6+c07e432da
  11. worker-.ocp4.redhat.ren Ready worker 71m v1.14.6+c07e432da

装机现场

OpenShift 4.2 离线安装补充记录的更多相关文章

  1. Openshift 4.4 静态 IP 离线安装系列:准备离线资源

    本系列文章描述了离线环境下以 UPI (User Provisioned Infrastructure) 模式安装 Openshift Container Platform (OCP) 4.4.5 的 ...

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

    上篇文章准备了离线安装 OCP 所需要的离线资源,包括安装镜像.所有样例 Image Stream 和 OperatorHub 中的所有 RedHat Operators.本文就开始正式安装 OCP( ...

  3. Istio在Openshift 3.11的安装

    详细安装步骤及解释参考 https://docs.openshift.com/container-platform/3.11/servicemesh-install/servicemesh-insta ...

  4. OpenShift 3.11离线环境的jenkins演示

    离线安装完成后,一般情况下只装了个基础环境,catalog镜像没有导入,本文主要侧重在jenkins的一些环境设置和演示. 1.导入镜像 首先follow下面链接下载镜像 https://docs.o ...

  5. SharePoint 2016 必备组件离线安装介绍

    前言 SharePoint 必备组件安装,一直以来都是SharePoint安装过程中的最大的坑,尤其是不能联网的服务器.博主在这里简单介绍一下离线安装过程,并附组件包下载以及安装命令,并且在windo ...

  6. MYSQL离线安装

    由于MySQL的广泛应用,MySQL的安装也就成了大家经常会碰到的问题.并且由于不是所有机器都可连接外网,所以MySQL的离线安装显得比较重要.而本文旨在介绍CentOS6.6下离线安装MySQL. ...

  7. VS2010+Qt5.4.0 环境搭建(离线安装)

    原创作者:http://blog.csdn.net/solomon1558/article/details/44084969 前言 因项目需要Qt开发GUI,我根据网上资料及自己的经验整理了搭建vs2 ...

  8. 离线安装 Python 2.7, paramiko 和 tornado

    无非就是离线安装, 步骤比较繁琐, 记录一下. 需求很简单, 一个离线安装的 Python, 能跑 tornado 和 paramiko 1. 离线安装 Python 2.7 .tgz cd Pyth ...

  9. npm包与gem包--在线&离线安装

    目录 NPM 在线 离线 GEM 在线 离线 NPM NPM,即为Node的包管理工具,官网为 https://www.npmjs.com/,我们可以在站内搜索所需要的NPM包,了解相关的使用规则 安 ...

随机推荐

  1. VSCode自动保存文件设置

    很多时候敲了一大堆代码,结果手贱或者电脑没电或者电脑突然崩溃,如果没有保存,只能说GG.好在VSCode有自动保存代码的功能,而且有好几种自动保存的模式选择,设置方法如下: 进入">文 ...

  2. 远程连接MySQL提示“Host is not allowed to connected to this MySQL server”

    如果你想连接你的mysql的时候发生这个错误: ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL serve ...

  3. javax.persistence.PersistenceException: Unable to build entity manager factory

    javax.persistence.PersistenceException: Unable to build entity manager factory at org.hibernate.jpa. ...

  4. GitHub使用方法与三步教程

    git下载地址:https://git-scm.com/downloads 下一步下一步就好了 在cmd输入 git --version 在桌面空白右键 Git Bash Here命令行 输入 git ...

  5. 项目Beta冲刺(团队3/7)

    项目Beta冲刺(团队) --3/7 作业要求: 项目Beta冲刺(团队) 1.团队信息 团队名 :男上加男 成员信息 : 队员学号 队员姓名 个人博客地址 备注 221600427 Alicesft ...

  6. Lombok 学习资料

    Lombok 学习资料 网址 Lombok 官方网站 https://projectlombok.org/features/all Lombok:让JAVA代码更优雅 http://blog.didi ...

  7. python-hashlib加密

    用于加密相关的操作,代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA512,MD5算法. 以下是算法示例: #!/usr/bin/env python # -*- c ...

  8. 一种动态的样式语言--Less 之 导引混合

    .mixin (@a) when (lightness(@a) >= 50%){ background-color: black; } .mixin (@a) when (lightness(@ ...

  9. (知识点4)C++ 中vector

    1.定义vector<vector<int>> M; 2.添加元素这里是vector的嵌套使用,本质是vector元素里的每个元素也是vector类型,所以抓住本质来添加元素就 ...

  10. [Javascript] ES6 Class Constructors and the Super Keyword

    When the ES6 class shipped back in 2015, a number of additional keywords came with it. Two of these ...