kubernetes 安装学习
什么是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 安装学习的更多相关文章
- Kuboard Kubernetes安装
一.简介 Kubernetes 容器编排已越来越被大家关注,然而使用 Kubernetes 的门槛却依然很高,主要体现在这几个方面: 集群的安装复杂,出错概率大 Kubernetes相较于容器化,引入 ...
- Docker系列(九)Kubernetes安装
环境: A.B两天机器A机器IP:192.169.0.104,B机器IP:192.168.0.102,其中A为Master节点,B为Slave节点 操作系统:Centos7 Master与Slave节 ...
- 轻松加愉快的 Kubernetes 安装教程
轻松加愉快的 Kubernetes 安装教程 马哥Linux运维 2 days ago 作者:无聊的学习者 来源:见文末 在国内安装 K8S,一直是大家很头痛的问题,各种麻烦,关键是还不知道需要下载什 ...
- python3数据分析,安装学习
python3数据分析,安装学习 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-09-26. 为了简单.安装 anaconda3 就好啦. 因为安装原版python3,用pip安装 ...
- kubernetes安装-kubeadm
系统信息 角色 系统 CPU Core memory master 18.04.1-Ubuntu 4 8G slave 18.04.1-Ubuntu 4 4G 安装前准备(主节点和从节点都需要执行) ...
- kubernetes安装-二进制
主要参考https://github.com/opsnull/follow-me-install-kubernetes-cluster,采用Flanel和docker 系统信息 角色 系统 CPU C ...
- 服务网格Istio入门-详细记录Kubernetes安装Istio并使用
我最新最全的文章都在南瓜慢说 www.pkslow.com,文章更新也只在官网,欢迎大家来喝茶~~ 1 服务网格Istio Istio是开源的Service Mesh实现,一般用于Kubernetes ...
- Kubernetes入门学习--在Ubuntu16.0.4安装配置Minikube
目 录 一. 安装minikube环境 1.1. 安装前准备 1.2. 安装Lantern 1.2.1. Lantern下载网站 1.2.2. Lantern下载地址 1.2.3. Lantern安装 ...
- Kubernetes 入门-学习-nginx安装-dashboard安装
一.入门 1.Kubernetes中文社区---http://docs.kubernetes.org.cn/ 2.Kubernetes集群组件: - etcd 一个高可用的K/V键值对存储和服务发现系 ...
随机推荐
- Spring系列之——使用了哪些设计模式
1 工厂模式:BeanFactory.ApplicationContext创建中 2 模板模式:BeanFactory.ApplicationContext实现中 3 代理模式:在AOP实现中用到了J ...
- 个人遗漏知识的回顾-HTML
常用的一些快捷键: Windows + e 我的电脑Ctrl + Tab 网页间不同页面切换F2 重命名Ctrl+Shift+S 另存为 前端的一些常识:前端意义:将效果图生成网页网页组成:文字.图片 ...
- java.lang.IllegalStateException: Mapped class was not specified
错误如下:java.lang.IllegalStateException: Mapped class was not specifiedat org.springframework.util.Asse ...
- PAT乙级01
1001 害死人不偿命的(3n+1)猜想 (15)(15 分) 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反 ...
- 前端构建工具 Gulp.js 上手实例
在软件开发中使用自动化构建工具的好处是显而易见的.通过工具自动化运行大量单调乏味.重复性的任务,比如图像压缩.文件合并.代码压缩.单元测试等等,可以为开发者节约大量的时间,使我们能够专注于真正重要的. ...
- maven Could not find artifact com.** 无法下载原因分析
1.有时候经常莫名其妙的遇到这个问题:比如在idea重新导入一个新项目,或者在原来的空间里面引入一个新项目.去私服里面查看明明是有的,但是就是下载不下来. 结合网上搜的和自己遇到的,总结原因如下: 1 ...
- 将虚拟网络连接到 ExpressRoute 线路
本文通过使用 Resource Manager 部署模型和 Azure 门户,帮助将虚拟网络 (VNets) 链接到 Azure ExpressRoute 线路. 虚拟网络可以在同一个订阅中,也可以属 ...
- 关于springMVC的一些xml配置
①springMVC必备jar包: commons-logging-1.1.3.jar spring-aop-4.0.0.RELEASE.jar spring-beans-4.0.0.RELEASE. ...
- Oracle特殊恢复原理与实战(DSI系列)
1.深入浅出Oracle(DSI系列Ⅰ) 2.Oracle特殊恢复原理与实战(DSI系列Ⅱ) 3.Oracle SQL Tuning(DSI系列Ⅲ)即将开设 4.Oracle DB Performan ...
- 转: SSH框架总结(框架分析+环境搭建+实例源码下载)
原:http://blog.csdn.net/shan9liang/article/details/8803989 首先,SSH不是一个框架,而是多个框架(struts+spring+hibernat ...