K8S原理架构与实战教程

文章目录

  • 一、背景
    • 1.1 物理机时代、虚拟机时代、容器化时代
    • 1.2 容器编排的需要
  • 二、K8S架构
    • 2.2 Worker节点
  • 三、核心概念
    • 3.1 Pod
    • 3.2 Deployment
    • 3.3 Service
    • 3.4 Volume
    • 3.5 Namespace
  • 四、K8S安装
  • 五、kubectl常用命令
  • 六、K8S实战
    • 6.1 水平扩容
    • 6.2 自动装箱
      • 6.2.1 节点污点
      • 6.2.2 Pod调度策略
    • 6.3 Secret
      • 6.3.1 挂载卷的方式
      • 6.3.2 环境变量的方式
    • 6.4 ConfigMap
    • 6.5 存储编排
    • 6.6 服务发现与负载均衡
    • 6.7 自我修复
      • 6.7.1 Pod重启机制
      • 6.7.2 Pod健康检查
    • 6.8 自动化上线与回滚
  • 参考资料

一、背景

1.1 物理机时代、虚拟机时代、容器化时代

在介绍K8S之前,先来看看服务器的演变过程:物理机时代、虚拟机时代、容器化时代。

物理机时代的缺点:

  • 部署慢 :每台服务器都要安装操作系统、相关的应用程序所需要的环境,各种配置
  • 成本高:物理服务器的价格十分昂贵
  • 资源浪费:硬件资源不能充分利用
  • 扩展和迁移成本高:扩展和迁移需要重新配置一模一样的环境
K8S原理架构与实战教程_第1张图片

虚拟机时代很好的解决了物理机时代的缺点,虚拟机时代的特点是:

  • 易部署:每台物理机可部署多台虚拟机,且可以通过模板,部署快,成本低
  • 资源池:开出来的虚拟机可作为资源池备用,充分压榨服务器性能
  • 资源隔离:每个虚拟机都有独立分配的内存磁盘等硬件资源,虚拟机之间不会互相影响
  • 易扩展:随时都能在一个物理机上创建或销毁虚拟机

虚拟机的缺点是:每台虚拟机都需要安装操作系统

K8S原理架构与实战教程_第2张图片

容器化时代解决了虚拟机时代的缺点,容器化时代在继承了虚拟机时代优点的基础之上,还有以下优势

  • 更高效的利用硬件资源:所有容器共享主机操作系统内核,不需要安装操作系统。
  • 一致的运行环境:相同的镜像产生相同的行为
  • 更小:较虚拟机而言,容器镜像更小,因为不需要打包操作系统
  • 更快:容器能达到秒级启动,其本质是主机上的一个进程
K8S原理架构与实战教程_第3张图片

1.2 容器编排的需要

容器技术的代表就是docker,docker在单机上使用方便快捷,但在集群中表现如何呢?假设现在有5个节点,每个节点中都装有docker,现在要部署一个应用,要求要10个副本,有如下做法:

  • 在5个节点上随机分配
  • 平均分配,每台节点分配2个
  • 根据不同节点的负载状态分配,负载低的优先分配

无论选择哪种方法都需要执行相同docker run命令10遍,如果是最后一种做法还需要挨个检查每个节点的负载,这种问题叫做不利于自动装箱

如果以后增加了1个副本还需要再重复上面的动作,如果增加10个呢?增加100个呢?人为去操作那就有点难受了,这种问题叫做不利于水平扩容与缩容,简称水平扩缩

如果现在要变更版本,更新或者回滚,需要停止容器,然后替换新版本镜像,再启动,这样的操作每个副本都要来一次,如果副本太多,简直是噩梦,这种问题叫做不利于自动化上线和回滚

如果现在一个容器停止运行了,docker的重启策略会将它拉起来继续运行,这没什么问题,如果节点宕机了呢?上面的所有容器都停止了,docker重启策略就没用了,这样副本的数量就会减少,这个问题叫做不能自我修复

假设需要负载均衡,那么得新增一个节点安装负载均衡器,并且配置5个节点的IP和端口,前提是容器的端口要映射到主机端口,而且容器之前网络是隔离的,不能相互访问,维护成本高,这个问题叫不利于服务发现与负载均衡

上面的这些操作,就是容器编排,既然存在如上问题,那么就需要一个技术进行自动化编排,这个技术就是K8S,K8S即kubernetes /kjubɚ’nɛtɪs/

Kubernetes,是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词,也就是“K8s”,它是通过将 8 个字母“ubernete ”替换为“8”而成为的一个缩写。

K8S官网:https://kubernetes.io/zh-cn/
根据官网描述,它有如下功能:
K8S原理架构与实战教程_第4张图片

二、K8S架构

在K8S中,由Master控制节点和Worker节点共同构成一个集群,总体架构如下图所示:

K8S原理架构与实战教程_第5张图片
## 2.1 Master节点
K8S原理架构与实战教程_第6张图片
  • etcd:分布式KV数据库,使用Raft协议,用于保存集群中的相关数据,项目地址:https://github.com/etcd-io/etcd
  • API Server:集群统一入口,以restful风格进行操作,同时交给etcd存储(是唯一能访问etcd的组件);提供认证、授权、访问控制、API注册和发现等机制,可以通过kubectl命令行工具,dashboard可视化面板,或者sdk等访问。
  • Scheduler:节点的调度,选择node节点应用部署。
  • Controller Manager:处理集群中常规后台任务,一个资源对应一个控制器,同时监控集群的状态,确保实际状态和最终状态一致。

2.2 Worker节点

K8S原理架构与实战教程_第7张图片
  • kubelet:相当于Master派到node节点代表,管理本机容器,上报数据给API Server
  • Container Runtime:容器运行时,K8S支持多个容器运行环境:Docker、Containerd、CRI-O、Rktlet以及任何实现- Kubernetes CRI (容器运行环境接口) 的软件
  • kube-proxy:实现服务(Service)抽象组件,屏蔽PodIP的变化和负载均衡

三、核心概念

3.1 Pod

  • Pod是最小调度单元
  • Pod里面会包含一个或多个容器(Container)
  • Pod内的容器共享存储及网络,可通过localhost通信
K8S原理架构与实战教程_第8张图片

Pod本意是豌豆荚的意思,此处指的是K8S中资源调度的最小单位,豌豆荚里面的小豆子就像是Container,豌豆荚本身就像是一个Pod。

3.2 Deployment

Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组 Pod 的副本数目、以及这个 Pod 的版本。一般大家用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。

  • 定义一组Pod的副本数量,版本等
  • 通过控制器维护Pod的数目
  • 自动恢复失败的Pod
  • 通过控制器以指定的策略控制版本
K8S原理架构与实战教程_第9张图片

3.3 Service

Pod是不稳定的,IP是会变化的,所以需要一层抽象来屏蔽这种变化,这层抽象叫做Service

  • 提供访问一个或者多个Pod实例稳定的访问地址
  • 支持多种访问方式ClusterIP(对集群内部访问)NodePort(对集群外部访问)LoadBalancer(集群外部负载均衡)
K8S原理架构与实战教程_第10张图片

3.4 Volume

Volume就是存储卷,在Pod中可以声明卷来问访问文件系统,同时Volume也是一个抽象层,其具体的后端存储可以是本地存储、NFS网络存储、云存储(阿里云盘、AWS云盘、Google云盘等)、分布式存储(比如说像 ceph、GlusterFS )

  • 声明在Pod中容器可以访问的文件系统
  • 可以被挂载在Pod中一个或多个容器的指定路径下
  • 支持多种后端储存
K8S原理架构与实战教程_第11张图片

3.5 Namespace

Namespace(命令空间)是用来做资源的逻辑隔离的,比如上面的Pod、Deployment、Service都属于资源,不同Namespace下资源可以重名。同一Namespace下资源名需唯一

  • 一个集群内部的逻辑隔离机制(鉴权、资源等)
  • 每个资源都属于一个Namespace
  • 同一个Namespace中资源命名唯一
  • 不同Namespace中资源可重名
K8S原理架构与实战教程_第12张图片

四、K8S安装

具体的安装教程可以参考:https://kuboard.cn/install/install-k8s.html
里面写的很详细了,此处不再赘述,简化过程如下

  1. 创建虚拟机,2个或者2个以上
  2. 操作系统为 CentOS 7.8 或者 CentOS Stream 8
  3. 每个节点CPU 内核数量大于等于 2,且内存大于等于 4G(实测2G也可以)
  4. 修改网络配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33 改成固定IP
  5. 安装containerd/kubelet/kubeadm/kubectl,注意教程中使用的容器运行时为containerd,如果需要使用docker,可以先安装docker然后跳过脚本中安装containerd的部分
  6. 初始化-master-节点
  7. 初始化-worker节点
  8. 验证:在Master节点上执行kubectl get nodes -o wide,能看到添加的worker节点即安装成功

我的环境情况如下:

NAME        STATUS   ROLES                  AGE   VERSION   INTERNAL-IP       
my-master   Ready    control-plane,master   27h   v1.21.0   192.168.108.101
my-node     Ready                     27h   v1.21.0   192.168.108.102

192.168.108.101是Master角色,名字为my-master;192.168.108.102是Worker角色,名字为my-node

五、kubectl常用命令

kubectl 则是 Kubernetes 的命令行工具,用于管理 Kubernetes 集群。

kubectl controls the Kubernetes cluster manager.
意为K8S集群管理的控制器,kubectl --help可以打印帮助命令。

(1)查看集群信息:

kubectl cluster-info  # 显示集群信息。

(2)查看资源状态:

kubectl get pods  # 查看所有Pod的状态
kubectl get deployments  # 查看所有部署的状态
kubectl get services  # 查看所有服务的状态
kubectl get nodes  # 查看所有节点的状态
kubectl get namespaces  # 查看所有命名空间的状态

kubectl describe pod   # 显示特定Pod的详细信息
kubectl describe node   # 显示特定Node的详细信息

(3)创建和管理资源:

kubectl create -f   # 根据YAML文件创建资源
kubectl apply -f   # 根据YAML文件创建或更新资源
kubectl delete -f   # 根据YAML文件删除资源

kubectl scale deployment  --replicas=  # 扩展或缩减部署的副本数
kubectl expose deployment  --port= --type=type>  # 创建一个服务来公开部署

(4)执行操作:

kubectl exec -it  --   # 在Pod中执行特定命令
kubectl logs   # 查看Pod的日志
kubectl port-forward  :  # 将本地端口与Pod的端口进行转发

(5)删除资源:

kubectl delete deployment   # 删除部署
kubectl delete pod   # 删除Pod
kubectl delete service   # 删除服务

六、K8S实战

6.1 水平扩容

为什么先实战水平扩容?因为这个最简单,首先来部署一个喜闻乐见的nginx

kubectl create deployment web --image=nginx:1.14

这句话表示创建一个资源,啥资源呢?是一个deployment(可以简写为deploy),取名叫web,指定了镜像为nginx的1.14版本,但是先别执行这句话,我们一般不这么部署应用,因为不好复用,一般通过yaml文件来部署,如下:

kubectl create deployment web --image=nginx:1.14 --dry-run -o yaml > web.yaml
  • –dry-run表示试运行,试一下看行不行,但是不运行
  • -o yaml表示以yaml格式输出
  • web.yaml表示将输出的内容重定向到web.yaml文件中

执行之后看看web.yaml文件里面有些什么:

apiVersion: apps/v1        # 表示资源版本号为apps/v1 
kind: Deployment           # 表示这是一个Deployment
metadata:                  # 一些元数据信息
  creationTimestamp: null
  labels:                  # 标签,可以随便定义
    app: web
  name: web                # 这个资源的名字
spec:                      # 资源的描述或者规格
  replicas: 1              # 副本数量
  selector:                # 选择器
    matchLabels:           # 需要匹配的标签
      app: web             # 标签的具体键值对
  strategy: {}
  template:                # 模板。表示Pod的生成规则
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:                  
      containers:
      - image: nginx:1.14  #指定镜像文件
        name: nginx
        resources: {}
status: {}

用下面的命令应用web.yaml,web.yaml声明了一个Deployment和一个Pod

kubectl apply -f web.yaml

执行完后以后可以通过以下命令查看Deployment和Pod:

kubectl get deploy,po -o wide

结果如下:

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES       SELECTOR
deployment.apps/web   1/1     1            1           2m40s   nginx        nginx:1.14   app=web

NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE    ...
pod/web-5bb6fd4c98-lg555   1/1     Running   0          2m40s   10.100.255.120   my-node ...

可以看到资源已经建立起来了,运行在Worker节点中,尝试访问一下Pod的IP:

curl 10.100.255.120

有如下nginx的标准返回说明应用已经部署完毕:

<!DOCTYPE html>


Welcome to nginx!<<span class="token operator">/</span>title>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<<span class="token operator">/</span>html>
</code></pre> 
  <p>有没有感觉这一路下来挺麻烦的,yaml文件还那么长,还不如无脑docker run呢,别急,在后面扩缩容的时候就可以看到它的威力了,当然也可以用最开始的命令来执行kubectl create deployment web --image=nginx:1.14,测试可以,在生产环境中强烈不建议这么做。</p> 
  <p><strong>【扩容实战】</strong>:假设现在扩容需求来了,需要部署同样的nginx副本10个,该怎么做?在K8S中很简单,直接告诉K8S我要10个副本即可,其他的细节不用关心。</p> 
  <p>具体的做法是修改上面的web.yaml文件,将replicas: 1声明成replicas: 10,最后再应用一下</p> 
  <pre><code class="prism language-powershell">kubectl apply <span class="token operator">-</span>f web<span class="token punctuation">.</span>yaml
</code></pre> 
  <p>此时快速的执行kubectl get po,可以看到一些容器已经开始运行了,一些在创建中,一些还在挂起:</p> 
  <pre><code class="prism language-powershell">NAME                       READY   STATUS              RESTARTS   AGE
pod/web-5bb6fd4c98-52qmf   0/1     ContainerCreating   0          1s
pod/web-5bb6fd4c98-5sp5l   0/1     Pending             0          1s
pod/web-5bb6fd4c98-9t2hm   0/1     ContainerCreating   0          1s
pod/web-5bb6fd4c98-lg555   1/1     Running             0          11m
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
</code></pre> 
  <p>稍等片刻可以看到所有Pod都是Running状态了!当然也可以偷懒一键扩容:</p> 
  <pre><code class="prism language-powershell">kubectl scale deploy web <span class="token operator">--</span>replicas=10
</code></pre> 
  <h2>6.2 自动装箱</h2> 
  <p>根据资源需求和其他约束自动放置容器,同时避免影响可用性。将关键性工作负载和尽力而为性质的服务工作负载进行混合放置,以提高资源利用率并节省更多资源。</p> 
  <p>K8S支持多种策略,包括:<strong>节点污点、节点标签、Pod调度策略</strong>等。目的是提供最大的灵活性,最终提高整体资源利用率,这就是自动装箱。</p> 
  <h3>6.2.1 节点污点</h3> 
  <p>Taint 污点:节点不做普通分配调度,是节点属性,属性值有三个</p> 
  <ul> 
   <li>NoSchedule:一定不被调度</li> 
   <li>PreferNoSchedule:尽量不被调度(也有被调度的几率)</li> 
   <li>NoExecute:不会调度,并且还会驱逐Node已有Pod</li> 
  </ul> 
  <p>也就是说,给节点打上污点,那么调度的时候就会根据上面的属性来进行调度,一般来说Master节点的污点值是NoSchedule,查看Master污点值</p> 
  <pre><code class="prism language-powershell">kubectl describe node my-master <span class="token punctuation">|</span> grep Taints
</code></pre> 
  <p>可以看到如下输出</p> 
  <pre><code class="prism language-powershell">Taints:             node-role<span class="token punctuation">.</span>kubernetes<span class="token punctuation">.</span>io/master:NoSchedule
</code></pre> 
  <h3>6.2.2 Pod调度策略</h3> 
  <p>Pod调度策略会影响到Pod最终被调度到哪个节点上,Pod调度策略有三类</p> 
  <ul> 
   <li>Pod声明的requests和limits,前者就是Pod需要多少资源,后者表示Pod最多用多少资源,资源比如CPU内存等</li> 
   <li>节点标签选择器,会选择符合标签的节点进行调度</li> 
   <li>节点亲和性,分为硬亲和和软亲和,前者必须满足,后者尝试满足,不强制</li> 
  </ul> 
  <h2>6.3 Secret</h2> 
  <p>Secret意为秘密,那在K8S中是啥意思呢?在K8S中表示一个存储在etcd中的配置,这个配置是秘密的,是安全的,通常用Base64编码,此配置可以通过挂载卷或者环境变量的方式供Pod访问,首先定义一个Secret:</p> 
  <pre><code class="prism language-powershell"><span class="token comment"># 首先将明文转换成base64编码</span>
<span class="token function">echo</span> <span class="token operator">-</span>n <span class="token string">'root'</span> <span class="token punctuation">|</span> base64   <span class="token comment"># 结果是cm9vdA==</span>
<span class="token function">echo</span> <span class="token operator">-</span>n <span class="token string">'123456'</span> <span class="token punctuation">|</span> base64 <span class="token comment"># 结果是MTIzNDU2</span>
</code></pre> 
  <p>通过下面的secret.yaml声明创建一个Secret,通过kubectl get secret可以查看刚才创建的Secret:</p> 
  <pre><code class="prism language-powershell">apiVersion: v1
kind: Secret
metadata:
  name: <span class="token function">test-secret</span>
<span class="token keyword">data</span>:
  username: cm9vdA==
  password: MTIzNDU2
</code></pre> 
  <h3>6.3.1 挂载卷的方式</h3> 
  <p>声明文件如下:</p> 
  <pre><code class="prism language-powershell">apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec: 
  replicas: 1
  selector: 
    matchLabels:
      app: web             
  strategy: <span class="token punctuation">{</span><span class="token punctuation">}</span>
  template:                
    metadata:
      labels:
        app: web
    spec:                  
      containers:
      <span class="token operator">-</span> image: nginx:1<span class="token punctuation">.</span>14
        name: nginx
        <span class="token comment"># 挂载到容器内</span>
        volumeMounts:
          <span class="token operator">-</span> name: secret-volume
            mountPath: <span class="token operator">/</span>etc/secret-volume
      <span class="token comment"># 卷声明      </span>
      volumes:
      <span class="token operator">-</span> name: secret-volume
        secret:
          secretName: <span class="token function">test-secret</span>
status: <span class="token punctuation">{</span><span class="token punctuation">}</span>
</code></pre> 
  <p>创建之后进入容器,下面是进入容器命令,和docker一致,你创建出来的Pod不一定是这个名web-66d9b4684b-dvwtm,根据实际情况进入:</p> 
  <pre><code class="prism language-powershell">kubectl exec <span class="token operator">-</span>it web-66d9b4684b-dvwtm bash
</code></pre> 
  <p>查看一下挂载的内容:</p> 
  <pre><code class="prism language-powershell"><span class="token function">cat</span> <span class="token operator">/</span>etc/secret-volume/username  <span class="token comment"># 显示root</span>
<span class="token function">cat</span> <span class="token operator">/</span>etc/secret-volume/password  <span class="token comment"># 显示123456</span>
</code></pre> 
  <h3>6.3.2 环境变量的方式</h3> 
  <p>声明文件如下:</p> 
  <pre><code class="prism language-powershell">apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec: 
  replicas: 1
  selector: 
    matchLabels:
      app: web             
  strategy: <span class="token punctuation">{</span><span class="token punctuation">}</span>
  template:                
    metadata:
      labels:
        app: web
    spec:                  
      containers:
      <span class="token operator">-</span> image: nginx:1<span class="token punctuation">.</span>14
        name: nginx
        <span class="token comment"># 环境变量声明</span>
        env:
        <span class="token operator">-</span> name: SECRET_USERNAME
          valueFrom:
            secretKeyRef:
              name: <span class="token function">test-secret</span>
              key: username
status: <span class="token punctuation">{</span><span class="token punctuation">}</span>
</code></pre> 
  <p>执行后再容器内部查看该环境变量是否符合预期值,打印出来的值应该是root,即我们设置的Secret</p> 
  <pre><code class="prism language-powershell">kubectl exec <span class="token operator">-</span>it web-848bb777bc-x5mh4 <span class="token operator">--</span> <span class="token operator">/</span>bin/sh <span class="token operator">-</span>c <span class="token string">'echo $SECRET_USERNAME'</span>
</code></pre> 
  <p>这里有一个疑问,既然是Base64的编码方式(不是加密方式),为什么说Secret是安全的呢?此处的安全是K8S提供的,主要是以前几点:</p> 
  <ul> 
   <li>传输安全(K8S中与API Server的交互都是HTTPS的)</li> 
   <li>存储安全(Secret被挂载到容器时存储在tmpfs中,只存在于内存中而不是磁盘中,Pod销毁Secret随之消失)</li> 
   <li>访问安全(Pod间的Secret是隔离的,一个Pod不能访问另一个Pod的Secret)</li> 
  </ul> 
  <h2>6.4 ConfigMap</h2> 
  <p>ConfigMap可以看做是不需要加密,不需要安全属性的Secret,也是和配置相关的,创建ConfigMap的过程如下,首先创建一个配置文件,比如redis.properties,包含如下内容</p> 
  <pre><code class="prism language-powershell">redis<span class="token punctuation">.</span>port=127<span class="token punctuation">.</span>0<span class="token punctuation">.</span>0<span class="token punctuation">.</span>1
redis<span class="token punctuation">.</span>port=6379
redis<span class="token punctuation">.</span>password=123456
</code></pre> 
  <p>以下命令从文件redis.properties创建了一个名为redis-config的ConfigMap</p> 
  <pre><code class="prism language-powershell">kubectl create configmap redis-config <span class="token operator">--</span><span class="token keyword">from</span><span class="token operator">-</span>file=redis<span class="token punctuation">.</span>properties
</code></pre> 
  <p>使用命令kubectl get configmap可以查看刚才创建的ConfigMap,当然ConfigMap也有挂载卷和设置环境变量的方式供Pod调用,此处不再赘述。</p> 
  <h2>6.5 存储编排</h2> 
  <p>存储编排可实现自动挂载所选存储系统,包括本地存储、诸如 GCP 或 AWS 之类公有云提供商所提供的存储或者诸如 NFS、iSCSI、Gluster、Ceph、Cinder 或 Flocker 这类网络存储系统。</p> 
  <p>提到存储就不得不说K8S中的PV和PVC了,解释如下:</p> 
  <ul> 
   <li>PV:PersistentVolume,持久化卷</li> 
   <li>PVC:PersistentVolumeClaim,持久化卷声明</li> 
  </ul> 
  <p>PV说白了就是一层存储的抽象,底层的存储可以是本地磁盘,也可以是网络磁盘比如NFS、Ceph之类,既然有了PV那为什么又要搞一个PVC呢?</p> 
  <p>PVC其实在Pod和PV之前又增加了一层抽象,这样做的目的在于将Pod的存储行为于具体的存储设备解耦,试想一下,假设哪天NFS网络存储的IP地址变化了,如果没有PVC,就需要每个Pod都改一下IP的声明,那得多累,有PVC来屏蔽这些细节之后只用改PV即可!</p> 
  <h2>6.6 服务发现与负载均衡</h2> 
  <p>服务发现与负载均衡可实现:无需修改你的应用程序即可使用陌生的服务发现机制。Kubernetes 为容器提供了自己的 IP 地址和一个 DNS 名称,并且可以在它们之间实现负载均衡。</p> 
  <p>到目前为止,我们的Pod已经可以实现水平扩缩、自动装箱、配置管理、存储编排了,但是访问还是个大问题,扩容后这么多Pod应该访问哪一个?如果能够自动将流量分配到不同的Pod上(负载均衡);并且当扩容或者缩容的时候能够动态的将Pod添加或者剔除出负载均衡的范围,简而言之就是服务发现。</p> 
  <p>那么在K8S中有没有东西可以做到服务发现和负载均衡呢?答案是有,这就是Service(还记得前面提到过的核心概念吗),Service有三种类型:</p> 
  <ul> 
   <li>ClusterIp:集群内部访问(默认)</li> 
   <li>NodePort:集群外部访问(包含了ClusterIp)</li> 
   <li>LoadBalancer:对外访问应用使用,公有云</li> 
  </ul> 
  <h2>6.7 自我修复</h2> 
  <p>自我修复可实现:重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会将它们公布给客户端。</p> 
  <h3>6.7.1 Pod重启机制</h3> 
  <p>当Pod异常停止时,就会触发Pod的重启机制,根据重启策略会表现出不同的行为。</p> 
  <p>重启策略主要分为以下三种</p> 
  <ul> 
   <li>Always:当容器终止退出后,总是重启容器,默认策略</li> 
   <li>OnFailure:当容器异常退出(退出状态码非0)时,才重启</li> 
   <li>Never:当容器终止退出,从不重启容器</li> 
  </ul> 
  <h3>6.7.2 Pod健康检查</h3> 
  <p>健康检查顾名思义就是检查Pod是否健康,怎么来定义健康呢?假设这么一种情况,当程序内部发生了错误已经不能对外提供服务了,但此时主程序仍在运行,这种情况就是不健康的,或者当容器主进程已经启动了,但是服务还没有准备好,这种情况也是不健康的,这就需要从应用层面来检查,K8S中定义了两种检查机制</p> 
  <ul> 
   <li>livenessProbe:存活检查,如果检查失败,将杀死容器,根据Pod的restartPolicy来操作</li> 
   <li>readinessProbe:就绪检查,如果检查失败,Kubernetes会把Pod从Service endpoints中剔除,也就是让客户流量不打到readinessProbe检查失败的Pod上</li> 
  </ul> 
  <p>具体的检查方式支持三种</p> 
  <ul> 
   <li>http Get:发送HTTP请求,返回200 - 400 范围状态码为成功</li> 
   <li>exec:执行Shell命令返回状态码是0为成功</li> 
   <li>tcpSocket:发起TCP Socket建立成功</li> 
  </ul> 
  <h2>6.8 自动化上线与回滚</h2> 
  <p>Kubernetes 会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。如果出现问题,Kubernetes 会为你回滚所作更改。你应该充分利用不断成长的部署方案生态系统。</p> 
  <h1>参考资料</h1> 
  <ul> 
   <li>K8S原理架构与实战(基础篇)</li> 
  </ul> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1700288540606279680"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(操作系统,kubernetes,容器,云原生)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1892378374161100800.htm"
                           title="记录一次进程被操作系统强制终止(OOM Killer)" target="_blank">记录一次进程被操作系统强制终止(OOM Killer)</a>
                        <span class="text-muted">别告诉我有BUG</span>
<a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>问题背景场景:在一次系统迁移中,团队将原本运行在16G内存物理机的Java服务迁移到8G内存虚拟机,直接复用了原有的JVM参数(如-Xmx12g)。服务启动后运行正常,但几小时后突然宕机,日志中无明确错误,仅显示进程终止。影响:服务不可用持续30分钟部分业务数据丢失,用户投诉激增分析过程1.初步排查现象确认:进程消失,无Java堆栈或异常日志。系统日志/var/log/messages中发现OOM</div>
                    </li>
                    <li><a href="/article/1892372445323653120.htm"
                           title="【分布式理论16】分布式调度2:资源划分和调度策略" target="_blank">【分布式理论16】分布式调度2:资源划分和调度策略</a>
                        <span class="text-muted">roman_日积跬步-终至千里</span>
<a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9E%B6%E6%9E%84/1.htm">分布式架构</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                        <div>文章目录一、资源划分:Linux容器的应用1.LXC的Namespace机制:资源隔离2.LXC的CGroup机制:资源管理二、任务与资源如何匹配1.任务队列与资源池2.资源调度策略在分布式系统中,资源的有效分配和调度是确保计算任务高效执行的关键。为了能够合理地利用系统资源并优化计算任务的执行,资源划分和调度策略显得尤为重要。本节将从Linux容器资源划分、资源池与任务队列的匹配,以及不同的调度策</div>
                    </li>
                    <li><a href="/article/1892368445526306816.htm"
                           title="百万架构师第四十课:RabbitMq:RabbitMq-工作模型与JAVA编程|JavaGuide" target="_blank">百万架构师第四十课:RabbitMq:RabbitMq-工作模型与JAVA编程|JavaGuide</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>来源:https://javaguide.netRabbitMQ1-工作模型与Java编程课前准备预习资料Windows安装步骤Linux安装步骤官网文章中文翻译系列环境说明操作系统:CentOS7JDK:1.8Erlang:19.0.4或最新版RabbitMQ:3.6.12或最新版版本对应关系典型应用场景跨系统的异步通信。人民银行二代支付系统,使用重量级消息队列IBMMQ,异步,解耦,削峰都有体</div>
                    </li>
                    <li><a href="/article/1892352146616152064.htm"
                           title="Linux基础(2):APT及YUM包管理工具及apt命令" target="_blank">Linux基础(2):APT及YUM包管理工具及apt命令</a>
                        <span class="text-muted">lishing6</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a>
                        <div>在windows操作系统中,我们要想安装某个软件的时候,只要点开相应的exe文件,一直按“下一步”,最后点“完成”,这样就可以在我们电脑上使用这个软件了。前面我们也提到过,Ubuntu提供了一个软件商店,虽然它也可以提供软件的下载,并且能够自动安装,但是有些软件并不一定能够在里面搜索得到,那只能以源码的方式来安装软件。采用源码的安装方式,都需要检测当前的系统环境,设置编译的参数,如加入/剔除某个模</div>
                    </li>
                    <li><a href="/article/1892350883237261312.htm"
                           title="高并发系统架构设计全链路指南" target="_blank">高并发系统架构设计全链路指南</a>
                        <span class="text-muted">power-辰南</span>
<a class="tag" taget="_blank" href="/search/java%E6%8A%80%E6%9C%AF%E6%9E%B6%E6%9E%84%E5%B8%88%E6%88%90%E9%95%BF%E4%B8%93%E6%A0%8F/1.htm">java技术架构师成长专栏</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%B9%B6%E5%8F%91/1.htm">高并发</a><a class="tag" taget="_blank" href="/search/springcloud/1.htm">springcloud</a>
                        <div>第一章:架构优化核心目标:提升系统高并发&高可用能力,优化架构,提高吞吐量。1.1微服务高可用优化解决问题:微服务可能存在单点故障、扩展性差、调用效率低等问题。1.1.1服务无状态化目的:让服务实例可以随时扩缩容、快速恢复,避免单点故障。可能的问题现象影响本地存储Session,导致用户粘连某个实例实例挂掉后,用户重新登录订单等业务逻辑依赖本地缓存容器扩缩时数据丢失静态文件(Excel/图片)存本</div>
                    </li>
                    <li><a href="/article/1892344203044777984.htm"
                           title="网络流量如何从公共互联网抵达Kubernetes容器 Pod?" target="_blank">网络流量如何从公共互联网抵达Kubernetes容器 Pod?</a>
                        <span class="text-muted">硅基创想家</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Kubernetes%E5%AE%9E%E6%88%98%E4%B8%8E%E7%BB%8F%E9%AA%8C/1.htm">Kubernetes实战与经验</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a>
                        <div>“解释网络流量如何从公共互联网抵达Kubernetes容器(Pod)”,这是DevOps技术面试中相当常见的问题。对这个问题给出准确且详尽的回答,能体现出DevOps工程师对Kubernetes各项流程的熟悉程度。在本文中,我将以在AWSEKS上运行Kubernetes为例,梳理这一过程。简短的答案可以概括为:用户请求→域名系统(DNS)→弹性负载均衡器(ELB)→Ingress控制器(可选)→K</div>
                    </li>
                    <li><a href="/article/1892344076632649728.htm"
                           title="Kubernetes的Ingress和Service有什么区别?" target="_blank">Kubernetes的Ingress和Service有什么区别?</a>
                        <span class="text-muted">硅基创想家</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Kubernetes%E5%AE%9E%E6%88%98%E4%B8%8E%E7%BB%8F%E9%AA%8C/1.htm">Kubernetes实战与经验</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a>
                        <div>在Kubernetes中,Ingress和Service是两个不同的概念,它们在功能、作用范围、应用场景等方面存在明显区别,具体如下:功能Ingress:主要用于管理集群外部到内部服务的HTTP和HTTPS流量路由。它可以根据域名、路径等规则,将外部请求精确地路由到集群内不同的Service,实现更细粒度的流量控制和多服务共享一个IP等功能。Service:主要用于在Kubernetes集群内部为</div>
                    </li>
                    <li><a href="/article/1892344076049641472.htm"
                           title="Kubernetes的Ingress 资源是什么?" target="_blank">Kubernetes的Ingress 资源是什么?</a>
                        <span class="text-muted">硅基创想家</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Kubernetes%E5%AE%9E%E6%88%98%E4%B8%8E%E7%BB%8F%E9%AA%8C/1.htm">Kubernetes实战与经验</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a>
                        <div>在Kubernetes中,Ingress资源是一种用于管理集群外部对内部服务访问的API对象,主要用于将不同的外部请求路由到集群内的不同服务,以下是关于它的详细介绍:定义与作用Ingress资源定义了从集群外部到内部服务的HTTP和HTTPS路由规则。通过Ingress,可以将多个不同域名或不同路径的请求,根据定义的规则,导向到集群内不同的Kubernetes服务,从而实现对集群内服务的统一外部访</div>
                    </li>
                    <li><a href="/article/1892341681794117632.htm"
                           title="systick和Timer的应用区别" target="_blank">systick和Timer的应用区别</a>
                        <span class="text-muted">weixin_58038206</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a>
                        <div>SysTick和Timer(通用定时器)都是嵌入式系统中常见的定时器,它们的区别、应用场景、优势和劣势如下:区别功能定位:SysTick主要用于为系统提供一个周期性的时钟节拍,常被操作系统用于任务调度等系统级功能;通用Timer功能更为丰富和灵活,可用于定时中断、输入捕获、输出比较、PWM输出等多种功能。时钟来源:SysTick的时钟源通常来自系统时钟,其定时精度取决于系统时钟频率;通用Timer</div>
                    </li>
                    <li><a href="/article/1892329955438686208.htm"
                           title="JAVA EE初阶 - 预备知识(三)" target="_blank">JAVA EE初阶 - 预备知识(三)</a>
                        <span class="text-muted">2025年一定要上岸</span>
<a class="tag" taget="_blank" href="/search/java-ee/1.htm">java-ee</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>一、中间件中间件是一种处于操作系统和应用程序之间的软件,它能够为分布式应用提供交互、资源共享、数据处理等功能,是现代软件架构中不可或缺的一部分。下面从多个方面为你详细介绍中间件:定义与作用定义:中间件是连接两个或多个软件组件或应用程序的软件层,它屏蔽了底层操作系统和网络的复杂性,为开发者提供了统一的编程接口和开发环境,使得不同的应用程序可以方便地进行通信和协作。作用简化开发:开发者无需关注底层的通</div>
                    </li>
                    <li><a href="/article/1892322898102775808.htm"
                           title="在Linux上安装和使用Docker" target="_blank">在Linux上安装和使用Docker</a>
                        <span class="text-muted">向着开发进攻</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a>
                        <div>在Linux上安装和使用Docker:一步步指南Docker是一种流行的容器化平台,它可以帮助开发者轻松构建、部署和运行应用程序。在本文中,我们将介绍如何在Linux系统上安装Docker,并提供一些常用的Docker命令和使用说明。1.安装DockerUbuntu系统更新包索引并安装必要的软件包以允许apt通过HTTPS使用存储库:sudoaptupdatesudoaptinstallapt-t</div>
                    </li>
                    <li><a href="/article/1892300939293945856.htm"
                           title="使用nginx+rtmp+ffmpeg实现桌面直播" target="_blank">使用nginx+rtmp+ffmpeg实现桌面直播</a>
                        <span class="text-muted">handsomestWei</span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/rtmp/1.htm">rtmp</a><a class="tag" taget="_blank" href="/search/live%E7%9B%B4%E6%92%AD/1.htm">live直播</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E6%B5%81/1.htm">推流</a><a class="tag" taget="_blank" href="/search/%E6%8B%89%E6%B5%81/1.htm">拉流</a>
                        <div>使用nginx+rtmp+ffmpeg实现桌面直播流媒体服务器搭建dockerrundocker镜像基于添加了rtmp模块的nginx,和ffmpegdockerpullalfg/nginx-rtmpdockerrun-d-p1935:1935-p8080:80--name=nginx-rtmpalfg/nginx-rtmprtmp模块说明进入容器内部查看dockerps|grepalfg/ngi</div>
                    </li>
                    <li><a href="/article/1892295011647680512.htm"
                           title="力扣hot100 —— 11.盛最多的水" target="_blank">力扣hot100 —— 11.盛最多的水</a>
                        <span class="text-muted">01_</span>
<a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%9B%9B%E6%9C%80%E5%A4%9A%E7%9A%84%E6%B0%B4/1.htm">盛最多的水</a>
                        <div>题目描述:给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。解法思路://木桶效应,短板决定水的上限,抽象问题一下,其实就是找出一对数字,俩者距离*较小数的值就是他们的水量//采用双指针,俩端开始,逐渐计算水量进行比较;//</div>
                    </li>
                    <li><a href="/article/1892285551562780672.htm"
                           title="咱们一起学C++ 第二百三十三篇之C++容器类与模板的探索" target="_blank">咱们一起学C++ 第二百三十三篇之C++容器类与模板的探索</a>
                        <span class="text-muted">一杯年华@编程空间</span>
<a class="tag" taget="_blank" href="/search/%E5%92%B1%E4%BB%AC%E4%B8%80%E8%B5%B7%E5%AD%A6%E4%B9%A0C%2B%2B/1.htm">咱们一起学习C++</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a>
                        <div>咱们一起学C++第二百三十三篇之C++容器类与模板的探索大家好!C++作为一门强大的编程语言,容器类和模板是其中非常重要的特性。今天咱们就一起来深入学习这两个知识点,希望能和大家一起进步,让我们在C++编程的道路上走得更远!一、容器类的重要性与实际应用场景在C++编程中,容器类扮演着至关重要的角色。我们在编写程序时,经常会遇到需要处理大量数据或者管理多个对象的情况。比如开发一个学生信息管理系统,需</div>
                    </li>
                    <li><a href="/article/1892277991585673216.htm"
                           title="k8s篇-应用持久化存储(PV和PVC)" target="_blank">k8s篇-应用持久化存储(PV和PVC)</a>
                        <span class="text-muted">jiam明</span>
<a class="tag" taget="_blank" href="/search/Kubernetes/1.htm">Kubernetes</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>一、Volume一般来说,容器一旦被删除后,容器运行时内部产生的所有文件数据也会被清理掉,因此,Docker提供了Volume这种方式来将数据持久化存储。可以说,Volume是Pod与外部存储设备进行数据传递的通道,也是Pod内部容器间、Pod与Pod间、Pod与外部环境进行数据共享的方式。实际上,这个Volume也只是宿主机上本地磁盘中的一个目录,也就是说,volume方式是将容器里面的数据都保</div>
                    </li>
                    <li><a href="/article/1892276731780329472.htm"
                           title="如何使用 Docker 搭建 FastAPI 环境, 本地仅编辑代码" target="_blank">如何使用 Docker 搭建 FastAPI 环境, 本地仅编辑代码</a>
                        <span class="text-muted">Acaibird.</span>
<a class="tag" taget="_blank" href="/search/eureka/1.htm">eureka</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a>
                        <div>在开发FastAPI应用时,我们有时希望将应用容器化,以便于部署和管理,同时避免污染本地的Python环境。使用Docker可以轻松实现这一目标,但如果你想在容器中安装依赖并进行调试,如何在不破坏本地环境的情况下管理依赖呢?本文将介绍如何通过Docker将FastAPI应用容器化,并展示如何进入容器安装依赖。1.项目结构假设你已经有一个简单的FastAPI项目结构,主要包含以下文件:Dockerf</div>
                    </li>
                    <li><a href="/article/1892275471823990784.htm"
                           title="2024年03月CCF-GESP编程能力等级认证Python编程四级真题解析" target="_blank">2024年03月CCF-GESP编程能力等级认证Python编程四级真题解析</a>
                        <span class="text-muted">码农StayUp</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/CCF/1.htm">CCF</a><a class="tag" taget="_blank" href="/search/GESP/1.htm">GESP</a><a class="tag" taget="_blank" href="/search/%E9%9D%92%E5%B0%91%E5%B9%B4%E7%BC%96%E7%A8%8B/1.htm">青少年编程</a>
                        <div>本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。一、单选题(共15题,共30分)第1题小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是.()A.小程序B.计时器C.操作系统D.神话人物答案:C本题属于考察计算机基础知识。鸿蒙是操作系统,操作系统是管理计算机硬件与软件资源的程序,同时也是计算机系统的内核与基石。它</div>
                    </li>
                    <li><a href="/article/1892270051516542976.htm"
                           title="Docker 安全基础:权限、用户、隔离机制" target="_blank">Docker 安全基础:权限、用户、隔离机制</a>
                        <span class="text-muted">drebander</span>
<a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a>
                        <div>Docker是一个强大的容器化平台,广泛用于开发、部署和运行应用。由于Docker提供了强大的隔离性和便捷的容器管理功能,它成为了现代DevOps和微服务架构的重要组成部分。然而,随着Docker在生产环境中的广泛应用,容器的安全性也变得至关重要。在本文中,我们将探讨Docker的权限管理、用户管理以及隔离机制,帮助开发者更好地理解和实施Docker安全最佳实践。1.Docker安全基础概述Doc</div>
                    </li>
                    <li><a href="/article/1892267781747961856.htm"
                           title="C++ STL容器大全 string vector stack queue list priority_queue set map pair" target="_blank">C++ STL容器大全 string vector stack queue list priority_queue set map pair</a>
                        <span class="text-muted">luckyyunji</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>数据结构(容器)string类Vectorvector向量->不定长数组#include定义vector方法一vectorv1;vector>v2;vector>>v3;方法二vectorv1(5,10);vector>v2(5,vector(5,10));vector>>v3(5,vector(5,vector(5,10)))尾插尾删尾插v.push_back(123);尾删v.pop_back</div>
                    </li>
                    <li><a href="/article/1892267401941151744.htm"
                           title="c++中的string、vector、list、stack、set、map等常用STL容器总结" target="_blank">c++中的string、vector、list、stack、set、map等常用STL容器总结</a>
                        <span class="text-muted">子春_贰叁</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/stl/1.htm">stl</a>
                        <div>文章目录string类vectorliststackqueuepriority_queue(优先级队列)deque(双端队列)setmultisetmapunordered_mapstring类string类简介:1.string类是表示字符串的字符串类2.string在底层实际是:basic_string模板类的别名,typedefbasic_stringstring3.不能操作多字节或者变长字</div>
                    </li>
                    <li><a href="/article/1892266771218493440.htm"
                           title="ansible部署ceph" target="_blank">ansible部署ceph</a>
                        <span class="text-muted">时空无限</span>
<a class="tag" taget="_blank" href="/search/ceph/1.htm">ceph</a><a class="tag" taget="_blank" href="/search/ansible/1.htm">ansible</a><a class="tag" taget="_blank" href="/search/ceph/1.htm">ceph</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>前言:ceph的官网有坑。按照官网部署,不会一蹴而就。会遇到各种各样的问题,ceph文档有待改进。环境操作系统cat/etc/redhat-releaseCentOSLinuxrelease8.5.2111uname-r4.18.0-80.el8.x86_64主机名三台主机,其中node-01为部署机器和ceph的其中一个节点。node-01node-02node-03网卡和ip每台主机双网卡en</div>
                    </li>
                    <li><a href="/article/1892266140982374400.htm"
                           title="【c++】容器:vector、list、map" target="_blank">【c++】容器:vector、list、map</a>
                        <span class="text-muted">大姨妈V</span>
<a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E3%80%90c%2B%2B%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A%E3%80%91%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">【c++从入门到精通】学习笔记</a>
                        <div>【c++】容器1.容器2.顺序容器3.向量4.双向链表5.关联容器6.映射参考:《c++从入门到精通》人民邮电出版社标准模板库STL的c++最有特色、最实用的部分之一。标准模板库包含了容器类、迭代器和算法三部分。容器:容器就是可以用于存放各种类型数据的数据结构。迭代器:迭代器可依次存取容器中的元素,在C++中称迭代器为指针,它们提供了访问容器、序列中每个元素的方法。算法:是用来操作容器中的元素的函</div>
                    </li>
                    <li><a href="/article/1892263493294419968.htm"
                           title="Solon —— 容器" target="_blank">Solon —— 容器</a>
                        <span class="text-muted">发强-CrazyAirhead</span>
<a class="tag" taget="_blank" href="/search/Solon/1.htm">Solon</a><a class="tag" taget="_blank" href="/search/Solon/1.htm">Solon</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/1.htm">实用教程</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>说明Solon的核心概念有IoC、AOP和本地事件总线。有人常常有误解以为IoC和AOP是Spring提出的,其实这两种思想在Spring之前就已经有了,但Spring把这两个思想在技术上落地和推广做得很好,让Ioc和AOP广为人知。核心概念IoCIoc的全称是InversionofControl,是控制反转或者反转控制的意思。它是一种思想,主要解决的是对象创建和管理的问题,用于解耦依赖。Ioc有</div>
                    </li>
                    <li><a href="/article/1892263492271009792.htm"
                           title="STL-vector,set,string,map,queue,priority_queue,stack,pair算法笔记" target="_blank">STL-vector,set,string,map,queue,priority_queue,stack,pair算法笔记</a>
                        <span class="text-muted">cloudless_sky</span>
<a class="tag" taget="_blank" href="/search/STL/1.htm">STL</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/stl/1.htm">stl</a>
                        <div>STL:standardtemplatelibrary标准模板库,封装了很多实用的容器。(一)vectorvector是一个容器。是个类。底层数据结构是数组。vector:向量,变长数组,即“长度根据需要而自动改变的数组”。使用前提:#includeusingnamespacestd;1、vector定义vectorname;以上是长度可以根据需要变化的一位数组,typename可以是任何基本类型</div>
                    </li>
                    <li><a href="/article/1892255922126909440.htm"
                           title="阿里云 MaxCompute MaxQA 开启公测,解锁近实时高效查询体验" target="_blank">阿里云 MaxCompute MaxQA 开启公测,解锁近实时高效查询体验</a>
                        <span class="text-muted">阿里云大数据AI技术</span>
<a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E4%BA%91/1.htm">阿里云</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a><a class="tag" taget="_blank" href="/search/MaxCompute/1.htm">MaxCompute</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E6%97%B6%E6%95%B0%E4%BB%93/1.htm">实时数仓</a>
                        <div>随着实时、近实时数据分析需求的持续增长,查询响应时间在现代数据分析和业务应用中变得越来越重要。为减少查询响应时间,提升数据效率,阿里云云原生大数据计算服务MaxCompute推出MaxQA(原MCQA2.0)查询加速功能,在独享的查询加速资源池的基础上,对管控链路、查询优化器、执行引擎、存储引擎以及缓存机制等多个环节进行全面优化,显著减少了查询响应时间,适用于BI场景、交互式分析以及近实时数仓等对</div>
                    </li>
                    <li><a href="/article/1892255923271954432.htm"
                           title="教程 | Ventoy全攻略:2025最新安装与使用教程,打造万能多系统启动盘" target="_blank">教程 | Ventoy全攻略:2025最新安装与使用教程,打造万能多系统启动盘</a>
                        <span class="text-muted">The god of big data</span>
<a class="tag" taget="_blank" href="/search/%E6%95%99%E7%A8%8B/1.htm">教程</a><a class="tag" taget="_blank" href="/search/%E7%A5%9E%E5%99%A8%EF%BC%9F%E4%B8%89%E5%8F%89%E6%88%9F%EF%BC%9F/1.htm">神器?三叉戟?</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E7%B3%BB%E7%BB%9F/1.htm">虚拟系统</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a>
                        <div>一、Ventoy简介与核心优势Ventoy是一款开源免费的多系统启动盘工具,支持Windows、Linux、macOS等操作系统及各类维护工具。其最大特点是无需反复格式化U盘,只需将ISO/WIM/IMG等镜像文件直接拷贝至U盘即可启动,且支持LegacyBIOS与UEFI双模式。相较于传统工具,Ventoy的优势包括:多系统兼容性:支持超1000种ISO镜像,涵盖主流操作系统及工具(如Windo</div>
                    </li>
                    <li><a href="/article/1892243171807653888.htm"
                           title="HarmonyOS NEXT开发:通过线性容器实现数组指导" target="_blank">HarmonyOS NEXT开发:通过线性容器实现数组指导</a>
                        <span class="text-muted">「已注销」</span>
<a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99%E5%BC%80%E5%8F%91/1.htm">鸿蒙开发</a><a class="tag" taget="_blank" href="/search/HarmonyOS/1.htm">HarmonyOS</a><a class="tag" taget="_blank" href="/search/OpenHarmony/1.htm">OpenHarmony</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/harmonyos/1.htm">harmonyos</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA/1.htm">华为</a><a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99/1.htm">鸿蒙</a><a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99%E7%B3%BB%E7%BB%9F/1.htm">鸿蒙系统</a>
                        <div>线性容器实现能按顺序访问的数据结构,其底层主要通过数组实现,包括ArrayList、Vector、List、LinkedList、Deque、Queue、Stack七种。线性容器,充分考虑了数据访问的速度,运行时(Runtime)通过一条字节码指令就可以完成增、删、改、查等操作。ArrayListArrayList即动态数组,可用来构造全局的数组对象。当需要频繁读取集合中的元素时,推荐使用Arra</div>
                    </li>
                    <li><a href="/article/1892242909344886784.htm"
                           title="HarmonyOS组件之Tabs" target="_blank">HarmonyOS组件之Tabs</a>
                        <span class="text-muted">秃顶老男孩.</span>
<a class="tag" taget="_blank" href="/search/harmonyos/1.htm">harmonyos</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA/1.htm">华为</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a>
                        <div>Tabs1.1概念Tabs视图切换容器,通过相适应的页签进行视图页面的切换的容器组件每一个页签对应一个内容视图Tabs拥有一种唯一的子集元素TabContent1.2子组件不支持自定义组件为子组件,仅可包含子组件TabContent,以及渲染控制类型if/else和ForEach并且if/else和ForEach下页仅支持TabContent,不支持自定义组件1.2.1TabContent有几个页</div>
                    </li>
                    <li><a href="/article/1892237237077209088.htm"
                           title="python 协程 深入浅出" target="_blank">python 协程 深入浅出</a>
                        <span class="text-muted">秋裤傻</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E8%BF%9B%E7%A8%8B/1.htm">多进程</a>
                        <div>说到并发编程,大家容易想到的就是:进程、线程、协程、异步IO。四者在实现上却有共通之处,不外乎调度二字。进程:操作系统进程系统调度,调度号:pid,基本由操作系统提供调度支持线程:操作系统线程调度,调度号:TCB,虚拟机提供一部分支持协程:程序自己进行调度,调度号:函数名,全部由程序自身完成。异步IO:由消息中间件负责调度,调度号:消息队列。进程、线程、协程它们三个实现的是时间复用,达到逻辑上的同</div>
                    </li>
                    <li><a href="/article/1892221220573736960.htm"
                           title="Kubernetes & 容器自动伸缩失败:解决方案及阿里云如何帮助" target="_blank">Kubernetes & 容器自动伸缩失败:解决方案及阿里云如何帮助</a>
                        <span class="text-muted">Anna_Tong</span>
<a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E4%BA%91/1.htm">阿里云</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/1.htm">负载均衡</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a><a class="tag" taget="_blank" href="/search/%E5%BC%B9%E6%80%A7%E8%AE%A1%E7%AE%97/1.htm">弹性计算</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E4%BC%B8%E7%BC%A9/1.htm">自动伸缩</a>
                        <div>随着容器技术的普及,Kubernetes(K8s)已成为构建现代云原生应用的核心平台。自动伸缩(AutoScaling)功能可以帮助应用在流量波动时动态调整资源,提高效率并节约成本。然而,很多企业在配置水平自动伸缩(HorizontalPodAutoscaler,HPA)或ECS扩容策略时,常常遇到配置错误或无法触发扩容的问题,导致资源无法及时扩展或收缩,影响系统的稳定性和用户体验。本文将为您分享</div>
                    </li>
                                <li><a href="/article/8.htm"
                                       title="LeetCode[Math] - #66 Plus One" target="_blank">LeetCode[Math] - #66 Plus One</a>
                                    <span class="text-muted">Cwind</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/LeetCode/1.htm">LeetCode</a><a class="tag" taget="_blank" href="/search/%E9%A2%98%E8%A7%A3/1.htm">题解</a><a class="tag" taget="_blank" href="/search/Algorithm/1.htm">Algorithm</a><a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a>
                                    <div>原题链接:#66 Plus One 
  
要求: 
给定一个用数字数组表示的非负整数,如num1 = {1, 2, 3, 9}, num2 = {9, 9}等,给这个数加上1。 
注意: 
1. 数字的较高位存在数组的头上,即num1表示数字1239 
2. 每一位(数组中的每个元素)的取值范围为0~9 
  
难度:简单 
  
分析: 
题目比较简单,只须从数组</div>
                                </li>
                                <li><a href="/article/135.htm"
                                       title="JQuery中$.ajax()方法参数详解" target="_blank">JQuery中$.ajax()方法参数详解</a>
                                    <span class="text-muted">AILIKES</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/jsonp/1.htm">jsonp</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a>
                                    <div>url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址。 
type: 要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和    delete也可以使用,但仅部分浏览器支持。 
timeout: 要求为Number类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局</div>
                                </li>
                                <li><a href="/article/262.htm"
                                       title="JConsole & JVisualVM远程监视Webphere服务器JVM" target="_blank">JConsole & JVisualVM远程监视Webphere服务器JVM</a>
                                    <span class="text-muted">Kai_Ge</span>
<a class="tag" taget="_blank" href="/search/JVisualVM/1.htm">JVisualVM</a><a class="tag" taget="_blank" href="/search/JConsole/1.htm">JConsole</a><a class="tag" taget="_blank" href="/search/Webphere/1.htm">Webphere</a>
                                    <div>    JConsole是JDK里自带的一个工具,可以监测Java程序运行时所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。我们可以根据这些信息判断程序是否有内存泄漏问题。 
  使用JConsole工具来分析WAS的JVM问题,需要进行相关的配置。 
  首先我们看WAS服务器端的配置. 
  1、登录was控制台https://10.4.119.18</div>
                                </li>
                                <li><a href="/article/389.htm"
                                       title="自定义annotation" target="_blank">自定义annotation</a>
                                    <span class="text-muted">120153216</span>
<a class="tag" taget="_blank" href="/search/annotation/1.htm">annotation</a>
                                    <div>Java annotation 自定义注释@interface的用法  一、什么是注释  
 
    说起注释,得先提一提什么是元数据(metadata)。所谓元数据就是数据的数据。也就是说,元数据是描述数据的。就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义。而J2SE5.0中提供的注释就是java源代码的元数据,也就是说注释是描述java源</div>
                                </li>
                                <li><a href="/article/516.htm"
                                       title="CentOS 5/6.X 使用 EPEL YUM源" target="_blank">CentOS 5/6.X 使用 EPEL YUM源</a>
                                    <span class="text-muted">2002wmj</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a>
                                    <div>CentOS 6.X 安装使用EPEL YUM源1. 查看操作系统版本[root@node1 ~]# uname -a Linux node1.test.com 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux [root@node1 ~]#</div>
                                </li>
                                <li><a href="/article/643.htm"
                                       title="在SQLSERVER中查找缺失和无用的索引SQL" target="_blank">在SQLSERVER中查找缺失和无用的索引SQL</a>
                                    <span class="text-muted">357029540</span>
<a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a>
                                    <div>--缺失的索引 
SELECT  avg_total_user_cost * avg_user_impact * ( user_scans + user_seeks ) AS PossibleImprovement ,  
        last_user_seek ,  
  </div>
                                </li>
                                <li><a href="/article/770.htm"
                                       title="Spring3 MVC 笔记(二) —json+rest优化" target="_blank">Spring3 MVC 笔记(二) —json+rest优化</a>
                                    <span class="text-muted">7454103</span>
<a class="tag" taget="_blank" href="/search/Spring3+MVC/1.htm">Spring3 MVC</a>
                                    <div>接上次的 spring mvc 注解的一些详细信息! 
                         其实也是一些个人的学习笔记  呵呵! 
 
</div>
                                </li>
                                <li><a href="/article/897.htm"
                                       title="替换“\”的时候报错Unexpected internal error near index 1 \ ^" target="_blank">替换“\”的时候报错Unexpected internal error near index 1 \ ^</a>
                                    <span class="text-muted">adminjun</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E2%80%9C%5C%E6%9B%BF%E6%8D%A2%E2%80%9D/1.htm">“\替换”</a>
                                    <div>发现还是有些东西没有刻子脑子里,,过段时间就没什么概念了,所以贴出来...以免再忘... 
  
在拆分字符串时遇到通过 \ 来拆分,可是用所以想通过转义 \\ 来拆分的时候会报异常 
   
 
 public class Main {   
    
     /*</div>
                                </li>
                                <li><a href="/article/1024.htm"
                                       title="POJ 1035 Spell checker(哈希表)" target="_blank">POJ 1035 Spell checker(哈希表)</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/%E6%9A%B4%E5%8A%9B%E6%B1%82%E8%A7%A3--%E5%93%88%E5%B8%8C%E8%A1%A8/1.htm">暴力求解--哈希表</a>
                                    <div>/*
题意:输入字典,然后输入单词,判断字典中是否出现过该单词,或者是否进行删除、添加、替换操作,如果是,则输出对应的字典中的单词
要求按照输入时候的排名输出

题解:建立两个哈希表。一个存储字典和输入字典中单词的排名,一个进行最后输出的判重
*/

#include <iostream>
//#define 
using namespace std;
const int HASH =</div>
                                </li>
                                <li><a href="/article/1151.htm"
                                       title="通过原型实现javascript Array的去重、最大值和最小值" target="_blank">通过原型实现javascript Array的去重、最大值和最小值</a>
                                    <span class="text-muted">ayaoxinchao</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/array/1.htm">array</a><a class="tag" taget="_blank" href="/search/prototype/1.htm">prototype</a>
                                    <div>用原型函数(prototype)可以定义一些很方便的自定义函数,实现各种自定义功能。本次主要是实现了Array的去重、获取最大值和最小值。 
实现代码如下: 
  
<script type="text/javascript">
	Array.prototype.unique = function() {
		var a = {};
		var le</div>
                                </li>
                                <li><a href="/article/1278.htm"
                                       title="UIWebView实现https双向认证请求" target="_blank">UIWebView实现https双向认证请求</a>
                                    <span class="text-muted">bewithme</span>
<a class="tag" taget="_blank" href="/search/UIWebView/1.htm">UIWebView</a><a class="tag" taget="_blank" href="/search/https/1.htm">https</a><a class="tag" taget="_blank" href="/search/Objective-C/1.htm">Objective-C</a>
                                    <div>  
        什么是HTTPS双向认证我已在先前的博文 ASIHTTPRequest实现https双向认证请求 
中有讲述,不理解的读者可以先复习一下。本文是用UIWebView来实现对需要客户端证书验证的服务请求,网上有些文章中有涉及到此内容,但都只言片语,没有讲完全,更没有完整的代码,让人困扰不已。但是此知</div>
                                </li>
                                <li><a href="/article/1405.htm"
                                       title="NoSQL数据库之Redis数据库管理(Redis高级应用之事务处理、持久化操作、pub_sub、虚拟内存)" target="_blank">NoSQL数据库之Redis数据库管理(Redis高级应用之事务处理、持久化操作、pub_sub、虚拟内存)</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a>
                                    <div>3.事务处理 
        Redis对事务的支持目前不比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中</div>
                                </li>
                                <li><a href="/article/1532.htm"
                                       title="各数据库分页sql备忘" target="_blank">各数据库分页sql备忘</a>
                                    <span class="text-muted">bingyingao</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E9%A1%B5/1.htm">分页</a>
                                    <div>ORACLE 
 
下面这个效率很低 
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM IPAY_RCD_FS_RETURN order by id desc) A ) WHERE RN <20; 
 
下面这个效率很高 
SELECT A.*, ROWNUM RN FROM (SELECT * FROM IPAY_RCD_</div>
                                </li>
                                <li><a href="/article/1659.htm"
                                       title="【Scala七】Scala核心一:函数" target="_blank">【Scala七】Scala核心一:函数</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a>
                                    <div>1. 如果函数体只有一行代码,则可以不用写{},比如 
def print(x: Int) = println(x) 
一行上的多条语句用分号隔开,则只有第一句属于方法体,例如 
  
def printWithValue(x: Int) : String= println(x); "ABC" 
  
上面的代码报错,因为,printWithValue的方法</div>
                                </li>
                                <li><a href="/article/1786.htm"
                                       title="了解GHC的factorial编译过程" target="_blank">了解GHC的factorial编译过程</a>
                                    <span class="text-muted">bookjovi</span>
<a class="tag" taget="_blank" href="/search/haskell/1.htm">haskell</a>
                                    <div>GHC相对其他主流语言的编译器或解释器还是比较复杂的,一部分原因是haskell本身的设计就不易于实现compiler,如lazy特性,static typed,类型推导等。 
关于GHC的内部实现有篇文章说的挺好,这里,文中在RTS一节中详细说了haskell的concurrent实现,里面提到了green thread,如果熟悉Go语言的话就会发现,ghc的concurrent实现和Go有点类</div>
                                </li>
                                <li><a href="/article/1913.htm"
                                       title="Java-Collections Framework学习与总结-LinkedHashMap" target="_blank">Java-Collections Framework学习与总结-LinkedHashMap</a>
                                    <span class="text-muted">BrokenDreams</span>
<a class="tag" taget="_blank" href="/search/LinkedHashMap/1.htm">LinkedHashMap</a>
                                    <div>        前面总结了java.util.HashMap,了解了其内部由散列表实现,每个桶内是一个单向链表。那有没有双向链表的实现呢?双向链表的实现会具备什么特性呢?来看一下HashMap的一个子类——java.util.LinkedHashMap。 
      </div>
                                </li>
                                <li><a href="/article/2040.htm"
                                       title="读《研磨设计模式》-代码笔记-抽象工厂模式-Abstract Factory" target="_blank">读《研磨设计模式》-代码笔记-抽象工厂模式-Abstract Factory</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/abstract/1.htm">abstract</a>
                                    <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ 
 
 


package design.pattern;

/*
 * Abstract Factory Pattern
 * 抽象工厂模式的目的是:
 * 通过在抽象工厂里面定义一组产品接口,方便地切换“产品簇”
 * 这些接口是相关或者相依赖的</div>
                                </li>
                                <li><a href="/article/2167.htm"
                                       title="压暗面部高光" target="_blank">压暗面部高光</a>
                                    <span class="text-muted">cherishLC</span>
<a class="tag" taget="_blank" href="/search/PS/1.htm">PS</a>
                                    <div>方法一、压暗高光&重新着色 
当皮肤很油又使用闪光灯时,很容易在面部形成高光区域。 
下面讲一下我今天处理高光区域的心得: 
皮肤可以分为纹理和色彩两个属性。其中纹理主要由亮度通道(Lab模式的L通道)决定,色彩则由a、b通道确定。 
处理思路为在保持高光区域纹理的情况下,对高光区域着色。具体步骤为:降低高光区域的整体的亮度,再进行着色。 
如果想简化步骤,可以只进行着色(参看下面的步骤1</div>
                                </li>
                                <li><a href="/article/2294.htm"
                                       title="Java VisualVM监控远程JVM" target="_blank">Java VisualVM监控远程JVM</a>
                                    <span class="text-muted">crabdave</span>
<a class="tag" taget="_blank" href="/search/visualvm/1.htm">visualvm</a>
                                    <div>Java VisualVM监控远程JVM  
  
JDK1.6开始自带的VisualVM就是不错的监控工具. 
这个工具就在JAVA_HOME\bin\目录下的jvisualvm.exe, 双击这个文件就能看到界面 
  
通过JMX连接远程机器, 需要经过下面的配置: 
1. 修改远程机器JDK配置文件 (我这里远程机器是linux). 
   </div>
                                </li>
                                <li><a href="/article/2421.htm"
                                       title="Saiku去掉登录模块" target="_blank">Saiku去掉登录模块</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/saiku/1.htm">saiku</a><a class="tag" taget="_blank" href="/search/%E7%99%BB%E5%BD%95/1.htm">登录</a><a class="tag" taget="_blank" href="/search/olap/1.htm">olap</a><a class="tag" taget="_blank" href="/search/BI/1.htm">BI</a>
                                    <div> 
1、修改applicationContext-saiku-webapp.xml 
 
<security:intercept-url pattern="/rest/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />  
<security:intercept-url pattern=&qu</div>
                                </li>
                                <li><a href="/article/2548.htm"
                                       title="浅析 Flex中的Focus" target="_blank">浅析 Flex中的Focus</a>
                                    <span class="text-muted">dsjt</span>
<a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Flex/1.htm">Flex</a><a class="tag" taget="_blank" href="/search/Flash/1.htm">Flash</a>
                                    <div>关键字:focus、 setFocus、 IFocusManager、KeyboardEvent 
 焦点、设置焦点、获得焦点、键盘事件 
 
 
 一、无焦点的困扰——组件监听不到键盘事件 
原因:只有获得焦点的组件(确切说是InteractiveObject)才能监听到键盘事件的目标阶段;键盘事件(flash.events.KeyboardEvent)参与冒泡阶段,所以焦点组件的父项(以及它爸</div>
                                </li>
                                <li><a href="/article/2675.htm"
                                       title="Yii全局函数使用" target="_blank">Yii全局函数使用</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a>
                                    <div>由于YII致力于完美的整合第三方库,它并没有定义任何全局函数。yii中的每一个应用都需要全类别和对象范围。例如,Yii::app()->user;Yii::app()->params['name'];等等。我们可以自行设定全局函数,使得代码看起来更加简洁易用。(原文地址) 
我们可以保存在globals.php在protected目录下。然后,在入口脚本index.php的,我们包括在</div>
                                </li>
                                <li><a href="/article/2802.htm"
                                       title="设计模式之单例模式二(解决无序写入的问题)" target="_blank">设计模式之单例模式二(解决无序写入的问题)</a>
                                    <span class="text-muted">come_for_dream</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/1.htm">单例模式</a><a class="tag" taget="_blank" href="/search/volatile/1.htm">volatile</a><a class="tag" taget="_blank" href="/search/%E4%B9%B1%E5%BA%8F%E6%89%A7%E8%A1%8C/1.htm">乱序执行</a><a class="tag" taget="_blank" href="/search/%E5%8F%8C%E9%87%8D%E6%A3%80%E9%AA%8C%E9%94%81/1.htm">双重检验锁</a>
                                    <div>                在上篇文章中我们使用了双重检验锁的方式避免懒汉式单例模式下由于多线程造成的实例被多次创建的问题,但是因为由于JVM为了使得处理器内部的运算单元能充分利用,处理器可能会对输入代码进行乱序执行(Out Of Order Execute)优化,处理器会在计算之后将乱序执行的结果进行重组,保证该</div>
                                </li>
                                <li><a href="/article/2929.htm"
                                       title="程序员从初级到高级的蜕变" target="_blank">程序员从初级到高级的蜕变</a>
                                    <span class="text-muted">gcq511120594</span>
<a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a>
                                    <div>软件开发是一个奇怪的行业,市场远远供不应求。这是一个已经存在多年的问题,而且随着时间的流逝,愈演愈烈。 
我们严重缺乏能够满足需求的人才。这个行业相当年轻。大多数软件项目是失败的。几乎所有的项目都会超出预算。我们解决问题的最佳指导方针可以归结为——“用一些通用方法去解决问题,当然这些方法常常不管用,于是,唯一能做的就是不断地尝试,逐个看看是否奏效”。 
现在我们把淫浸代码时间超过3年的开发人员称为</div>
                                </li>
                                <li><a href="/article/3056.htm"
                                       title="Reverse Linked List" target="_blank">Reverse Linked List</a>
                                    <span class="text-muted">hcx2013</span>
<a class="tag" taget="_blank" href="/search/list/1.htm">list</a>
                                    <div>Reverse a singly linked list. 
  
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
p</div>
                                </li>
                                <li><a href="/article/3183.htm"
                                       title="Spring4.1新特性——数据库集成测试" target="_blank">Spring4.1新特性——数据库集成测试</a>
                                    <span class="text-muted">jinnianshilongnian</span>
<a class="tag" taget="_blank" href="/search/spring+4.1/1.htm">spring 4.1</a>
                                    <div>目录 
Spring4.1新特性——综述 
Spring4.1新特性——Spring核心部分及其他 
Spring4.1新特性——Spring缓存框架增强 
Spring4.1新特性——异步调用和事件机制的异常处理 
Spring4.1新特性——数据库集成测试脚本初始化 
Spring4.1新特性——Spring MVC增强 
Spring4.1新特性——页面自动化测试框架Spring MVC T</div>
                                </li>
                                <li><a href="/article/3310.htm"
                                       title="C# Ajax上传图片同时生成微缩图(附Demo)" target="_blank">C# Ajax上传图片同时生成微缩图(附Demo)</a>
                                    <span class="text-muted">liyonghui160com</span>

                                    <div>  
  
1.Ajax无刷新上传图片,详情请阅我的这篇文章。(jquery + c# ashx) 
        2.C#位图处理  System.Drawing。 
        3.最新demo支持IE7,IE8,Fir</div>
                                </li>
                                <li><a href="/article/3437.htm"
                                       title="Java list三种遍历方法性能比较" target="_blank">Java list三种遍历方法性能比较</a>
                                    <span class="text-muted">pda158</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象,测试代码例如以下: 
package com.hisense.tiger.list;
import java.util.ArrayList;
import java.util.Iterator;</div>
                                </li>
                                <li><a href="/article/3564.htm"
                                       title="300个涵盖IT各方面的免费资源(上)——商业与市场篇" target="_blank">300个涵盖IT各方面的免费资源(上)——商业与市场篇</a>
                                    <span class="text-muted">shoothao</span>
<a class="tag" taget="_blank" href="/search/seo/1.htm">seo</a><a class="tag" taget="_blank" href="/search/%E5%95%86%E4%B8%9A%E4%B8%8E%E5%B8%82%E5%9C%BA/1.htm">商业与市场</a><a class="tag" taget="_blank" href="/search/IT%E8%B5%84%E6%BA%90/1.htm">IT资源</a><a class="tag" taget="_blank" href="/search/%E5%85%8D%E8%B4%B9%E8%B5%84%E6%BA%90/1.htm">免费资源</a>
                                    <div> 
 A.网站模板+logo+服务器主机+发票生成 
 
 
  HTML5 UP:响应式的HTML5和CSS3网站模板。 
  Bootswatch:免费的Bootstrap主题。 
  Templated:收集了845个免费的CSS和HTML5网站模板。 
  Wordpress.org|Wordpress.com:可免费创建你的新网站。 
  Strikingly:关注领域中免费无限的移动优</div>
                                </li>
                                <li><a href="/article/3691.htm"
                                       title="localStorage、sessionStorage" target="_blank">localStorage、sessionStorage</a>
                                    <span class="text-muted">uule</span>
<a class="tag" taget="_blank" href="/search/localStorage/1.htm">localStorage</a>
                                    <div>W3School 例子 
  
HTML5 提供了两种在客户端存储数据的新方法: 
localStorage - 没有时间限制的数据存储 
sessionStorage - 针对一个 session 的数据存储 
  
之前,这些都是由 cookie 完成的。但是 cookie 不适合大量数据的存储,因为它们由每个对服务器的请求来传递,这使得 cookie 速度很慢而且效率也不</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>