什么是Kubernetes

Kubernetes是一个开源平台,用于跨主机群集自动部署,扩展和操作应用程序容器,提供以容器为中心的基础架构。

使用Kubernetes,您可以快速高效地响应客户需求:

  • 快速,可预测地部署应用程序。
  • 在运行中扩展应用程序。
  • 无缝推出新功能。
  • 仅使用您需要的资源来优化硬件的使用。

我们的目标是建立一个组件和工具的生态系统,以减轻在公共云和私有云中运行应用程序的负担。

Kubernetes是:

Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。

主要功能如下:

1)将多台Docker主机抽象为一个资源,以集群方式管理容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。

2)使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题

3)自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有十个容器在运行,反而杀死多余的。

kubernetes角色组成:

1)Pod

Pod是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;

同一个Pod只能运行在同一个主机上,共享相同的volumes、network、namespace;

2)ReplicationController(RC)

RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后,系统会根据定义好的副本数来创建Pod数量。在运行过程中,如果Pod数量小于定义的,就会重启停止的或重新分配Pod,反之则杀死多余的。当然,也可以动态伸缩运行的Pods规模。

RC通过label关联对应的Pods,在滚动升级中,RC采用一个一个替换要更新的整个Pods中的Pod。

3)Service

Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。集合根据定义的Label和selector完成,当创建一个Service后,会分配一个Cluster IP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡。

4)Label

Label是用于区分Pod、Service、RC的key/value键值对;

Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;

主要是将Service的请求通过lable转发给后端提供服务的Pod集合;

kubernetes组件组成:

1)kubectl

客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。

2)kube-apiserver

作为整个系统的控制入口,以REST API服务提供接口。

3)kube-controller-manager

用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。

4)kube-scheduler

负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。

5)etcd

负责节点间的服务发现和配置共享。

6)kube-proxy

运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。

7)kubelet

运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。

8)DNS

一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。

基本部署步骤:

)minion节点安装docker

)minion节点配置跨主机容器通信

)master节点部署etcd、kube-apiserver、kube-controller-manager和kube-scheduler组件

)minion节点部署kubelet、kube-proxy组件


kubernetes 1.5.2 yum源

[virt7-docker-common-candidate]
name=virt7-docker-common-candidate
baseurl=https://cbs.centos.org/repos/virt7-docker-common-candidate/x86_64/os/
enabled=1
gpgcheck=0
EOF
使用阿里云yum源
wget http://mirrors.aliyun.com/repo/Centos-7.repo wget http://mirrors.aliyun.com/repo/epel-7.repo  [root@master ~] yum -y install kubernetes etcd
[root@master ~] cd /etc/kubernetes/
[root@master ~] ls
apiserver config controller-manager sheduler 修改master apiserver 文件
 [root@master ~]  cat apiserver

  KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

  KUBE_API_PORT="--port=8080"

  KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.20.226:2379"

  KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

  KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

  KUBE_API_ARGS=""

修改 master config 文件

  KUBE_LOGTOSTDERR="--logtostderr=true"

  KUBE_LOG_LEVEL="--v=0"

  KUBE_ALLOW_PRIV="--allow-privileged=false"

  KUBE_MASTER="--master=http://192.168.20.226:8080"

修改master  etcd配置文件

  ETCD_NAME=default
  ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  ETCD_LISTEN_CLIENT_URLS="http://192.168.20.226:2379"
  ETCD_ADVERTISE_CLIENT_URLS="http://192.168.20.226:2379"

master 启动kubernetes 和 etcd 服务

etcd.service
kube-apiserver.service kube-controller-manager.service kube-scheduler.service
systemctl  start etcd.service
systemctl  start kube-apiserver.service
systemctl  start kube-controller-manager.service
systemctl start kube-scheduler.service

node节点配置

node 节点配置
[root@docker223 ~]# yum kubernetes docker openswitch openvswitch 网络互通 查看http://www.cnblogs.com/fengjian2016/p/6253039.html
[root@docker223 ~]#  vim /etc/kubernetes/kubelet 

 KUBELET_ADDRESS="--address=0.0.0.0"

 KUBELET_HOSTNAME="--hostname-override=192.168.20.223"

 KUBELET_API_SERVER="--api-servers=http://192.168.20.226:8080"

 KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

 KUBELET_ARGS=""

[root@docker223 kubernetes]# vim /etc/kubernetes/config 

 KUBE_LOGTOSTDERR="--logtostderr=true"

 KUBE_LOG_LEVEL="--v=0"

 KUBE_ALLOW_PRIV="--allow-privileged=false"

 KUBE_MASTER="--master=http://192.168.20.226:8080"


node 启动kubernetes 服务 kubelet.service   kube-proxy.service
[root@docker223 kubernetes]# systemctl start kube-kubelet.service
[root@docker223 kubernetes]# systemctl start kube-proxy.service

其他node节点  修改 /etc/kubernetes/kubelet KUBELET_HOSTNAME="--hostname-override=192.168.20.223"(自己的ip地址),

/etc/kubernetes/config  KUBE_MASTER="--master=http://192.168.20.226:8080" master地址

然后启动kubelet 和 kube-proxy 服务


在master 查看 node状态

[root@master ~] # kubectl get nodes

[root@master ~] # kubectl get node 192.168.20.223


配置pod和容器

一定义容器的环境变量

创建pod时,可以为在pod中运行的容器是这环境变量, 要设置环境变量,需要env 字段包含在配置文件中

pod的配置文件定义了一个 名称DEMO_GREETING 和 值为 环境变量 “Hello from the environment”

pod.yaml

apiVersion: v1
kind: Pod
metadata: #元数据信息
name: envar-demo #kubectl get pods 和 登陆容器显示的名字
labels: #标签
purpose: demonstrate-envars #标签,可以作为查询条件 kubectl get pods -l purpose=demonsstrate-envars
spec:                  #规格
containers: #容器
- name: envar-demo-container #容器名称
image: docker.cinyi.com:/senyint/centos7.3 #使用的镜像
env:                 #设置env,登陆到容器中查看环境变量, DEME_GREETING 的值是 "hello from the enviroment"
- name:DEME_GREETING
value: "hello from the environment"

1. 基于YAML配置文件创建pod
[root@master ~]# kubectl create -f pod.yaml 2.列出正在运行的pods
[root@master ~]# kubectl get pods 3.列出标签中 purpose等于demonstrate-envars的pod
[root@master ~]# kubectl get pods -l purpose=demonstrate-envars

4.获取一个shell 进入到pod 中运行的容器中

[root@master ~]# kubectl exec -it envar-demon /bin/bash


二、定义容器的命令和参数

创建pod时,可以为在pod中运行的容器定义命令和参数, 要定义命令,需要把command字段包含在配置文件中, 要定义参数,请将该args字段包含在配置文件中,创建pod后, 无法更改定义的命令和参数

您在配置文件中定义的命令和参数会覆盖容器图像提供的默认命令和参数

command_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: command-demo
labels:
purpose: demonstrate-command
spec:
containers:
- name: command-demo-container
image: docker.cinyi.com:/senyint/centos7.
command: ["printenv"]
args: ["HOSTNAME", "KUBENETES_PORT"] 1. 基于yaml配置文件常见pod
[root@master ~]# kubectl create -f command_pod.yaml 2.列出正在运行的pods
[root@master ~]# kubectl get pods 3. 查看容器中运行的命令的输出,请查看pod中的日志
[root@master ~]# kubectl log comman-demon 显示的HOSTNAME 和 KUBENETES_PORT环境变量值为


三、想容器分配CPU 和RAM 资源

创建Pod时,可以为在Pod中运行的容器请求CPU和RAM资源。您还可以设置CPU和RAM资源的限制。要请求CPU和RAM资源,请resources:requests在配置文件中包含该字段。要设置CPU和RAM资源的限制,请包括 resources:limits字段。

只有当节点有足够的CPU和RAM可用来满足Pod中所有容器请求的总CPU和RAM时,Kubernetes才会计划一个Pod在节点上运行。此外,当容器在节点上运行时,Kubernetes不允许容器使用的CPU和RAM超过为容器指定的限制。如果容器超过其RAM限制,它将终止。如果容器超过其CPU限制,它将成为其CPU使用受到限制的候选。

Pod的配置文件请求250 milicpu和64 mebibtes的RAM。它还设置了1 cpu和128兆字节RAM的上限

cpu_ram_pod.yaml

apiVersion: v1
kind: Pod
metadata:
name: cpu-ram-demo
spec:
containers:
- name: cpu-ram-demo-container
image: gcr.io/google-samples/node-hello:1.0
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "" 1. 基于yaml配置文件常见pod [root@master ~]# kubectl create -f cpu_ram_pod.yaml 2. 查看pods cpu-ram-demon详细信息
四、配置单元以将卷用于存储

容器的文件系统只存在于容器中,因此当容器终止并重新启动时,文件系统的更改将丢失。对于独立于容器的更一致的存储,您可以使用 卷。这对于状态应用程序(例如键值存储和数据库)尤其重要。例如,Redis是一个键值缓存和存储。

创建一个运行一个容器的Pod。这个Pod有一个类型为EmptyDir的卷, 它持续了Pod的生命周期,即使容器终止和重新启动。这里是Pod的配置文件

apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-storage
mountPath: /data/redis
volumes:
- name: redis-storage
emptyDir: {}

使用服务访问集群中的应用程序

目的

  • 运行Hello World应用程序的两个实例。
  • 创建公开节点端口的Service对象。
  • 使用Service对象访问正在运行的应用程序

1. 在进去中运行Hello World应用程序

[root@kubernetes ~]#  kubectl run hello-world --replicas= --labels="run=load-balancer-example" --image=gcr.io/google-samples/node-hello:1.0  --port=

上述命令将创建一个 Deployment 对象和一个关联的 ReplicaSet 对象。ReplicaSet有两个 Pod,每个都运行Hello World应用程序。

2. 显示有关部署的信息:

[root@kubernetes ~]# kubectl get pods

  NAME                 READY     STATUS R      ESTARTS      AGE
  hello-world-2895499144-d99r4    0/1      Running       0          42s
  hello-world-2895499144-v5wkb    1/1      Running       0          2h

[root@kubernetes ~]# kubectl describe hello-world-2895499144-d99r4

3.显示有关ReplicaSet 对象的信息:

[root@kubernetes ~]# kubectl get replicasets
[root@kubernetes ~]# kubectl describe replicasets

4. 创建公开部署的Service对象

[root@kubernetes ~]# kubectl expose deployment hello-world --type=NodePort --name=example-server
service "example-server" exposed

5.显示有关服务器的信息

[root@kubernetes ~]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
example-server 10.254.140.175 <nodes> /TCP 45s
kubernetes 10.254.0.1 <none> /TCP 2d
nginxserver 10.254.235.210 <none> /TCP 21h [root@kubernetes ~]# kubectl describe service example-server

Name:      example-server
Namespace:   default
Labels:     run=load-balancer-example
Selector:   run=load-balancer-example
Type:      NodePort
IP:        10.254.140.175
Port:      <unset> 8080/TCP
NodePort:   <unset> 30049/TCP    #自动分配的
Endpoints:  10.0.224.4:8080
Session Affinity: None
No events.

记下服务的NodePort值。例如,在前面的输出中,NodePort值为31496。

http://192.168.20.224:31496

6.列出运行Hello world 应用程序的pod

[root@kubernetes ~]# kubectl  get pods --selector="run=load-balancer-example"
NAME READY STATUS RESTARTS AGE
hello-world--d99r4 / ImagePullBackOff 17m
hello-world--v5wkb / Running 2h
[root@kubernetes ~]# kubectl get pods --selector="run=load-balancer-example" --output=wide
NAME READY STATUS RESTARTS AGE IP NODE
hello-world--d99r4 / ImagePullBackOff 17m 10.0.225.4 192.168.20.225
hello-world--v5wkb / Running 2h 10.0.224.4 192.168.20.224

7. 使用节点地址和节点端口访问Hello World应用程序:

curl http://<public-node-ip>:<node-port>

其中<public-node-ip>是您的节点的公共IP地址,<node-port>是您的服务的NodePort值。

[root@kubernetes ~]# curl  192.168.20.224:

Hello Kubernetes!

8. 删除服务

[root@kubernetes ~]# kubectl  delete service example-server
service "example-server" deleted 要删除运行Hello World应用程序的Deployment,ReplicaSet和Pod,请输入以下命令

  [root@kubernetes ~]# kubectl delete deployment hello-world
  deployment "hello-world" deleted

公开外部IP地址以访问集群中的应用程序

  • 运行Hello World应用程序的五个实例。
  • 创建公开外部IP地址的Service对象。
  • 使用Service对象访问正在运行的应用程序。

创建5个pod 运行的应用程序

[root@kubernetes ~]# kubectl  run hello-world --replicas= --labels="run=load-balncer-example" --image=gcr.io/google-samples/node-hello:1.0 --port=

显示有关部署的信息
[root@kubernetes ~]# kubctl get pods
[root@kubernetes ~]# kubectl describe pods hello-world 显示有关ReplicaSet对象的信息
[root@kubernetes ~]# kubectl get replicasets
[root@kubernetes ~]# kubectl describe replicasets
[root@kubernetes ~]# kubectl describe pods hello-world 创建部署的Service对象
[root@kubernetes ~]# kubectl expose deployment hello-world --type=LoadBalancer --name=my-services 显示有关服务的信息
[root@kubernetes ~]# kubectl get service
[root@kubernetes ~]# kubectl describe service my-service

[root@kubernetes ~]# kubectl describe  services my-services

记下服务公开的外部IP地址。在此示例中,外部IP地址为104.198.205.71。还要注意端口的值。在此示例中,端口为8080


使用部署运行无状态应用程序

  • 创建nginx部署。
  • 使用kubectl列出有关部署的信息。
  • 更新部署。
创建和探索nginx部署

vim deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: docker.cinyi.com:443/nginx:v1.0
ports:
- containerPort: 80 [root@kubernetes nginx]# kubectl  create -f deployment.yam
[root@kubernetes nginx]#  kubectl  describe deployment
[root@kubernetes nginx]#  kubectl  describe pods  nginx-deployment
[root@kubernetes nginx]#  kubectl  exec -it nginx-deployment-253806509-bfwxw /bin/bash 

更新部署,更新images

vim  depolyment_update.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: docker.cinyi.com:443/nginx:v1.1 #更新了镜像版本
ports:
- containerPort:
应用新的yaml文件,更新了nginx版本
[root@kubernetes nginx]# kubectl  apply -f deployment_update.yaml  
通过命令查看更新情况
[root@kubernetes nginx]# kubectl get pods -l app=nginx

 
更新部署,更新replica副本数
vim  depolyment_replicas.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 4
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: docker.cinyi.com:443/nginx:v1.1 #更新了镜像版本
ports:
- containerPort:

应用新的yaml文件,更新了nginx版本
[root@kubernetes nginx]# kubectl  apply -f deployment_update.yaml  

通过命令查看更新情况

[root@kubernetes nginx]# kubectl get pods -l app=nginx

删除部署

[root@kubernetes nginx]#  kubectl delete deployment nginx-deployment
 

资源管理

许多应用程序需要创建多个资源,例如deployment和service 。通过将多个资源一起分组在同一文件(由---YAML 分隔)中,可以简化对多个资源的管理

apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
spec:
type: LoadBalancer
ports:
- port:
selector:
app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.
ports:
- containerPort: 80 [root@kubernetes nginx]# kubectl create -f nginx.yaml

[root@kubernetes nginx]# kubectl create -f nginx-1.yaml -f nginx-2.yaml
deployment "nginx-deployment" created
service "my-nginx-svc" created


缩放应用程序

当应用程序的负载增长或缩小时,可以轻松扩展kubectl。例如,要将nginx副本的数量从3减少到1,请执行以下操作
kubectl scale deployment/my-nginx --replicas=1
 

kubernet-dashboard安装

.下载dashboard.yaml
kubectl create -f https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml .修改yaml文件
image 镜像从
gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.1
修改成: image: docker.cinyi.com:/kubernetes-dashboard-amd64:v1.5.1 打开注释,修改成apiserverIP地址和端口
- --apiserver-host=http://192.168.20.226:8080 配置文件如下:
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
replicas:
selector:
matchLabels:
app: kubernetes-dashboard
template:
metadata:
labels:
app: kubernetes-dashboard
annotations:
scheduler.alpha.kubernetes.io/tolerations: |
[
{
"key": "dedicated",
"operator": "Equal",
"value": "master",
"effect": "NoSchedule"
}
]
spec:
containers:
- name: kubernetes-dashboard
image: docker.cinyi.com:/kubernetes-dashboard-amd64:v1.5.1
imagePullPolicy: Always
ports:
- containerPort:
protocol: TCP
args:
- --apiserver-host=http://192.168.20.226:8080
livenessProbe:
httpGet:
path: /
port:
initialDelaySeconds:
timeoutSeconds:
---
kind: Service
apiVersion: v1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port:
targetPort:
selector:
app: kubernetes-dashboard .执行yaml文件
[root@kubernetes dashboard]# kubectl create -f kubernetes-dashboard.yaml . 使用命令kubectl get pod –all-namespaces查看创建的pod [root@kubernetes dashboard]# kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system kubernetes-dashboard--cu9vp / Running 22m . 使用describe 查看详细信息,IP地址,端口等 [root@kubernetes dashboard]# kubectl describe svc kubernetes-dashboard --namespace=kube-system
Name: kubernetes-dashboard
Namespace: kube-system
Labels: app=kubernetes-dashboard
Selector: app=kubernetes-dashboard
Type: NodePort
IP: 10.254.159.33
Port: <unset> /TCP
NodePort: <unset> /TCP
Endpoints: 10.0.223.2:
Session Affinity: None
No events. IP:10.254.159.33 是cluster-ip,外部无法访问
Endpoint:10.0.223.2: 是docker container IP 如果访问kubernetes dashboard, 需要访问nodeport IP 和端口31457
例如 http://192.168.20.223:31457

kubernetes 安装学习的更多相关文章

  1. Kuboard Kubernetes安装

    一.简介 Kubernetes 容器编排已越来越被大家关注,然而使用 Kubernetes 的门槛却依然很高,主要体现在这几个方面: 集群的安装复杂,出错概率大 Kubernetes相较于容器化,引入 ...

  2. Docker系列(九)Kubernetes安装

    环境: A.B两天机器A机器IP:192.169.0.104,B机器IP:192.168.0.102,其中A为Master节点,B为Slave节点 操作系统:Centos7 Master与Slave节 ...

  3. 轻松加愉快的 Kubernetes 安装教程

    轻松加愉快的 Kubernetes 安装教程 马哥Linux运维 2 days ago 作者:无聊的学习者 来源:见文末 在国内安装 K8S,一直是大家很头痛的问题,各种麻烦,关键是还不知道需要下载什 ...

  4. python3数据分析,安装学习

    python3数据分析,安装学习 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-09-26. 为了简单.安装 anaconda3 就好啦. 因为安装原版python3,用pip安装 ...

  5. kubernetes安装-kubeadm

    系统信息 角色 系统 CPU Core memory master 18.04.1-Ubuntu 4 8G slave 18.04.1-Ubuntu 4 4G 安装前准备(主节点和从节点都需要执行) ...

  6. kubernetes安装-二进制

    主要参考https://github.com/opsnull/follow-me-install-kubernetes-cluster,采用Flanel和docker 系统信息 角色 系统 CPU C ...

  7. 服务网格Istio入门-详细记录Kubernetes安装Istio并使用

    我最新最全的文章都在南瓜慢说 www.pkslow.com,文章更新也只在官网,欢迎大家来喝茶~~ 1 服务网格Istio Istio是开源的Service Mesh实现,一般用于Kubernetes ...

  8. Kubernetes入门学习--在Ubuntu16.0.4安装配置Minikube

    目 录 一. 安装minikube环境 1.1. 安装前准备 1.2. 安装Lantern 1.2.1. Lantern下载网站 1.2.2. Lantern下载地址 1.2.3. Lantern安装 ...

  9. Kubernetes 入门-学习-nginx安装-dashboard安装

    一.入门 1.Kubernetes中文社区---http://docs.kubernetes.org.cn/ 2.Kubernetes集群组件: - etcd 一个高可用的K/V键值对存储和服务发现系 ...

随机推荐

  1. 使用mybatis-generator生成自动代码

    2019-02-22 配置文件: pom.xml  添加 dependency plugin    基于mybatis-plus <dependency> <groupId>o ...

  2. python中作用域

    Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的. 函数定义了本地作用域,而模块定义的是全局作用域.如果想要在函数内定义全局作用域,需要加上global修饰符. 变量名解析:LEG ...

  3. 基于Udp的五子棋对战游戏

    引言 本文主要讲述在局域网内,使用c#基于Udp协议编写一个对战的五子棋游戏.主要从Udp的使用.游戏的绘制.对战的逻辑这三个部分来讲解. 开发环境:vs2013,.Net4.0,在文章的末尾提供源代 ...

  4. NOIP2017 题解

    QAQ--由于没报上名并没能亲自去,自己切一切题聊以慰藉吧-- 可能等到省选的时候我就没有能力再不看题解自己切省选题了--辣鸡HZ毁我青春 D1T1 小凯的疑惑 地球人都会做,懒得写题解了-- D1T ...

  5. BZOJ3832: [Poi2014]Rally(拓扑排序 堆)

    题意 题目链接 Sol 最直观的思路是求出删除每个点后的最长路,我们考虑这玩意儿怎么求 设\(f[i]\)表示以\(i\)结尾的最长路长度,\(g[i]\)表示以\(i\)开始的最长路长度 根据DAG ...

  6. Spring Boot—04文件上传

    package com.smartmap.sample.ch1.controller.view; import java.io.File; import java.io.IOException; im ...

  7. 星级评分进度条(RatingBar)

    星级评分进度条(RatingBar):(主要用于评价等方面) 常用的xml属性; android:isIndicator:RatingBar是否是一个指示器(用户无法进行更改) android:num ...

  8. VC++ 共享内存读写操作

    此解决方案含两个工程文件,一个是写操作工程文件,即把任意字符串写入创建的共享内存里,另外一个读操作工程文件,则是读取共享内存里的数据,从而实现了进程之间的共享内存读写操作. 源码下载

  9. spring多线程初探

    6月14号  晴  最高温度37   今天很热的一天啊,开发的任务现在正在测试阶段,手头没有什么工作任务,忙里偷闲,丰富一下我的blog. 前两天有个需求:调用第三方接口,这个接口的响应时间有点长,需 ...

  10. HAproxy simple

    下载地址 start install: wget     http://www.haproxy.org/download/1.7/src/haproxy-1.7.5.tar.gz tar   -xf  ...