Kubernetes是一个可移植的、可扩展的容器集群管理系统开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化,适用于快速交付和频繁变更的场景

kubernetes的特点

可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)

可扩展: 模块化, 插件化, 可挂载, 可组合

自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

部署方式

  1. kubeadm方式部署,部署简单,开发环境
  2. ansible部署,方便做后期节点的添加与维护
  3. 二进制方式部署,复杂度高,但可以高度自定义参数

1. 基础环境准备

  1. 最小化基础系统(此处为Centos 7.9.2009)
  2. 关闭防火墙 selinux和swap
  3. 更新软件源
  4. 时间同步
  5. 各节点安装docker
  • docker要使用兼容的版本,查看kubernetes release changelog说明
  • kubernetes-1.20 CRI 移除docker支持,改用docker shim,此处CRI部署使用docker-ce-3:19.03.15-3.el7

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md

  1. Deprecation
  2. Docker support in the kubelet is now deprecated and will be removed in a future release. The kubelet uses a module called "dockershim" which implements CRI support for Docker and it has seen maintenance issues in the Kubernetes community. We encourage you to evaluate moving to a container runtime that is a full-fledged implementation of CRI (v1alpha1 or v1 compliant) as they become available. (#94624, @dims) [SIG Node]
  3. Kubectl: deprecate --delete-local-data (#95076, @dougsland) [SIG CLI, Cloud Provider and Scalability]

1.1 基础初始化

  1. sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  2. setenforce 0
  3. systemctl disable --now firewalld
  4. swapoff -a
  5. sed -i.bak /swap/d /etc/fstab
  6. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo\
  7. yum -y install vim curl dnf
  8. timedatectl set-ntp true
  9. # 增加内核配置
  10. cat <<EOF > /etc/sysctl.d/k8s.conf
  11. net.ipv4.ip_forward = 1
  12. net.bridge.bridge-nf-call-ip6tables = 1
  13. net.bridge.bridge-nf-call-iptables = 1
  14. EOF
  15. sysctl --system
  16. vim /etc/hosts # 节点hosts本地解析
  17. # 配置阿里云kubernetes镜像
  18. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  19. [kubernetes]
  20. name=Kubernetes
  21. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  22. enabled=1
  23. gpgcheck=1
  24. repo_gpgcheck=1
  25. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  26. EOF
  27. # dnf list kubelet --showduplicates
  28. # 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装

1.2 安装docker

  1. wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  2. # VERSION=3:20.10.5-3.el7
  3. VERSION=3:19.03.15-3.el7
  4. dnf -y install docker-ce-${VERSION}
  5. systemctl enable --now docker
  6. sudo mkdir -p /etc/docker
  7. # 使用推荐的systemd驱动程序 https://kubernetes.io/docs/setup/production-environment/container-runtimes/
  8. sudo tee /etc/docker/daemon.json <<-'EOF'
  9. {
  10. "registry-mirrors": ["https://0nth4654.mirror.aliyuncs.com"],
  11. "exec-opts":["native.cgroupdriver=systemd"]
  12. }
  13. EOF
  14. sudo systemctl daemon-reload
  15. sudo systemctl restart docker
  16. systemctl enable docker
  17. $ vim /usr/lib/systemd/system/docker.service
  18. $ 使用推荐的systemd驱动程序
  19. $ ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd

2. 部署harbor及haproxy高可用反向代理

2.1 镜像加速配置

  1. #kubeadm config images list --kubernetes-version v1.20.5
  2. k8s.gcr.io/kube-apiserver:v1.20.5
  3. k8s.gcr.io/kube-controller-manager:v1.20.5
  4. k8s.gcr.io/kube-scheduler:v1.20.5
  5. k8s.gcr.io/kube-proxy:v1.20.5
  6. k8s.gcr.io/pause:3.2
  7. k8s.gcr.io/etcd:3.4.13-0
  8. k8s.gcr.io/coredns:1.7.0
  9. docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.20.5
  10. ...
  11. docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.20.5 harbor.alp.local/kubernetes-basic/kube-apiserver:v1.20.5
  12. ...

2.2 高可用master可配置

3. 初始化master节点

在所有的master节点安装指定版本的kubeadm、kubelet、kubectl、docker

在master和node节点安装kubeadm、kubelet、kubectl、docker等软件

  1. # dnf list kubeadm --showduplicates
  2. version=1.20.5 && echo $version
  3. dnf install kubeadm-$version kubelet-$version kubectl-$version
  4. systemctl enable --now kubelet && systemctl status kubelet

4. 初始化node节点

在所有node节点安装指定版本的kubeadm、kubelet、docker

  1. version=1.20.5 && echo $version
  2. dnf install kubeadm-$version kubelet-$version
  3. systemctl enable --now kubelet

所有节点都需要安装kubeadm on ubuntu

  1. # for master
  2. apt-cache madsion kubeadm=1.17.2-00 kubectl-1.17.2-00 kubelet=1.17.2-00
  3. # for node
  4. apt install kubeadm=1.17.2-00 kubelet=1.17.2-00

5. master节点kubeadm init初始化

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

master节点中任意一台进行初始化,且只需要初始化一次

  1. # kubeadm init -h
  2. # kubeadm config images list --kubernetes-version v1.20.5 # 可提前下载镜像,防止初始化失败
  3. # https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
  4. kubeadm init \
  5. --apiserver-advertise-address=192.168.1.113 \
  6. --apiserver-bind-port=6443 \
  7. --control-plane-endpoint=192.168.1.113 \
  8. --ignore-preflight-errors=swap \
  9. --service-dns-domain=alp.domain \
  10. --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
  11. --kubernetes-version=1.20.5 \
  12. --pod-network-cidr=10.0.0.0/16 \
  13. --service-cidr=172.20.1.0/20
  14. #################################################
  15. [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
  16. [addons] Applied essential addon: CoreDNS
  17. [addons] Applied essential addon: kube-proxy
  18. Your Kubernetes control-plane has initialized successfully!
  19. To start using your cluster, you need to run the following as a regular user:
  20. mkdir -p $HOME/.kube
  21. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  22. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  23. Alternatively, if you are the root user, you can run:
  24. export KUBECONFIG=/etc/kubernetes/admin.conf
  25. You should now deploy a pod network to the cluster.
  26. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  27. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  28. You can now join any number of control-plane nodes by copying certificate authorities
  29. and service account keys on each node and then running the following as root:
  30. kubeadm join 192.168.1.113:6443 --token 0ej3dg.1msgev7hznukc183 \
  31. --discovery-token-ca-cert-hash sha256:7c901a6b1ae135e2ce1012265d9bd3887e128b7d35e147a29ecdeb5e6ca01568 \
  32. --control-plane
  33. Then you can join any number of worker nodes by running the following on each as root:
  34. kubeadm join 192.168.1.113:6443 --token 0ej3dg.1msgev7hznukc183 \
  35. --discovery-token-ca-cert-hash sha256:7c901a6b1ae135e2ce1012265d9bd3887e128b7d35e147a29ecdeb5e6ca01568

5.1基于文件初始化master节点

  1. kubeadm config print init-defaults > kubeadm-init.yml # 输出默认初始化配置
  2. vim kubeadm-init.yml
  3. # bootstrapTokens时间
  4. # 监听地址 advertiseAddress
  5. # kubernetesVersion
  6. # dnsDomain
  7. # + podSubnet
  8. # serviceSubnet
  9. # imageRepository
  10. # + controlPlanEndpoint # vip地址 172.16.3.248:6443
  11. # 40 line
  12. kubeadm init --config kubeadm-init.yml

5.2 将其他master主机加入集群(扩容master )

  1. kubeadm init phase upload-certs --upload-certs # 取得key
  2. kubeadm join 192.168.1.113:6443 --token gpduj8.mpejowfe7entffhk \
  3. --discovery-token-ca-cert-hash sha256:1a56f5c63583097f19842b56195648c4df233448db80905c4c808f9f28821d82 \
  4. --control-plane --certificate-key ${key}

6. 验证master节点状态

6.1 安装flannel网络插件

  1. wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  2. 修改默认的pod-network-cidr为初始化设置的(默认配置为10.244.0.0
  3. kubectl apply -f kube-flannel.yml

6.2 查看集群状态

  1. export KUBECONFIG=/etc/kubernetes/admin.conf
  2. [0 root@master1 /root] #kubeadm version
  3. kubeadm version: &version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.5", GitCommit:"6b1d87acf3c8253c123756b9e61dac642678305f", GitTreeState:"clean", BuildDate:"2021-03-18T01:08:27Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"}
  4. [0 root@master /root] #kubectl get nodes -A
  5. NAME STATUS ROLES AGE VERSION
  6. master NotReady control-plane,master 7m17s v1.20.5
  7. [0 root@master1 /root] #kubectl get pods -A
  8. NAMESPACE NAME READY STATUS RESTARTS AGE
  9. kube-system coredns-54d67798b7-6sfsj 0/1 Pending 0 7m6s
  10. kube-system coredns-54d67798b7-v2lh6 0/1 Pending 0 7m6s
  11. kube-system etcd-master 1/1 Running 0 7m13s
  12. kube-system kube-apiserver-master 1/1 Running 0 7m13s
  13. kube-system kube-controller-manager-master 1/1 Running 0 7m13s
  14. kube-system kube-proxy-6zfdd 1/1 Running 0 7m6s
  15. kube-system kube-scheduler-master 1/1 Running 0 7m13s

6.3 使得单master节点状态可用

  1. kubectl taint node master node-role.kubernetes.io/master=:NoSchedule #设置master不可调度
  2. kubectl taint node master node-role.kubernetes.io/master- # 设置master可调度
  3. kubectl describe node master | grep Taints # 查看污点标签

6.4 增加master节点

6.4.1 拷贝证书方式

  1. # 1. 从已kubeadm init的节点拷贝证书
  2. scp /etc/kubernetes/pki/ca.* master-2:/etc/kubernetes/pki/
  3. scp /etc/kubernetes/pki/sa.* master-2:/etc/kubernetes/pki/
  4. scp /etc/kubernetes/pki/front-proxy-ca.* master-2:/etc/kubernetes/pki/
  5. scp /etc/kubernetes/pki/etcd/ca.* master-2:/etc/kubernetes/pki/etcd/
  6. # 2. 新master进行初始化
  7. kubeadm join 192.168.1.113:6443 --token 0ej3dg.1msgev7hznukc183 \
  8. --discovery-token-ca-cert-hash sha256:7c901a6b1ae135e2ce1012265d9bd3887e128b7d35e147a29ecdeb5e6ca01568 \
  9. --control-plane

6.4.2 生成证书方式

  1. # 1. 当前 maste 生成证书用于添加新控制节点
  2. kubeadm init phase upload-certs --upload-certs
  3. # 2. 新master进行初始化
  4. kubeadm join 192.168.1.113:6443 --token abcdef.0123456789abcdef \
  5. --discovery-token-ca-cert-hash sha256:c555fd7cdf1f08d1b4aab959417bb620010e3376c6be406d8a36ddc1fdd233eb \
  6. --control-plane \
  7. --certificate-key 6ff68e4e7c0255073a9f0a9d96b76fc8f4ec4b490dfdaf6a567b4dd95622f012

7. 将node节点加入k8s集群

使用kubeadm将node节点加入k8smaster

  1. kubeadm join 192.168.1.113:6443 --token 0ej3dg.1msgev7hznukc183 \
  2. --discovery-token-ca-cert-hash sha256:7c901a6b1ae135e2ce1012265d9bd3887e128b7d35e147a29ecdeb5e6ca01568

kubeadm重新生成加入token

  1. # kubeadm token create --print-join-command

8. 验证集群状态

  1. # 查看node状态
  2. kubectl get node
  3. kubectl describe node node1
  4. # 验证k8s集群状态
  5. kubectl get cs
  6. NAME STATUS MESSAGE ERROR
  7. controller-manager Healthy ok
  8. scheduler Healthy ok
  9. etcd-0 Healthy {"health":"true"}
  10. # 当前csr证书状态
  11. kubectl get csr
  12. NAME AGE REQUESTOR CONDITION
  13. csr-7bzrk 14m system:bootstrap:0fpghu Approved,Issued
  14. csr-jns87 20m system:node:kubeadm-master1.magedu.net Approved,Issued
  15. csr-vcjdl 14m system:bootstrap:0fpghu Approved,Issued

9. 创建pod并测试网络通信

  1. kubectl create deployment net --image=busybox --replicas=3 -- sleep 36000
  2. # kubectl scale deploy net --replicas=10
  3. kubectl get pod -o wide
  4. kubectl exec -it $(pod_name) -- sh
  5. # ping 其他pod节点和外网测试网络通信

10. 部署dashboard

https://github.com/kubernetes/dashboard

https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md

10.2 配置与安装 dashboard与admin-user

  1. wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml -o dashboard-v2.2.0.yml
  2. # 由于官方为localhost访问,此处添加type: NodePort直接代理出来访问dashboard(添加第40行)
  3. # cat -n dashboard-v2.2.0.yml | sed -n 32,45p
  4. 32 kind: Service
  5. 33 apiVersion: v1
  6. 34 metadata:
  7. 35 labels:
  8. 36 k8s-app: kubernetes-dashboard
  9. 37 name: kubernetes-dashboard
  10. 38 namespace: kubernetes-dashboard
  11. 39 spec:
  12. ++> 40 type: NodePort
  13. 41 ports:
  14. 42 - port: 443
  15. 43 targetPort: 8443
  16. 44 selector:
  17. 45 k8s-app: kubernetes-dashboard
  18. # cat admin-user.yml
  19. apiVersion: v1
  20. kind: ServiceAccount
  21. metadata:
  22. name: admin-user
  23. namespace: kubernetes-dashboard
  24. ---
  25. apiVersion: rbac.authorization.k8s.io/v1
  26. kind: ClusterRoleBinding
  27. metadata:
  28. name: admin-user
  29. roleRef:
  30. apiGroup: rbac.authorization.k8s.io
  31. kind: ClusterRole
  32. name: cluster-admin
  33. subjects:
  34. - kind: ServiceAccount
  35. name: admin-user
  36. namespace: kubernetes-dashboard
  37. # kubectl apply -f dashboard-v2.2.0.yml -f admin-user.yml

10.2 登录dashboard

  1. #- 1. 获取nodeport 为 32241
  2. #kubectl get services -n kubernetes-dashboard
  3. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  4. dashboard-metrics-scraper ClusterIP 172.16.4.15 <none> 8000/TCP 41m
  5. kubernetes-dashboard NodePort 172.16.1.0 <none> 443:32241/TCP 41m
  6. #- 2. 获取token
  7. # kubectl get secret -A | grep admin-user
  8. # kubectl describe secret admin-user-token-nzpjj -n kubernetes-dashboard
  9. # -3. 访问dashboard
  10. https://192.168.1.113:32241

10.3 Kubeconfig登录

制作Kubeconfig文件

10.4 设置token登录会话保持时间

  1. # vim dashboard/kubernetes-dashboard.yaml
  2.    image: harbor.alp.local/baseimages/kubernetes-dashboard-amd64:v1.10.1
  3.    ports:
  4.    - containerPort: 8443
  5.     protocol: TCP
  6.    args:
  7.     - --auto-generate-certificates
  8.     - --token-ttl=43200
  9. # kubectl apply -f .

11. k8s集群升级

https://v1-20.docs.kubernetes.io/zh/docs/setup/release/version-skew-policy/

11.1 升级kubeadm为指定版本

  1. dnf install kubeadm=1.20.4

11.2 升级master

  1. kubeadm upgrade plan # 查看变化
  2. kubeadm upgrade apply v1.20.4 # 开始升级
  3. dnf install kubelet=1.20.4 kubectl=1.20.4 kubeadm=1.20.4

11.2 升级node

  1. kubeadm upgrade node --kubelet-version 1.20.4 #升级各 node 节点配置文件
  2. dnf install kubelet=1.20.4 kubeadm=1.20.4 #升级 kubelet 二进制包

12. 其他部署相关命名

  1. kubeadm reset # 重置节点,不可恢复
  2. kubeadm token --help # token管理
  3. kubectl taint node master node-role.kubernetes.io/master- #设置master节点可调度
  4. # node节点重建操作
  5. # kubectl drain node01 --delete-local-data --force --ignore-daemonsets
  6. #清空节点(若节点已经NotReady了,则drain命令会卡住无法完成)
  7. kubectl delete node node01 # 删除node01节点
  8. kubectl uncordon node01 # 恢复node01节点调度
  9. # 初始化 Control-plane/Master 节点
  10. kubeadm init \
  11. --apiserver-advertise-address 0.0.0.0 \
  12. # API 服务器所公布的其正在监听的 IP 地址,指定“0.0.0.0”以使用默认网络接口的地址
  13. # 切记只可以是内网IP,不能是外网IP,如果有多网卡,可以使用此选项指定某个网卡
  14. --apiserver-bind-port 6443 \
  15. # API 服务器绑定的端口,默认 6443
  16. --cert-dir /etc/kubernetes/pki \
  17. # 保存和存储证书的路径,默认值:"/etc/kubernetes/pki"
  18. --control-plane-endpoint kuber4s.api \
  19. # 为控制平面指定一个稳定的 IP 地址或 DNS 名称,
  20. # 这里指定的 kuber4s.api 已经在 /etc/hosts 配置解析为本机IP
  21. --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  22. # 选择用于拉取Control-plane的镜像的容器仓库,默认值:"k8s.gcr.io"
  23. # 因 Google被墙,这里选择国内仓库
  24. --kubernetes-version 1.17.3 \
  25. # 为Control-plane选择一个特定的 Kubernetes 版本, 默认值:"stable-1"
  26. --node-name master01 \
  27. # 指定节点的名称,不指定的话为主机hostname,默认可以不指定
  28. --pod-network-cidr 10.10.0.0/16 \
  29. # 指定pod的IP地址范围
  30. --service-cidr 10.20.0.0/16 \
  31. # 指定Service的VIP地址范围
  32. --service-dns-domain cluster.local \
  33. # 为Service另外指定域名,默认"cluster.local"
  34. --upload-certs
  35. # 将 Control-plane 证书上传到 kubeadm-certs Secret

- PS

- 手把手从零搭建与运营生产级的 Kubernetes 集群与 KubeSphere

- kubectl cmd

- kubernetes技能图谱

- kubeadm-init.yml

  1. apiVersion: kubeadm.k8s.io/v1beta2
  2. bootstrapTokens:
  3. - groups:
  4. - system:bootstrappers:kubeadm:default-node-token
  5. token: abcdef.0123456789abcdef
  6. ttl: 36h0m0s
  7. usages:
  8. - signing
  9. - authentication
  10. kind: InitConfiguration
  11. localAPIEndpoint:
  12. advertiseAddress: 192.168.1.113
  13. bindPort: 6443
  14. nodeRegistration:
  15. criSocket: /var/run/dockershim.sock
  16. name: master
  17. taints:
  18. - effect: NoSchedule
  19. key: node-role.kubernetes.io/master
  20. ---
  21. apiServer:
  22. timeoutForControlPlane: 4m0s
  23. apiVersion: kubeadm.k8s.io/v1beta2
  24. certificatesDir: /etc/kubernetes/pki
  25. clusterName: kubernetes
  26. # controlPlaneEndpoint: 192.168.1.113:6443
  27. controllerManager: {}
  28. dns:
  29. type: CoreDNS
  30. etcd:
  31. local:
  32. dataDir: /var/lib/etcd
  33. imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
  34. kind: ClusterConfiguration
  35. kubernetesVersion: v1.20.5
  36. networking:
  37. dnsDomain: alpine.local
  38. podSubnet: 10.0.0.0/16
  39. serviceSubnet: 172.16.0.0/20
  40. scheduler: {}

Kubernetes集群搭建 ver1.20.5的更多相关文章

  1. Kubernetes集群搭建之企业级环境中基于Harbor搭建自己的私有仓库

    搭建背景 企业环境中使用Docker环境,一般出于安全考虑,业务使用的镜像一般不会从第三方公共仓库下载.那么就要引出今天的主题 企业级环境中基于Harbor搭建自己的安全认证仓库 介绍 名称:Harb ...

  2. kubernetes集群搭建(2):docker私有仓库

    kubernetes集群搭建(1):环境准备 中各节点已经安装好了docker,请确认docker已启动并正常运行 1.通过命令启动私库 docker run -d -p 5000:5000 --pr ...

  3. Centos 7 kubernetes集群搭建

    一.环境准备 Kubernetes支持在物理服务器或虚拟机中运行,本次使用虚拟机准备测试环境,硬件配置信息如表所示: IP地址 节点角色 CPU Memory Hostname 磁盘 192.168. ...

  4. Kubernetes集群搭建(详细)

    kubernetes集群搭建(kubeadm方式) kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具.这个工具能通过两条指令完成一个kubernetes集群的部署: # 创 ...

  5. [云原生]Kubernetes - 集群搭建(第2章)

    目录 一.前置知识点 二.kubeadm部署方式介绍 三.安装要求 四.最终目标 五.准备环境 六.环境初始化 6.1 设置系统主机名以及Hosts文件的相互解析 6.2 安装依赖文件(所有节点) 6 ...

  6. Kubernetes集群搭建过程中遇到的问题

    1. 创建Nginx Pod过程中报如下错误: #kubectlcreate -f nginx-pod.yaml Error from server: error when creating &quo ...

  7. Kubernetes集群搭建之Master配置篇

    本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 今天终于到正题了~~ 生成kubernets证书与私钥 1. 制作kubernetes ca证 ...

  8. Kubernetes集群搭建之系统初始化配置篇

    Kubernetes的几种部署方式 1. minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境 ...

  9. kubernetes集群搭建

    工作环境: 主机名 IP 系统 master 192.168.199.6 rhel7.4 node1 192.168.199.7 rhel7.4 node2 192.168.199.8 rhel7.4 ...

随机推荐

  1. 从中国加入WTO来看Java设计模式:中介者模式

    目录 应用场景 中介者模式 定义 意图 主要解决问题 何时使用 优缺点 世界贸易组织WTO 应用场景 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象 想通过一个 ...

  2. Go之Zap日志库集成Gin

    简介 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小.时间或间隔等来切割日志文件; ...

  3. openpyxl 库

    1. 简介与安装 2.具体示例 2.1 获取workbook与sheet对象 2.2 访问单元格及其值 2.3 写数据 2.4 设置样式 1. 简介与安装 openpyxl 简介 openpyxl 是 ...

  4. Android Studio在android Emulator中运行的项目黑屏

    前言: 最近在做一个Android相关的小项目,因为之前这方面的项目做的比较的少.今天在使用虚拟机调试的时候经常出现一些莫名其妙的问题,经过自己多次的尝试和搜索终于解决了这些问题. 问题: 每次run ...

  5. 【Java】 Java中的浅拷贝和深拷贝

    先抛出结论: 浅拷贝是引用拷贝,A对象拷贝B以后,A对象和B对象指向同一块内存地址,改变A对象的属性值会触发B对象属性的改变,有安全风险 深拷贝是对象拷贝,A对象拷贝B以后,A对象和B对象指向不同的额 ...

  6. nginx添加module之threads

    一.安装nginx yum安装nginx 折叠源码 1 2 3 4 5 6 7 8 9 10 11 12 # 添加nginx源 rpm -ivh http://nginx.org/packages/c ...

  7. 洛谷P1085 不高兴的津津

    题目描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞蹈和钢琴.但是津津如果一天上课超过八个小时就会不高兴,而 ...

  8. Python脚本抓取京东手机的配置信息

    以下代码是使用python抓取京东小米8手机的配置信息 首先找到小米8商品的链接:https://item.jd.com/7437788.html 然后找到其配置信息的标签,我们找到其配置信息的标签为 ...

  9. 逆向 string.h 函数库 strlen、memchr、strcat 函数

    strlen 函数 主要功能:返回字符串的长度 C/C++ 实现: #include <iostream> #include <stdio.h> #include <st ...

  10. postgresql高级应用之合并单元格

    postgresql高级应用之合并单元格 转载请注明出处https://www.cnblogs.com/funnyzpc/p/14732172.html 1.写在前面✍ 继上一篇postgresql高 ...