• 一、Deployment的概念

K8S本身并不提供网络的功能,所以需要借助第三方网络插件进行部署K8S中的网络,以打通各个节点中容器的互通。 
POD,是K8S中的一个逻辑概念,K8S管理的是POD,一个POD中包含多个容器,容器之间通过localhost互通。而POD需要ip地址。每个POD都有一个标签

POD–>RC–>RS–>Deployment (发展历程)

Deployment,表示用户对K8S集群的一次更新操作。Deployment是一个比RS应用模式更广的API对象。用于保证Pod的副本的数量。

可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务。实际是创建一个新的RS,然后将新的RS中副本数增加到理想状态,将旧的RS中的副本数减小到0的复合操作; 这样的一个复合操作用一个RS是不太好描述的,所以用一个更通用的Deployment来描述。

RC、RS和Deployment只是保证了支撑服务的POD数量,但是没有解决如何访问这些服务的问题。一个POD只是一个运行服务的实例,随时可以能在一个节点上停止,在另一个节点以一个新的IP启动一个新的POD,因此不能以确定的IP和端口号提供服务。

要稳定地提供服务需要服务发现和负载均衡能力。服务发现完成的工作,是针对客户端访问的服务,找到对应的后端服务实例。

在K8S的集中当中,客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。

  • 二、创建K8S的第一个应用

  1. [root@linux-node1 ~]# kubectl run net-test --image=alpine --replicas= sleep   #创建名称为net-test的应用,镜像指定为alpine,副本数为2个
  2. deployment.apps "net-test" created
  3. [root@linux-node1 ~]# kubectl get pod -o wide  #查看pod的状态信息,此时是API Server从etcd中读取这些数据
  4. NAME READY STATUS RESTARTS AGE IP NODE
  5. net-test-7b949fc785-2v2qz / Running 56s 10.2.87.2 192.168.56.120
  6. net-test-7b949fc785-6nrhm / ContainerCreating 56s <none> 192.168.56.130
  7. [root@linux-node1 ~]# kubectl get deployment net-test
  8. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  9. net-test 22h
  1. kubectl get deployment命令可以查看net-test的状态,输出显示两个副本正常运行。还可以在创建的过程中,通过kubectl describe deployment net-test了解详细的信息。  
  1. [root@linux-node1 ~]# kubectl describe deployment net-test
  2. Name: net-test
  3. Namespace: default
  4. CreationTimestamp: Thu, Aug :: +
  5. Labels: run=net-test
  6. Annotations: deployment.kubernetes.io/revision=
  7. Selector: run=net-test
  8. Replicas: desired | updated | total | available | unavailable
  9. StrategyType: RollingUpdate
  10. MinReadySeconds:
  11. RollingUpdateStrategy: max unavailable, max surge
  12. Pod Template:
  13. Labels: run=net-test
  14. Containers:
  15. net-test:
  16. Image: alpine
  17. Port: <none>
  18. Host Port: <none>
  19. Args:
  20. sleep
  21.  
  22. Environment: <none>
  23. Mounts: <none>
  24. Volumes: <none>
  25. Conditions:
  26. Type Status Reason
  27. ---- ------ ------
  28. Available True MinimumReplicasAvailable
  29. Progressing True NewReplicaSetAvailable
  30. OldReplicaSets: <none>
  31. NewReplicaSet: net-test-5767cb94df (/ replicas created)
  32. Events: <none>  

Events是Deployment的日志,记录整个RelicaSet的启动过程,从上面的创建过程,可以看到Deployment是通过ReplicaSet来管理Pod。

  1. [root@linux-node1 ~]# kubectl get replicaset  #获取副本集信息
  2. NAME DESIRED CURRENT READY AGE
  3. net-test-5767cb94df 23h
  4.  
  5. [root@linux-node1 ~]# kubectl describe replicaset net-test-5767cb94df  #查看副本集的详细信息
  6. Name: net-test-5767cb94df
  7. Namespace: default
  8. Selector: pod-template-hash=,run=net-test
  9. Labels: pod-template-hash=
  10. run=net-test
  11. Annotations: deployment.kubernetes.io/desired-replicas=
  12. deployment.kubernetes.io/max-replicas=
  13. deployment.kubernetes.io/revision=
  14. Controlled By: Deployment/net-test  #指明ReplicaSet是由Deployment net-test创建
  15. Replicas: current / desired
  16. Pods Status: Running / Waiting / Succeeded / Failed
  17. Pod Template:
  18. Labels: pod-template-hash=
  19. run=net-test
  20. Containers:
  21. net-test:
  22. Image: alpine
  23. Port: <none>
  24. Host Port: <none>
  25. Args:
  26. sleep
  27.  
  28. Environment: <none>
  29. Mounts: <none>
  30. Volumes: <none>
  31. Events: <none>  #Events可以查看到两个副本Pod的创建过程
  32.  
  33. [root@linux-node1 ~]# kubectl get pod  #获取Pod信息,可以看到2个副本都处于Running状态
  34. NAME READY STATUS RESTARTS AGE
  35. net-test-5767cb94df-djt98 / Running 22h
  36. net-test-5767cb94df-zb8m4 / Running 23h
  37.  
  38. [root@linux-node1 ~]# kubectl describe pod net-test-5767cb94df-djt98 #查看pod的详细信息
  39. Name: net-test-5767cb94df-djt98
  40. Namespace: default
  41. Node: 192.168.56.13/192.168.56.13
  42. Start Time: Thu, Aug :: +
  43. Labels: pod-template-hash=
  44. run=net-test
  45. Annotations: <none>
  46. Status: Running
  47. IP: 10.2.73.3
  48. Controlled By: ReplicaSet/net-test-5767cb94df
  49. Containers:
  50. net-test:
  51. Container ID: docker://c8e267326ed80f3cbe8111377c74dd1f016beaef513196b941165e180a5d5733
  52. Image: alpine
  53. Image ID: docker-pullable://alpine@sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430
  54. Port: <none>
  55. Host Port: <none>
  56. Args:
  57. sleep
  58.  
  59. State: Running
  60. Started: Thu, Aug :: +
  61. Ready: True
  62. Restart Count:
  63. Environment: <none>
  64. Mounts:
  65. /var/run/secrets/kubernetes.io/serviceaccount from default-token-mnqx5 (ro)
  66. Conditions:
  67. Type Status
  68. Initialized True
  69. Ready True
  70. PodScheduled True
  71. Volumes:
  72. default-token-mnqx5:
  73. Type: Secret (a volume populated by a Secret)
  74. SecretName: default-token-mnqx5
  75. Optional: false
  76. QoS Class: BestEffort
  77. Node-Selectors: <none>
  78. Tolerations: <none>
  79. Events: <none>

Controlled By 指明此 Pod 是由 ReplicaSet/net-test-5767cb94df 创建。Events 记录了 Pod 的启动过程。如果操作失败(比如 image 不存在),也能在这里查看到原因。

总结创建的过程:

(1)用户通过kubectl创建Deployment

(2)Deployment创建ReplicaSet

(3)ReplicaSet创建Pod

如图:

  • 三、K8S创建资源的两种方式

Kubernetes 支持两种方式创建资源:

(1)用kubectl命令直接创建,在命令行中通过参数指定资源的属性。此方式简单直观,比较适合临时测试或实验使用。

  1. kubectl run net-test --image=alpine --replicas= sleep

(2)通过配置文件和kubectl create创建。在配置文件中描述了应用的信息和需要达到的预期状态。

  1. kubectl create -f nginx-deployment.yaml
  • 四、以Deployment YAML方式创建Nginx服务

  • 1、创建deployment
  1. [root@linux-node1 ~]# vim nginx-deployment.yaml  #使用yaml的方式进行创建应用
  2. apiVersion: apps/v1  #apiVersion是当前配置格式的版本
  3. kind: Deployment    #kind是要创建的资源类型,这里是Deploymnet
  4. metadata:        #metadata是该资源的元数据,name是必须的元数据项
  5. name: nginx-deployment
  6. labels:
  7. app: nginx
  8. spec:          #spec部分是该Deployment的规则说明
  9. replicas: 3      #relicas指定副本数量,默认为1
  10. selector:
  11. matchLabels:
  12. app: nginx
  13. template:      #template定义Pod的模板,这是配置的重要部分
  14. metadata:     #metadata定义Pod的元数据,至少要顶一个label,label的key和value可以任意指定
  15. labels:
  16. app: nginx
  17. spec:       #spec描述的是Pod的规则,此部分定义pod中每一个容器的属性,name和image是必需的
  18. containers:
  19. - name: nginx
  20. image: nginx:1.13.
  21. ports:
  22. - containerPort:
  23.  
  24. [root@linux-node1 ~]# kubectl create -f nginx-deployment.yaml #创建nginx-deployment应用
  25. deployment.apps "nginx-deployment" created
  • 2、查看deployment
  1. [root@linux-node1 ~]# kubectl get deployment
  2. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  3. net-test 32m
  4. nginx-deployment 3 3 3 0 10s
  5.  
  6. [root@linux-node1 ~]# kubectl describe deployment nginx-deployment #查看deployment详情
  7. Name: nginx-deployment
  8. Namespace: default
  9. CreationTimestamp: Thu, Aug :: +
  10. Labels: app=nginx
  11. Annotations: deployment.kubernetes.io/revision=
  12. Selector: app=nginx
  13. Replicas: desired | updated | total | available | unavailable
  14. StrategyType: RollingUpdate
  15. MinReadySeconds:
  16. RollingUpdateStrategy: % max unavailable, % max surge
  17. Pod Template:
  18. Labels: app=nginx
  19. Containers:
  20. nginx:
  21. Image: nginx:1.13.
  22. Port: /TCP
  23. Host Port: /TCP
  24. Environment: <none>
  25. Mounts: <none>
  26. Volumes: <none>
  27. Conditions:
  28. Type Status Reason
  29. ---- ------ ------
  30. Available False MinimumReplicasUnavailable
  31. Progressing True ReplicaSetUpdated
  32. OldReplicaSets: <none>
  33. NewReplicaSet: nginx-deployment-6c45fc49cb (/ replicas created)
  34. Events:
  35. Type Reason Age From Message
  36. ---- ------ ---- ---- -------
  37. Normal ScalingReplicaSet 1m deployment-controller Scaled up replica set nginx-deployment-6c45fc49cb to
  • 3、查看Pod
  1. [root@linux-node1 ~]# kubectl get pod #查看pod在状态,正在创建中,此时应该正在拉取镜像
  2. NAME READY STATUS RESTARTS AGE
  3. net-test-5767cb94df-djt98 / Running 22m
  4. net-test-5767cb94df-hcwv7 / Unknown 34m
  5. net-test-5767cb94df-zb8m4 / Running 34m
  6. nginx-deployment-6c45fc49cb-dmc22 / ContainerCreating 2m
  7. nginx-deployment-6c45fc49cb-fd8xm / ContainerCreating 2m
  8. nginx-deployment-6c45fc49cb-sc8sh / ContainerCreating 2m
  9.  
  10. [root@linux-node1 ~]# kubectl describe pod nginx-deployment-6c45fc49cb-dmc22 #查看具体某个pod的状态信息
  11.  
  12. [root@linux-node1 ~]# kubectl get pod -o wide  #创建成功,状态为Running
  13. NAME READY STATUS RESTARTS AGE IP NODE
  14. net-test-5767cb94df-djt98 / Running 24m 10.2.73.3 192.168.56.13
  15. net-test-5767cb94df-hcwv7 / Unknown 36m 10.2.10.2 192.168.56.12
  16. net-test-5767cb94df-zb8m4 / Running 36m 10.2.73.2 192.168.56.13
  17. nginx-deployment-6c45fc49cb-dmc22 1/1 Running 0 4m 10.2.73.6 192.168.56.13
  18. nginx-deployment-6c45fc49cb-fd8xm 1/1 Running 0 4m 10.2.73.4 192.168.56.13
  19. nginx-deployment-6c45fc49cb-sc8sh 1/1 Running 0 4m 10.2.73.5 192.168.56.13

Deployment、ReplicaSet、Pod 都已经就绪。如果要删除这些资源,执行 kubectl delete deployment nginx-deployment 或者 kubectl delete -f nginx-deployment.yaml

  • 4、测试Pod访问
  1. [root@linux-node1 ~]# curl --head http://10.2.73.6
  2. HTTP/1.1 OK
  3. Server: nginx/1.13.12
  4. Date: Thu, Aug :: GMT
  5. Content-Type: text/html
  6. Content-Length:
  7. Last-Modified: Mon, Apr :: GMT
  8. Connection: keep-alive
  9. ETag: "5acb8e45-264"
  10. Accept-Ranges: bytes
  • 5、更新Deployment
  1. [root@linux-node1 ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.15. --record #nginx的版本升级,由1.13.2升级为1.15.2,记录需要加参数--record
  2. deployment.apps "nginx-deployment" image updated
  3.  
  4. [root@linux-node1 ~]# kubectl get deployment -o wide  #查看更新后的deployment,可以看到当前4个副本,说明还在滚动升级中
  5. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
  6. net-test 39m net-test alpine run=net-test
  7. nginx-deployment 6m nginx nginx:1.15.2 app=nginx
  • 6、查看更新历史
  1. [root@linux-node1 ~]# kubectl rollout history deployment/nginx-deployment #查看更新历史记录
  2. deployments "nginx-deployment"
  3. REVISION CHANGE-CAUSE
  4. <none>
  5. kubectl set image deployment/nginx-deployment nginx=nginx:1.15. --record=true
  • 7、查看具体某一个版本的升级历史
  1. [root@linux-node1 ~]# kubectl rollout history deployment/nginx-deployment --revision=
  2. deployments "nginx-deployment" with revision #
  3. Pod Template:
  4. Labels: app=nginx
  5. pod-template-hash=
  6. Containers:
  7. nginx:
  8. Image: nginx:1.13.
  9. Port: /TCP
  10. Host Port: /TCP
  11. Environment: <none>
  12. Mounts: <none>
  13. Volumes: <none>
  • 8、查看更新后的Deployment,并进行访问
  1. [root@linux-node1 ~]# kubectl get pod -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE
  3. net-test-5767cb94df-djt98 / Running 30m 10.2.73.3 192.168.56.13
  4. net-test-5767cb94df-hcwv7 / Unknown 42m 10.2.10.2 192.168.56.12
  5. net-test-5767cb94df-zb8m4 / Running 42m 10.2.73.2 192.168.56.13
  6. nginx-deployment-64749d4b59-djttr 1/1 Running 0 37s 10.2.73.8 192.168.56.13
  7. nginx-deployment-64749d4b59-jp7fw 1/1 Running 0 3m 10.2.73.7 192.168.56.13
  8. nginx-deployment-64749d4b59-q4fsn 1/1 Running 0 33s 10.2.73.9 192.168.56.13
  9. [root@linux-node1 ~]# curl --head http://10.2.73.7
  10. HTTP/1.1 OK
  11. Server: nginx/1.15.2  #版本已经升级为1.15.2
  12. Date: Thu, Aug :: GMT
  13. Content-Type: text/html
  14. Content-Length:
  15. Last-Modified: Tue, Jul :: GMT
  16. Connection: keep-alive
  17. ETag: "5b572365-264"
  18. Accept-Ranges: bytes
  • 9、快速回滚到上一个版本
  1. [root@linux-node1 ~]# kubectl rollout undo deployment/nginx-deployment #回滚上一个版本
  2. deployment.apps "nginx-deployment"
  3.  
  4. [root@linux-node1 ~]# kubectl get pod -o wide
  5. NAME READY STATUS RESTARTS AGE IP NODE
  6. net-test-5767cb94df-djt98 / Running 32m 10.2.73.3 192.168.56.13
  7. net-test-5767cb94df-hcwv7 / Unknown 43m 10.2.10.2 192.168.56.12
  8. net-test-5767cb94df-zb8m4 / Running 43m 10.2.73.2 192.168.56.13
  9. nginx-deployment-6c45fc49cb-b9h84 / Running 24s 10.2.73.11 192.168.56.13
  10. nginx-deployment-6c45fc49cb-g4mrg / Running 26s 10.2.73.10 192.168.56.13
  11. nginx-deployment-6c45fc49cb-k29kq / Running 21s 10.2.73.12 192.168.56.13
  12. [root@linux-node1 ~]# curl --head http://10.2.73.10
  13. HTTP/1.1 OK
  14. Server: nginx/1.13.12
  15. Date: Thu, Aug :: GMT
  16. Content-Type: text/html
  17. Content-Length:
  18. Last-Modified: Mon, Apr :: GMT
  19. Connection: keep-alive
  20. ETag: "5acb8e45-264"
  21. Accept-Ranges: bytes
  22.  
  23. 回滚完成,每一次更新或者回滚ip都会变化,所以需要通过vip进行访问,这就引入了service
  • 10、使用service的vip进行访问应用
  1. [root@linux-node1 ~]# vim nginx-service.yaml  #使用yaml方式创建service
  2. kind: Service
  3. apiVersion: v1
  4. metadata:
  5. name: nginx-service
  6. spec:
  7. selector:
  8. app: nginx
  9. ports:
  10. - protocol: TCP
  11. port:
  12. targetPort:
  13.  
  14. [root@linux-node1 ~]# kubectl create -f nginx-service.yaml   #创建service
  15. service "nginx-service" created
  16.  
  17. [root@linux-node1 ~]# kubectl get service
  18. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  19. kubernetes ClusterIP 10.1.0.1 <none> /TCP 4h
  20. nginx-service ClusterIP 10.1.213.126 <none> /TCP 15s  #这个就是vip
  21.  
  22. [root@linux-node2 ~]# curl --head http://10.1.213.126  #在node2节点上进行访问vip测试,在node1上无法访问是因为没有安装kube-proxy导致无法访问
  23. HTTP/1.1 OK
  24. Server: nginx/1.13.
  25. Date: Thu, Aug :: GMT
  26. Content-Type: text/html
  27. Content-Length:
  28. Last-Modified: Mon, Apr :: GMT
  29. Connection: keep-alive
  30. ETag: "5acb8e45-264"
  31. Accept-Ranges: bytes
  32.  
  33. [root@linux-node2 ~]# ipvsadm -Ln  
  34. IP Virtual Server version 1.2. (size=)
  35. Prot LocalAddress:Port Scheduler Flags
  36. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  37. TCP 10.1.0.1: rr persistent
  38. -> 192.168.56.11: Masq
  39. TCP 10.1.213.126: rr
  40. -> 10.2.73.10: Masq
  41. -> 10.2.73.11: Masq
  42. -> 10.2.73.12: Masq
  43.  
  44. 查看LVS状态可以看到,当访问VIP10.1.213.126时,会进行负载均衡到各个pod
  • 11、扩容到5个节点
  1. [root@linux-node1 ~]# kubectl scale deployment nginx-deployment --replicas 5  #对应用的副本数进行扩容,直接指定副本数为5
  2. deployment.extensions "nginx-deployment" scaled
  3.  
  4. [root@linux-node1 ~]# kubectl get pod  #查看pod状态,可以看到已经增加到5个副本
  5. NAME READY STATUS RESTARTS AGE
  6. net-test-5767cb94df-djt98 / Running 38m
  7. net-test-5767cb94df-hcwv7 / Unknown 50m
  8. net-test-5767cb94df-zb8m4 / Running 50m
  9. nginx-deployment-6c45fc49cb-b9h84 / Running 6m
  10. nginx-deployment-6c45fc49cb-g4mrg / Running 7m
  11. nginx-deployment-6c45fc49cb-k29kq / Running 6m
  12. nginx-deployment-6c45fc49cb-n9qkx / Running 24s
  13. nginx-deployment-6c45fc49cb-xpx9s / Running 24s
  14.  
  15. [root@linux-node2 ~]# ipvsadm -Ln
  16. IP Virtual Server version 1.2. (size=)
  17. Prot LocalAddress:Port Scheduler Flags
  18. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  19. TCP 10.1.0.1: rr persistent
  20. -> 192.168.56.11: Masq
  21. TCP 10.1.213.126: rr
  22. -> 10.2.73.10: Masq
  23. -> 10.2.73.11: Masq
  24. -> 10.2.73.12: Masq
  25. -> 10.2.73.13: Masq
  26. -> 10.2.73.14: Masq

Kubernetes学习之路(六)之创建K8S应用的更多相关文章

  1. Kubernetes学习之路目录

    Kubernetes基础篇 环境说明 版本说明 系统环境 Centos 7.2 Kubernetes版本 v1.11.2 Docker版本 v18.09 Kubernetes学习之路(一)之概念和架构 ...

  2. Kubernetes学习之路(一)之概念和架构解析和证书创建和分发

    1.Kubernetes的重要概念 转自:CloudMan老师公众号<每天5分钟玩转Kubernetes>https://item.jd.com/26225745440.html Clus ...

  3. Kubernetes学习之路(五)之Flannel网络二进制部署和测试

    一.K8S的ip地址 Node IP:节点设备的IP,如物理机,虚拟机等容器宿主的实际IP. Pod IP:Pod的IP地址,是根据docker0网络IP段进行分配的. Cluster IP:Serv ...

  4. Kubernetes学习之路(七)之Coredns和Dashboard二进制部署

    一.CoreDNS部署 在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问. (1)编辑coredns.yaml文 ...

  5. Kubernetes学习之路(十七)之statefulset控制器

    目录 一.statefulset简介 二.为什么要有headless?? 三.为什么要 有volumeClainTemplate?? 四.statefulSet使用演示 (1)查看statefulse ...

  6. Kubernetes学习之路(十八)之认证、授权和准入控制

    API Server作为Kubernetes网关,是访问和管理资源对象的唯一入口,其各种集群组件访问资源都需要经过网关才能进行正常访问和管理.每一次的访问请求都需要进行合法性的检验,其中包括身份验证. ...

  7. Kubernetes学习之路(十六)之存储卷

    目录 一.存储卷的概念和类型 二.emptyDir存储卷演示 三.hostPath存储卷演示 四.nfs共享存储卷演示 五.PVC和PV的概念 六.NFS使用PV和PVC 1.配置nfs存储 2.定义 ...

  8. Kubernetes学习之路(二十)之K8S组件运行原理详解总结

    目录 一.看图说K8S 二.K8S的概念和术语 三.K8S集群组件 1.Master组件 2.Node组件 3.核心附件 四.K8S的网络模型 五.Kubernetes的核心对象详解 1.Pod资源对 ...

  9. Kubernetes学习之路(27)之k8s 1.15.2 部署

    目录 一.环境准备 二.软件安装 三.部署master节点 四.部署node节点 五.集群状态检测 一.环境准备 IP地址 节点角色 CPU Memory Hostname Docker versio ...

随机推荐

  1. Django 补充

    在Django项目的外面操作这个Django内部的models: 当你创建Django项目的时候你在用的时候,你是在这个Django项目中使用的  那么你怎么在你的这个Django项目的外面使用这个D ...

  2. 设计可以多选的按钮ChooseManyButton

    设计可以多选的按钮ChooseManyButton 效果: 源码: ChooseManyButton.h 与 ChooseManyButton.m // // ChooseManyButton.h / ...

  3. zabbix的日常监控-自动发现端口并监测(服务器开启的所有端口或监控指定端口)(十三)

    动批量检查agent开放的端口 注:此方法给监控磁盘IO(即十二)篇过程一样: 注释:如果服务器上的应用都是固定的,不会随机产生的都可以使用自动发现端口来监控:  如果服务器会随机出现端口且每次启动程 ...

  4. Gitflow 工作流简介

    Gitflow工作流简介 Gitflow工作流通过为功能开发.发布准备和项目维护分配独立的分支,让发布迭代过程更流畅. Gitflow工作流定义了一个围绕项目发布的严格分支模型,它会相对复杂一点,但提 ...

  5. ios的图片解压

    YYKit SDWebImage FLAnimatedImage YYKit YYCGImageCreateDecodedCopy YYImageCoder 1 2 3 4 5 6 7 8 9 10 ...

  6. Perl之my与local

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sunshoupo211/article/details/31745909    在函数定义中,使用m ...

  7. Spring-IOC 在非 web 环境下优雅关闭容器

    当我们设计一个程序时,依赖了Spring容器,然而并不需要spring的web环境时(Spring web环境已经提供了优雅关闭),即程序启动只需要启动Spring ApplicationContex ...

  8. 切换composer国内镜像

    composer config -g repo.packagist composer https://packagist.phpcomposer.com

  9. 1066. [SCOI2007]蜥蜴【最大流】

    Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃 到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到 ...

  10. 【转】Android中获取应用程序(包)的信息-----PackageManager的使用(一)

    转载请注明出处:http://blog.csdn.net/qinjuning       本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占 ...