一 前置准备

1.1 前置条件

相应的充足资源的Linux服务器;

设置相应的主机名,参考命令:

  1. 1 hostnamectl set-hostname k8smaster

Mac及UUID唯一;

若未关闭防火墙则建议放通相应端口,如下:

Master节点——

规则

方向

端口范围

作用

使用者

TCP

Inbound

6443*

Kubernetes API server

All

TCP

Inbound

2379-2380

etcd server client API

kube-apiserver, etcd

TCP

Inbound

10250

Kubelet API

Self, Control plane

TCP

Inbound

10251

kube-scheduler

Self

TCP

Inbound

10252

kube-controller-manager

Self

Worker 节点——

规则

方向

端口范围

作用

使用者

TCP

Inbound

10250

Kubelet API

Self, Control plane

TCP

Inbound

30000-32767

NodePort Services**

All

其他更多前置准备见:https://kubernetes.io/zh/docs/setup/independent/install-kubeadm/

二 主要组件

2.1 核心组件

  • etcd:保存了整个集群的状态;
  • apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
  • controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
  • kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
  • Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI);
  • kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡。

2.2 非核心组件

  • kube-dns:负责为整个集群提供DNS服务;
  • Ingress Controller:为服务提供外网入口;
  • Heapster:提供资源监控;
  • Dashboard:提供GUI;
  • Federation:集群联邦提供跨可用区的集群;
  • Fluentd-elasticsearch:提供集群日志采集、存储与查询。

延伸1:对master节点服务组件的理解:

Master节点上面主要由四个模块组成:APIServer,schedule,controller-manager,etcd。

APIServer: APIServer负责对外提供RESTful的kubernetes API的服务,它是系统管理指令的统一接口,任何对资源的增删该查都要交给APIServer处理后再交给etcd,如架构图中所示,kubectl(Kubernetes提供的客户端工具,该工具内部就是对Kubernetes API的调用)是直接和APIServer交互的。

schedule: schedule负责调度Pod到合适的Node上,如果把scheduler看成一个黑匣子,那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定,即将这个pod部署到这个Node上。Kubernetes目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。

controller manager: 如果APIServer做的是前台的工作的话,那么controller manager就是负责后台的。每一个资源都对应一个控制器。而control manager就是负责管理这些控制器的,比如我们通过APIServer创建了一个Pod,当这个Pod创建成功后,APIServer的任务就算完成了。而后面保证Pod的状态始终和我们预期的一样的重任就由controller manager去保证了。

etcd:etcd是一个高可用的键值存储系统,kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

延伸2:对master节点服务组件的理解:

每个Node节点主要由三个模板组成:kubelet、kube-proxy、runtime。

runtime:runtime指的是容器运行环境,目前Kubernetes支持docker和rkt两种容器。

kube-proxy: 该模块实现了kubernetes中的服务发现和反向代理功能。kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响。另外,kube-proxy还支持session affinity。

kublet:kublet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上的所有容器,但是如果容器不是通过kubernetes创建的,它并不会管理。本质上,它负责使Pod的运行状态与期望的状态一致。

三 部署规划

3.1 节点规划

节点


IP


类型


运行服务
k8smaster01
172.24.8.71
Kubernetes master节点
docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、kube-nginx、flannel
k8smaster02
172.24.8.72
Kubernetes master节点
docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、
kubelet、kube-nginx、flannel
k8smaster03
172.24.8.73
Kubernetes master节点
docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、
kubelet、kube-nginx、flannel
k8snode01
172.24.8.74
Kubernetes node节点1
docker、etcd、kubelet、proxy、flannel
k8snode03
172.24.8.75
Kubernetes node节点2
docker、etcd、kubelet、proxy、flannel

提示:本实验使用三节点master部署,从而实现master的高可用。

3.2 组件及版本

  • Kubernetes 1.14.2
  • Docker 18.09.6-ce
  • Etcd 3.3.13
  • Flanneld 0.11.0
  • 插件:
    • Coredns
    • Dashboard
    • Metrics-server
    • EFK (elasticsearch、fluentd、kibana)
  • 镜像仓库:
    • docker registry
    • harbor

3.3 组件策略

kube-apiserver:

  • 使用节点本地 nginx 4 层透明代理实现高可用;
  • 关闭非安全端口 8080 和匿名访问;
  • 在安全端口 6443 接收 https 请求;
  • 严格的认证和授权策略 (x509、token、RBAC);
  • 开启 bootstrap token 认证,支持 kubelet TLS bootstrapping;
  • 使用 https 访问 kubelet、etcd,加密通信;

kube-controller-manager:

  • 3 节点高可用;
  • 关闭非安全端口,在安全端口 10252 接收 https 请求;
  • 使用 kubeconfig 访问 apiserver 的安全端口;
  • 自动 approve kubelet 证书签名请求 (CSR),证书过期后自动轮转;
  • 各 controller 使用自己的 ServiceAccount 访问 apiserver;

kube-scheduler:

  • 3 节点高可用;
  • 使用 kubeconfig 访问 apiserver 的安全端口;

kubelet:

  • 使用 kubeadm 动态创建 bootstrap token,而不是在 apiserver 中静态配置;
  • 使用 TLS bootstrap 机制自动生成 client 和 server 证书,过期后自动轮转;
  • 在 KubeletConfiguration 类型的 JSON 文件配置主要参数;
  • 关闭只读端口,在安全端口 10250 接收 https 请求,对请求进行认证和授权,拒绝匿名访问和非授权访问;
  • 使用 kubeconfig 访问 apiserver 的安全端口;

kube-proxy:

  • 使用 kubeconfig 访问 apiserver 的安全端口;
  • 在 KubeProxyConfiguration 类型的 JSON 文件配置主要参数;
  • 使用 ipvs 代理模式;

集群插件:

  • DNS:使用功能、性能更好的 coredns;
  • Dashboard:支持登录认证;
  • Metric:metrics-server,使用 https 访问 kubelet 安全端口;
  • Log:Elasticsearch、Fluend、Kibana;
  • Registry 镜像库:docker-registry、harbor。

四 其他准备

4.1 手动添加解析

注意:以下4.1至4.7步骤可通过如下脚本快速实现:

  1. 1 [root@k8smaster01 ~]# vi k8sinit.sh
  2. 2 # Modify Author: xhy
  3. 3 # Modify Date: 2019-06-23 22:19
  4. 4 # Version:
  5. 5 #***************************************************************#
  6. 6 # Initialize the machine. This needs to be executed on every machine.
  7. 7
  8. 8 # Add host domain name.
  9. 9 cat >> /etc/hosts << EOF
  10. 10 172.24.8.71 k8smaster01
  11. 11 172.24.8.72 k8smaster02
  12. 12 172.24.8.73 k8smaster03
  13. 13 172.24.8.74 k8snode01
  14. 14 172.24.8.75 k8snode02
  15. 15 EOF
  16. 16
  17. 17 # Add docker user
  18. 18 useradd -m docker
  19. 19
  20. 20 # Disable the SELinux.
  21. 21 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
  22. 22
  23. 23 # Turn off and disable the firewalld.
  24. 24 systemctl stop firewalld
  25. 25 systemctl disable firewalld
  26. 26
  27. 27 # Modify related kernel parameters & Disable the swap.
  28. 28 cat > /etc/sysctl.d/k8s.conf << EOF
  29. 29 net.ipv4.ip_forward = 1
  30. 30 net.bridge.bridge-nf-call-ip6tables = 1
  31. 31 net.bridge.bridge-nf-call-iptables = 1
  32. 32 net.ipv4.tcp_tw_recycle = 0
  33. 33 vm.swappiness = 0
  34. 34 vm.overcommit_memory = 1
  35. 35 vm.panic_on_oom = 0
  36. 36 net.ipv6.conf.all.disable_ipv6 = 1
  37. 37 EOF
  38. 38 sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null
  39. 39 swapoff -a
  40. 40 sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  41. 41 modprobe br_netfilter
  42. 42
  43. 43 # Add ipvs modules
  44. 44 cat > /etc/sysconfig/modules/ipvs.modules <<EOF
  45. 45 #!/bin/bash
  46. 46 modprobe -- ip_vs
  47. 47 modprobe -- ip_vs_rr
  48. 48 modprobe -- ip_vs_wrr
  49. 49 modprobe -- ip_vs_sh
  50. 50 modprobe -- nf_conntrack_ipv4
  51. 51 EOF
  52. 52 chmod 755 /etc/sysconfig/modules/ipvs.modules
  53. 53 bash /etc/sysconfig/modules/ipvs.modules
  54. 54
  55. 55 # Install rpm
  56. 56 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
  57. 57
  58. 58 # Create k8s directory $$ Add system PATH
  59. 59 mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert
  60. 60 echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc
  61. 61 source /root/.bashrc
  62. 62
  63. 63 # Reboot the machine.
  64. 64 reboot
  1. 1 [root@k8smaster01 ~]# cat <<EOF >> /etc/hosts
  2. 2 172.24.8.71 k8smaster01
  3. 3 172.24.8.72 k8smaster02
  4. 4 172.24.8.73 k8smaster03
  5. 5 172.24.8.74 k8snode01
  6. 6 172.24.8.75 k8snode02
  7. 7 EOF

提示:所有节点均建议如上操作。

4.2 添加docker账户

  1. 1 [root@k8smaster01 ~]# useradd -m docker

提示:所有节点均建议如上操作。

4.3 关闭SELinux

  1. 1 [root@k8smaster01 ~]# setenforce 0
  2. 2 [root@k8smaster01 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

4.4 修正iptables

  1. 1 [root@k8smaster01 ~]# systemctl stop firewalld
  2. 2 [root@k8smaster01 ~]# systemctl disable firewalld #关闭防火墙
  3. 3 [root@k8smaster01 ~]# cat <<EOF >> /etc/sysctl.d/k8s.conf
  4. 4 net.bridge.bridge-nf-call-ip6tables = 1
  5. 5 net.bridge.bridge-nf-call-iptables = 1
  6. 6 net.ipv4.ip_forward = 1
  7. 7 EOF
  8. 8 [root@k8smaster01 ~]# modprobe br_netfilter
  9. 9 [root@k8smaster01 ~]# sysctl -p /etc/sysctl.d/k8s.conf

提示:所有节点均建议如上操作。

4.5 关闭swap

  1. 1 [root@k8smaster01 ~]# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  2. 2 [root@k8smaster01 ~]# echo "vm.swappiness = 0" >> /etc/sysctl.d/k8s.conf #禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
  3. 3 [root@k8smaster01 ~]# sysctl -p /etc/sysctl.d/k8s.conf

4.6 其他调整

  1. 1 [root@k8smaster01 ~]# cat <<EOF >> /etc/sysctl.d/k8s.conf
  2. 2 vm.overcommit_memory = 1 # 不检查物理内存是否够用
  3. 3 vm.panic_on_oom = 0 # 开启 OOM
  4. 4 net.ipv6.conf.all.disable_ipv6 = 1 # 关闭 IPV6
  5. 5 EOF
  6. 6 [root@k8smaster01 ~]# sysctl -p /etc/sysctl.d/k8s.conf
  7. 7 [root@k8smaster01 ~]# mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert #创建相应目录
  8. 8 [root@k8smaster01 ~]# yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget

提示:必须关闭 tcp_tw_recycle,否则和 NAT 冲突,会导致服务不通;

关闭 IPV6,防止触发 docker BUG。

4.7 加载IPVS

pod的负载均衡是用kube-proxy来实现的,实现方式有两种,一种是默认的iptables,一种是ipvs,相对iptables,ipvs有更好的性能。且当前ipvs已经加入到了内核的主干。

为kube-proxy开启ipvs的前提需要加载以下的内核模块:

  • ip_vs
  • ip_vs_rr
  • ip_vs_wrr
  • ip_vs_sh
  • nf_conntrack_ipv4
  1. 1 [root@k8smaster01 ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOF
  2. 2 #!/bin/bash
  3. 3 modprobe -- ip_vs
  4. 4 modprobe -- ip_vs_rr
  5. 5 modprobe -- ip_vs_wrr
  6. 6 modprobe -- ip_vs_sh
  7. 7 modprobe -- nf_conntrack_ipv4
  8. 8 EOF
  9. 9 [root@k8smaster01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
  10. 10 [root@k8smaster01 ~]# bash /etc/sysconfig/modules/ipvs.modules
  11. 11 [root@k8smaster01 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
  12. 12 [root@k8smaster01 ~]# yum -y install ipvsadm

提示:所有节点均建议如上操作。

为了更好的管理和查看ipvs,可安装相应的管理工具《002.LVS管理工具的安装与使用》。

五 环境准备

5.1 配置免秘钥

为了更方便远程分发文件和执行命令,本实验配置master节点到其它节点的 ssh 信任关系。

  1. 1 [root@k8smaster01 ~]# ssh-keygen -f ~/.ssh/id_rsa -N ''
  2. 2 [root@k8smaster01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8smaster01
  3. 3 [root@k8smaster01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8smaster02
  4. 4 [root@k8smaster01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8smaster03
  5. 5 [root@k8smaster01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8snode01
  6. 6 [root@k8smaster01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8snode02

提示:此操作仅需要在master节点操作。

5.2 分发集群配置参数脚本

后续使用的环境变量都定义在文件 environment.sh 中,同时拷贝到所有节点的 /opt/k8s/bin 目录:

  1. 1 #!/usr/bin/bash
  2. 2
  3. 3 # 生成 EncryptionConfig 所需的加密 key
  4. 4 export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
  5. 5
  6. 6 # 集群 MASTER 机器 IP 数组
  7. 7 export MASTER_IPS=(172.24.8.71 172.24.8.72 172.24.8.73)
  8. 8
  9. 9 # 集群 MASTER IP 对应的主机名数组
  10. 10 export MASTER_NAMES=(k8smaster01 k8smaster02 k8smaster03)
  11. 11
  12. 12 # 集群 NODE 机器 IP 数组
  13. 13 export NODE_IPS=(172.24.8.74 172.24.8.75)
  14. 14
  15. 15 # 集群 NODE IP 对应的主机名数组
  16. 16 export NODE_NAMES=(k8snode01 k8snode02)
  17. 17
  18. 18 # 集群所有机器 IP 数组
  19. 19 export ALL_IPS=(172.24.8.71 172.24.8.72 172.24.8.73 172.24.8.74 172.24.8.75)
  20. 20
  21. 21 # 集群所有IP 对应的主机名数组
  22. 22 export ALL_NAMES=(k8smaster01 k8smaster02 k8smaster03 k8snode01 k8snode02)
  23. 23
  24. 24 # etcd 集群服务地址列表
  25. 25 export ETCD_ENDPOINTS="https://172.24.8.71:2379,https://172.24.8.72:2379,https://172.24.8.73:2379"
  26. 26
  27. 27 # etcd 集群间通信的 IP 和端口
  28. 28 export ETCD_NODES="k8smaster01=https://172.24.8.71:2380,k8smaster02=https://172.24.8.72:2380,k8smaster03=https://172.24.8.73:2380"
  29. 29
  30. 30 # kube-apiserver 的反向代理(kube-nginx)地址端口
  31. 31 export KUBE_APISERVER="https://127.0.0.1:8443"
  32. 32
  33. 33 # 节点间互联网络接口名称
  34. 34 export IFACE="eth0"
  35. 35
  36. 36 # etcd 数据目录
  37. 37 export ETCD_DATA_DIR="/data/k8s/etcd/data"
  38. 38
  39. 39 # etcd WAL 目录,建议是 SSD 磁盘分区,或者和 ETCD_DATA_DIR 不同的磁盘分区
  40. 40 export ETCD_WAL_DIR="/data/k8s/etcd/wal"
  41. 41
  42. 42 # k8s 各组件数据目录
  43. 43 export K8S_DIR="/data/k8s/k8s"
  44. 44
  45. 45 # docker 数据目录
  46. 46 export DOCKER_DIR="/data/k8s/docker"
  47. 47
  48. 48 ## 以下参数一般不需要修改
  49. 49
  50. 50 # TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
  51. 51 BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c"
  52. 52
  53. 53 # 最好使用 当前未用的网段 来定义服务网段和 Pod 网段
  54. 54
  55. 55 # 服务网段,部署前路由不可达,部署后集群内路由可达(kube-proxy 保证)
  56. 56 SERVICE_CIDR="10.254.0.0/16"
  57. 57
  58. 58 # Pod 网段,建议 /16 段地址,部署前路由不可达,部署后集群内路由可达(flanneld 保证)
  59. 59 CLUSTER_CIDR="172.30.0.0/16"
  60. 60
  61. 61 # 服务端口范围 (NodePort Range)
  62. 62 export NODE_PORT_RANGE="30000-32767"
  63. 63
  64. 64 # flanneld 网络配置前缀
  65. 65 export FLANNEL_ETCD_PREFIX="/kubernetes/network"
  66. 66
  67. 67 # kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
  68. 68 export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"
  69. 69
  70. 70 # 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
  71. 71 export CLUSTER_DNS_SVC_IP="10.254.0.2"
  72. 72
  73. 73 # 集群 DNS 域名(末尾不带点号)
  74. 74 export CLUSTER_DNS_DOMAIN="cluster.local"
  75. 75
  76. 76 # 将二进制目录 /opt/k8s/bin 加到 PATH 中
  77. 77 export PATH=/opt/k8s/bin:$PATH
  1. 1 [root@k8smaster01 ~]# source environment.sh
  2. 2 [root@k8smaster01 ~]# for all_ip in ${ALL_IPS[@]}
  3. 3 do
  4. 4 echo ">>> ${all_ip}"
  5. 5 scp environment.sh root@${all_ip}:/opt/k8s/bin/
  6. 6 ssh root@${all_ip} "chmod +x /opt/k8s/bin/*"
  7. 7 done

003.Kubernetes二进制部署准备的更多相关文章

  1. Kubernetes 二进制部署(一)单节点部署(Master 与 Node 同一机器)

    0. 前言 最近受“新冠肺炎”疫情影响,在家等着,入职暂时延后,在家里办公和学习 尝试通过源码编译二进制的方式在单一节点(Master 与 Node 部署在同一个机器上)上部署一个 k8s 环境,整理 ...

  2. kubernetes二进制部署k8s-master集群controller-manager服务unhealthy问题

    一.问题现象 我们使用二进制部署k8s的高可用集群时,在部署多master时,kube-controller-manager服务提示Unhealthy [root@ceph-01 system]# k ...

  3. 008.Kubernetes二进制部署Nginx实现高可用

    一 Nginx代理实现kube-apiserver高可用 1.1 Nginx实现高可用 基于 nginx 代理的 kube-apiserver 高可用方案. 控制节点的 kube-controller ...

  4. 012.Kubernetes二进制部署worker节点Flannel

    一 部署flannel 1.1 安装flannel kubernetes 要求集群内各节点(包括 master 节点)能通过 Pod 网段互联互通.flannel 使用 vxlan 技术为各节点创建一 ...

  5. 013.Kubernetes二进制部署worker节点Nginx实现高可用

    一 Nginx代理实现kube-apiserver高可用 1.1 Nginx实现高可用 基于 nginx 代理的 kube-apiserver 高可用方案. 控制节点的 kube-controller ...

  6. 015.Kubernetes二进制部署所有节点kubelet

    一 部署 kubelet kubelet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如 exec.run.logs 等. k ...

  7. 016.Kubernetes二进制部署所有节点kube-proxy

    一 部署 kube-proxy kube-proxy 运行在所有节点上,它监听 apiserver 中 service 和 endpoint 的变化情况,创建路由规则以提供服务 IP 和负载均衡功能. ...

  8. Kubernetes 二进制部署(二)集群部署(多 Master 节点通过 Nginx 负载均衡)

    0. 前言 紧接上一篇,本篇文章我们尝试学习多节点部署 kubernetes 集群 并通过 haproxy+keepalived 实现 Master 节点的负载均衡 1. 实验环境 实验环境主要为 5 ...

  9. Kubernetes 二进制部署

    目录 1.基础环境 2.部署DNS 3.准备自签证书 4.部署Docker环境 5.私有仓库Harbor部署 6.部署Master节点 6.1.部署Etcd集群 6.2.部署kube-apiserve ...

随机推荐

  1. mongoDB4.0数据库

    下载:https://www.mongodb.com/ 安装:略 注意:使用前修改bin目录下配置文件mongodb.cfg,删除最后一行的'mp'字段 1. 启动服务与终止服务 net start ...

  2. Kibana 快速入门教程

    欢迎关注笔者的公众号: 小哈学Java, 专注于推送 Java 领域优质干货文章!! 个人网站: https://www.exception.site/kibana/kibana-tutorial 什 ...

  3. 第3章(3) do{}while(0)语句

    do {} while (0) 主要在宏定义后为语句中使用,比如: #define macrofun(a, b, c) \ do { \ if (a == 5) \ do_this(b, c); \ ...

  4. Python:的web爬虫实现及原理(BeautifulSoup工具)

    最近一直在学习python,学习完了基本语法就练习了一个爬虫demo,下面总结下. 主要逻辑是 1)初始化url管理器,也就是将rooturl加入到url管理器中 2)在url管理器中得到新的new_ ...

  5. comparator接口实现时,只需要实现 int compare(T o1, T o2)方法?

    从Comparator接口的源码,可以看到Comparator接口中的方法有三类: 1 普通接口方法 2 default方法 3 static方法 其中default方法和static方法 是java ...

  6. MariaDB数据库

      MySQL作者Michael Widenius自己创办了新公司Monty Program AB,在MySQL基础上新创了MariaDB开源数据库.MariaDB带来更好的数据库管理特性,更好的自由 ...

  7. std::tuple

    tuple,元组类型.头文件<tuple>,tuple是一个固定大小的不同类型(异质,heterogeneous)值的集合(这一点是tuple与其他常规STL容器的最大不同,即它可以同时存 ...

  8. php好在哪?

    PHP即“超文本预处理器”,是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 PHP 自创的语法.利于学习 ...

  9. Spring Boot2 系列教程(十六)定时任务的两种实现方式

    在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Qua ...

  10. 闪讯 开启wifi教程

    这是我自己试了几次之后发现的,也不是什么技术活. 首先说下,我的比较是小米pro笔记本,一般笔记本都是自带wifi功能的.如果要开wifi的话,必须是用网线连接才可以,通过wifi连接网络就不能开移动 ...