Mac OS(10.13.6)使用 vagrant+VirtualBox +centos7搭建k8s集群

Stella981
• 阅读 977

Mac OS(10.13.6)使用 vagrant+VirtualBox +centos7搭建k8s集群步骤

环境准备工作

  1. 下载VirtualBox 地址:https://www.virtualbox.org/ 下载最新安装包 6.1 ,安装环境很简单,根据步骤下一步即可
  2. 下载vagrant 地址:https://www.vagrantup.com/ 下载最新安装包 Vagrant 2.2.9 ,安装环境很简单,根据步骤下一步即可
  3. 下载centos7 box https://download.csdn.net/download/xia296/12740338 使用命令vagrant box add centos7 box文件路径,增加本地box
  4. 安装 kubeadm,使用 kubeadm 开启k8s集群,需要环境如下:
    1. 一台或多台运行着下列系统的机器:(CentOS 7);
    2. 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响您应用的运行内存);
    3. 2 CPU 核或更多;
    4. 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以);
    5. 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里 了解更多详细信息。
    6. 开启机器上的某些端口。请参见这里 了解更多详细信息。
    7. 禁用交换分区。为了保证 kubelet 正常工作,您 必须 禁用交换分区。
  5. docker-ce安装
  6. kubelet和kubectl

使用vagrant 创建3个centos7 虚拟机网络配置及其他配置基础

  1. 新增vagrant 本地box,以防止远程下载操作系统;

    #创建本地box
    vagrant box add centos7 /Users/summer/Downloads/centos-7.0-x86_64.box
    #查询本地box
    vagrant box list
    
  2. 新建一个vagrant 配置文件Vagrantfile 批量创建3个虚拟机

    Vagrant.configure("2") do |config| (1..3).each do |i| config.vm.define "k8s-node#{i}" do |node| # 设置虚拟机的Box node.vm.box = "centos7" # 设置虚拟机的主机名 node.vm.hostname="k8s-node#{i}" # 设置虚拟机的IP node.vm.network "private_network", ip: "192.168.56.#{99+i}", netmask: "255.255.255.0" # 设置主机与虚拟机的共享目录 # node.vm.synced_folder "~/Documents/vagrant/share", "/home/vagrant/share" # VirtaulBox相关配置 node.vm.provider "virtualbox" do |v| # 设置虚拟机的名称 v.name = "k8s-node#{i}" # 设置虚拟机的内存大小 v.memory = 2048 # 设置虚拟机的CPU个数 v.cpus = 2 end end end end

  3. 运行vagrant up命令,运行后会帮我们自动创建k8s-node1、k8s-node2、k8s-node3 虚拟机

    vagrant up

Mac OS(10.13.6)使用 vagrant+VirtualBox +centos7搭建k8s集群

设置自定义nat网络,防止公用一个IP;

Mac OS(10.13.6)使用 vagrant+VirtualBox +centos7搭建k8s集群

Mac OS(10.13.6)使用 vagrant+VirtualBox +centos7搭建k8s集群

Mac OS(10.13.6)使用 vagrant+VirtualBox +centos7搭建k8s集群

  1. 由于vagrant 帮我们创建的只能通过ssh访问,我们需要开启账号密码访问权限,以便可以使用其他客户端工具访问,这里以k8s-node1为例,其他虚拟机类似(非必须,测试我的版本默认已经开启了yes);

    #进入k8s-node1
    vagrant ssh k8s-node1
    #切换root访问权限,密码默认为vagrant
    su root
    #修改sshd_config,找到 PasswordAuthentication no 改为yes即可,最新版本创建的时候可以忽略,默认则是yes
    vi /etc/ssh/sshd_config
    #重启sshd服务
    service sshd restart
    
  2. 设置Linux环境(三个虚拟机都要执行)

    1. 为了测试方便,关闭所有虚拟机的防火墙

      systemctl stop firewalld
      systemctl disable firewalld
      
    2. 关闭selinux 安全策略(此处可以省略,我测试默认是关闭的)

      #查看selinux
      cat /etc/selinux/config
      #SELINUX=disabled
      SELINUX=disabled
      #如没有禁止,可以使用如下命令快速禁止
      sed -i 's/enforcing/disabled' /etc/selinux/config
      #全局禁止配置
      setenforce 0
      
    3. 关闭swap

      #查看是否禁止了swap
      cat /etc/fstab
      #可以查看到是开启的,如需要禁止注释掉此行即可
      /dev/mapper/centos-swap swap                    swap    defaults        0 0
      #临时的禁止
      swapoff -a
      #执行此命令,可以注释掉分区交换行
      sed -ri 's/.*swap.*/#&/' /etc/fstab
      #验证,swap必须为0
      free -g 
      
    4. 添加主机名与IP对于关系

      #通过hostname查看主机名,我这里使用vagrant创建时就指定了,如果你没使用vagrant,则可以使用hostnamectl set-hostname<newhostname> 指定新的hostname;
      hostname
      #添加本地主机映射
      vim /etc/hosts
      10.0.2.15   k8s-node1
      10.0.2.4    k8s-node2
      10.0.2.5    k8s-node3
      
    5. 将桥接的IPv4流量传递到iptables的链(防止统计流量指标不准确)

      cat > /etc/sysctl.d/k8s.conf << EOF
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      net.ipv4.ip_forward = 1
      EOF
      
      sysctl --system
      

所有虚拟机安装docker、kubeadm、kubelet和kubectl

配置yum源(可选)

#1、配置yum源base repo为阿里云的yum源
cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.bak
mv epel.repo  epel.repo.bak
curl https://mirrors.aliyun.com/repo/Centos-7.repo -o CentOS-Base.repo 
sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/CentOS-Base.repo
curl https://mirrors.aliyun.com/repo/epel-7.repo -o epel.repo

#2、配置kubernetes源为阿里的yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

#配置yum说明
#baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64   Kubernetes源设为阿里
#gpgcheck=0:表示对从这个源下载的rpm包不进行校验
#repo_gpgcheck=0:某些安全性配置文件会在 /etc/yum.conf 内全面启用 repo_gpgcheck,以便能检验软件库的中继数据的加密签署
#如果gpgcheck设为1,会进行校验,就会报错如下,所以这里设为0

#3、update cache 更新缓存
yum clean all && yum makecache && yum repolist

docker 安装

  1. 安装docker之前,清理系统之前的docker

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  2. 安装docker-ce 之前需安装所需的包。yum-utils提供了yum-config-manager 效用,并device-mapper-persistent-data和lvm2由需要 devicemapper存储驱动程序。

    sudo yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2
    
  3. 设置稳定的存储库。

    #官方库有点慢,我们可以使用国内镜像库
    sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    
    #设置阿里云库
    sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  4. 安装docker及配置docker加速

    国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

    当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。

    阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了,更多阿里云服务器docker一键部署见帮助手册

    #安装docker-ce cli
    sudo yum install -y docker-ce docker-ce-cli containerd.io
    #复制以下配置加速
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  5. 设置docker开机自启动

    sudo systemctl enable docker
    

安装kubeadm、kubelet和kubectl

Kubelet负责与其他节点集群通信,并进行本节点Pod和容器生命周期的管理。

Kubeadm是Kubernetes的自动化部署工具,降低了部署难度,提高效率。

Kubectl是Kubernetes集群管理工具。

#配置kubernetes源为阿里的yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 将 SELinux 设置为 permissive 模式(相当于将其禁用),这里我上面已经设置过了,所以不需要设置;
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
#开始安装
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
#设置开机自启动kubelet
systemctl enable --now kubelet
#查看k8s版本
kubeadm version

请注意:

  • 通过运行命令 setenforce 0sed ... 将 SELinux 设置为 permissive 模式可以有效的将其禁用。 这是允许容器访问主机文件系统所必须的,例如正常使用 pod 网络。 您必须这么做,直到 kubelet 做出升级支持 SELinux 为止。

  • 一些 RHEL/CentOS 7 的用户曾经遇到过问题:由于 iptables 被绕过而导致流量无法正确路由的问题。您应该确保 在 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 被设置为 1。

    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sysctl --system
    
  • 确保在此步骤之前已加载了 br_netfilter 模块。这可以通过运行 lsmod | grep br_netfilter 来完成。要显示加载它,请调用 modprobe br_netfilter

kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。

在控制平面节点上配置 kubelet 使用的 cgroup 驱动程序

使用 docker 时,kubeadm 会自动为其检测 cgroup 驱动并在运行时对 /var/lib/kubelet/kubeadm-flags.env 文件进行配置。

如果您使用不同的 CRI,您需要使用 cgroup-driver 值修改 /etc/default/kubelet 文件(对于 CentOS、RHEL、Fedora,修改 /etc/sysconfig/kubelet 文件),像这样:

KUBELET_EXTRA_ARGS=--cgroup-driver=<value>

这个文件将由 kubeadm initkubeadm join 使用以获取额外的用户自定义的 kubelet 参数。

请注意,您只需要在您的 cgroup 驱动程序不是 cgroupfs 时这么做,因为它已经是 kubelet 中的默认值。

需要重新启动 kubelet:

systemctl daemon-reload
systemctl restart kubelet

自动检测其他容器运行时的 cgroup 驱动,例如在进程中工作的 CRI-O 和 containerd。

查看kubernetes 镜像并初始化 (master node都要执行)

开始初始化集群之前可以使用kubeadm config images list查看一下初始化需要哪些镜像,可以先通过kubeadm config images pull手动在各个节点上拉取所k8s需要的docker镜像,master节点初始化或者node节点加入集群时,会用到这些镜像

如果不先执行kubeadm config images pull拉取镜像,其实在master节点执行kubeadm init 或者node节点执行 kubeadm join命令时,也会先拉取镜像。

kubeadm config images list
W0823 16:09:49.820989    7970 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
#以下是所需要的镜像
k8s.gcr.io/kube-apiserver:v1.18.8
k8s.gcr.io/kube-controller-manager:v1.18.8
k8s.gcr.io/kube-scheduler:v1.18.8
k8s.gcr.io/kube-proxy:v1.18.8
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
  1. 初始化kubeadm与之对应的命令为kubeadm reset(1.18.8版本忽略这一步)

    kubeadm init --kubernetes-version v1.18.8 \
    --apiserver-advertise-address=10.0.2.15 \
    --service-cidr=10.1.0.0/16 \
    --pod-network-cidr=10.244.0.0/16
    --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
    

    参数说明:

    –kubernetes-version: 用于指定k8s版本; –apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 master本机IP地址。 –pod-network-cidr:用于指定Pod的网络范围,它的值取决于你在下一步选择的哪个网络插件,比如我在本文中使用的是Calico网络,需要指定为192.168.0.0/16 –service-cidr:用于指定SVC的网络范围; –image-repository: 指定阿里云镜像仓库地址,这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址,注意在发文的时候阿里云仓库中最新版本为1.17,所以通过这个镜像地址无法拉取1.18.8版本;

  2. 手动下载docker镜像,编写master_images.sh(master节点所需镜像下载)、node_images.sh(node节点所需镜像下载)

    master_images.sh 脚本内容如下:

    #!/bin/bash
    
    images=(
        kube-apiserver:v1.18.8 
      kube-proxy:v1.18.8
        kube-controller-manager:v1.18.8
        kube-scheduler:v1.18.8
        coredns:1.6.7
        etcd:3.4.3-0
      pause:3.2
    )
    
    for imageName in ${images[@]} ; do
            docker pull gotok8s/$imageName
            docker tag gotok8s/$imageName k8s.gcr.io/$imageName
          docker rmi gotok8s/$imageName
    done
    

    node_images.sh 脚本内容如下:

    #!/bin/bash
    
    images=(
        kube-proxy:v1.18.8
        pause:3.2
    )
    
    for imageName in ${images[@]} ; do
            docker pull gotok8s/$imageName
            docker tag gotok8s/$imageName k8s.gcr.io/$imageName
          docker rmi gotok8s/$imageName
        #docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    #    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName  k8s.gcr.io/$imageName
    done
    

    初始化配置文件

    #初始化配置文件
    kubeadm config print init-defaults > kubeadm.yaml
    #编辑配置文件
    vim kubeadm.yaml
    apiVersion: kubeadm.k8s.io/v1beta2
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 10.0.2.15  # 修改为本机ip地址,多块网卡可以指定具体ip
      bindPort: 6443
    nodeRegistration:
      criSocket: /var/run/dockershim.sock
      name: master1
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: k8s.gcr.io
    kind: ClusterConfiguration
    kubernetesVersion: v1.18.8    # 修改为最新版本
    networking:
      dnsDomain: cluster.local
      serviceSubnet: 10.1.0.0/16 # service网段
      podSubnet: 10.244.0.0/16   # pod网段,需与网络插件网段一致
    scheduler: {}
    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    mode: ipvs                    # 开启ipvs
    
    
    #指定初始化配置文件执行
    kubeadm init --config=kubeadm.yaml
    #看到如下信息代表初始化成功,然后根据提示操作即可
    Your Kubernetes control-plane has initialized successfully!
    #要开始使用群集,您需要以常规用户身份运行以下操作:
    To start using your cluster, you need to run the following as a regular user:
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    #现在应该将pod网络部署到集群。
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
    #待网络配置好后,在子节点执行如下命令,子节点则加入到集群中;
    Then you can join any number of worker nodes by running the following on each as root:
    
    kubeadm join 10.0.2.15:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:763142fb1596ffa79b631210b801e0b0764c23666a01f37f5224a853c8777a93
    

至此我们master节点已经初步完成,执行命令kubectl get nodes 查看集群节点状态可以发现master状态是NotReady,因为此时还没有安装网络组件,下面我们来安装网络组件;

  1. 安装pod网络组件(flannel网络组件为例)

    #下载flannel网络组件配置文件
    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    #安装网络组件
    kubectl apply -f kube-flannel.yml
    #卸载网络组件
    kubectl delete -f kube-flannel.yml
    
  2. 命令查看有多少pods

    #查看默认名称空间下的pods
    kubectl get pods
    #查看名称空间
    kubectl get ns
    #查看所有名称空间下的pods
    kubectl get pods --all-namespaces
    #查看运行节点
    [root@k8s-node1 k8s]# kubectl get nodes
    NAME        STATUS     ROLES    AGE     VERSION
    k8s-node1   Ready      master   3h59m   v1.18.8 #主节点运行正常
    k8s-node2   Ready      <none>   4m25s   v1.18.8 #从节点运行正常,如果为NotReady,我们耐心等待加载即可;
    k8s-node3   Ready      <none>   4m23s   v1.18.8 #从节点运行正常
    

常见问题

  1. 如启动vagrant up 出现如下错误,不要慌,这个是你的虚拟网卡驱动没初始化好

There was an error while executing VBoxManage, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%... Progress state: NS_ERROR_FAILURE VBoxManage: error: Failed to create the host-only adapter VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface VBoxManage: error: Context: "RTEXITCODE handleCreate(HandlerArg *)" at line 95 of file VBoxManageHostonly.cpp

执行以下命令即可

sudo "/Library/Application Support/VirtualBox/LaunchDaemons/VirtualBoxStartup.sh" restart

注意:执行命令可能一些会不成功,你需要进入设置->安全和隐私->常规,并在“允许应用程序...”下批准Oracle,Inc.的请求。

  1. 修改Docker Cgroup Driver为systemd,如果不修改则在后续添加Worker节点时可能会遇到“detected cgroupfs as ths Docker driver.xx”的报错信息,并配置Docker本地镜像库;

    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/"

    cat > /etc/docker/daemon.json <<EOF
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "registry-mirrors":[
                  "https://1nj0zren.mirror.aliyuncs.com",
            "https://kfwkfulq.mirror.aliyuncs.com",
            "https://2lqq34jg.mirror.aliyuncs.com",
            "https://pee6w651.mirror.aliyuncs.com",
            "http://hub-mirror.c.163.com",
            "https://docker.mirrors.ustc.edu.cn",
            "http://f1361db2.m.daocloud.io",
            "https://registry.docker-cn.com"
        ]
    }
    EOF
    
    #以下为常用命令
    #重新加载daemon.json配置
    systemctl daemon-reload
    #重启docker服务 或start docker
    systemctl restart docker
    #设置Kubelet开启开机自启动
    systemctl enable kubelet
    #启动Kubelet服务
    systemctl start kubelet
    #重启kubelet服务
    systemctl restart kubelet
    #查看kubectl健康状态
    kubectl get cs
    
  2. 发现controller-manager和scheduler状态是不健康

    如果节点都处于Ready后,实际上该状态是不影响的。因为kubeadm v1.18.6及以后的版本,是默认不开启controller-manager的10252和scheduler的10251端口的,一般10251和10252是监听在http上面,不需要证书认证,属于不安全的端口。

    可以将/etc/kubernetes/manifests/kube-controller-manager.yaml、/etc/kubernetes/manifests/kube-scheduler.yaml中–port=0注释掉,再次kubect get cs组件状态,这时都是ok了。

    [root@k8s-node1 k8s]# kubectl get cs
    NAME                 STATUS    MESSAGE             ERROR
    controller-manager   Healthy   ok                  
    scheduler            Healthy   ok                  
    etcd-0               Healthy   {"health":"true"} 
    
  3. worker节点加入集群后,一直处于NotReady状态,我们通过监控pod进度查看

    #监控pod状态
    watch kubectl get pods -n kube-system  -o wide
    #指定pod查看详细信息
    kubectl describe pod coredns-66bff467f8-8pksf --namespace=kube-system #coredns-66bff467f8-8pksf是你的pod name
    
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这