首页 文章 精选 留言 我的

精选列表

搜索[文献管理工具],共5866篇文章
优秀的个人博客,低调大师

Docker集群管理工具-Kubernetes部署记录

Kubernetes介绍 1 2 3 4 5 6 7 8 9 Kubernetes是Google开源的容器集群管理系统,是基于Docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件。 Kubernetes提供应用部署、维护、扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下: 1)使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run)。 2)将多台Docker主机抽象为一个资源,以集群的方式运行、管理跨机器的容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。 3)使用编排系统(YAMLFile)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题 4)解决Docker跨机器容器之间的通讯问题。 5)自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有 十个容器在运行,反而杀死多余的。 Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift。 Kubernetes和Mesos的区别 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1)Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核; Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。 2)Mesos负责管理集群管资源(动态运行时,某机器有额外的资源,通知master来分配); Kubernetes抽象出新的容器组合模型并且对其编排管理(把容器自由组合提供服务这事儿搞定了,从而微服务,serverless等才真 正的优雅地在开发和运维之间不吵架地被实现),而且kubernetes把以前运维的很多很难搞的东西都变得容易了。比如OpenStack, Kubernetes是把OpenStack里面的VM换成了容器,但是实现地更漂亮,更精简,更抽象和本质化,用起来也更容易。 3)Mesos相比Kubernetes发展的时间更久,总体情况更成熟,在生产环境有更多的使用经验,国外使用Mesos的公司有Twitter,Apple, Airbnb,Uber等,国内也有大批知名公司在使用Mesos,比如:小米、当当、豆瓣、去哪儿、携程、唯品会、知乎、新浪微博、爱奇艺、 七牛、唯品会、bilibili、中国联通、中国移动、中国电信、华为、数人云等等。中大型公司会更倾向于使用Mesos, 因为本身这些公司有一定的开发能力,Mesos提供了良好的API而且有非常多成熟的Framework跑在Mesos上,Mesos+Marathon+Zookeeper 正常情况可以满足绝大部分需求,只需要写JSON或者DSL定义好service /application 就好,只有一些特殊情况才确实需要写自己的Framework。 而kubernetes(k8s)现在也正在慢慢成熟起来,它在生产环境显然还需要更多时间来验证。京东目前已经在kubernetes上跑15W+容器了。 Mesos现在越来越适应并且被添加上了很多Kubernete的概念同时支持了很多Kubernetes的API。因此如果你需要它们的话,它将是对你的 Kubernetes应用去获得更多能力的一个便捷方式(比如高可用的主干、更加高级的调度命令、去管控很大数目结点的能力),同时能够很好的 适用于产品级工作环境中(毕竟Kubernetes任然还是一个初始版本)。 4)如果你是一个集群世界的新手,Kubernetes是一个很棒的起点。它是最快的、最简单的、最轻量级的方法去摆脱束缚,同时开启面向集群开发的实践。 它提供了一个高水平的可移植方案,因为它是被一些不同的贡献者所支持的(例如微软、IBM、RedHat、CoreOs、MesoSphere、VMWare等等)。 如果你已经有已经存在的工作任务(Hadoop、Spark、Kafka等等),Mesos给你提供了一个可以让你将不同工作任务相互交错的框架,然后混合进一个 包含Kubernetes应用的新的东西。 如果你还没有用Kubernetes系列框架完成项目的能力,Mesos给了你一个减压阀。 Kubernetes结构图 kubernetes角色组成 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 1)Pod 在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod,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。 ReplicationController是Kubernetes系统中最有用的功能,实现复制多个Pod副本,往往一个应用需要多个Pod来支撑,并且可以保证其复制的 副本数,即使副本所调度分配的宿主机出现异常,通过ReplicationController可以保证在其它主宿机启用同等数量的Pod。ReplicationController 可以通过repcon模板来创建多个Pod副本,同样也可以直接复制已存在Pod,需要通过Labelselector来关联。 3)Service Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。集合根据定义的Label和selector完成,当创建一个Service后, 会分配一个ClusterIP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡。 Services是Kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的Pod资源,目前的版本是通过iptables的nat转发来实现, 转发的目标端口为Kube_proxy生成的随机端口,目前只提供GOOGLE云上的访问调度,如GCE。 4)Label Label是用于区分Pod、Service、RC的key /value 键值对;仅使用在Pod、Service、ReplicationController之间的关系识别,但对这些单元本身进行操 作时得使用name标签。Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;主要是将Service的请求通过lable转发给后端提供服务的Pod集合; 说说个人一点看法,目前Kubernetes保持一周一小版本、一个月一大版本的节奏,迭代速度极快,同时也带来了不同版本操作方法的差异,另外官网文档更新速度 相对滞后及欠缺,给初学者带来一定挑战。在上游接入层官方侧重点还放在GCE(GoogleComputeEngine)的对接优化,针对个人私有云还未推出一套可行的接入 解决方案。在v0.5版本中才引用service代理转发的机制,且是通过iptables来实现,在高并发下性能令人担忧。但作者依然看好Kubernetes未来的发展,至少目前 还未看到另外一个成体系、具备良好生态圈的平台,相信在V1.0时就会具备生产环境的服务支撑能力。 kubernetes组件组成 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1)kubectl 客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。 2)kube-apiserver 作为整个系统的控制入口,以RESTAPI服务提供接口。 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访问服务了。 Kubelet 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 根据上图可知Kubelet是Kubernetes集群中每个Minion和MasterAPIServer的连接点,Kubelet运行在每个Minion上,是MasterAPIServer和Minion之间的桥梁, 接收MasterAPIServer分配给它的commands和work,与持久性键值存储etcd、 file 、server和http进行交互,读取配置信息。Kubelet的主要工作是管理Pod和容 器的生命周期,其包括DockerClient、RootDirectory、PodWorkers、EtcdClient、CadvisorClient以及HealthChecker组件,具体工作如下: 1)通过Worker给Pod异步运行特定的Action。 2)设置容器的环境变量。 3)给容器绑定Volume。 4)给容器绑定Port。 5)根据指定的Pod运行一个单一容器。 6)杀死容器。 7)给指定的Pod创建network容器。 8)删除Pod的所有容器。 9)同步Pod的状态。 10)从Cadvisor获取containerinfo、podinfo、rootinfo、machineinfo。 11)检测Pod的容器健康状态信息。 12)在容器中运行命令 kubernetes基本部署步骤 1 2 3 4 5 6 7 8 9 10 1)minion节点安装docker 2)minion节点配置跨主机容器通信 3)master节点部署etcd、kube-apiserver、kube-controller-manager和kube-scheduler组件 4)minion节点部署kubelet、kube-proxy组件 温馨提示: 如果minion主机没有安装docker,启动kubelet时会报如下错误: Couldnotloadkubeconfig file /var/lib/kubelet/kubeconfig :stat /var/lib/kubelet/kubeconfig :nosuch file ordirectory.Tryingauthpathinstead. Couldnotloadkubernetesauthpath /var/lib/kubelet/kubernetes_auth :stat /var/lib/kubelet/kubernetes_auth :nosuch file ordirectory.Continuingwithdefaults. Nocloudproviderspecified. kubernetes集群环境部署过程记录 1 2 3 4 主机名 IP 节点及功能 系统版本 K8S-master 10.10.172.202 Master、etcd、registry CentOS7.2 K8S-node-1 10.10.172.203 Node1 CentOS7.2 K8S-node-2 10.10.172.204 Node2 CentOS7.2 1)设置三台机器的主机名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Master上执行: [root@localhost~] #hostnamectl--staticset-hostnamek8s-master Node1上执行: [root@localhost~] #hostnamectl--staticset-hostnamek8s-node-1 Node2上执行: [root@localhost~] #hostnamectl--staticset-hostnamek8s-node-2 在三台机器上都要设置hosts,均执行如下命令: [root@k8s-master~] #vim/etc/hosts 10.10.172.202k8s-master 10.10.172.202etcd 10.10.172.202registry 10.10.172.203k8s-node-1 10.10.172.204k8s-node-2 2)关闭三台机器上的防火墙 1 2 [root@k8s-master~] #systemctldisablefirewalld.service [root@k8s-master~] #systemctlstopfirewalld.service 3)现在开始部署Master 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 1)先安装docker环境 [root@k8s-master~] #yuminstall-ydocker 配置Docker配置文件,使其允许从registry中拉取镜像 [root@k8s-master~] #vim/etc/sysconfig/docker#添加下面一行内容 ...... OPTIONS= '--insecure-registryregistry:5000' [root@k8s-master~] #systemctlstartdocker 2)安装etcd k8s运行依赖etcd,需要先部署etcd,下面采用yum方式安装: [root@k8s-master~] #yuminstalletcd-y yum安装的etcd默认配置文件在 /etc/etcd/etcd .conf,编辑配置文件: [root@k8s-master~] #cp/etc/etcd/etcd.conf/etc/etcd/etcd.conf.bak [root@k8s-master~] #cat/etc/etcd/etcd.conf #[member] ETCD_NAME=master #节点名称 ETCD_DATA_DIR= "/var/lib/etcd/default.etcd" #数据存放位置 #ETCD_WAL_DIR="" #ETCD_SNAPSHOT_COUNT="10000" #ETCD_HEARTBEAT_INTERVAL="100" #ETCD_ELECTION_TIMEOUT="1000" #ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS= "http://0.0.0.0:2379,http://0.0.0.0:4001" #监听客户端地址 #ETCD_MAX_SNAPSHOTS="5" #ETCD_MAX_WALS="5" #ETCD_CORS="" # #[cluster] #ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380" #ifyouusedifferentETCD_NAME(e.g.test),setETCD_INITIAL_CLUSTERvalueforthisname,i.e."test=http://..." #ETCD_INITIAL_CLUSTER="default=http://localhost:2380" #ETCD_INITIAL_CLUSTER_STATE="new" #ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS= "http://etcd:2379,http://etcd:4001" #通知客户端地址 #ETCD_DISCOVERY="" #ETCD_DISCOVERY_SRV="" #ETCD_DISCOVERY_FALLBACK="proxy" #ETCD_DISCOVERY_PROXY="" 启动etcd并验证状态 [root@k8s-master~] #systemctlstartetcd [root@k8s-master~] #ps-ef|grepetcd etcd281451114:38?00:00:00 /usr/bin/etcd --name=master--data- dir = /var/lib/etcd/default .etcd--listen-client-urls=http: //0 .0.0.0:2379,http: //0 .0.0.0:4001 root2818524819014:38pts /1 00:00:00 grep --color=autoetcd [root@k8s-master~] #lsof-i:2379 COMMANDPIDUSERFDTYPEDEVICESIZE /OFF NODENAME etcd28145etcd6uIPv612838220t0TCP*:2379(LISTEN) etcd28145etcd18uIPv612841330t0TCPlocalhost:53203->localhost:2379(ESTABLISHED) ........ [root@k8s-master~] #etcdctlsettestdir/testkey00 0 [root@k8s-master~] #etcdctlgettestdir/testkey0 0 [root@k8s-master~] #etcdctl-Chttp://etcd:4001cluster-health member8e9e05c52164694dishealthy:gothealthyresultfromhttp: //etcd :2379 clusterishealthy [root@k8s-master~] #etcdctl-Chttp://etcd:2379cluster-health member8e9e05c52164694dishealthy:gothealthyresultfromhttp: //etcd :2379 clusterishealthy 3)安装kubernets [root@k8s-master~] #yuminstallkubernetes-y 配置并启动kubernetes 在kubernetesmaster上需要运行以下组件:KubernetsAPIServer、KubernetsControllerManager、KubernetsScheduler [root@k8s-master~] #cp/etc/kubernetes/apiserver/etc/kubernetes/apiserver.bak [root@k8s-master~] #vim/etc/kubernetes/apiserver ### #kubernetessystemconfig # #Thefollowingvaluesareusedtoconfigurethekube-apiserver # #Theaddressonthelocalservertolistento. KUBE_API_ADDRESS= "--insecure-bind-address=0.0.0.0" #Theportonthelocalservertolistenon. KUBE_API_PORT= "--port=8080" #Portminionslistenon #KUBELET_PORT="--kubelet-port=10250" #Commaseparatedlistofnodesintheetcdcluster KUBE_ETCD_SERVERS= "--etcd-servers=http://etcd:2379" #Addressrangetouseforservices KUBE_SERVICE_ADDRESSES= "--service-cluster-ip-range=192.168.21.0/24" #defaultadmissioncontrolpolicies #KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota" KUBE_ADMISSION_CONTROL= "--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" #Addyourown! KUBE_API_ARGS= "" [root@k8s-master~] #cp/etc/kubernetes/config/etc/kubernetes/config.bak [root@k8s-master~] #vim/etc/kubernetes/config ### #kubernetessystemconfig # #Thefollowingvaluesareusedtoconfigurevariousaspectsofall #kubernetesservices,including # #kube-apiserver.service #kube-controller-manager.service #kube-scheduler.service #kubelet.service #kube-proxy.service #loggingtostderrmeanswegetitinthesystemdjournal KUBE_LOGTOSTDERR= "--logtostderr=true" #journalmessagelevel,0isdebug KUBE_LOG_LEVEL= "--v=0" #Shouldthisclusterbeallowedtorunprivilegeddockercontainers KUBE_ALLOW_PRIV= "--allow-privileged=false" #Howthecontroller-manager,scheduler,andproxyfindtheapiserver KUBE_MASTER= "--master=http://k8s-master:8080" 启动服务并设置开机自启动 [root@k8s-master~] #systemctlenablekube-apiserver.service [root@k8s-master~] #systemctlstartkube-apiserver.service [root@k8s-master~] #systemctlenablekube-controller-manager.service [root@k8s-master~] #systemctlstartkube-controller-manager.service [root@k8s-master~] #systemctlenablekube-scheduler.service [root@k8s-master~] #systemctlstartkube-scheduler.service 4)接着部署Node(在两台node节点机器上都要操作) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 1)安装docker [root@k8s-node-1~] #yuminstall-ydocker 配置Docker配置文件,使其允许从registry中拉取镜像 [root@k8s-node-1~] #vim/etc/sysconfig/docker#添加下面一行内容 ...... OPTIONS= '--insecure-registryregistry:5000' [root@k8s-node-1~] #systemctlstartdocker 2)安装kubernets [root@k8s-node-1~] #yuminstallkubernetes-y 配置并启动kubernetes 在kubernetesmaster上需要运行以下组件:Kubelet、KubernetsProxy [root@k8s-node-1~] #cp/etc/kubernetes/config/etc/kubernetes/config.bak [root@k8s-node-1~] #vim/etc/kubernetes/config ### #kubernetessystemconfig # #Thefollowingvaluesareusedtoconfigurevariousaspectsofall #kubernetesservices,including # #kube-apiserver.service #kube-controller-manager.service #kube-scheduler.service #kubelet.service #kube-proxy.service #loggingtostderrmeanswegetitinthesystemdjournal KUBE_LOGTOSTDERR= "--logtostderr=true" #journalmessagelevel,0isdebug KUBE_LOG_LEVEL= "--v=0" #Shouldthisclusterbeallowedtorunprivilegeddockercontainers KUBE_ALLOW_PRIV= "--allow-privileged=false" #Howthecontroller-manager,scheduler,andproxyfindtheapiserver KUBE_MASTER= "--master=http://k8s-master:8080" [root@k8s-node-1~] #cp/etc/kubernetes/kubelet/etc/kubernetes/kubelet.bak [root@k8s-node-1~] #vim/etc/kubernetes/kubelet ### #kuberneteskubelet(minion)config #Theaddressfortheinfoservertoserveon(setto0.0.0.0or""forallinterfaces) KUBELET_ADDRESS= "--address=0.0.0.0" #Theportfortheinfoservertoserveon #KUBELET_PORT="--port=10250" #Youmayleavethisblanktousetheactualhostname KUBELET_HOSTNAME= "--hostname-override=k8s-node-1" #特别注意这个,在另一个node2节点上,要改为k8s-node-2 #locationoftheapi-server KUBELET_API_SERVER= "--api-servers=http://k8s-master:8080" #podinfrastructurecontainer KUBELET_POD_INFRA_CONTAINER= "--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" #Addyourown! KUBELET_ARGS= "" 加速器配置(可选) [root@k8s-node-1~] #cat/etc/docker/daemon.json { "registry-mirrors" :[ "http://df98fb04.m.daocloud.io" ]} [root@k8s-node-1~] # 启动服务并设置开机自启动 [root@k8s-node-1~] #systemctlenablekubelet.service [root@k8s-node-1~] #systemctlstartkubelet.service [root@k8s-node-1~] #systemctlenablekube-proxy.service [root@k8s-node-1~] #systemctlstartkube-proxy.service 查看状态 1 2 3 4 5 6 7 8 [root@k8s-master~] #kubectl-shttp://k8s-master:8080getnode NAMESTATUSAGE k8s-node-1Ready29s k8s-node-2Ready28s [root@k8s-master~] #kubectlgetnodes NAMESTATUSAGE k8s-node-1Ready44s k8s-node-2Ready43s kubernetes常用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 查看node主机 [root@k8s-master~] #kubectlgetnode//有的环境是用monion,那么查看命令就是"kubectlgetminions" 查看pods清单 [root@k8s-master~] #kubectlgetpods 查看service清单 [root@k8s-master~] #kubectlgetservices//或者使用命令"kubectlgetservices-ojson" 查看replicationControllers清单 [root@k8s-master~] #kubectlgetreplicationControllers 删除所有pods(同理将下面命令中的pods换成services或replicationControllers,就是删除所有的services或replicationContronllers) [root@k8s-master~] #foriin`kubectlgetpod|tail-n+2|awk'{print$1}'`;dokubectldeletepod$i;done -------------------------------------------------------------------------- 除了上面那种查看方式,还可以通过Serverapi for REST方式(这个及时性更高) 查看kubernetes版本 [root@k8s-master~] #curl-s-Lhttp://10.10.172.202:8080/api/v1beta1/version|python-mjson.tool 查看pods清单 [root@k8s-master~] #curl-s-Lhttp://10.10.172.202:8080/api/v1beta1/pods|python-mjson.tool 查看replicationControllers清单 [root@k8s-master~] #curl-s-Lhttp://10.10.172.202:8080/api/v1beta1/replicationControllers|python-mjson.tool 查查看node主机(或者是minion主机,将下面命令中的node改成minion) [root@k8s-master~] #curl-s-Lhttp://10.10.172.202:8080/api/v1beta1/node|python-mjson.tool 查看service清单 [root@k8s-master~] #curl-s-Lhttp://10.10.172.202:8080/api/v1beta1/services|python-mjson.tool 温馨提示: 在新版Kubernetes中,所有的操作命令都整合至kubectl,包括kubecfg、kubectl.sh、kubecfg.sh等 5)创建覆盖网络——Flannel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 1)安装Flannel(在master、node上均执行如下命令,进行安装) [root@k8s-master~] #yuminstallflannel-y 2)配置Flannel(在master、node上均编辑 /etc/sysconfig/flanneld ) [root@k8s-master~] #cp/etc/sysconfig/flanneld/etc/sysconfig/flanneld.bak [root@k8s-master~] #vim/etc/sysconfig/flanneld #Flanneldconfigurationoptions #etcdurllocation.Pointthistotheserverwhereetcdruns FLANNEL_ETCD_ENDPOINTS= "http://etcd:2379" #etcdconfigkey.Thisistheconfigurationkeythatflannelqueries #Foraddressrangeassignment FLANNEL_ETCD_PREFIX= "/atomic.io/network" #Anyadditionaloptionsthatyouwanttopass #FLANNEL_OPTIONS="" 3)配置etcd中关于flannel的key(这个只在master上操作) Flannel使用Etcd进行配置,来保证多个Flannel实例之间的配置一致性,所以需要在etcd上进行如下配置:( '/atomic.io/network/config' 这个key与上文 /etc/sysconfig/flannel 中的配置项FLANNEL_ETCD_PREFIX是相对应的,错误的话启动就会出错) [root@k8s-master~] #etcdctlmk/atomic.io/network/config'{"Network":"10.10.0.0/16"}' { "Network" : "10.10.0.0/16" } 4)启动Flannel 启动Flannel之后,需要依次重启docker、kubernete。 在master执行: [root@k8s-master~] #systemctlenableflanneld.service [root@k8s-master~] #systemctlstartflanneld.service [root@k8s-master~] #servicedockerrestart [root@k8s-master~] #systemctlrestartkube-apiserver.service [root@k8s-master~] #systemctlrestartkube-controller-manager.service [root@k8s-master~] #systemctlrestartkube-scheduler.service 在node上执行: [root@k8s-node-1~] #systemctlenableflanneld.service [root@k8s-node-1~] #systemctlstartflanneld.service [root@k8s-node-1~] #servicedockerrestart [root@k8s-node-1~] #systemctlrestartkubelet.service [root@k8s-node-1~] #systemctlrestartkube-proxy.service 然后通过 ifconfig 命令查看maste和node节点,发现docker0网桥网络的ip已经是上面指定的10.10.0.0网段了。并且在master和node节点上创建的容器间都是可以相互通信的,能相互 ping 通! 在master上执行: [root@k8s-master~] #ifconfig docker0:flags=4099<UP,BROADCAST,MULTICAST>mtu1500 inet10.10.34.1netmask255.255.255.0broadcast0.0.0.0 ether02:42:e1:c2:b5:88txqueuelen0(Ethernet) RXpackets0bytes0(0.0B) RXerrors0dropped0overruns0frame0 TXpackets0bytes0(0.0B) TXerrors0dropped0overruns0carrier0collisions0 eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet10.10.172.202netmask255.255.255.0broadcast10.10.172.255 inet6fe80::250:56ff:fe86:6833prefixlen64scopeid0x20<link> ether00:50:56:86:68:33txqueuelen1000(Ethernet) RXpackets87982bytes126277968(120.4MiB) RXerrors0dropped40overruns0frame0 TXpackets47274bytes6240061(5.9MiB) TXerrors0dropped0overruns0carrier0collisions0 flannel0:flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>mtu1472 inet10.10.34.0netmask255.255.0.0destination10.10.34.0 unspec00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00txqueuelen500(UNSPEC) RXpackets0bytes0(0.0B) RXerrors0dropped0overruns0frame0 TXpackets0bytes0(0.0B) TXerrors0dropped0overruns0carrier0collisions0 lo:flags=73<UP,LOOPBACK,RUNNING>mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10<host> looptxqueuelen0(LocalLoopback) RXpackets91755bytes38359378(36.5MiB) RXerrors0dropped0overruns0frame0 TXpackets91755bytes38359378(36.5MiB) TXerrors0dropped0overruns0carrier0collisions0 [root@k8s-master~] # 在node上执行 [root@k8s-node-1~] #ifconfig docker0:flags=4099<UP,BROADCAST,MULTICAST>mtu1500 inet10.10.66.1netmask255.255.255.0broadcast0.0.0.0 ether02:42:2c:1d:19:14txqueuelen0(Ethernet) RXpackets0bytes0(0.0B) RXerrors0dropped0overruns0frame0 TXpackets0bytes0(0.0B) TXerrors0dropped0overruns0carrier0collisions0 eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet10.10.172.203netmask255.255.255.0broadcast10.10.172.255 inet6fe80::250:56ff:fe86:3ed8prefixlen64scopeid0x20<link> ether00:50:56:86:3e:d8txqueuelen1000(Ethernet) RXpackets69554bytes116340717(110.9MiB) RXerrors0dropped34overruns0frame0 TXpackets35925bytes2949594(2.8MiB) TXerrors0dropped0overruns0carrier0collisions0 flannel0:flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>mtu1472 inet10.10.66.0netmask255.255.0.0destination10.10.66.0 unspec00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00txqueuelen500(UNSPEC) RXpackets0bytes0(0.0B) RXerrors0dropped0overruns0frame0 TXpackets0bytes0(0.0B) TXerrors0dropped0overruns0carrier0collisions0 lo:flags=73<UP,LOOPBACK,RUNNING>mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10<host> looptxqueuelen0(LocalLoopback) RXpackets24bytes1856(1.8KiB) RXerrors0dropped0overruns0frame0 TXpackets24bytes1856(1.8KiB) TXerrors0dropped0overruns0carrier0collisions0 [root@k8s-node-1~] # [root@k8s-node-2~] #ifconfig docker0:flags=4099<UP,BROADCAST,MULTICAST>mtu1500 inet10.10.59.1netmask255.255.255.0broadcast0.0.0.0 ether02:42:08:8b:65:48txqueuelen0(Ethernet) RXpackets0bytes0(0.0B) RXerrors0dropped0overruns0frame0 TXpackets0bytes0(0.0B) TXerrors0dropped0overruns0carrier0collisions0 eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500 inet10.10.172.204netmask255.255.255.0broadcast10.10.172.255 inet6fe80::250:56ff:fe86:22d8prefixlen64scopeid0x20<link> ether00:50:56:86:22:d8txqueuelen1000(Ethernet) RXpackets69381bytes116036521(110.6MiB) RXerrors0dropped27overruns0frame0 TXpackets35545bytes2943130(2.8MiB) TXerrors0dropped0overruns0carrier0collisions0 flannel0:flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>mtu1472 inet10.10.59.0netmask255.255.0.0destination10.10.59.0 unspec00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00txqueuelen500(UNSPEC) RXpackets0bytes0(0.0B) RXerrors0dropped0overruns0frame0 TXpackets0bytes0(0.0B) TXerrors0dropped0overruns0carrier0collisions0 lo:flags=73<UP,LOOPBACK,RUNNING>mtu65536 inet127.0.0.1netmask255.0.0.0 inet6::1prefixlen128scopeid0x10<host> looptxqueuelen0(LocalLoopback) RXpackets24bytes1856(1.8KiB) RXerrors0dropped0overruns0frame0 TXpackets24bytes1856(1.8KiB) TXerrors0dropped0overruns0carrier0collisions0 [root@k8s-node-2~] # 6)部署nginx pod 和复制 “器” 以下面的图来安装一个简单的静态内容的nginx应用: 用复制“器”启动一个2个备份的nginx Pod,然后在前面挂Service,一个service只能被集群内部访问,一个能被集群外的节点访问。下面所有的命令都是在master管理节点上运行的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 1)首先部署nginxpod和复制“器”--------------------------------------------------------------------- [root@k8s-master~] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE docker.io /nginx latest3448f27c273f8daysago109.4MB 通过下面命令发现apiVersion版本是v1 [root@k8s-master~] #curl-s-Lhttp://10.10.172.202:8080/api/v1beta1/version|python-mjson.tool { "apiVersion" : "v1" , ....... } 开始创建pod单元 [root@k8s-master~] #mkdir-p/home/kubermange&&cd/home/kubermange [root@k8s-masterkubermange] #vimnginx-rc.yaml apiVersion:v1 kind:ReplicationController metadata: name:nginx-controller spec: replicas:2 #即2个备份 selector: name:nginx template: metadata: labels: name:nginx spec: containers: -name:nginx image:docker.io /nginx ports: -containerPort:80 [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080create-fnginx-rc.yaml replicationcontroller "nginx-controller" created 由于kubernetes要去gcr.io下载gcr.io /google_containers/pause 镜像,然后下载nginx镜像,所以所创建的Pod需要等待一些时间才能处于running状态。 然后查看pods清单 [root@k8s-masterkubermange] #kubectl-shttp://k8s-master:8080getpods NAMEREADYSTATUSRESTARTSAGE nginx-controller-3n1ct0 /1 ContainerCreating08s nginx-controller-4bnfn0 /1 ContainerCreating08s 可以使用describe命令查看pod所分到的节点: [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080describepodnginx-controller-3n1ct|more Name: nginx-controller-3n1ct Namespace: default Node: k8s-node-1 /10 .10.172.203 ....... 同理,查看另一个pod [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080describepodnginx-controller-4bnfn|more Name: nginx-controller-4bnfn Namespace: default Node: k8s-node-2 /10 .10.172.204 ....... 由上可以看出,这个复制“器”启动了两个Pod,分别运行在10.10.172.203和10.10.172.204这两个节点上了。到这两个节点上查看,发现已经有nginx应用容器创建了。 提醒:最好事先在node节点上执行命令yum install *rhsm*-y;然后执行命令dockerpullregistry.access.redhat.com /rhel7/pod-infrastructure :latest;最后执行命令kubectl-shttp: //10 .10.172.202:8080create-fnginx-rc.yaml来创建pod单元。 [root@k8s-node-1~] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE docker.io /nginx latest3f8a4339aadd12daysago108.5MB registry.access.redhat.com /rhel7/pod-infrastructure latest99965fb9842312weeksago208.6MB [root@k8s-node-1~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES e60877d9d5e4docker.io /nginx "nginx-g'daemonoff" 10minutesagoUp10minutesk8s_nginx.3d610115_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_6de59c2d cba61f9bda3bregistry.access.redhat.com /rhel7/pod-infrastructure :latest "/usr/bin/pod" 11minutesagoUp11minutesk8s_POD.a8590b41_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_e60a56ca [root@k8s-node-1~] #dockerinspecte60877d9d5e4|grep-iip "IpcMode" : "container:cba61f9bda3b9e68859098f16ae4c77c09189ace3b8dc4656b797f5dd7dcb615" , "LinkLocalIPv6Address" : "" , "LinkLocalIPv6PrefixLen" :0, "SecondaryIPAddresses" :null, "SecondaryIPv6Addresses" :null, "GlobalIPv6Address" : "" , "GlobalIPv6PrefixLen" :0, "IPAddress" : "" , "IPPrefixLen" :0, "IPv6Gateway" : "" , [root@k8s-node-1~] # [root@k8s-node-2~] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE docker.io /nginx latest3f8a4339aadd12daysago108.5MB registry.access.redhat.com /rhel7/pod-infrastructure latest99965fb9842312weeksago208.6MB [root@k8s-node-2~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 491df793c5d8docker.io /nginx "nginx-g'daemonoff" 12minutesagoUp12minutesk8s_nginx.3d610115_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_785ceefb 647bf56d61b8registry.access.redhat.com /rhel7/pod-infrastructure :latest "/usr/bin/pod" 12minutesagoUp12minutesk8s_POD.a8590b41_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_145d0863 [root@k8s-node-2~] #dockerinspect491df793c5d8|grep-iip "IpcMode" : "container:647bf56d61b8b46a01dbf422ab273a11aa36c6b38bce594d73bec1ac42068829" , "LinkLocalIPv6Address" : "" , "LinkLocalIPv6PrefixLen" :0, "SecondaryIPAddresses" :null, "SecondaryIPv6Addresses" :null, "GlobalIPv6Address" : "" , "GlobalIPv6PrefixLen" :0, "IPAddress" : "" , "IPPrefixLen" :0, "IPv6Gateway" : "" , [root@k8s-node-2~] # 2)部署节点内部可访问的nginxservice------------------------------------------------------------------------ Service的 type 有ClusterIP和NodePort之分,缺省是ClusterIP,这种类型的Service只能在集群内部访问。配置文件如下: [root@k8s-masterkubermange] #vimnginx-service-clusterip.yaml apiVersion:v1 kind:Service metadata: name:nginx-service-clusterip spec: ports: -port:8001 targetPort:80 protocol:TCP selector: name:nginx 然后执行下面的命令创建service: [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080create-fnginx-service-clusterip.yaml 或者 [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080create-f./nginx-service-clusterip.yaml service "nginx-service-clusterip" created [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080getservice NAMECLUSTER-IPEXTERNAL-IPPORT(S)AGE kubernetes192.168.21.1<none>443 /TCP 2d nginx-service-clusterip192.168.21.174<none>8001 /TCP 12s 验证service的可访问性(访问节点): 上面的输出告诉我们这个Service的ClusterIP是10.254.101.186,端口是8001。那么我们就来验证这个PortalNetIP的工作情况: ssh 登录到节点机上验证(可以提前做 ssh 无密码登录的信任关系,当然也可以不做,这样验证时要手动输入登录密码) [root@k8s-masterkubermange] #ssh10.10.172.203curl-s192.168.21.174:8001//或者直接到节点机上执行"curl-s192.168.21.174:8001" Theauthenticityofhost '10.10.172.203(10.10.172.203)' can'tbeestablished. ECDSAkeyfingerprintis66:41:1f:d2:77:b6:eb:ce:3f:a1:68:47:7e:14:ee:cb. Areyousureyouwantto continue connecting( yes /no )? yes Warning:Permanentlyadded '10.10.172.203' (ECDSA)tothelistofknownhosts. root@10.10.172.203'spassword: <!DOCTYPEhtml> <html> < head > <title>Welcometonginx!< /title > <style> body{ width:35em; margin:0auto; font-family:Tahoma,Verdana,Arial,sans-serif; } < /style > < /head > <body> <h1>Welcometonginx!< /h1 > <p>Ifyouseethispage,thenginxwebserverissuccessfullyinstalledand working.Furtherconfigurationisrequired.< /p > <p>Foronlinedocumentationandsupportpleasereferto <ahref= "http://nginx.org/" >nginx.org< /a >.<br/> Commercialsupportisavailableat <ahref= "http://nginx.com/" >nginx.com< /a >.< /p > <p><em>Thankyou for usingnginx.< /em >< /p > < /body > < /html > [root@k8s-masterkubermange] # 同理验证到另外一个节点机上的service的可访问性也是ok的 [root@k8s-masterkubermange] #ssh10.10.172.204curl-s192.168.21.174:8001 由此可见,从前面部署×××的部分可以知道nginxPod运行在10.10.172.203和10.10.172.204这两个节点上。 从这两个节点上访问我们的服务来体现ServiceClusterIP在所有集群节点的可到达性。 3)部署外部可访问的nginxservice------------------------------------------------------------------- 下面我们创建NodePort类型的Service,这种类型的Service在集群外部是可以访问。下表是本文用的配置文件: [root@k8s-masterkubermange] #vimnginx-service-nodeport.yaml apiVersion:v1 kind:Service metadata: name:nginx-service-nodeport spec: ports: -port:8000 targetPort:80 protocol:TCP type :NodePort selector: name:nginx 执行下面的命令创建service: [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080create-f./nginx-service-nodeport.yaml service "nginx-service-nodeport" created [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080getservice NAMECLUSTER-IPEXTERNAL-IPPORT(S)AGE kubernetes192.168.21.1<none>443 /TCP 2d nginx-service-clusterip192.168.21.174<none>8001 /TCP 27m nginx-service-nodeport192.168.21.140<nodes>8000:31099 /TCP 13s 使用下面的命令获得这个service的节点级别的端口: [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080describeservicenginx-service-nodeport2>/dev/null|grepNodePort Type: NodePort NodePort: < unset > 31099 /TCP 验证service的可访问性(访问节点): 上面的输出告诉我们这个Service的节点级别端口是31298。下面我们验证这个Service的工作情况: [root@k8s-masterkubermange] #curl10.10.172.203:31099 <!DOCTYPEhtml> <html> < head > <title>Welcometonginx!< /title > <style> body{ width:35em; margin:0auto; font-family:Tahoma,Verdana,Arial,sans-serif; } < /style > < /head > <body> <h1>Welcometonginx!< /h1 > <p>Ifyouseethispage,thenginxwebserverissuccessfullyinstalledand working.Furtherconfigurationisrequired.< /p > <p>Foronlinedocumentationandsupportpleasereferto <ahref= "http://nginx.org/" >nginx.org< /a >.<br/> Commercialsupportisavailableat <ahref= "http://nginx.com/" >nginx.com< /a >.< /p > <p><em>Thankyou for usingnginx.< /em >< /p > < /body > < /html > [root@k8s-masterkubermange] # 同理验证到另外一个节点机上的service的可访问性也是ok的 [root@k8s-masterkubermange] #curl10.10.172.204:31099 ---------------------------------------------------------- 登录另外两个节点机上,发现已经创建了nginx应用容器 [root@k8s-node-1~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES e60877d9d5e4docker.io /nginx "nginx-g'daemonoff" AboutanhouragoUpAboutanhourk8s_nginx.3d610115_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_6de59c2d cba61f9bda3bregistry.access.redhat.com /rhel7/pod-infrastructure :latest "/usr/bin/pod" AboutanhouragoUpAboutanhourk8s_POD.a8590b41_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_e60a56ca CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 491df793c5d8docker.io /nginx "nginx-g'daemonoff" AboutanhouragoUpAboutanhourk8s_nginx.3d610115_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_785ceefb 647bf56d61b8registry.access.redhat.com /rhel7/pod-infrastructure :latest "/usr/bin/pod" AboutanhouragoUpAboutanhourk8s_POD.a8590b41_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_145d0863 谷歌浏览器访问测试: -------------------------------------------------------------------------------------------------------------- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 1)可以扩容nginx应用容器,依次添加对应的应用容器的pod、service-clusterip、service-nodeport的yaml文件即可。 注意yaml文件中的name名。 2)当然也可以添加其他应用容器,比如tomcat,也是依次创建pod、service-clusterip、service-nodeport的yaml文件。 注意yaml文件中的name名和port端口不要重复 3)后面应用容器的集群环境完成后(外部可访问的端口是固定的),可以考虑做下master控制机的集群环境(即做etcd集群)。 可以在控制节点做负载均衡,还可以通过keepalived做高可用。 --------------------------------------------------------- 下面是tomcat应用容器创建实例中的3个yaml文件 [root@k8s-masterkubermange] #cattomcat-rc.yaml apiVersion:v1 kind:ReplicationController metadata: name:tomcat-controller spec: replicas:2 selector: name:tomcat template: metadata: labels: name:tomcat spec: containers: -name:tomcat image:docker.io /tomcat ports: -containerPort:8080 [root@k8s-masterkubermange] #cattomcat-service-clusterip.yaml apiVersion:v1 kind:Service metadata: name:tomcat-service-clusterip spec: ports: -port:8801 targetPort:8080 protocol:TCP selector: name:tomcat [root@k8s-masterkubermange] #cattomcat-service-nodeport.yaml apiVersion:v1 kind:Service metadata: name:tomcat-service-nodeport spec: ports: -port:8880 targetPort:8080 protocol:TCP type :NodePort selector: name:tomcat 查看外部可访问的tomcatservice的端口 [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080describeservicetomcat-service-nodeport2>/dev/null|grepNodePort Type:NodePort NodePort:< unset >32295 /TCP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 操作步骤如下: 1)首先部署nginxpod和复制“器” [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080create-ftomcat-rc.yaml [root@k8s-masterkubermange] #kubectl-shttp://k8s-master:8080getpods [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080describepodnginx-controller-*|more 2)部署节点内部可访问的nginxservice [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080create-ftomcat-service-clusterip.yaml [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080getservice 3)部署外部可访问的nginxservice [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080create-f./tomcat-service-nodeport.yaml [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080getservice [root@k8s-masterkubermange] #kubectl-shttp://10.10.172.202:8080describeservicetomcat-service-nodeport2>/dev/null|grepNodePort 谷歌浏览器访问测试: 到此为止,我们在每个节点上分别部署了nginx和tomcat容器。 总结:只需要node节点安装所有镜像即可,master节点不承担虚拟机docker安装可选。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [root@k8s-master~] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE docker.io /nginx latest3f8a4339aadd12daysago108.5MB [root@k8s-master~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES [root@k8s-master~] # [root@k8s-node-1~] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE docker.io /nginx latest3f8a4339aadd12daysago108.5MB docker.io /tomcat latest3dcfe809147d3weeksago557.4MB registry.access.redhat.com /rhel7/pod-infrastructure latest99965fb9842312weeksago208.6MB [root@k8s-node-1~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES a30873206f1adocker.io /tomcat "catalina.shrun" 23minutesagoUp23minutesk8s_tomcat.cdbc0245_tomcat-controller-9dm45_default_07397545-f448-11e7-a1bf-005056866833_d753af9d 967e614e667bregistry.access.redhat.com /rhel7/pod-infrastructure :latest "/usr/bin/pod" 25minutesagoUp25minutesk8s_POD.24f70ba9_tomcat-controller-9dm45_default_07397545-f448-11e7-a1bf-005056866833_46708437 e60877d9d5e4docker.io /nginx "nginx-g'daemonoff" 2hoursagoUp2hoursk8s_nginx.3d610115_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_6de59c2d cba61f9bda3bregistry.access.redhat.com /rhel7/pod-infrastructure :latest "/usr/bin/pod" 2hoursagoUp2hoursk8s_POD.a8590b41_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_e60a56ca [root@k8s-node-1~] # [root@k8s-node-2~] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE docker.io /nginx latest3f8a4339aadd12daysago108.5MB docker.io /tomcat latest3dcfe809147d3weeksago557.4MB registry.access.redhat.com /rhel7/pod-infrastructure latest99965fb9842312weeksago208.6MB [root@k8s-node-2~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 18b91f21a691docker.io /tomcat "catalina.shrun" 24minutesagoUp24minutesk8s_tomcat.cdbc0245_tomcat-controller-2b17b_default_07395f07-f448-11e7-a1bf-005056866833_de861f22 5bfe2ec09a0aregistry.access.redhat.com /rhel7/pod-infrastructure :latest "/usr/bin/pod" 25minutesagoUp25minutesk8s_POD.24f70ba9_tomcat-controller-2b17b_default_07395f07-f448-11e7-a1bf-005056866833_69dd72ef 491df793c5d8docker.io /nginx "nginx-g'daemonoff" 2hoursagoUp2hoursk8s_nginx.3d610115_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_785ceefb 647bf56d61b8registry.access.redhat.com /rhel7/pod-infrastructure :latest "/usr/bin/pod" 2hoursagoUp2hoursk8s_POD.a8590b41_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_145d0863 [root@k8s-node-2~] # 本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/2057388,如需转载请自行联系原作者

优秀的个人博客,低调大师

docker(2):安装docker管理工具rancher

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/51136562 未经博主允许不得转载。 博主地址是:http://blog.csdn.net/freewebsys 1,关于rancher rancher是一个docker的管理系统。http://rancher.com/ 相同类似的系统还有,http://shipyard-project.com/。 有管理界面的好处是,可以方便的查看有多少容器在运行,可以通过简单的界面点击,实现docker的功能。 同时也能够方便的检查系统的运行状况,资源消耗等。 类似于daoCloud和灵云雀等docker的容器服务。 安装的环境是在coreos系统上。 coreos安装参考之前写的博客: http://blog.csdn.net/freewebsys/article/details/51093850 2,下载安装 安装文档参考: http://docs.rancher.com/rancher/quick-start-guide/ 直接下载即可: docker pull rancher/server docker run -d --restart=always -p 8080:8080 rancher/server 镜像下载:一共775.9MB要用daoCLoud镜像下载。 rancher/server latest 26bce58807d1 2 weeks ago 775.9 MB 安装要求docker 1.9.1+,1G RAM 并且mysql max_connections setting > 150 这里先安装一个单机环境测试下。 启动非常慢。需要启动32个服务: 2016-04-12 12:50:01,529 INFO [main] [ConsoleStatus] [1/32] [0ms] [0ms] Loading bootstrap 2016-04-12 12:50:01,740 INFO [main] [ConsoleStatus] [2/32] [211ms] [211ms] Loading config-defaults 2016-04-12 12:50:10,398 INFO [main] [ConsoleStatus] [3/32] [8869ms] [8658ms] Loading system 2016-04-12 12:50:10,516 INFO [main] [ConsoleStatus] [4/32] [8987ms] [118ms] Loading defaults 2016-04-12 12:50:11,143 INFO [main] [ConsoleStatus] [5/32] [9614ms] [627ms] Loading types 2016-04-12 12:50:17,801 INFO [main] [ConsoleStatus] [6/32] [16272ms] [6657ms] Loading system-services 2016-04-12 12:50:18,261 INFO [main] [ConsoleStatus] [7/32] [16732ms] [460ms] Loading agent-server 2016-04-12 12:50:18,762 INFO [main] [ConsoleStatus] [8/32] [17233ms] [501ms] Loading allocator-server 2016-04-12 12:50:21,995 INFO [main] [ConsoleStatus] [9/32] [20466ms] [3232ms] Loading api-server 2016-04-12 12:50:25,014 INFO [main] [ConsoleStatus] [10/32] [23485ms] [3019ms] Loading iaas-api 2016-04-12 12:50:25,148 INFO [main] [ConsoleStatus] [11/32] [23619ms] [130ms] Loading archaius 2016-04-12 12:50:25,613 INFO [main] [ConsoleStatus] [12/32] [24084ms] [465ms] Loading core-model 2016-04-12 12:50:25,649 INFO [main] [ConsoleStatus] [13/32] [24120ms] [36ms] Loading core-object-defaults 2016-04-12 12:50:25,746 INFO [main] [ConsoleStatus] [14/32] [24217ms] [97ms] Loading encryption 2016-04-12 12:50:29,949 INFO [main] [ConsoleStatus] [15/32] [28420ms] [4201ms] Loading process 2016-04-12 12:50:30,021 INFO [main] [ConsoleStatus] [16/32] [28492ms] [71ms] Loading redis 2016-04-12 12:50:30,138 INFO [main] [ConsoleStatus] [17/32] [28609ms] [117ms] Starting bootstrap 2016-04-12 12:50:30,141 INFO [main] [ConsoleStatus] [18/32] [28612ms] [0ms] Starting config-defaults 2016-04-12 12:50:30,141 INFO [main] [ConsoleStatus] [19/32] [28612ms] [0ms] Starting system 2016-04-12 12:50:30,142 INFO [main] [ConsoleStatus] [20/32] [28613ms] [0ms] Starting defaults 2016-04-12 12:50:30,142 INFO [main] [ConsoleStatus] [21/32] [28613ms] [0ms] Starting types 2016-04-12 12:50:34,062 INFO [main] [ConsoleStatus] [22/32] [32533ms] [3920ms] Starting system-services 2016-04-12 12:50:34,063 INFO [main] [ConsoleStatus] [23/32] [32534ms] [1ms] Starting agent-server 2016-04-12 12:50:34,063 INFO [main] [ConsoleStatus] [24/32] [32534ms] [0ms] Starting allocator-server 2016-04-12 12:50:34,748 INFO [main] [ConsoleStatus] [25/32] [33219ms] [685ms] Starting api-server 2016-04-12 12:50:36,763 INFO [main] [ConsoleStatus] [26/32] [35234ms] [2015ms] Starting iaas-api 2016-04-12 12:50:36,774 INFO [main] [ConsoleStatus] [27/32] [35245ms] [2ms] Starting archaius 2016-04-12 12:50:36,774 INFO [main] [ConsoleStatus] [28/32] [35245ms] [0ms] Starting core-model 2016-04-12 12:50:36,774 INFO [main] [ConsoleStatus] [29/32] [35245ms] [0ms] Starting core-object-defaults 2016-04-12 12:50:36,775 INFO [main] [ConsoleStatus] [30/32] [35246ms] [1ms] Starting encryption 2016-04-12 12:50:36,791 INFO [main] [ConsoleStatus] [31/32] [35262ms] [16ms] Starting process 2016-04-12 12:50:36,794 INFO [main] [ConsoleStatus] [32/32] [35265ms] [1ms] Starting redis time="2016-04-12T12:50:36Z" level=info msg="Starting websocket proxy. Listening on [:8080], Proxying to cattle API at [localhost:8081], Monitoring parent pid [11]." 启动之后进入管理界面: 3,增加主机 首先创建一个host主机。测试就把本机当成一个主机吧。 一定要执行那个命令,执行完成之后就把本机当成一个客户端了。其实下载的rancher/agent ,并且把客户端注册上。 当然还支持其他主机。亚马逊,和ssh方式登录的主机。 继续漫长的等待,因为网速的问题,在国内搭建环境还是非常费力的,得赶紧学会创建私服。 然后执行命令就行了。但是但是,没有添加成功。 是因为coreos的原因么?? 4,容器 主机增加成功之后就可以增加一个容器了。 比如增加一个tomcat,这个太直观了,将docker的参数命令都写到界面上了,方便配置。 主机都没有添加成功,自然容器也没有 正常启动。 看日志: itioningInternalMessage=null, previousIds=null, data={}, time=Tue Apr 12 13:43:45 UTC 2016, listenerKey=null, transitioningProgress=null]] 2016-04-12 13:43:45,297 ERROR [a6949f7c-dc4e-46c9-9919-a44754211614:29] [instance:1] [instance.start->(InstanceStart)->instance.allocate] [] [ecutorService-3] [c.p.e.p.i.DefaultProcessInstanceImpl] Unknown exception io.cattle.platform.eventing.exception.EventExecutionException: Scheduling failed: No candidates available at io.cattle.platform.eventing.exception.EventExecutionException.fromEvent(EventExecutionException.java:53) ~[cattle-framework-eventing-0.5.0-SNAPSHOT.jar:na] at io.cattle.platform.eventing.impl.AbstractEventService.callSync(AbstractEventService.java:258) ~[cattle-framework-eventing-0.5.0-SNAPSHOT.jar:na] at io.cattle.platform.process.common.handler.EventBasedProcessHandler.handle(EventBasedProcessHandler.java:109) ~[cattle-iaas-logic-common-0.5.0-SNAPSHOT.jar:na] at io.cattle.platform.process.instance.InstanceAllocate.handle(InstanceAllocate.java:48) ~[cattle-iaas-logic-0.5.0-SNAPSHOT.jar:na] at io.cattle.platform.engine.process.impl.DefaultProcessInstanceImpl.runHandler(DefaultProcessInstanceImpl.java:446) [cattle-framework-engine-0.5.0-SNAPSHOT.jar:na] at io.cattle.platform.engine.process.impl.DefaultProcessInstanceImpl$4.execute(DefaultProcessInstanceImpl.java:393) [cattle-framework-engine-0.5.0-SNAPSHOT.jar:na] at io.cattle.platform.engine.process.impl.DefaultProcessInstanceImpl$4.execute(DefaultProcessInstanceImpl.java:387) [cattle-framework-engine-0.5.0-SNAPSHOT.jar:na] at io.cattle.platform.engine.idempotent.Idempotent.execute(Idempotent.java:42) [cattle-framework-engine-0.5.0-SNAPSHOT.jar:na] at io.cattle.platform.engine.process.impl.DefaultProcessInstanceImpl.runHandlers(DefaultProcessInstanceImpl.java:387) [cattle-framework-engine-0.5.0-SNAPSHOT.jar:na] at io.cattle.platform.engine.process.impl.DefaultProcessInstanceImpl.runLogic(DefaultProcessInstanceImpl.java:493) [cattle-framework-engine-0.5.0-SNAPSHOT.jar:na] at io.cattle.platform.engine.process.impl.DefaultProcessInstanceImpl.runWithProcessLock(DefaultProcessInstanceImpl.java:320) [cattle-framework-engine-0.5.0-SNAPSHOT.jar:na] 好吧,我还以为所有的服务都是用go写的呢,原来这个是java的服务呢,为啥内存消耗1G知道原因了。 5,总结 终于找到一个超级NB的docker管理系统,虽然系统还没有跑起来,但是雏形已经基本有了。 可以像大多数docker容器服务一样有强大的界面功能。 开发人员可以轻松的创建镜像,管理服务。 想了想,目前想可有可能是coreos的问题。明天换下centos7再试验下。 本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/51136562 未经博主允许不得转载。 博主地址是:http://blog.csdn.net/freewebsys 挺好的灵云雀还提供了一个视频讲解docker的地方。 http://www.alauda.cn/demo/

优秀的个人博客,低调大师

文献分享(xenium)--产后心脏的空间引导体内单细胞功能基因组学

数据构建:研究团队整合单核RNA测序(snRNA-seq)profiling与单细胞原位空间转录组成像,建立了产后心脏的高分辨率时空图谱。在产后第0天(P0)、P7、P14和P21收集全心脏,以捕获从增生期到成熟肥大期的发育转变。为了改善多核CMs的分割,研究团队将多模态细胞分割染色纳入Xenium工作流程。与基于核的分割相比,多模态分割显著提高了产后心脏中无核和多核细胞识别的准确性。

优秀的个人博客,低调大师

文献分享--肿瘤免疫微环境的重塑可预测免疫检查点抑制剂治疗反应

免疫检查点抑制剂(ICIs)已成为多种癌症的标准疗法,但仍有超过半数患者无应答或产生耐药。既往研究多聚焦于治疗前的“冷/热”肿瘤免疫表型,试图通过基线特征预测疗效,但效果有限。作者指出,ICI并非被动检测免疫状态,而是主动扰动微环境的干预措施,能重新激活淋巴细胞、改变髓系细胞群体。因此,应将TIME视为动态系统,而非静态属性。关键问题应转变为:治疗开始后,免疫生态系统如何演变?这种演变轨迹是否能预测疗效? 验证此假设需要治疗前后连续活检的纵向样本,但此前研究样本量小(10-20例),且跨研究整合困难。本研究通过构建大规模、跨癌种的纵向单细胞RNA测序(scRNA-seq)图谱,系统性解析TIME在ICI治疗过程中的重塑规律,并探索其与临床结局的关联。

优秀的个人博客,低调大师

全新 Rebebuca 重磅发布——快捷命令管理工具

核心特性 1. 智能任务发现 Rebebuca 能够自动扫描并导入你项目中已有的任务配置: 「VSCode tasks.json」- 直接复用你在 VS Code 中配置的任务 「npm/pnpm scripts」- 自动读取 package.json 中的脚本命令 「自定义任务」- 灵活添加任何你需要的命令 无需重复配置,「开箱即用」。 2. 现代化终端体验 内置完整功能的终端模拟器(基于 xterm.js): 真实 PTY 支持,与系统终端体验一致 多标签页设计,同时运行多个任务 支持 URL 点击跳转 拖拽文件自动输入路径 10,000 行滚动缓冲区 3. AI 智能助手 集成多个 AI 服务,用自然语言描述你的需求,自动生成命令配置: 「Ollama」- 本地部署,隐私安全 「OpenAI」- GPT-4 强大能力 「Anthropic」- Claude 系列模型 「DeepSeek」- 国产优质模型 只需说:"帮我创建一个运行 Go 测试并显示覆盖率的任务",AI 就能为你生成完整配置。 4. 端口管理器 再也不用lsof -i :3000了!内置端口管理功能: 一目了然查看所有监听端口 显示进程名称和 PID 一键终止进程 支持搜索过滤 5. 收藏与最近运行 「收藏夹」- 星标常用任务,支持拖拽排序 「最近运行」- 自动记录使用历史,支持按时间/频率排序 「执行日志」- 完整保存每次运行的输出 6. 深浅主题 精心设计的 UI,支持三种主题模式: 「深色主题」- 专业护眼,程序员首选 「浅色主题」- 清新明亮,白天使用 「跟随系统」- 自动切换,省心省力 为什么选择 Rebebuca? vs VS Code 内置任务 特性 Rebebuca VS Code 独立运行 ✅ 无需 IDE ❌ 需要打开 VS Code 启动速度 ✅ 秒开 ❌ 需要加载整个 IDE 资源占用 ✅ ~50MB 内存 ❌ 数百 MB 起步 端口管理 ✅ 内置 ❌ 无 AI 生成 ✅ 内置 ❌ 需要插件 vs 传统终端 特性 Rebebuca 终端 命令管理 ✅ 可视化界面 ❌ 手动记忆/脚本 历史追溯 ✅ 完整日志 ❌ 有限历史 多项目切换 ✅ 一键切换 ❌ cd 来 cd 去 任务发现 ✅ 自动扫描 ❌ 手动查看 技术优势 「Tauri + Rust」- 安装包仅 ~10MB,比 Electron 应用小 10 倍以上 「真正跨平台」- macOS(支持 Intel 和 Apple Silicon)、Windows、Linux 「开源免费」- GPL-3.0 协议,社区驱动 使用场景 前端开发者 📁 我的项目 ├── 🟢 dev - pnpm dev ├── 🔵 build - pnpm build ├── 🟡test- vitest run └── 🟣 lint - eslint --fix . 一键切换不同项目,秒速启动开发环境。 后端开发者 📁 后端服务 ├── 🟢 start - go run main.go ├── 🔵test- gotest-v ./... ├── 🟡 docker - docker compose up -d └── 🟣 migrate - goose up 告别复杂的启动脚本,所有命令一目了然。 DevOps 工程师 📁 运维任务 ├── 🟢 deploy - ./deploy.sh production ├── 🔵 logs - kubectl logs -f pod/xxx ├── 🟡 backup - ./backup-db.sh └── 🟣 monitor - htop 常用运维命令集中管理,提升工作效率。 快速开始 安装 从 GitHub Releases 下载适合你系统的安装包: 「macOS」:.dmg(Universal Binary,同时支持 Intel 和 Apple Silicon) 「Windows」:.exe或.msi 「Linux」:.AppImage或.deb

优秀的个人博客,低调大师

GaussDB轻量化运维管理工具介绍

前言 本期课程将从管理平台的架构出发,结合平台的实例管理、实例升级、容灾管理和监控告警的功能和操作介绍,全面覆盖日常运维操作,带您理解并熟练运用GaussDB运维平台完成运维工作。 一、GaussDB 运维管理平台简介 开放生态层 友好Web界面,多云皮肤个性化定制 丰富的原子API 公有云、合运营、HCSO、边缘云IES、HCS、轻量化、统一版本 基础+智能运维能力 丰富的基础运维能力 打造端到端全链路的智能自制运维平台,覆盖自监控、自诊断、自调优、自恢复和自安全全量功能,一键部署,精准实施; 标准化代理层 全方位多层安全防护,精细隔离设计 精准管理进程资源消耗控制,极少性能损耗 标准化南向接口规范各引警插件化接入原子操作 通过授权,登录到GaussDB运维管理平台,我们可以看到如下界面: 1、实例总览界面 2、实例详情页面 二、GaussDB 运维管理平台功能介绍 1、平台管理功能 作为管控平台,云数据库GaussDB管理平台具备完善的安全防护策略。主要是通过用户角色和用户组划分,细粒度的控制各个角色的访问执行权限,守护运维的安全。 基本功能: 1、管理用户(user):支持管理员对普通用户进行增加、删除、锁定、重置密码、用户和实例(Instance)、用户组的绑定等操作 2、管理用户组(user_group):可以将用户加入用户组中,针对整个用户组可以设置统一的角色,用户可以同时加到多个用户组中 3、角色管理(Role):可以自定义角色,增加对应的权限(permission),支持细粒度权限 4、管理活跃用户会话:可以查看当前登录中的用户,管理员可以结束会话 5、后台功能:提供鉴权、校验弱密码等接口,密码会校验规则和弱密码,加密后存入元库中。 2、实例管理功能 1、实例纳管 2、实例解除纳管 3、实例启停 4、实例扩容 5、实例升级管理 6、实例容灾管理 7、实例告警管理 8、实例巡检管理 三、GaussDB管理平台实例管理基本功能 1、纳管实例 数据库实例安装完成后,状态为Normal>则可以使用GaussDB管理平台将实例进行纳管。 纳管前需将实例主机录入主机管理中进行管理。 输入实例节点任意一个管理IP地址,点击检查实例节点,检查主机是否已经录入主机管理,主机状态在线则已经录入允许导入,主机状态离线则未录入,无法执行导入。 所有主机都在线后。输入实例名称,管理员用户名,管理员密码点击提交按钮下发纳管流程。 1.1 添加主机 1.2 纳管实例 2、取消纳管实例 GaussDB 运维管理平台可以取消纳管已经导入并纳管的数据库实例。 首先在主页上找到要取消纳管的实例 点击“更多”->“取消纳管” 页面弹出对话框进行管理员密码的输入 3、实例启停 GaussDB 运维管理平台支持对所纳管的数据库实例进行基本的启停操作,主要包括停止实例启动实例、重启实例等。 在主页找到需要管理的实例,点击“更多”–>“停止实例”来停止实例运行 对于已经停止运行的实例,点击“更多”–>“启动实例”来启动实例运行 也可以直接点击“更多”–>“重启实例”来快速对实例进行重启 4、实例卸载 GaussDB 运维管理平台支持对所纳管的数据库实例进行一键式卸载。 注:删除实例属于高危操作,需要输入“delete”进行二次确认。 GaussDB 运维管理平台可以一键式删除已经导入并纳管的数据库实例。 首先在主页上找到要删除的实例,然后点击“更多”->“删除实例”。 页面弹出对话框进行二次确认。 5、节点扩容 随着业务的增长,数据库在运行性能及存储上逐渐会达到瓶颈。此时,需要通过增加节点来提升实例的性能及存储能力。GaussDB支持节点扩容操作。扩容方案如下: 在线扩容主要分为加节点和数据重分布两个阶段,除切换元数据外均支持在线业务。 加节点阶段:主要完成新的CN/DN节点的安装、元信息同步、启动等操作。 数据重分布阶段:主要完成基线数据搬迁、增量数据搬迁(在线业务)、切换元数据等操作。 注:同步元信息的目的在于为后续数据重分布做准备 向新增的DN、CN节点同步元数据: 1、同步基础元信息:数据库、模式、表空间 2、同步普通元信息:用户表、函数 3、建立新的nodegroup(为扩容后的新集群) 4、元信息同步完成后切换installation group为新建nodegroup GaussDB 运维管理平台支持对所纳管的分布式数据库实例进行节点扩容。 “实例管理”界面,单击具体实例名称,进入“基本信息”界面。 在“数据库信息”模块的“节点数量”后,单击“添加”进入“节点扩容”页面。 选择节点数量和管理地址,管理地址数量需要与新增节点数量一致,管理地址可用区分布需要符合部署方案。 确认“实例扩容过程中会有锁表操作,可能会阻塞业务,属于高危操作。请选择在业务低峰期进行该操作。” 风险提示信息,并勾选“我已确认阅读上述风险提示”。 单击“下一步”进入“规格确认”界面。 确认无误后,单击“提交”,进行扩容。 数据库实例状态将显示为“添加节点中”,则说明扩容指令下发成功。 注意事项 扩容是指分片扩容,扩容的节点仅包含CN、DN,不含有其他组件。 扩容以节点组为单位,扩容节点的组件分布形态与扩容前实例分布规律相同。 主备版部署模式暂时不支持扩容。 存在故障节点的实例不允许扩容。 实例扩容过程中会有锁表操作,可能会阻塞业务,属于高危操作。请选择在业务低峰期进行该操作。 扩容前,需要满足所有DN节点剩余可用空间大于DN节点的最大单表空间。 四、GaussDB管理平台实例升级功能 1、GaussDB升级方式 升级过程涉及系统表和数据表变更,重启进程,有版本兼容风险和业务中断问题,根据升级方式,业务中断时间,风险评估对比如下: 大小版本升级方式比较 2、就地升级 找到需要升级的实例点击更多进行版本升级 版本升级选择就地升级方式 选择对应的目标版本 3、灰度升级 灰度升级分为两种方式: 1、升级自动提交方式:所有节点一起升级,在升级过程中有大概10秒的业务中断 2、升级待观察后提交方式:将数据库升级过程细分为升级待观察和升级提交两个阶段 升级待观察阶段 升级待观察阶段可以按照AZ升级,也可以对升级的AZ进行回滚,所有AZ升级完成后可以对实例进行业务测试 升级提交阶段 提交当前的升级,提交后不可回滚 3.1 灰度升级-升级自动提交 在实例管理主页找到需要升级的实例点击“版本升级”。 在弹窗中选择升级自动提交的操作方式和目标版本进行升级。 3.2 灰度升级-升级待观察阶段 灰度升级选择升级待观察 选择升级可用区中AZ进行升级 选择目标版本进行升级 3.3 灰度升级-升级待提交阶段 升级完所有可用区的AZ之后,选择提交升级,对实例进行真正的升级 观察阶段发现升级的版本有问题,可以选择升级回退 五、GaussDB 运维管理平台实例容灾管理 GaussDB 运维管理平台流式容灾管理的主要功能: 容灾搭建 容灾状态查看 容灾倒换 灾备升主 容灾解除 容灾演练(规划中) 容灾快速加回(规划中) 流式容灾:基于流复制的容灾解决方案 1、容灾搭建 主数据库实例配置灾备数据库实例信息,等待灾备数据库实例连接过来进行全量复制 灾备数据库实例完成全量build之后,将与主数据库实例建立流式复制进行日志的增量复制 2、容灾状态查看 在容灾管理界面,可以查看到已经创建好的容灾关系组,并支持对容灾实例进行容灾倒换、灾备升主、容灾解除等操作。 如上图,在容灾详情页面,可以查看容灾基本信息,容灾RTO、RPO数值,以及灾备状态指标;灾备实例分片日志差距、灾备实例分片日志落盘速率、灾备实例分片待回放日志量、灾备实例分片日志回放速率。 3、容灾倒换 可以通过容灾倒换,将容灾关系中主备实例角色互换,原来的主变为备实例,原来的备变为主实例 容灾倒换命令不会解除容灾关系 4、灾备升主 可以通过灾备升主,将容灾备实例提升为一个包含主DN的实例,使其可以对外提供服务,升主成功后,之前的容灾关系将失效。 5、容灾解除 容灾解除,是使得主实例清除维护的对端容灾信息。 清除后,主实例可以重新建立新的容灾关系。 6、容灾演练 1.准备两个正常的实例 2.创建两个实例的容灾关系 3.主实例发生严重故障 4.对备实例进行升主,对外提供服务 5.对主实例进行维修,然后执行容灾解除 6.重新搭建容灾关系 7.进行容灾倒换,恢复初始的容灾关系 六、GaussDB管理平台实例监控告警 1、告警统计 实时告警与历史告警: 告警基本信息:告警id,告警名称,告警类型,告警状态类型、告警实例 告警表现:告警时间、告警级别、告警描述、告警持续时间、告警节点IP、通知状态 告警数据分析:告警可能原因、影响、优化建议 2、告警管理 告警模板管理:默认模板包括默认文本模板以及默认JSON模板 3、监控大盘 列表看板: 通过将实例进行平铺展示的方式,横向对比各个实例的基本指标信息,包括CPU使用率、内存使用率等。 趋势看板: 展示单个实例的全方位详细监控指标。 指标范围包括:CPU/内存、磁盘/存储、网络、连接、业务负载锁、同步状态、进程资源等。 希望本节课程对大家对GaussDB运维管理平台的工具有所了解,欢迎大家共同学习交流。

优秀的个人博客,低调大师

Solon 的事务管理工具类(TranUtils)

Solon 在编码上,是强调注解与手写并重的一个风格。它有个@Tran注解,用于事务管理(可以参考:《事务的全局控制及应用》)。这里,主要是讲讲它的手动处理工具类TranUtils。 1、看看它的接口: public final class TranUtils { //执行事务 public static void execute(Tran tran, RunnableEx runnable) throws Throwable; //是否在事务中 public static boolean inTrans(); //是否在事务中且只读 public static boolean inTransAndReadOnly(); //监听事务 public static void listen(TranListener listener) throws IllegalStateException; //获取链接 public static Connection getConnection(DataSource ds) throws SQLException; //获取链接代理(方便,用于第三方框架事务对接) public static Connection getConnectionProxy(DataSource ds) throws SQLException; } 2、那怎么用它呢? 用它判断当前是否在事务中? if(TranUtils.inTrans()){ //正在事务中喽... } 做一个手动的事务控制(与@Tran注解等同效果) @Component public class UserService{ //@Tran(policy=TranPolicy.requires_new) public void addUser(UserModel user) throws Throwable{ TranUtils.execute(new TranAnno().policy(TranPolicy.requires_new), ()->{ //... }); } } @Controller public class DemoController{ @Inject UserService userService; //父回滚,子不回滚 // //@Tran @Mapping("/user/add2") pubblic void addUser2(UserModel user){ TranUtils.execute(new TranAnno(), ()->{ userService.addUser(user); throw new RuntimeException("不让你加;但还是加了:("); }); } } 用它与 dbvisitor (或者别的第三方框架)做事务托管对接 public class SolonManagedDynamicConnection implements DynamicConnection { private DataSource ds; public SolonManagedDynamicConnection(DataSource ds) { this.ds = ds; } @Override public Connection getConnection() throws SQLException { return TranUtils.getConnectionProxy(ds); } @Override public void releaseConnection(Connection conn) throws SQLException { conn.close(); } } 3、TranUtils 是个麻雀工具 麻雀虽然,五脏具全。还可以在运行时,动态添加事务监听哦。先看看事务监听器接口: public interface TranListener { //顺序位 default int getIndex(); //提交之前(可以出异常触发回滚) default void beforeCommit(boolean readOnly) throws Throwable; //完成之前 default void beforeCompletion(); //提交之后 default void afterCommit(); //完成之后 default void afterCompletion(int status); } 然后,我们试着做一个事务监听: @Component public class UserService { @Inject UserDao userDao; //添加并使用事务 @Tran public void addUserAndTran(User user){ userDao.add(user); onUserAdd(); //这里明确知道有事务 TranUtils.listen(new TranListener() { @Override public void afterCompletion(int status) { System.err.println("---afterCompletion: " + status); } }); } //添加(不使用事务) public vod addUser(User user){ userDao.add(user); onUserAdd(); } private void onUserAdd(){ //这里不确定是否有事务,先判断下 if(TranUtils.inTrans()){ TranUtils.listen(new TranListener() { @Override public void afterCompletion(int status) { System.err.println("---afterCompletion: " + status); } }); } } }

优秀的个人博客,低调大师

Flatseal 2.0 发布,Flatpak 应用权限管理工具

Flatseal 是一个图形实用工具,用于查看和修改Flatpak应用程序的权限,这个方法比通过命令行修改权限更加容易。Flatseal 列出了所有已安装的 Flatpak 应用程序。当选择一个应用时,可以看到所有权限,并对应用权限进行启用 / 禁用。 Flatseal 在 Flathub 上已经达到 800,000 的下载量。 Flatseal 2.0 将用户界面移植到 GTK 4 和 Libadwaita,改进了视觉效果 修正了在 GNOME Software 不可用时重新启用显示细节按钮。 修正了部分语言的翻译 修正了其他文件部分的验证,例如,允许尾部的斜线 为 XDG 路径建议添加了弹出窗口 增加了应用程序的打字搜索 为了稳定起见,改用了 GNOME 44 运行时 待更新: 还有一些改进和新的功能目前正在开发,暂时没有发布,例如:检测应用程序何时被安装、移除或更新、允许用户重新加载应用程序列表等 更多详情可查看:https://flathub.org/apps/com.github.tchx84.Flatseal

优秀的个人博客,低调大师

digiKam 8.0 发布,KDE 数字相片管理工具

digiKam 是 KDE 桌面环境的影像管理和编辑程序,支持所有主要图像格式,并可以组织目录为基础的照片收藏,或按日期、时间、或标签的动态相册。用户还可以对图像添加标题和注释,搜索他们和透过智能文件夹保存搜索。添加插件还可以输出到 Flickr 的相册、Gallery2、谷歌地球的 KML 文件、Simpleviewer、刻录成光盘或创建 Web 画廊。 近日,digiKam 8.0 正式发布,本次更新的部分内容如下: 新功能: 常规: 移植代码到 Qt6 框架(代码仍与 Qt5 API 兼容) 添加 JPEG-XL、WEBP 和 AVIF 导出设置 在从相机导入时,增加转换为无损的 JPEG-XL、WEBP 和 AVIF 在批量队列管理器中添加 JPEG-XL、WEBP 和 AVIF 转换器 使用 KF5::Sonnet 组件在标题文本小部件中增加拼写检查支持 在 digiKam 和 Showfoto 的 Setup/Misc 中添加拼写检查配置面板 为替代语言文本编辑器小部件添加在线翻译支持 在文本编辑小部件中增加设置以列出首选的替代/翻译语言 允许在任何地方使用全局或定制的图像质量排序设置 增加新的工具,对扫描的文本进行 OCR 版本管理: 支持 JPEG-XL、HEIF、WEBP 和 AVIF 作为无损图像格式,以便在编辑器中存储不同版本的图像。 可用性: 如果主菜单被隐藏,在工具栏中添加汉堡菜单 元数据: 增加新的选项,用 ExifTool 后端写元数据到文件 对 DNG 和 RAW 文件的可选写元数据操作现在总是委托给 ExifTool 后端 优化元数据编辑插件的布局,使其具有更好的可用性 在 Avanced Metadata Settings Pannel 中添加新的选项来保存和加载配置文件。 重命名: 使用选项 [c]或 [c,step] 在序列号中增加增量文件计数器 用选项 [r] 增加随机文本序列号 用 {unique:n,c} 为唯一修改器增加可配置的第一个字符 搜索: 增加按人物面部区域数量搜索项目 增加对没有人物脸部区域的项目的搜索 收藏 增加对跨平台网络路径的支持 数据库 增加对 SQLite WAL(Write-Ahead-Logging)模式的支持 …… 更多详情可查看:https://invent.kde.org/graphics/digikam/-/blob/v8.0.0/NEWS

优秀的个人博客,低调大师

digiKam 7.10 发布,KDE 数字相片管理工具

digiKam 是 KDE 桌面环境的影像管理和编辑程序,支持所有主要图像格式,并可以组织目录为基础的照片收藏,或按日期、时间、或标签的动态相册。用户还可以对图像添加标题和注释,搜索他们和透过智能文件夹保存搜索。添加插件还可以输出到 Flickr 的相册、Gallery2、谷歌地球的 KML 文件、Simpleviewer、刻录成光盘或创建 Web 画廊。 近日,digiKam 7.10 正式发布,本次更新添加了对新相机的支持,包括 Canon EOS R3、Canon EOS R7、Canon EOS R10、Fujifilm X-H2S、Fujifilm X-T30 II、OM System OM- 1、徕卡 M11、索尼 A7-IV。 此版本还增加了对新格式的支持,包括 Phase One/Leaf IIQ-S v2 格式、佳能 CR3 胶卷/原始连拍格式以及佳能 CRM 电影格式。 digiKam 7.10 还改进了对 DXO 标签的支持,增加了对新在线文档的支持,改进了内部垃圾行为,改进了导入工具中的取消按钮,改进了相似性搜索设置管理,更新了国际化,并解决了崩溃问题最后一个 OpenCV 4.7.0 版本。 此版本基于 KDE Frameworks 5.102 和 Qt 5.15.8 LTS,还包括 ExifTool 12.57 和 libjasper 4.0.0,它们提供了重要的稳定性改进和错误修复,使 digiKam 在管理照片库时更加可靠。 查看发行说明了解更多详情。

优秀的个人博客,低调大师

digiKam 7.9 发布,KDE 数字相片管理工具

digiKam 是 KDE 桌面环境的影像管理和编辑程序,支持所有主要图像格式,并可以组织目录为基础的照片收藏,或按日期、时间、或标签的动态相册。用户还可以对图像添加标题和注释,搜索他们和透过智能文件夹保存搜索。添加插件还可以输出到 Flickr 的相册、Gallery2、谷歌地球的 KML 文件、Simpleviewer、刻录成光盘或创建 Web 画廊。 近日,digiKam 7.9 正式发布,本次更新的部分内容如下: 新功能: IconView:增加对灰度和 16-bits PSD 图像的支持 AppImage 移植到 Qt5 5.15.5 所有捆绑软件都移植到 KF5 5.96 常规:HIF 文件被识别为 HEIF 图像 常规:Libraw 更新至 2022-07-14 快照 支持相机格式: 支持 Phase One/Leaf IIQ-S v2 佳能 CR3 filmrolls/RawBurst 佳能 CRM 文件 支持相机: 佳能 EOS R3、R7 和 R10 富士 X-H2S,X-T30 II 徕卡 M11 索尼 A7-IV (ILCE-7M4) DJI Mavic 3 尼康 Z9 插件:GMicQt 工具更新到最新的 3.1 版本 错误修复: Appimage 无法在 Fedora 36 中启动 MacOS 改为 macOS 文件传输终止导致 0 字节的文件被传输到目标位置,与此同时文件被从源头删除 不显示 PSD 16-bit 图像 macOS 上的黑暗模式支持 在 macOS 10.14 上打开任何文件夹都会出现崩溃 在相册之间一次移动超过 30 到 40 张图片后,缩略图中的元数据丢失 在许多元素上使用标签的剪切和粘贴操作会产生一个意外的结果 digiKam 在选择多个文件并进行批处理时崩溃 文档中的文字不清楚 缩略图在图像重命名时消失,只有在选择或鼠标移动时才重新出现 …… 更多详情可查看:https://invent.kde.org/graphics/digikam/-/blob/master/project/NEWS.7.9.0

优秀的个人博客,低调大师

digiKam 7.8.0 发布,KDE 数字相片管理工具

digiKam 是 KDE 桌面环境的影像管理和编辑程序,支持所有主要图像格式,并可以组织目录为基础的照片收藏,或按日期、时间、或标签的动态相册。用户还可以对图像添加标题和注释,搜索他们和透过智能文件夹保存搜索。添加插件还可以输出到 Flickr 的相册、Gallery2、谷歌地球的 KML 文件、Simpleviewer、刻录成光盘或创建 Web 画廊。 digiKam 7.8 已正式发布,本次更新的部分内容如下: AppImage bundle 中使用的 Qt 5.15 LTS KDE 框架和 Libraw 的更新。KDE 框架已更新至最新的 5.96 版本,包括大量错误修复。基于 Libraw 源代码的内部 RAW 处理器已更新到最新快照 2022-07-14。此版本现在支持超过 1199 种不同的 RAW 相机。此版本支持的新相机列表如下: Canon EOS R3, R7 and R10 Fujifilm X-H2S, X-T30 II Olympus System OM-1 Leica M11 Sony A7-IV DJI Mavic 3 Nikon Z9 维护和改进。这个新版本包含 51 个在 bugzilla 中分类和关闭的文件。在此版本中,HIF images 现在被识别为 modern HEIF,并且 GMicQt 工具也已更新到最新的 3.1 版本。其他改进包括特定条件下的崩溃修复、回归用例修复、添加灰度和 16 位 PSD 图像支持。 应用程序国际化也已更新,现在为图形界面提出了 57 种不同的语言。 公告指出,8.0.0 版本计划在几周内发布 。根据 8.0.0 源代码的结果,开发团队表示他们会在必要时用一个新的 7.9.0 版本来维护 7.x 系列以进行一些错误修复。8.0.0 被移植到新的 Qt6 框架,它仍然与 Qt5 兼容。此外,使用神经网络研究图像质量分析和使用 Tesseract 对图像执行 OCR 的新插件等内容也计划将很快集成到 8.0.0。 更多详情可查看官方公告。

优秀的个人博客,低调大师

digiKam 7.7 发布,KDE 数字相片管理工具

digiKam 是 KDE 桌面环境的影像管理和编辑程序,支持所有主要图像格式,并可以组织目录为基础的照片收藏,或按日期、时间、或标签的动态相册。用户还可以对图像添加标题和注释,搜索他们和透过智能文件夹保存搜索。添加插件还可以输出到 Flickr 的相册、Gallery2、谷歌地球的 KML 文件、Simpleviewer、刻录成光盘或创建 Web 画廊。 近日,digiKam 7.7 正式发布,本次更新的部分内容如下: 新功能 常规:从核心中移除内部的 libheif 和 libde265,以利于系统库的使用 常规:更新内部 Libraw snashot 至 2022-06-17,支持 Olympus OM-1 在所有捆绑包(AppImage、macOS 和 Windows)中添加 JpegXL 支持(读/写) 在所有捆绑包(AppImage、macOS 和 Windows)中添加 AVIF/AOM 支持(读/写) 所有捆绑包使用 KF5 框架 5.95 版本 macOS 软件包使用 Qt 框架 5.15.3 版本 错误修复 当编辑一个组的标题时,digiKam 不会警告可能的信息丢失 撤销/恢复后保存动作的禁用状态不一致 空的相册显示数据库查询没有返回结果的通知信息 对话框中的信息不正确 修复了无法启动 digiKam 的问题 当在 DNG 文件中改变图像方向为纵向时,该改变似乎没有被写入文件元数据中 修复 digiKam 启动时挂起的问题 digiKam 在 *.svg 文件中含有系统未安装的字体时崩溃 修复 digiKam 导入照片后崩溃 修复 digiKam 在升级到 Ubuntu 22.04 后无法工作的问题 更多详情可查看:https://invent.kde.org/graphics/digikam/-/blob/master/project/NEWS.7.7.0

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册