关于kubernetes:日志系统设计和实践1Kubernetes下EFK日志系统搭建ECK方式

前言随着生产环境局部服务曾经切换至Kubernetes,最近的工作都围绕着周边基础设施来进行,最先思考到的就是架构可观测性的欠缺,包含了日志零碎和监控零碎,相比之下我感觉日志零碎更为迫切些。 对于日志这个事件其实可大可小,所有取决于利用的规模,日志的重要度以及复杂度会随着规模的变大而直线回升。日系零碎蕴含的货色其实很多,一方面蕴含日志根底设置的建设,更重要的在于日志的标准的制订和体系的建设。这次除了须要搭建Kubernetes下的日志平台,还想趁着这次机会梳理一下与日志相干的方方面面,来建设较为欠缺的日志体系。 基于开源的日志计划首选就是ELK,未引入容器化之前咱们采纳的也是ELK + Filebeat,全副基于文件采集的形式,那么这次日志环境搭建的思路就是正确的把这套日志计划移入Kubernetes环境,当然基于EFK(Elasticsearch、Fluentd、Kibana)的计划也是 Kubernetes 官网比拟举荐的一种计划。 包含: 利用FileBeats、Fluentd等采集Agent实现容器上的数据对立收集。(Fluentd因为性能、与Kubernetes的无缝集成以及是CNCF会员我的项目等起因代替了Logstash)。采集的数据能够对接ElasticSearch来做实时的查问检索。数据的可视化能够应用grafana、kibana等罕用的可视化组件。以咱们目前的日志要求以及量级,以上计划就足够了,至于定制化的数据荡涤,实时或者离线的数据分析,这些作为后续扩大的储备。 Kubernetes下日志特点在 Kubernetes 中,日志采集相比传统虚拟机、物理机形式要简单很多,最基本的起因是 Kubernetes 把底层异样屏蔽,提供更加细粒度的资源调度,向上提供稳固、动静的环境。因而日志采集面对的是更加丰盛、动静的环境,须要思考的点也更加的多。 日志的模式变得更加简单,不仅有物理机/虚拟机上的日志,还有容器的规范输入、容器内的文件、容器事件、Kubernetes 事件等等信息须要采集。环境的动态性变强,在 Kubernetes 中,机器的宕机、下线、上线、Pod销毁、扩容/缩容等都是常态,这种状况下日志的存在是刹时的(例如如果 Pod 销毁后该 Pod 日志就不可见了),所以日志数据必须实时采集到服务端。同时还须要保障日志的采集可能适应这种动态性极强的场景;日志的品种变多,一个申请从客户端须要通过 CDN、Ingress、Service Mesh、Pod 等多个组件,波及多种基础设施,其中的日志品种减少了很多,例如 K8s 各种零碎组件日志、审计日志、ServiceMesh 日志、Ingress 等;采集形式日志的采集形式次要分为被动和被动,被动推送包含业务直写和DockerEngine 推送两种形式,前者在利用中集成日志sdk,和利用强绑定,后者太依赖容器运行时,灵活性也不够,这里都不做思考。 至于被动形式,次要依附在节点上运行日志Agent,通过轮训形式(阿里的logtail貌似是事件告诉形式)采集节点日志。在Kubernetes环境下,也有两种形式: DaemonSet 形式在每个 node 节点上只运行一个日志 agent,采集这个节点上所有的日志。DaemonSet 绝对资源占用要小很多,但扩展性、租户隔离性受限,比拟实用于性能繁多或业务不是很多的集群;Sidecar 形式为每个 POD 独自部署日志 agent,这个 agent 只负责一个业务利用的日志采集。Sidecar 绝对资源占用较多,但灵活性以及多租户隔离性较强,倡议大型的 K8s 集群或作为 PaaS 平台为多个业务方服务的集群应用该形式。网上找的一个比照表格,在这贴一下: DockerEngine业务直写DaemonSet形式Sidecar形式 采集日志类型规范输入业务日志规范输入+局部文件文件部署运维低,原生反对低,只需保护好配置文件即可个别,需保护DaemonSet较高,每个须要采集日志的POD都须要部署sidecar容器日志分类存储无奈实现业务独立配置个别,可通过容器/门路等映射每个POD可独自配置,灵活性高多租户隔离弱弱,日志直写会和业务逻辑竞争资源个别,只能通过配置间隔离强,通过容器进行隔离,可独自分配资源反对集群规模本地存储无限度,若应用syslog、fluentd会有单点限度无限度取决于配置数无限度资源占用低,docker engine提供整体最低,省去采集开销较低,每个节点运行一个容器较高,每个POD运行一个容器 查问便捷性低,只能grep原始日志高,可依据业务特点进行定制较高,可进行自定义的查问、统计高,可依据业务特点进行定制可定制性低高,可自在扩大低高,每个POD独自配置耦合度高,与DockerEngine强绑定,批改须要重启DockerEngine高,采集模块批改/降级须要从新公布业务低,Agent可独立降级个别,默认采集Agent降级对应Sidecar业务也会重启(有一些扩大包能够反对Sidecar热降级)实用场景测试、POC等非生产场景对性能要求极高的场景日志分类明确、性能较繁多的集群大型、混合型、PAAS型集群通过比照后,DaemonSet形式最适宜目前的状况。 日志输入形式和虚拟机/物理机不同,K8s 的容器提供规范输入和文件两种形式。在容器中,规范输入将日志间接输入到 stdout 或 stderr,而 DockerEngine 接管 stdout 和 stderr 文件描述符,将日志接管后依照 DockerEngine 配置的 LogDriver 规定进行解决;日志打印到文件的形式和虚拟机/物理机根本相似,只是日志能够应用不同的存储形式,例如默认存储、EmptyDir、HostVolume、NFS 等。 ...

June 7, 2021 · 9 min · jiezi

关于kubernetes:记一次Kubernetes部署应用过程

前言前文曾经部署了高可用的Kubernetes集群以及Rancher集群,这两天正好须要提前部署seata-server,推敲着正好趁这个危险不大的机会试验一下Kubernetes,特此记录下。 架构形容在正式部署之前,我有必要形容下现有架构的现状。现有架构次要是基于SpringCloud框架搭建的微服务体系,配置核心和服务注册核心应用的都是阿里的Nacos组件。 从架构转型角度来说,全面切换至Kubernetes为根底的微服务体系必定不够事实,从现有支流的计划来说,个别是应用Kubernetes做根底措施,利用其做服务编排调度,软件层面还是基于SpringCloud的开发方式,这也是比拟事实的逐渐切换的计划。 那么目前就架构来说,seata-server会部署在Kuberetes上治理,seata客户端利用应用Docker容器部署,Nacos服务是二进制形式物理装置。seata-server因为没有治理后盾,所以并不需要对外裸露服务,只须要seata客户端利用可能进行服务间调用即可。 部署过程本次过程形容重点并不是怎么部署能力使seata-server可能应用,而是通过Kubernetes部署利用的过程。 Seata官网文档反对Kubernetes的部署形式,并提供了YAML格局的资源文件(因为应用了Nacos形式,应用了自定义文件): apiVersion: apps/v1kind: Deploymentmetadata: name: seata-server namespace: default labels: k8s-app: seata-serverspec: replicas: 1 selector: matchLabels: k8s-app: seata-server template: metadata: labels: k8s-app: seata-server spec: containers: - name: seata-server image: docker.io/seataio/seata-server:latest imagePullPolicy: IfNotPresent env: - name: SEATA_CONFIG_NAME value: file:/root/seata-config/registry ports: - name: http containerPort: 8091 protocol: TCP volumeMounts: - name: seata-config mountPath: /root/seata-config volumes: - name: seata-config configMap: name: seata-server-config---apiVersion: v1kind: ConfigMapmetadata: name: seata-server-configdata: registry.conf: | registry { type = "nacos" nacos { application = "seata-server" #依据须要配置nacos信息 serverAddr = "192.168.199.2" } } config { type = "nacos" nacos { serverAddr = "192.168.199.2" group = "SEATA_GROUP" } }能够通过以下命令提交资源: ...

June 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes高可用集群的管理

有心人可能会发现后面的高可用计划部署实现后的节点截图: Master节点和Node节点的版本不统一,这也牵引出本文的目标,如何简略治理保护一套集群环境,首先当然包含:集群的降级和集群节点的伸缩。 集群版本升级官网文档地址,不同版本间降级可能会存在差别,本文针对1.19.x降级至1.20.x版本。 降级流程降级工作的根本流程如下: 降级主控制立体节点降级其余管制立体节点降级工作节点注意事项上面是官网对于集群降级的须知: 务必仔细认真浏览发行阐明。集群应应用动态的管制立体和 etcd Pod 或者内部 etcd。务必备份所有重要组件,例如存储在数据库中利用层面的状态。 kubeadm upgrade 不会影响你的工作负载,只会波及 Kubernetes 外部的组件,但备份究竟是好的。必须禁用替换分区附加信息在对 kubelet 作次版本升级时须要凌空节点。 对于管制面节点,其上可能运行着 CoreDNS Pods 或者其它十分重要的负载。降级后,因为容器规约的哈希值已更改,所有容器都会被重新启动。Master节点降级依照降级流程,首先对主控Master节点降级,而后再对其余Master节点进行降级 kubeadm降级主控Master节点 # 用最新的补丁版本号替换 1.20.x-0 中的 xyum install -y kubeadm-1.20.4-0 --disableexcludes=kubernetes# 验证下载操作失常,并且 kubeadm 版本正确:kubeadm version# 验证降级打算:kubeadm upgrade plan# 抉择要降级到的指标版本,运行适合的命令。例如:# 将 x 替换为你为此次降级所抉择的补丁版本号sudo kubeadm upgrade apply v1.20.4 其余Master节点 sudo kubeadm upgrade nodekubelet 和 kubectl降级此处须要依据官网阐明先做凌空节点操作。 凌空节点 通过将节点标记为不可调度并凌空节点为节点作降级筹备: # 将 <node-to-drain> 替换为你要凌空的管制面节点名称,kubectl get nods中的名称kubectl drain <node-to-drain> --ignore-daemonsetskubectl drain 命令能够用来标记某个节点行将进行服务。 运行 kubectl drain 命令时,工具会尝试驱赶机器上的所有 Pod。 kubectl 所提交的驱赶申请可能会临时被回绝,所以该工具会定时重试失败的申请, 直到所有的 Pod 都被终止,或者达到配置的超时工夫。 ...

June 7, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes高可用集群部署中一些可以说的

前文咱们搭建了3Master节点4Node节点的高可用集群,本文讨论一下过程中的总结。 高可用策略前文说了Kubernetes集群高可用的关键在于Master节点的高可用,官网也给出了2种高可用拓扑构造: Stacked etcd topology (重叠etcd) 该计划中,所有Master节点都部署kube-apiserver,kube-controller-manager,kube-scheduler,以及etcd等组件;kube-apiserver均与本地的etcd进行通信,etcd在三个节点间同步数据 External etcd topology (内部etcd) 该计划中,所有Master节点都部署kube-apiserver,kube-controller-manager,kube-scheduler组件,而etcd 分布式数据存储集群独立运行。这种拓扑构造解耦了Master节点组件和 etcd 。 vcontrol plane node 即Master节点高可用计划剖析通过官网给的拓扑图,有2个要害的中央: etcdload balancer也就是说,只有实现上述两者的高可用,整个Kubernetes集群即达到了高可用的目标。 etcd高可用Kubernetes选用etcd作为它的后端数据存储仓库也正是看重了其应用分布式架构,没有单点故障的个性。尽管单节点的etcd也能够失常运行,然而举荐的部署计划均是采纳3个或者5个节点组成etcd集群,供Kubernetes应用。 etcd的高可用计划是官网2种拓扑构造中最显著的差别,区别就是etcd的地位不同。官网对于2种etcd的计划也做了比拟,我总结如下: 重叠形式 所需硬件资源少部署简略、利于治理横向扩大容易毛病在于一台宿主机挂了,Master节点和etcd就少了一套,会大大降低集群冗余度和健壮性。内部形式 Master节点和etcd解耦,Master节点挂了后不影响etcd,集群健壮性加强毛病是硬件资源简直2倍于重叠计划,并且运维复杂度会变高。不论从我集体角度还是企业角度,我毫不犹豫抉择重叠形式,横向扩大的便捷性以及对于硬件的需要这2点理由就足够了。另外在收集材料的时候还发现了一篇文章-Scaling Kubernetes to 2,500 Nodes,外面实践证明,etcd挂载本地ssd的形式会大幅提高超大规模(节点大于2000)集群性能。 除了上述2种形式之外,在网上冲浪时还发现了一篇文章提到另一种形式: CoreOS提出的self-hosted etcd计划 将本应在底层为Kubernetes提供服务的etcd运行在Kubernetes之上。实现Kubernetes对本身依赖组件的治理。在这一模式下的etcd集群能够间接应用etcd-operator来自动化运维,最合乎Kubernetes的应用习惯。 当然,这种形式材料并不多,也没找到具体的实际形式,并且在官网文档中多带有实验性的前缀,并且官网文档如下阐明: The self-hosted portion of the control plane does not include etcd, which still runs as a static Pod.也不晓得是已经版本中反对过起初勾销还是怎么的,在此不做深究吧,只是提一句题外话。所有还是以官网文档的两种形式为准。 kube-apiserver高可用在官网的拓扑图中,除了etcd以外很容易疏忽load balancer这个节点。kube-apiserver节点通过前置负载均衡器load balancer实现高可用,然而目前尚没有官网的举荐计划。罕用的思路或者计划大抵演绎有以下几种: 内部负载均衡器 不论是应用私有云提供的负载均衡器服务或是在公有云中应用LVS或者HaProxy自建负载均衡器都能够归到这一类。负载均衡器是十分成熟的计划,如何保障负载均衡器的高可用,则是抉择这一计划须要思考的新问题。 目前网上大部分材料都是通过HAproxy实现kube-apiserver的高可用并且通过Keepalived形式确保HAproxy本身的高可用,前文咱们应用的就是这种形式,刚入门随大流总没有错的。 网络层做负载平衡 比方在Master节点上用BGP做ECMP,或者在Node节点上用iptables做NAT都能够实现。采纳这一计划不须要额定的内部服务,然而对网络配置有肯定的要求。 在Node节点上应用反向代理对多个Master做负载平衡 这一计划同样不须要依赖内部的组件,然而当Master节点有增减时,如何动静配置Node节点上的负载均衡器成为了另外一个须要解决的问题。 目前除了本人用的形式外,对于其余形式还需留待后续钻研和尝试。 kube-controller-manager与kube-scheduler 高可用这两项服务是Master节点的组件,他们的高可用绝对容易,仅须要运行多份实例即可。Kubernetes本身通过leader election机制保障以后只有一个正本是处于运行状态。 至于leader选举的机制,简略来说是:多个kube-controller-manager与kube-scheduler的正本对 endpoint 锁资源做抢占,谁能抢到并将本人的信息写入 endpoint的 annotation 中,谁就成为了leader,leader须要在可配置的一个间隔时间内更新音讯,其余节点也能看见以后的leader和过期工夫;当过期工夫到并且leader没有更新后,其余正本会尝试去获取锁,去竞争leader,直到本人成为leader。 ...

June 7, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes多主多从高可用集群部署

前文我搭建了一主两从的Kubernetes集群,然而还是存在一个问题,没有达到高可用的目标,如果Master节点呈现问题,整个集群将会瘫痪,所以高可用的要害动作在于多Master节点,并且部署过程要比单Master节点集群要简单很多。 思考再三,鉴于我理论部署过程中呈现的问题泛滥(天知道我经验了什么),我还是决定在本文只形容部署过程,即怎么做,力求照着本文能胜利部署出一套高可用的Kubernetes集群;至于为什么?的问题我留在下一篇文章作为闲聊。 本次高可用计划架构图如下: 须要用到haproxy和keepalived组件提供Master节点高可用。 筹备工作机器角色IPmaster10.128.2.53master10.128.2.52master10.11.0.220node10.128.1.187node10.11.7.94node10.11.0.181node10.11.7.125所有机器须要依照上文Kubeadm疾速部署Kubernetes集群中筹备工作环节进行设置,此外须要非凡留神的几点如下: hostname设置须要设置hosts文件和hostname ## vi /etc/hosts10.128.2.53 kubernetes-master0110.128.2.52 kubernetes-master0210.11.0.220 kubernetes-master0310.128.1.187 kubernetes-node0110.11.7.94 kubernetes-node0210.11.0.181 kubernetes-node0310.11.7.125 kubernetes-node0410.128.2.111 kubernetes-viphostnamectl set-hostname kubernetes-master01......10.128.2.111 kubernetes-vip是通过keepalived实现的vip地址。 节点互信须要设置Master三节点间互信以及Master免登录Node节点,参考前文。 装置ipvsipvs是kube-proxy实现负载平衡的一种技术实现,默认的实现形式是iptables,后文再详述。 装置软件yum install ipvsadm ipset sysstat conntrack libseccomp -y加载模块cat > /etc/sysconfig/modules/ipvs.modules <<EOF#!/bin/bashmodprobe -- ip_vsmodprobe -- ip_vs_rrmodprobe -- ip_vs_wrrmodprobe -- ip_vs_shmodprobe -- nf_conntrackmodprobe -- ip_tablesmodprobe -- ip_setmodprobe -- xt_setmodprobe -- ipt_setmodprobe -- ipt_rpfiltermodprobe -- ipt_REJECTmodprobe -- ipipEOF配置重启主动加载所有节点执行chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrackkubeadm、kubelet、kubectl装置配置源 ...

June 7, 2021 · 3 min · jiezi

关于kubernetes:Kubeadm快速部署Kubernetes集群

通过后面的架构概述,能够看出,若想手动部署一套高可用的Kubernetes集群,还是相当麻烦的。所以官网推出了疾速建设Kubernetes集群的工具:Kubeadm。 Kubeadm是一个提供Kubeadm init 和 Kubeadm join命令,用于创立Kubernetes集群的最佳实际“疾速门路”工具。 Kubeadm的指标是在不装置其余性能插件的根底上,建设一个通过Kubernetes一致性测试Kubernetes Conformance tests的最小可行集群。它在设计上并不会装置网络解决方案,而是须要用户自行装置第三方合乎CNI的网络解决方案(如:flannel,calico,weave network等)。 筹备工作机器这个太难了,好不容易从生产环境坑蒙拐骗挪进去3台能用的,总算能弄个一主两从的集群,零碎都是CentOS: 机器角色IPmaster10.128.2.53node10.128.1.187node10.11.7.94配置host三台机器均配置host,/etc/hosts文件增加以下配置: 10.128.2.53 kubernetes-master0110.128.1.187 kubernetes-node0110.11.7.94 kubernetes-node02hostnamectlhostnamectl set-hostname kubernetes-master01敞开防火墙systemctl stop firewalldsystemctl disable firewalldsystemctl status firewalld敞开selinuxsed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永恒 需重启setenforce 0 # 长期敞开swapswapoff -ased -i 's/^[^#].*swap/#&/' /etc/fstabsystemctl daemon-reload若要启用swap设施,则须要在集群初始化时增加--ignore-preflight-errors=swap,意义为疏忽因swap设施导致的报错 敞开ipv6echo net.ipv6.conf.all.disable_ipv6=1 >> /etc/sysctl.confecho NETWORKING_IPV6=no >> /etc/sysconfig/networksed -i 's/IPV6INIT=yes/IPV6INIT=no/g' /etc/sysconfig/network-scripts/ifcfg-ens33sysctl -pip a # 查看ipv6是否敞开将桥接的IPv4流量传递到iptablescat >/etc/sysctl.d/kubernetes.conf << EOFnet.bridge.bridge-nf-call-ip6tables =1net.bridge.bridge-nf-call-iptables =1EOFsysctl --system # 失效这个不晓得什么意思然而通过Kubeadm装置Kubenetes集群时会校验。这里也搜到一篇文章阐明net.bridge.bridge-nf-call-iptables的作用参数作用,然而我示意看不懂。 装置容器运行时三台机器必须都装置容器运行时,这里我应用Dokcer,并且须要配置Docker的Cgroup Driver为systemd: vi /etc/docker/daemon.json{ "exec-opts":["native.cgroupdriver=systemd"]}systemctl restart docker什么是cgroups? 首先说下容器是什么?容器是一个视图隔离、资源可限度、独立文件系统的过程汇合。cgroups(Control Groups) 是 linux 内核提供的一种机制,作用就是能够对资源进行限度。此外,视图隔离是通过namespace实现,而文件系统是通过chroot实现。 ...

June 7, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes核心资源对象概述

Kubernetes 有很多技术概念和API对象,每一个都能够扩大讲很多,依照前文的学习思路,还是先理解大略。 Pod官网对于Pod的解释是: Pod是能够在 Kubernetes 中创立和治理的、最小的可部署的计算单元。Pod 的设计理念是反对多个容器在一个 Pod 中共享网络地址和文件系统,能够通过过程间通信和文件共享这种简略高效的形式组合实现服务。 举个简略的例子:比方咱们设计了一个商品相干的微服务,包含了商品治理和商品同步(从其余数据源抽取商品)两局部性能,在设计上来说,咱们很可能把这两局部拆成2个独立小利用并且由2个小组别离来实现(只是假如)。这种状况下,大能够不同的团队各自开发构建本人的容器镜像,在部署的时候组合成一个微服务对外提供服务,构建一个Pod。 Pod间关系如下图: 同一个 Pod 之间的 Container 能够通过 localhost 相互拜访,并且能够挂载 Pod 内所有的数据卷;然而不同的 Pod 之间的 Container 不能用 localhost 拜访,也不能挂载其余 Pod 的数据卷。 VolumeKubernetes 集群中的存储卷跟 Docker 的存储卷有些相似,只不过 Docker 的存储卷作用范畴为一个容器,而 Kubernetes 的存储卷的生命周期和作用范畴是一个 Pod。每个 Pod 中申明的存储卷由 Pod 中的所有容器共享。Kubernetes 反对十分多的存储卷类型,特地的,反对多种私有云平台的存储,包含 AWS,Google 和 Azure 云;反对多种分布式存储包含 GlusterFS 和 Ceph;也反对较容易应用的主机本地目录 emptyDir, hostPath 和 NFS。 Deployment、ReplicaSet、Replication Controller前文说了Master节点中包涵组件Controller Manager,其中具体的一些控制器就蕴含了Deployment、ReplicaSet、Replication Controller三者,它们相当于一个状态机,用来管制pod的具体状态和行为。 ReplicaSet、Replication Controller 先说Replication Controller,简称RC。RC保障在同一时间可能运行指定数量的Pod正本,保障Pod总是可用。如果理论Pod数量比指定的多就完结掉多余的,如果理论数量比指定的少就启动短少的。当Pod失败、被删除或被终结时RC会主动创立新的Pod来保障正本数量。所以即便只有一个Pod也应该应用RC来进行治理。 ReplicaSet,简称RS,随着Kubernetes的倒退,官网曾经举荐咱们应用RS和Deployment来代替RC了,RS对象个别不独自应用,而是作为 Deployment 的现实状态参数应用。目前RS和RC惟一的一个区别就是RC只反对基于等式的selector(env=dev或environment!=qa),但RS还反对基于汇合的selector(version in (v1.0, v2.0)),这对简单的运维治理就十分不便了。 Deployment ...

June 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes架构概述

写在后面自从在生产环境引入容器当前,目前直观感触最大的两个长处: 部署疾速,挪动、扩大便捷。节俭了15%左右的硬件资源。随着线上容器数量的增多,也遇到了治理工作量加大的状况,便呈现了前文的DockerSwarm的应用调研以及portainer工具的引入,在治理难度上确实加重很多。 然而容器治理的精华:主动实现服务的部署、更新、卸载和扩容、缩容等,DockerSwarm并没有提供。包含将来想进行服务基础设施和利用拆散,并且从现有的基于springcloud的Java语言微服务转向语言无关的云原生微服务的落地等等指标都指向了Kubernetes。接下来的次要学习方向也放在这里,摸索云原生的生态链,一边学习一边总结。 对于Kubernetes的学习思路如下: 首先理解大略实操部署集群深入研究原理,浏览相干书籍Kubernetes是什么Kubernetes 是谷歌开源的容器集群管理系统,是 Google 多年大规模容器治理技术 Borg 的开源版本,官网称其是: Kubernetes is an open source system for managing containerized applications across multiple hosts. It provides basic mechanisms for deployment, maintenance, and scaling of applications. 用于主动部署、扩大和治理“容器化(containerized)应用程序”的开源零碎。 次要性能包含: 基于容器的利用部署、保护和滚动降级负载平衡和服务发现跨机器和跨地区的集群调度主动伸缩无状态服务和有状态服务宽泛的 Volume 反对插件机制保障扩展性Kubernetes架构整体架构下图清晰表明了Kubernetes的架构设计以及组件之间的通信协议。 图中一些协定名称后续再深究,临时先理解大略。 上面是更形象的一个视图: Kubernetes是属于主从设施模型(Master-Slave 架构),在 Kubernetes 中,主节点个别被称为Master,而从节点则被称为Node。 Master 和 Node 是别离装置了 Kubernetes 的 Master 组件 和 Node 组件的实体服务器,每个 Node 都对应了一台实体服务器(尽管 Master 能够和其中一个 Node 装置在同一台服务器,然而倡议 Master 独自部署),所有 Master 和 Node 组成了 Kubernetes 集群,同一个集群可能存在多个 Master 和 Node,满足高可用诉求。 ...

June 7, 2021 · 2 min · jiezi

关于kubernetes:Kubelet运行在容器下使用LocalPV磁盘地址不存在问题

问题明天在通过kubernetes部署elasticsearch的过程中呈现一个问题,特此记录一下。因为elasticsearch是有状态利用,须要应用长久化存储,手头既没有云存储,也没有nfs,cephfs之类的存储。kubernetes给的elasticsearch的yaml资源文件默认的是emptydir形式,并且文档强调: StorageThe Elasticsearch StatefulSet will use the EmptyDir volume to store data. EmptyDir is erased when the pod terminates, here it is used only for testing purposes. Important: please change the storage to persistent volume claim before actually using this StatefulSet in your setup! 说白了,这块须要自由发挥,抉择适宜本人的长久化存储。所以理所应当应用本地磁盘,Local PV的形式,PV的资源文件如下: apiVersion: v1kind: PersistentVolumemetadata: name: es-data-holder-01spec: capacity: storage: 100Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /home/k8s/localpv # 节点上的目录 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - kubernetes-node03其中指定了/home/k8s/localpv目录作为存储目录,这些都不是关键点,关键点在于,最初elasticsearch的pod启动时会报错: ...

June 7, 2021 · 2 min · jiezi

关于kubernetes:使用jco连接sap的应用迁移至Kubernetes记录

在生产环境迁徙至Kubernetes的过程中,有一个服务和其余服务不太一样,该服务次要用于和底层SAP零碎做数据交换和同步,SAP提供了SAP Java Connector(SAP JCo)的开发库来连贯SAP零碎。 非容器环境下LinuxJco实质上是基于RFC的ABAP和JAVA过程间通信组件,和其余组件不同,并不是引入一个Jar包就解决问题,从官网下载的包里蕴含2个文件,Jar包和本地Native库: libsapjco3.sosapjco3.jar必须要在零碎环境变量加载Native库能力驱动Jar包 echo "export LD_LIBRARY_PATH=/你的目录" >> /etc/profile# 失效source /etc/profile如此Java利用运行后便可能胜利连贯SAP零碎。 容器环境下因为须要迁徙至Kubernetes环境下,所以剖析后须要做到如下三点: 定义volume把jco文件夹做hostpath挂载至Pod内 在宿主机上传jco文件夹后,做挂载 这里为了方便使用的是Kuboard工具,并没有间接编辑yaml资源文件。如果不是业余Kubernetes运维,其实集体倡议应用一些图形管理工具会更加高效一点。 配置环境变量LD_LIBRARY_PATH 因为并不想把所有机器都上传jco文件夹,所以思考还是选出2-3台机器加标签后,把此利用限度一下调度主机范畴 做完上述三点后,于是启动,sap连贯失常,就这样。

June 7, 2021 · 1 min · jiezi

关于kubernetes:运维攻坚之服务间歇性不可用问题解决

背景某客户kubernetes集群新加了一个节点,新节点部署利用后,利用会间歇性unavaliable,用户拜访报503,没有事件音讯,主机状态也失常。 排查初步狐疑是新节点问题,在系统日志/var/log/message和dmesg中都未发现相干错误信息,在kubelet中发现以下日志 kubernetes集群时通过rke进行装置,能够在节点上间接执行命令docker logs -f --tail=30 kubelet查看kubelet日志E0602 03:18:27.766726 1301 controller.go:136] failed to ensure node lease exists, will retry in 7s, error: an error on the server ("") has prevented the request from succeeding (get leases.coordination.k8s.io k8s-node-dev-6)E0602 03:18:34.847254 1301 reflector.go:178] k8s.io/client-go/informers/factory.go:135: Failed to list *v1.CSIDriver: an error on the server ("") has prevented the request from succeeding (get csidrivers.storage.k8s.io)I0602 03:18:39.176996 1301 streamwatcher.go:114] Unexpected EOF during watch stream event decoding: unexpected EOFE0602 03:18:43.771023 1301 controller.go:136] failed to ensure node lease exists, will retry in 7s, error: an error on the server ("") has prevented the request from succeeding (get leases.coordination.k8s.io k8s-node-dev-6)其中比拟关注failed to ensure node lease exists这个错误信息,从字面上了解应该就是无奈注册主机信息,然而kubectl get nodes失去的状态都是Ready。联想到利用间歇性的不可用,狐疑可能是短时间节点不可用而后疾速复原,因而可能在执行命令的时候是失常的,为了验证猜测,在后盾始终执行kubectl get nodes命令,终于捕捉到NotReady状态 ...

June 2, 2021 · 1 min · jiezi

关于kubernetes:分享画的-Kubernetes-的源码架构图

大略 200 张手画的图,置信对学习 Kubernetes 会有所帮忙 云原生社区博客地址 Kubernetes 源码架构图浏览 Gitbook

May 31, 2021 · 1 min · jiezi

关于kubernetes:集群镜像集群整体打包分布式应用build-share-run

作者 | fanux.中弈 什么是集群镜像顾名思义和操作系统.iso镜像或者Docker镜像相似,集群镜像是用肯定的技术手段把整个集群的所有文件以肯定格局打成的一个资源包。比照单机和集群会发现一些乏味景象: 单机有计算存储网络这些驱动,集群有CNI/CSI/CRI的实现像是集群的驱动操作系统单机有ubuntu centos这些,咱们能够把kubernetes看成云操作系统单机上能够运行docker容器 或者是虚拟机,相当于一个运行的实例,集群也有运行着k8s的实例单机上的虚拟机镜像,docker镜像,所以随着云计算技术的倒退,在集群这个纬度也会形象出相似的镜像技术。 以基于kubernetes的集群镜像为例,外面蕴含了除操作系统以外的所有文件: docker的依赖的二进制与systemd配置,dockerd的配置,以及一个公有的容器镜像仓库kubernetes外围组件二进制,容器镜像,kubelet system配置等利用须要用到的yaml配置或者helm chart,以及利用的容器镜像其它脚本,配置与二进制工具等利用运行须要的所有依赖同样集群镜像运行时必定不是起一个容器或者装在一台机器上,而是这个镜像能够间接装置到多台服务器上或者间接对接到私有云的基础设施上。 sealer介绍sealer是阿里巴巴开源的集群镜像的一个实现形式,我的项目地址: https://github.com/alibaba/se...Docker解决了单个容器的镜像化问题,而sealer通过把整个集群打包,实现了分布式软件的Build Share Run!!! 试想咱们要去交付一个SaaS利用,它依赖了mysql es redis这些数据库和中间件,所有货色都在kubernetes上进行编排,那如果没有集群镜像那要做如下操作: 找个工具去装置k8s集群helm install mysql es redis... 如果是离线环境可能还须要导入容器镜像kubectl apply yoursaas看似如同也没那么简单,然而其实从整个我的项目交付的角度来说是面向过程极易出错的 那当初如果当初提供另外一个形式只有一条命令解决下面的问题你会不会用?sealer run your-saas-application-with-mysql-redis-es:latest能够看到只须要run一个集群镜像整个集群就被整体交付了,细节简单的操作都被屏蔽掉了,而且任何利用都能够应用雷同的形式运行。那这个集群镜像是怎么来的呢:咱们只须要定义一个相似Dockerfile的文件咱们称之为Kubefile, 而后执行一下build命令即可:sealer build -t your-saas-application-with-mysql-redis-es:latest .在单机和集群两个纬度进行一个比照就能够高深莫测:docker能够通过Dockerfile构建一个docker镜像,应用compose就能够运行容器。sealer通过Kubefile构建一个CloudImage,应用Clusterfile启动整个集群。 疾速体验制作和运行一个kubernetes dashboard的集群镜像来体验一个残缺的流程。编写Kubefile # 根底镜像,曾经被制作好了外面蕴含所有的kubernetes启动相干的依赖FROM registry.cn-qingdao.aliyuncs.com/sealer-io/cloudrootfs:v1.16.9-alpha.7# 下载官网的dashboard yaml编排文件,曾经下载了能够应用COPY指令RUN wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml# 指定运行形式,能够应用kubectl helm kustomiz等CMD kubectl apply -f recommended.yamlbuild dashboard集群镜像sealer build -t kubernetes-with-dashobard:latest . 运行集群镜像 # 上面命令会在服务器上安装k8s集群并apply dashboard, passwd指定服务器ssh明码,也能够应用密钥sealer run kubernetes-with-dashobard:latest \ --master 192.168.0.2,192.168.0.3,192.168.0.4 \  --node 192.168.0.5,192.168.0.6 \  --passwd xxx# 查看podkubectl get pod -A |grep dashboard 把制作好的镜像推送到镜像仓库,兼容docker registry sealer tag kubernetes-with-dashobard:latest docker.io/fanux/dashobard:latestsealer push docker.io/fanux/dashobard:latest这样就能够把制作好的镜像交付进来或者提供给他人复用。 应用场景sealer具体能帮咱们做哪些事呢,上面列举几个次要场景: | 装置kubernetes与集群生命周期治理(降级/备份/复原/伸缩)这是个最简略的场景,不论你是须要在单机上安装个开发测试环境还是在生产环境中装置一个高可用集群,不论是裸机还是对接私有云,或者各种体系结构操作系统,都能够应用sealer进行装置,这里只装置kubernetes的话就抉择个根底镜像即可。与其它的装置工具比照,sealer劣势在于: 简略到令人发指 sealer run 一条命令完结速度快到令人窒息,3min装完6节点,可能你在应用别的工具还没下载完sealer就曾经装完了,然而咱们后续还有黑科技优化到2min甚至1min以内兼容性与稳定性 兼容各种操作系统,反对x86 arm等体系结构一致性设计,会让集群放弃Clusterfile中的定义状态,以降级为例,只须要改一下Clusterfile中的版本号即可实现降级。 速度快是因为首先是golang实现,意味着咱们能够很多很粗疏的中央做并发的解决,这相比ansible就有更多的劣势了,而且还能够做更粗疏的错误处理,而后在镜像散发上摈弃了以前load的形式,后续在文件散发上也会做优化达到装置性能上的极致。 兼容性上,docker kubelet这里都采纳了二进制+systemd装置外围组件全容器化,这样不必再去依赖yum apt这类感知操作系统的装置工具。 ARM和x86采纳不同的镜像反对与sealer自身解耦开。 对私有云的适配也抽离独自模块进行实现,这里咱们没去对接terraform起因还是为了性能,在咱们的场景下terraform启动基础设施将近3min,而咱们通过退却重试把基础设施启动优化到了30s以内,还有就是在集群镜像这个场景下是不须要这么简单的基础设施治理能力的,咱们不想让sealer变重也不想去依赖一个命令行工具。 一致性的设计理念是sealer中值得一提的,集群镜像与Clusterfile决定了集群是什么样子的,雷同的镜像与Clusterfile就能run出个一样的集群进去。 变更要么变更Clusterfile如减少节点,扭转节点规格,要么换镜像,换镜像的时候因为集群镜像也是分层构造,hash值不变的layer不会产生变更,而hash发生变化会帮忙从新apply该层。 | 云原生生态软件的打包/装置等如prometheus mysql集群等sealer run prometheus:latest 就能够创立一个带有prometheus的集群,或者在一个已有的集群中装置prometheus。那么问题来了:和helm啥区别? sealer 不关怀编排,更重视打包,下面例子prometheus能够用helm编排的,sealer会把chart和chart外面须要的所有容器镜像打包起来,这是在build的过程中通过黑科技做到的,因为build过程会像docker build一样起长期的kubernetes集群,而后咱们就晓得了集群依赖了哪些容器镜像,最初把这些容器镜像打包。和kubernetes一起打包,拿了一个chart它未必能装置胜利,比方应用了废除的api版本,然而做成镜像把kubnernetes也包在一起了,只有build没问题,run就没问题,这点和docker把操作系统rootfs打包在一起殊途同归。集成性,集群镜像更关注整个分布式应用集群整体打包,如把prometheus ELK mysql集群这些做成一个镜像服务与业务。所以sealer与helm是协作关系,分工明确。 后续就能够在sealer的官网镜像仓库中找到这些通用的集群镜像而后间接应用。 | SaaS软件整体打包/交付 专有云离线交付从分布式应用的视角看,通常从上往下,少则几个多则上百的组件,现有整体交付形式大多都是面向过程的,两头须要很多认为干涉的事,sealer就能够把这些货色通通打包在一起进行一键交付。 可能你会问,我做个tar.gz再加个ansible脚本不也是能一样一键化嘛,那是必定,就和docker镜像呈现之前大家也通过tar.gz交付一样,你会发现规范和技术的呈现解决和人与人之间的合作问题, 有了集群镜像你能够间接复用他人的成绩,也能制作好货色做他人应用。 专有云场景就非常适合应用sealer,很多客户机房都是离线的,而集群镜像会把所有依赖打到镜像中。 只有镜像制作的好那所有局点都能够以雷同的形式进行一键交付,取得极佳的一致性体验。 | 在私有云上实际上述场景sealer自带对接私有云属性,很多状况下对接私有云会有更好的应用体验,比方装置集群时只须要指定服务器数量和规格而不必关怀IP,伸缩间接批改Clusterfile中定义的数字即可。 技术原理简介| 写时复制集群镜像的存储也是通过写时复制的形式,这样做有两个益处,咱们能够把一个集群中不同的分布式式软件打在不同的层,以实现复用,还能够实现间接把集群镜像push到docker镜像仓库中。 | 容器镜像缓存build的过程中sealer是如何晓得待构建的集群镜像里有哪些容器镜像,以及怎么把容器镜像存储下来,这其中有一些难点问题: 如何晓得分布式软件中有哪些容器镜像,因为咱们须要把这些镜像缓存下来,不论是扫描用户的yaml文件还是用helm template之后扫描都是不完满的,首先不能确定用户的编排形式是什么,其次有些软件甚至不把镜像地址写在编排文件中,而是通过本人的程序去拉起。无奈保障build胜利运行就肯定没问题。容器镜像是须要被存储到公有仓库中打包在集群镜像里,那容器镜像仓库地址势必和编排文件中写的不一样,特地是怎么保障用户alwayPull的时候还是可能在公有仓库中下载到镜像。看待第一个问题,sealer解决形式是 sealer build的过程中和Docker build一样会起一个长期的kubernetes集群,并执行用户在Kubefile中定义的apply指令。这样就能够保障用户依赖的所有镜像都被打包进去,无论用户应用什么样的编排形式。第二个问题,咱们打包容器镜像到公有镜像仓库中,怎么应用这个公有镜像也是个问题,因为假如公有镜像仓库名为localhost:5000 那必定会和编排文件中写的不一样,咱们有两种形式解决,第一种是hack和docker,做了一个只有公有镜像仓库中有就间接从公有镜像中拉取,没有才去公网拉取镜像的能力。 还有种计划是无侵入docker的proxy,把docker申请全部打给代理,让代理去决定如果公有仓库有就从公有仓库拉取。同时咱们还加强了registry的能力让registry能够cache多个近程仓库的能力。sealer的这种计划完满的解决了离线场景镜像打包的问题。 | 负载平衡sealer的集群高可用应用了轻量级的负载平衡lvscare,首先相比其它负载平衡lvscare十分小几百行代码,而且lvscare只做ipvs规定的守护,自身不做负载十分稳固,间接在node上监听apiserver,如果跪了就移除对应的规定,从新起来之后会主动加回,相当于是一个专用的负载均衡器,在sealos我的项目中也用了两年多,有宽泛的实际。| 运行时运行时就是撑持利用运行的环境,像base on kuberentes的运行时sealer就能够通明的反对非常简单,以istio为例,用户只须要: ...

May 29, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-稳定性保障手册洞察预案

简介:稳定性保障是个简单的话题,须要无效、可迭代、可继续保障集群的稳定性,系统性的办法或者能够解决该问题。 作者 | 悟鹏 起源 | 阿里巴巴云原生公众号 《Kubernetes 稳定性保障手册》系列文章: Kubernetes 稳定性保障手册 -- 极简版Kubernetes 稳定性保障手册 -- 日志专题Kubernetes 稳定性保障手册 -- 可观测性专题Kubernetes 稳定性保障手册 -- 洞察+预案(本文)综述 稳定性保障是个简单的话题,须要无效、可迭代、可继续保障集群的稳定性,系统性的办法或者能够解决该问题。 为了造成系统性的办法,能够梳理出稳定性保障复杂性的源头,制订数据模型来对其进行形容,而后在数据模型的根底上对集群的稳定性保障进行数字化和可视化,以数据模型为内核来继续迭代对稳定性保障的了解、实际以及教训的固化。 稳定性复杂性源头 稳定性保障的复杂性源头,个别会有如下维度: 零碎组件数量和交互关系:随着工夫继续变动零碎组件和交互的动静行为特色:不易推导和察看系统资源类型和数量:随着工夫继续变动系统资源的动静行为特色:不易推导和察看集群的稳定性保障动作:不易标准和平安执行总结下来,即: 如何无效、全面洞察集群如何通过预案平安执行稳定性保障动作数据模型 能够通过 4 张图和 3 张表对洞察和预案进行数据模型的形象: 4 张图 架构关系图:形容集群组件及其交互关系架构运行图:形容集群组件及交互的动静特色资源形成图:形容集群资源的形成资源运行图:形容集群资源的动静应用特色3 张表 事件列表:形容集群产生的须要关注的事件操作列表:形容集群中能够执行的治理操作预案列表:形容集群中事件和操作的关联关系如下: 洞察 集群的性能由集群架构提供,性能组件基于集群资源运行,故对于集群稳定性的洞察,外围在于把握集群架构和集群资源的特色。 1. 架构关系图 集群架构通常能够通过图来表征,其中节点表征组件,边表征交互关系,通过图构造能够直观把握集群的架构,形如下图: 可通过形如下的数据结构形容: { "nodes": [ { "_id": "0ce0e913f6e5516846c654dbd81db6ecab1f684e", "name": "kube-apiserver", "description": "XXX VPC 内", "type": "managed component", "dependencies": {} }, { "_id": "f0740d8bb67520857061a9b71d4a9e4fc50bfe3d", "name": "etcd", "description": "XXX VPC 内", "type": "managed component | storage", "dependencies": {} }, { "_id": "05952a825e91cb50a81cbaf23c6941d5c3bb2c89", "name": "eni-operator", "description": "XXX VPC 内,治理 ENI", "type": "component", "dependencies": { "serviceaccount": "enioperator", "clusterrole": "enioperator", "clusterrolebinding": "enioperator", "configmaps": ["eniconfig"], "secrets": ["enioperator"] } }, { "_id": "42699513a7561e89a5f99881d7b05653a1625c51", "name": "Network Service", "description": "提供 VPC/VSwitch 等云网络资源的治理服务", "type": "cloud service" } ], "edges": [ { "_id": "38bce9ca8a0cec6d8586d96298bd63b0523fc946", "source": "eni-operator", "target": "kube-apiserver", "description": "治理 ENI 申请" }, { "_id": "93f3c21247165f0be3a969fc80f72bc1a402e9f5", "source": "eni-operator", "target": "Network Service", "description": "拜访阿里云 ECS OpenAPI,治理 VPC/VSwitch 等网络资源" } ]} ...

May 28, 2021 · 4 min · jiezi

关于kubernetes:K8S-使用-Deployment-运行一个无状态应用Nginx

一、指标创立一个 nginx Deployment应用 kubectl 列举对于 Deployment 的信息更新 Deployment二、筹备你必须领有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,参考 用 kubeadm 在 Debian 或 Ubuntu 中创立 k8s 集群。 三、教程1 创立并理解一个 nginx Deployment你能够通过创立一个 Kubernetes Deployment 对象来运行一个利用,且你应用 yaml 格局的文件创建一个 Deployment 的配置文件。例如, 上面是一个运行 nginx:1.14.2 Docker 镜像的 Deployment 的配置文件: deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deploymentspec: selector: matchLabels: app: nginx replicas: 2 # tells deployment to run 2 pods matching the template template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80应用 yaml 文件创建一个 Deployment: ...

May 27, 2021 · 2 min · jiezi

关于kubernetes:K8S-有状态的应用和示例多副本MySQL

本页展现如何应用 StatefulSet 控制器运行一个有状态的应用程序。此例是多正本的 MySQL 数据库。 示例利用的拓扑构造有一个主服务器和多个正本,应用异步的基于行(Row-Based) 的数据复制。 阐明: 这不是生产环境下配置。 尤其留神,MySQL 设置都应用的是不平安的默认值,这是因为咱们想把重点放在 Kubernetes 中运行有状态应用程序的个别模式上。 一、筹备你必须领有一个 Kubernetes 的集群(至多 5 个子节点,1 主 4 子),同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,参考 用 kubeadm 在 Debian 或 Ubuntu 中创立 k8s 集群,不要用 Debian,用 Ubuntu。 要实现本教程,你应该曾经相熟 Pod, Service和 StatefulSet。 您正在应用默认命名空间或不蕴含任何抵触对象的另一个命名空间。 二、指标应用 StatefulSet 控制器部署多正本 MySQL 拓扑架构。发送 MySQL 客户端申请察看对宕机的抵抗力扩缩 StatefulSet 的规模三、教程1 部署 MySQLMySQL 示例部署蕴含一个 ConfigMap、两个 Service 与一个 StatefulSet。 1.1 ConfigMap应用以下的 YAML 配置文件创立 ConfigMap : mysql-configmap.yaml apiVersion: v1kind: ConfigMapmetadata: name: mysql labels: app: mysqldata: master.cnf: | # Apply this config only on the master. [mysqld] log-bin skip_name_resolve slave.cnf: | # Apply this config only on slaves. [mysqld] super-read-only skip_name_resolvekubectl apply -f ./mysql-configmap.yaml这个 ConfigMap 提供 my.cnf 笼罩设置,使你能够独立管制 MySQL 主服务器和从服务器的配置。 在这里,你心愿主服务器可能将复制日志提供给正本服务器,并且心愿正本服务器回绝任何不是通过复制进行的写操作。 ...

May 27, 2021 · 7 min · jiezi

关于kubernetes:Kubesphere部署Eureka

用project-regular 用户登录Kubesphere,如何创立用户请参考:创立企业空间、我的项目、帐户和角色进入咱们创立好的我的项目后,抉择 利用负载 -> 利用 -> 构建自制利用 填写根本信息依据提醒填写,而后点击下一步 有状态服务抉择有状态的服务依据提醒填写能够设置容器组的正本数量抉择 设置环境参数spring.profiles.active 指定服务启动应用prod环境eureka.client.service-url.defaultZone eureka互相注册地址 详细描述如下: 匹配Pod name(网络标识)的模式为:(statefulset名称)−(序号),比方下面的示例:eureka-server-v1-0,eureka-server-v1-1。StatefulSet为每个Pod正本创立了一个DNS域名,这个域名的格局为: $(podname).(headless Service name),也就意味着服务间是通过Pod域名来通信而非Pod IP,因为当Pod所在Node产生故障时,Pod会被飘移到其它Node上,Pod IP会发生变化,然而Pod域名不会有变动。StatefulSet应用Headless服务来管制Pod的域名,这个域名的FQDN为:(servicename).(namespace).svc.cluster.local,其中,“cluster.local”指的是集群的域名。参数值形容spring.profiles.activeprod指定服务启动应用prod环境eureka.client.service-url.defaultZonehttp://eureka-server-v1-0.eur...eureka互相注册地址eureka.instance.prefer-ip-addressfalseeureka注册为机器的主机名 后续就统一下一步就能够了

May 26, 2021 · 1 min · jiezi

关于kubernetes:Serverless这真的是未来吗二

简介:在对于无服务器的第二篇文章中,咱们将探讨一些更宽泛的问题。再次强调,咱们并不是要做硬性规定。咱们想提出一些观点,以促成所有利益相关者之间的探讨。许多说所有应用程序都将是无服务器的应用程序的人并未大规模运行其应用程序,也未解决与提早、复杂性和供应商锁定无关的所有问题。这就是咱们在这里要议论的。 原文 | https://www.pulumi.com/blog/is\_serverless\_the\_future\_part\_2/ 作者 | Lee Briggs & Piers Karsenbarg 译者 | donghui 在对于无服务器的第二篇文章中,咱们将探讨一些更宽泛的问题。再次强调,咱们并不是要做硬性规定。咱们想提出一些观点,以促成所有利益相关者之间的探讨。许多说所有应用程序都将是无服务器的应用程序的人并未大规模运行其应用程序,也未解决与提早、复杂性和供应商锁定无关的所有问题。这就是咱们在这里要议论的。 供应商锁定怎么办?你有多关怀厂商锁定问题?例如:你很可能无奈将 AWS 中的无服务器架构转移到另一个云提供商。有些组织不关怀厂商锁定问题,但很多组织关怀。如果你真的在乎,那么在你继续前进之前,请决定你应该在乎多少。 您的组织有多大?无服务器对于较年老的组织或较小的组织来说是一个很好的抉择,兴许大型组织中的老手团队间接关注于交付价值。一旦组织倒退到足够大,能够反对专门治理基础设施的团队了,并且使用率增长了,可能就该从新评估状况了。胜利采纳无服务器平台的大型组织往往是经验了文化转变才获得成功。如果您还没有筹备好在组织的所有级别上进行大量投资,以使无服务器的采纳获得成功,那么应用更传统的办法(由专门的团队管制供给基础设施)可能更适合。 最初,正如在前一篇文章中所探讨的,大型企业可能想要思考构建一个基础设施平台,在那里像 Kubernetes 这样的技术能够受害。 架构是什么样的呢?须要思考的一点是无服务器的产品和更"传统"的办法在思维形式上的显著差别,这意味着当切换平台时,应用程序可能常常须要从新设计。您可能须要思考这些体系结构更改的 ROI 是什么。通常,从工夫和财务的角度来看,任何应用程序的从新设计都是低廉的,甚至会给最胜利的工程团队带来问题。 无论您是在开发一个新开发的应用程序还是评估一个现有的应用程序,思考无服务器应用程序的架构都是很重要的。传统的 N 层格调的体系结构或 N 层格调的 web 应用程序须要大量的投资能力迁徙到无服务器的平台。 总结总而言之,无服务器并不能解决所有问题,然而在正确的中央能够提供很多服务。请记住以下问题: 1. 您有多在乎供应商锁定?无服务器架构不能简略地从一个云提供商迁徙到另一家云提供商。您的组织在多大程度上关怀供应商锁定? 2. 您的组织规模是多大?无服务器通常更适宜小型组织。一旦有了 IT 员工来反对它,您可能想看看更传统的抉择。大型企业可能心愿钻研 Kubernetes。 3. 您是否比提供应用程序透明性更关怀疾速提供价值?如果您心愿尽快将应用程序推向市场,那么无服务器可能是一个不错的抉择。然而,您将就义应用程序的指标和洞察力。随着规模的增长,这可能会导致真正的问题。 4. 您理解应用程序的属性吗?通常说无服务器能够省钱,因为您只需为应用工夫付费。然而,如果您的应用程序具备较长的响应或启动工夫,请仔细观察。无服务器可能是一个低廉的抉择。 5. 您的应用程序的体系结构是什么样的?不要冀望传统的端层格调的体系结构可能很好地与无服务器的应用程序配合应用。寻找能够分解成更小的组件一起工作的应用程序。另一方面,将无服务器应用程序迁徙到您管制的服务器也须要从新构建应用程序。你有工夫和人去做吗? 6. 无服务器是绕过 IT 的一种办法吗?应用无服务器作为绕过 IT 部门的办法可能不是最好的主见。编写不合规且容易受到攻打的代码太容易了。相同,请应用 DevOps 办法并与所有利益相关者会面以提出解决方案。 7. 安全性如何?无服务器架构的安全性存在问题。云提供商提供了一些现成的选项,例如 Amazon GuardDuty,然而它们可能有很多限度,限度了无服务器提供的灵活性。实现平安的无服务器应用程序须要大量的思考。 本文转载自 Serverless Life 公众号,转载请分割原作者。 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

May 25, 2021 · 1 min · jiezi

关于kubernetes:K8S-有状态的应用和示例-1

本示例演示了在 Kubernetes 上装置 WordPress 和 MySQL,这两个利用都应用 PersistentVolumes 和 PersistentVolumeClaims 保留数据。 PersistentVolume(PV)是一块集群里由管理员手动提供,或 kubernetes 通过 StorageClass 动态创建的存储。 PersistentVolumeClaim(PVC)是一个满足对 PV 存储须要的申请。PersistentVolumes 和 PersistentVolumeClaims 独立于 Pod 生命周期,在 Pod 重启、从新调度或删除过程中均能保留数据。 本示例中应用的是单实例 WordPress 和 MySQL Pods,故而不适用于生产环境。 :tipping_hand_man: 本教程中提供的文件应用 GA Deployment API,并且特定于 kubernetes 1.9 或更高版本。如果您心愿将本教程与 Kubernetes 的晚期版本一起应用,请相应地更新 API 版本,或参考本教程的晚期版本。 一、教程指标创立 PersistentVolumeClaims 和 PersistentVolumes创立kustomization.yaml应用 Secret 生成器MySQL 资源配置WordPress 资源配置利用整个 kustomization 目录 kubectl apply -k ./革除示例二、筹备开始你必须领有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,参考 用 kubeadm 在 Debian 或 Ubuntu 中创立 k8s 集群。 ...

May 25, 2021 · 2 min · jiezi

关于kubernetes:K8S-无状态应用程序和示例

无状态利用是不将数据或利用状态存储到集群或永久性存储空间的利用。相同,该利用将数据和利用状态保留在客户端,从而使无状态利用更具可伸缩性。例如,前端利用是无状态利用:您能够部署多个正本以进步其可用性,在需要较低时能够缩小正本,并且正本无需具备惟一标识。 一、向外公开 IP 地址1 筹备工作官网文档中的筹备工作要求有一个云供应商提供的 Kubernetes 集群,因为示例中应用的是一个内部负载均衡器。 但对于开发环境,在阿里云、华为云或腾讯云特意创立一个 Kubernetes 集群是没有必要的,所以还是以本地集群为例。 2 教程指标运行 5 个 Hello World 的利用实例创立一个公开内部 IP 地址的 Service 对象应用 Service 对象拜访正在运行的应用程序3 为有 5 个实例的应用程序创立服务3.1 在集群中运行 Hello World 应用程序应用配置文件创立,service/load-balancer-example.yaml : apiVersion: apps/v1kind: Deploymentmetadata: labels: app.kubernetes.io/name: load-balancer-example name: hello-worldspec: replicas: 5 selector: matchLabels: app.kubernetes.io/name: load-balancer-example template: metadata: labels: app.kubernetes.io/name: load-balancer-example spec: containers: # 我从谷歌仓库中拉的镜像源 - image: registry.cn-hangzhou.aliyuncs.com/google_samples_thepoy/node-hello:1.0 name: hello-world ports: - containerPort: 8080利用配置文件(本地配置文件或近程配置文件皆可): kubectl apply -f load-balancer-example.yaml# 或kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml这个命令会创立一个 Deployment 对象和一个关联的 ReplicaSet 对象。其中 ReplicaSet 对象有 5 个 Pods,每个 Pod 都运行 Hello World 应用程序。 ...

May 24, 2021 · 3 min · jiezi

关于kubernetes:用-kubeadm-在-Debian-或-Ubuntu-中创建-k8s-集群

本文依据官网教程批改而来。 一、筹备要遵循本指南,你须要: 一个或多个 Debian 9 / Ubuntu 18.04 虚拟机,物理机当然更好每台机器 2GB 以上的内存用作管制平台节点的虚拟机至多有 2 个CPU集群中所有计算机之间具备齐全的网络连接更改主节点 hostname 为 k8s-master,子节点依据数量批改 hostname 为 k8s-node-n,每个节点都要批改 hosts文件,增加所有节点的 ip 和 hostname 的映射关系,如: # k8s cluster nodes start192.168.31.221 k8s-master192.168.31.222 k8s-node-1192.168.31.231 k8s-node-2# k8s cluster nodes end二、教程开始1 装置 kubeadm1.1 容许 iptables 查看桥接流量确保 br_netfilter 模块被加载。这一操作能够通过运行 lsmod | grep br_netfilter 来实现。若要显式加载该模块,可执行 sudo modprobe br_netfilter。 为了让你的 Linux 节点上的 iptables 可能正确地查看桥接流量,你须要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。例如: cat <<EOF | sudo tee /etc/modules-load.d/k8s.confbr_netfilterEOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsudo sysctl --system1.2 装置 Docker参考 docker-ce | 镜像站应用帮忙 | 北京外国语大学开源软件镜像站 | BFSU Open Source Mirror。 ...

May 24, 2021 · 3 min · jiezi

关于kubernetes:Kubernetes中部署Docker-registry271并通过containerd实现拉取镜像到应用Pod的部署

这里次要介绍一下公有仓库(HTTPS)在Kubernetes中部署的问题,因为Kubernetes将弃用docker,因而这里次要介绍以下应用containerd替换docker后如何从公有仓库拉取镜像并实现镜像的部署。 下载registry2.7.1的镜像文件阐明:在应用registry2.3.1的话会有一个重大的问题,问题就是在yaml或者在命令行通过ctr和crictl命令拉取镜像时携带的sha256值和公有仓库中镜像存储的理论sha256不统一,因而会报找不到镜像的问题:not found: not found的谬误,所以尽量应用2.7.1版本以上的镜像,并且2.7.1版本以上的仓库反对加密镜像的存储。 docker pull registry:2.7.1生成证书文件这里阐明一下:因为containerd默认的仓库为docker.io,因而在创立公有仓库时应用IP地址才会在前面的操作中避开它主动连贯到默认仓库的问题,因而在制作证书的这步就要提前思考好该问题,因为在证书制作的过程中CN字段的值就要设置为IP地址。 # 在集群中某个节点找个地位新建一个文件夹mkdir docker-registrycd docker-registrymkdir certs# 生成2048位的私钥,也能够生成4096位的,看本人需要openssl genrsa -out Yuan.key 2048# 生成证书申请文件openssl req -new -key Yuan.key -subj "/CN=10.131.82.53" -out Yuan.csr# 将IP地址写入一个文件,为了解决上述所说的那个问题echo subjectAltName = IP:10.131.82.53>extfile.cnf# 这里的ca我就应用了集群自带的,在/etc/kubernetes/pki/下openssl x509 -req -in Yuan.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out Yuan.crt -days 5000 # 查看证书信息openssl x509 -in Yuan.crt -noout -text# 将生存的证书信息追加到零碎的证书管理文件后cat Yuan.crt >> /etc/pki/tls/certs/ca-bundle.crt在大略两头的地位会看到一个相似下图的信息: 不然会报如下的谬误: x509: cannot validate certificate for 10.131.82.53 because it doesn't contain any IP SANs生成明码认证文件yum install httpd-toolsmkdir authhtpasswd -Bbn Yuan Abcd123456 > /home/docker-registry/auth/htpasswd部署公有仓库编写部署文件docker-registry.yaml ...

May 21, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes实用技巧

kubectl命令太多太长记不住? 查看资源缩写kubectl describe 回车配置kubectl主动补全命令source <(kubectl completion bash)kubectl写yaml太累,找样例太麻烦? 用run命令生成kubectl run --image=nginx my-deploy -o yaml --dry-run > my-deploy.yaml用get命令导出kubectl get statefulset/foo -o=yaml --export > new.yamlPod亲和性上面字段的拼写遗记了kubectl explain pod.spec.affinity.podAffinity监控集群组件 集群整体状态kubectl cluster-info 更多集群信息kubectl cluster-info dump组件metricscurl localhost:10250/stats/summary组件监控情况curl localhost:10250/healthz治理K8s组件日志 # 组件日志/var/log/kube-apiserver.log/var/log/kube-proxy.log/var/log/kube-controller-manager.log/var/log/kubelet.log应用systemd治理 journalctl -u kubelet 应用K8s插件部署 kubectl logs -f kube-proxy治理K8s利用日志 从容器规范输入截获 kubectl logs -f {pod name} -c {container name} docker logs -f {docker name}日志文件挂载到主机目录 apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - image: test-webserver name: test-container volumeMounts: - mountPath: /log name: log-volume volumes: - name: log-volume hostPath: path: /var/k8s/logDeployment降级与回滚 ...

May 20, 2021 · 1 min · jiezi

关于kubernetes:建设-Kubernetes-生产环境的-16条建议

Kubernetes是用于构建高度可扩大零碎的弱小工具。后果,许多公司曾经开始或正在打算应用它来协调生产服务。可怜的是,像大多数弱小的技术一样,Kubernetes也很简单。咱们整顿了以下清单,以帮忙你生产环境最佳实际Kubernetes(Kubernetes生产环境最佳实际)。 容器最佳实际Kubernetes提供了一种编排容器化服务的办法,因而,如果您没有按程序实际你的容器,那么集群一开始就不会处于良好状态。请依照以下提醒开始。 1、应用精简根底镜像what:容器是内置在零碎镜像中的应用程序堆栈。从业务逻辑到内核的所有内容都打包在一起。最小的镜像会占用尽可能多的OS,并迫使您显式增加所需的任何组件。 why:仅在您的容器中包含要应用的软件,同时具备性能和安全性方面的益处。磁盘上的字节数更少,复制镜像的网络流量更少,并且潜在的攻击者无法访问的工具也更少。 how:Alpine Linux是一个风行的抉择,并具备宽泛的反对。 2、应用提供最佳失常运行工夫的注册表what:注册表是镜像的存储库,使这些镜像可供下载和启动。在指定部署配置时,您须要指定从何处获取门路为<registry> / <remote name>:<tag>的镜像: why:您的集群须要镜像去运行。 how:大多数云提供商都提供公有镜像注册表服务:Google提供Google容器注册表,AWS提供Amazon ECR,Microsoft提供Azure容器注册表。 认真调研,并抉择提供最佳失常运行工夫的私人注册表。因为您的群集将依附您的注册表来启动软件的较新版本,因而任何停机工夫都将阻止对正在运行的服务进行更新。 3、应用ImagePullSecrets对您的注册表进行身份验证what:ImagePullSecrets是Kubernetes对象,可让您的群集通过注册表进行身份验证,因而注册表能够抉择谁能够下载镜像。 why:如果您的注册表足够公开,能够让集群从中提取镜像,则表明注册表足够公开,须要身份验证。 how:Kubernetes网站在配置ImagePullSecrets方面有很好的演练,该示例应用Docker作为示例注册表。 治理你的集群微服务实质上是一团糟。应用微服务的许多益处来自在服务级别上强制职责拆散,无效地为后端的各个组件创立了形象。一些很好的例子是运行与业务逻辑拆散的数据库,运行软件的独自开发和生产版本,或拆散出程度可伸缩的流程。 具备不同服务执行不同职责的阴暗面是,它们不能被平等看待。值得庆幸的是,Kubernetes为您提供了许多解决此问题的工具。 4、应用命名空间隔离环境what:命名空间是Kubernetes中最根本,最弱小的分组机制。它们简直像虚构集群一样工作。默认状况下,Kubernetes中的大多数对象仅限于一次影响单个名称空间。 why:大多数对象都是在命名空间范畴内定义的,因而您必须应用命名空间。鉴于它们提供了弱小的隔离性,因而它们非常适合隔离具备不同目标的环境,例如用户服务的生产环境和严格用于测试的环境,或者拆散反对单个应用程序的不同服务堆栈,例如放弃平安解决方案的工作负载与您本人的应用程序离开。一个好的教训法令是按资源分配划分名称空间:如果两组微服务将须要不同的资源池,请将它们放在独自的名称空间中。 how:它是大多数对象类型的元数据的一部分: 请留神,您应该始终创立本人的名称空间,而不要依赖“默认”名称空间。Kubernetes的默认设置通常会为开发人员优化以最小的摩擦,这通常意味着甚至放弃最根本的安全措施。 5、通过Labels 治理您的集群what:Labels是组织集群的最根本且可扩大的办法。它们容许您创立用于分隔Kubernetes对象的任意key:value对。例如,您能够创立一个标签密钥,将解决敏感信息的服务与不解决敏感信息的服务区离开。 why:如前所述,Kubernetes应用标签进行组织,但更具体地说,它们用于抉择。这意味着,当您想给Kubernetes对象援用某个命名空间中的一组对象时(例如通知网络策略容许哪些服务互相通信),请应用它们的标签。因为它们代表了这种开放式组织类型,因而请尽最大致力使事件简单化,并且仅在须要选择权的中央创立标签。 how:标签是一个简略的规范字段,您能够将其增加到YAML文件中: 6、应用正文来跟踪重要的零碎更改等what:正文是能够附加到pod的任意键值元数据,就像标签一样。然而,Kubernetes不会读取或解决批注,因而围绕您能够和不能应用批注进行正文的规定相当宽松,并且不能用于抉择。 why:它们可帮忙您跟踪容器化应用程序的某些重要性能,例如版本号或首次启动的日期和工夫。仅在Kubernetes的上下文中,正文是一种无能为力的结构,然而当用于跟踪重要的零碎更改时,正文能够成为开发人员和经营团队的资产。 how:正文是相似于标签的规格字段。 让你的集群更加平安好了,您曾经建设了集群并按所需形式组织了-当初呢?好吧,接下来是要确保一些平安。您可能会破费毕生的工夫来学习,但仍未发现有人能够侵入您零碎的所有形式。博客文章的内容空间要比毕生少得多,因而您必须满足一些强烈的倡议。 7、应用RBAC施行访问控制what:RBAC(基于角色的访问控制)使您能够管制谁能够查看或批改群集的不同方面。 why:如果要遵循最小特权准则,则须要设置RBAC来限度群集用户和部署可能执行的操作。 how:如果要设置本人的集群(即不应用托管的Kube服务),请确保应用''--authorization-mode = Node,RBAC“启动您的kube apiserver。如果应用托管的Kubernetes例如,您能够通过查问用于启动kube apiserver的命令来查看它是否设置为应用RBAC。惟一通用的查看办法是在kubectl cluster-info dump的输入中查找“ --authorization-mode ...”。 RBAC关上后,您须要更改默认权限以适宜您的需要。Kubernetes我的项目站点在此处提供了无关设置角色和RoleBindings的演练。托管的Kubernetes服务须要启用RBAC的自定义步骤-请参阅Google的GKE指南或Amazon的AKS指南。 8、应用Pod安全策略避免危险行为what:Pod安全策略是一种资源,十分相似于Deployment或Role,能够通过kubectl以雷同的形式创立和更新。每个都有一个标记汇合,可用来避免集群中特定的不平安行为。 why:如果创立Kubernetes的人认为限度这些行为足够重要,能够创立一个非凡的对象来解决它,那么它们很重要。 how:让他们工作可能会令人丧气。我倡议启动并运行RBAC,而后在此处查看Kubernetes我的项目的指南。在我看来,最重要的应用是避免特权容器和对主机文件系统的写访问,因为它们代表了容器形象中一些较透露的局部。 9、应用网络策略施行网络管制/防火墙what:网络策略是容许您明确申明容许哪些流量的对象,而Kubernetes将阻止所有其余不符合标准的流量。 why:限度群集中的网络流量是一项根本且重要的安全措施。默认状况下,Kubernetes启用所有服务之间的开放式通信。保留此“默认凋谢”配置意味着与Internet连贯的服务与存储敏感信息的数据库仅一步之遥。 how:有一篇文章写的很好,具体详情查看这里。 10、应用Secrets来存储和治理必要的敏感信息what:Secrets是您如何在Kubernetes中存储敏感数据,包含明码,证书和令牌。 why:无论您是施行TLS还是限度拜访,您的服务都可能须要互相认证,与其余第三方服务或您的用户进行认证。 how:Kubernetes我的项目在此处提供了指南。一个要害倡议:防止将秘密作为环境变量加载,因为在您的环境中领有秘密数据通常是不平安的。相同,将秘密装入容器中的只读卷中-您能够在本 Use Secrets中找到一个示例。 11、应用镜像扫描辨认和修复镜像破绽what:扫描仪查看镜像中装置的组件。从操作系统到应用程序堆栈的所有内容。扫描程序对于找出镜像所蕴含的软件版本中存在哪些破绽十分有用。 why:破绽始终在风行的开源软件包中发现。一些驰名的例子是Heartbleed和Shellshock。您将想晓得这些破绽在零碎中的什么地位,以便您晓得哪些镜像可能须要更新。 how:扫描仪是基础设施中相当常见的局部-大多数云提供商都提供了产品。如果您想本人托管一些货色,那么开源Clair我的项目是一个受欢迎的抉择。 放弃集群稳固Kubernetes代表很高的技术栈。您领有在嵌入式内核上运行的应用程序,在VM中运行的应用程序(在某些状况下甚至在裸机上),以及Kubernetes本人的服务共享硬件。思考到所有这些因素,在物理和虚构畛域中很多事件都会出错,因而尽可能升高开发周期的危险十分重要。Kubernetes四周的生态系统曾经开发了一系列最佳实际,以使事件尽可能保持一致。 12、遵循CI / CD办法what:继续集成/继续部署是一种过程哲学。置信对代码库进行的每次批改都应减少增量值,并筹备投入生产。因而,如果代码库中的某些内容产生了更改,则可能要启动服务的新版本,以运行测试。 why:遵循CI / CD能够帮忙您的工程团队在日常工作中牢记品质。如果呈现问题,修复问题将成为整个团队的事不宜迟,因为尔后依赖于已合成的提交的所有更改也将被合成。 how:因为云部署软件的衰亡,CI / CD越来越风行。因而,您能够从托管或自托管的泛滥杰出产品中进行抉择。如果您的团队比拟小,我建议您采纳托管路线,因为节俭的工夫和精力相对值得您付出额定的费用。 ...

May 20, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes安全之鉴权

Authorization下面认证过程,只是确认通信的单方都确认了对方是可信的,能够互相通信。而鉴权是确定申请方有哪些资源的权限。API Server目前反对以下几种受权策略(通过API Server的启动参数“--authorization-mode”设置) AlwaysDeny:示意回绝所有的申请,个别用于测试AlwaysAllow:容许接管所有申请,如果集群不须要受权流程,则能够采纳该策略ABAC(Attribute-Based Access Control):基于属性的访问控制,示意应用用户配置的受权规定对用户申请进行匹配和管制Webbook:通过调用内部REST服务对用户进行受权RBAC(Role-Based Access Control):基于角色的访问控制,现行默认规定RBAC受权模式RBAC(Role-Based Access Control)基于角色的访问控制,在Kubernetes 1.5中引入,现行版本成为默认规范。绝对其它访问控制形式,领有以下劣势: 对集群中的资源和非资源均领有残缺的笼罩整个RBAC齐全由几个API对象实现,同其它API对象一样,能够用kubectl或API进行操作能够在运行时进行调整,无需重启API ServerⅠ、RBAC的API资源对象阐明 RBAC引入了4个新的顶级资源对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding,4种对象类型均能够通过kubectl与API操作 须要留神的是Kubenetes并不会提供用户治理,那么User、Group、ServiceAccount指定的用户又是从哪里来的呢?Kubenetes组件(kubectl、kube-proxy)或是其余自定义的用户在向CA申请证书时,须要提供一个证书申请文件 { "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "HangZhou", "L": "XS", "O": "system:masters", "OU": "System" } ]}API Server会把客户端证书的CN字段作为User,把names.O字段作为Group kubelet应用TLS Bootstaping认证时,API Server能够应用Bootstrap Tokens或者Token authenticationfile验证=token,无论哪一种,Kubenetes都会为token绑定一个默认的User和Group Pod应用ServiceAccount认证时,service-account-token中的JWT会保留User信息 有了用户信息,再创立一对角色/角色绑定(集群角色/集群角色绑定)资源对象,就能够实现权限绑定了 Role and ClusterRole在RBAC API中,Role示意一组规定权限,权限只会减少(累加权限),不存在一个资源一开始就有很多权限而通过RBAC对其进行缩小的操作;Role能够定义在一个namespace中,如果想要跨namespace则能够创立ClusterRole kind: RoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata: namespace: default name: pod-readerrules:- apiGroups: [""] # "" indicates the core API group resources: ["pods"] verbs: ["get","watch","list"]ClusterRole具备与Role雷同的权限角色控制能力,不同的是ClusterRole是集群级别的,ClusterRole能够用于: ...

May 19, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes安全之认证

机制阐明Kubernetes作为一个分布式集群的管理工具,保障集群的安全性是其一个重要的工作。API Server是集群外部各个组件通信的中介,也是内部管制的入口。所以Kubernetes的平安机制根本就是围绕爱护API Server来设计的。Kubernetes应用了认证(Authentication)、鉴权(Authorization)、准入管制(AdmissionControl)三步来保障API Server的平安 AuthenticationHTTP Token认证:通过一个Token来辨认非法用户 HTTP Token的认证是用一个很长的非凡编码方式的并且难以被模拟的字符串- Token来表白客户的一种形式。Token是一个很长的很简单的字符串,每一个Token对应一个用户名存储在API Server能拜访的文件中。当客户端发动API调用申请时,须要在HTTP Header里放入TokenHTTP Base认证:通过用户名+明码的形式认证 用户名+:+明码用BASE64算法进行编码后的字符串放在HTTP Request中的HeatherAuthorization域里发送给服务端,服务端收到后进行编码,获取用户名及明码最严格的HTTPS证书认证:基于CA根证书签名的客户端身份认证形式Ⅰ、HTTPS证书认证: Ⅱ、须要认证的节点 两种类型 Kubenetes组件对API Server的拜访:kubectl、Controller Manager、Scheduler、kubelet、kube-proxyKubernetes治理的Pod对容器的拜访:Pod(dashborad也是以Pod模式运行)安全性阐明 Controller Manager、Scheduler与API Server在同一台机器,所以间接应用API Server的非平安端口拜访,--insecure-bind-address=127.0.0.1kubectl、kubelet、kube-proxy拜访API Server就都须要证书进行HTTPS双向认证证书颁发 手动签发:通过k8s集群的跟ca进行签发HTTPS证书主动签发:kubelet首次拜访API Server时,应用token做认证,通过后,Controller Manager会为kubelet生成一个证书,当前的拜访都是用证书做认证了Ⅲ、kubeconfig kubeconfig文件蕴含集群参数(CA证书、API Server地址),客户端参数(下面生成的证书和私钥),集群context信息(集群名称、用户名)。Kubenetes组件通过启动时指定不同的kubeconfig文件能够切换到不同的集群 Ⅳ、ServiceAccount Pod中的容器拜访API Server。因为Pod的创立、销毁是动静的,所以要为它手动生成证书就不可行了。Kubenetes应用了Service Account解决Pod拜访API Server的认证问题 Ⅴ、Secret与SA的关系 Kubernetes设计了一种资源对象叫做Secret,分为两类,一种是用于ServiceAccount的service-accounttoken,另一种是用于保留用户自定义窃密信息的Opaque。ServiceAccount中用到蕴含三个局部:Token、ca.crt、namespace token是应用API Server私钥签名的JWT。用于拜访API Server时,Server端认证ca.crt,根证书。用于Client端验证API Server发送的证书namespace,标识这个service-account-token的作用域名空间kubectl get secret --all-namespaces kubectl describe secret default-token-5gm9r --namespace=kube-system默认状况下,每个namespace都会有一个ServiceAccount,如果Pod在创立时没有指定ServiceAccount,就会应用Pod所属的namespace的ServiceAccount 总结

May 19, 2021 · 1 min · jiezi

关于kubernetes:阿里云开发者学院电子书Dubbo分布式服务治理实战重磅来袭

简介:Dubbo 是阿里巴巴开源的高性能分布式 RPC 服务治理框架,曾经募捐给 Apache 开源组织,最新的版本是 3.0。在阿里巴巴、工行、电信、银联、中国人寿、网易、滴滴、当当等互联网公司中大规模应用,历经双 11 等流量测验。Dubbo提供了六大外围能力:面向接口代理的高性能 RPC 调用、智能容错和负载平衡、服务主动注册和发现、高度可扩大能力、运行期流量调度、可视化的服务治理与运维。Dubbo性能非常弱小,将来反对 Go、K8S云原生等技术,代表着高性能微服务架构的倒退方向。 Dubbo的能力如此弱小,将来倒退更具备广大的空间,那怎样才能理解Dubbo的原理及实战呢?Alibaba Java 技术图谱课程系列电子书《Dubbo分布式服务治理实战》来啦!阿里云开发者学院举荐配套教材,品牌有保障! 本书亮点: Dubbo分布式架构原理模仿淘宝双11大规模服务集群治理Dubbo3.0高性能微服务的倒退方向点击即可收费下载 《Dubbo分布式服务治理实战》 配套视频课程地址:https://developer.aliyun.com/learning/course/72 精彩内容领先看 也能够PC端点击https://developer.aliyun.com/topic/download?id=1219 下载电子书 Dubbo是阿里巴巴开源的高性能分布式 RPC 服务治理框架,曾经募捐给 Apache 开源组织,最新的版本是 3.0。在阿里巴巴、工行、电信、银联、中国人寿、网易、滴滴当 当等互联网公司中有大规模应用,历经双 11 等流量测验。 通过本书你能够学到理解并把握Dubbo3.0分布式服务治理框架新个性实际Dubbo分布式加与淘宝双 11 大规模服 务集群治理、Dubbo 订单服务集群调用等实战Dubbo相比传统分布式框架有很大差异,Dubbo 自身解决的问题不仅仅是服务调用,致力于提供高性能和透明化的 RPC 近程服务调用计划,以及 SOA 服务治理计划。所以相比传统 RPC,在架构档次上又做了一次很重要的降级,这个课程是作为 Java 服务课程前置的十分重要的学习课程。 点击链接即可收费观看配套视频进行学习:https://developer.aliyun.com/learning/course/72 福利指南Alibaba Java 技术图谱由“Java课程专家组”倾力打造的行业权威图谱,11个知识点,35门课程 ,近千课时,3个体验场景,19场公开课。从新手入门,到高级工程师进阶,从实践学习,到实际利用,一张图谱讲透Java ! 点击立刻收费学。https://developer.aliyun.com/graph/java藏经阁系列电子书阿里云开发者社区——藏经阁系列电子书,汇聚了一线大厂的技术积淀精髓,爆款一直。点击链接获取海量收费电子书:https://developer.aliyun.com/ebook 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

May 19, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes集群调度

简介Scheduler是kubernetes的调度器,次要的工作是把定义的pod调配到集群的节点上。听起来非常简单,但有很多要思考的问题: 偏心:如何保障每个节点都能被分配资源资源高效利用:集群所有资源最大化被应用效率:调度的性能要好,可能尽快地对大批量的pod实现调度工作灵便:容许用户依据本人的需要管制调度的逻辑Sheduler是作为独自的程序运行的,启动之后会始终坚挺API Server,获取PodSpec.NodeName为空的pod,对每个pod都会创立一个binding,表明该pod应该放到哪个节点上 调度过程调度分为几个局部:首先是过滤掉不满足条件的节点,这个过程称为predicate;而后对通过的节点依照优先级排序,这个是priority;最初从中抉择优先级最高的节点。如果两头任何一步骤有谬误,就间接返回谬误 Predicate有一系列的算法能够应用: PodFitsResources:节点上残余的资源是否大于pod申请的资源PodFitsHost:如果pod指定了NodeName,查看节点名称是否和NodeName匹配PodFitsHostPorts:节点上曾经应用的port是否和pod申请的port抵触PodSelectorMatches:过滤掉和pod指定的label不匹配的节点NoDiskConflict:曾经mount的volume和pod指定的volume不抵触,除非它们都是只读如果在predicate过程中没有适合的节点,pod会始终在pending状态,一直重试调度,直到有节点满足条件。通过这个步骤,如果有多个节点满足条件,就持续priorities过程:依照优先级大小对节点排序 优先级由一系列键值对组成,键是该优先级项的名称,值是它的权重(该项的重要性)。这些优先级选项包含: LeastRequestedPriority:通过计算CPU和Memory的使用率来决定权重,使用率越低权重越高。换句话说,这个优先级指标偏向于资源应用比例更低的节点BalancedResourceAllocation:节点上CPU和Memory使用率越靠近,权重越高。这个应该和下面的一起应用,不应该独自应用ImageLocalityPriority:偏向于曾经有要应用镜像的节点,镜像总大小值越大,权重越高通过算法对所有的优先级我的项目和权重进行计算,得出最终的后果 自定义调度器除了kubernetes自带的调度器,你也能够编写本人的调度器。通过spec:schedulername参数指定调度器的名字,能够为pod抉择某个调度器进行调度。比方上面的pod抉择my-scheduler进行调度,而不是默认的default-scheduler: apiVersion: v1kind: Podmetadata: name: annotation-second-scheduler labels: name: multischeduler-examplespec: schedulername: my-scheduler containers: - name: pod-with-second-annotation-container image: gcr.io/google_containers/pause:2.0Node亲和性pod.spec.nodeAfinity preferredDuringSchedulingIgnoredDuringExecution:软策略requiredDuringSchedulingIgnoredDuringExecution:硬策略requiredDuringSchedulingIgnoredDuringExecution apiVersion: v1kind: Podmetadata: name: affinity labels: app: node-affinity-podspec: containers: - name: with-node-affinity image: myapp:v1 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: NotIn values: - k8s-node02preferredDuringSchedulingIgnoredDuringExecution apiVersion: v1kind: Podmetadata: name: affinity labels: app: node-affinity-podspec: containers: - name: with-node-affinity image: myapp:v1 affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: source operator: In values: - qikqiak混合应用 ...

May 18, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes存储之PCPVC

概念PersistentVolume(PV) 是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV也是集群中的资源。PV是Volume之类的卷插件,但具备独立于应用PV的Pod的生命周期。此API对象蕴含存储实现的细节,即NFS、iSCSI或特定于云供应商的存储系统 PersistentVolumeClaim(PVC) 是用户存储的申请。它与Pod类似。Pod耗费节点资源,PVC耗费PV资源。Pod能够申请特定级别的资源(CPU和内存)。申明能够申请特定的大小和拜访模式(例如,能够以读/写一次或只读屡次模式挂载) 动态pv 集群管理员创立一些PV。它们带有可供群集用户应用的理论存储的细节。它们存在于Kubernetes API中,可用于生产 动静 当管理员创立的动态PV都不匹配用户的PersistentVolumeClaim时,集群可能会尝试动静地为PVC创立卷。此配置基于StorageClasses:PVC必须申请[存储类],并且管理员必须创立并配置该类能力进行动态创建。申明该类为""能够无效地禁用其动静配置要启用基于存储级别的动静存储配置,集群管理员须要启用API server上的DefaultStorageClass[准入控制器]。例如,通过确保DefaultStorageClass位于API server组件的--admission-control标记,应用逗号分隔的有序值列表中,能够实现此操作 绑定 master中的管制环路监督新的PVC,寻找匹配的PV(如果可能),并将它们绑定在一起。如果为新的PVC动静调配PV,则该环路将始终将该PV绑定到PVC。否则,用户总会失去他们所申请的存储,然而容量可能超出要求的数量。一旦PV和PVC绑定后,PersistentVolumeClaim绑定是排他性的,不论它们是如何绑定的。PVC跟PV绑定是一对一的映射 长久化卷申明的爱护 PVC爱护的目标是确保由pod正在应用的PVC不会从零碎中移除,因为如果被移除的话可能会导致数据失落当启用PVC爱护alpha性能时,如果用户删除了一个pod正在应用的PVC,则该PVC不会被立刻删除。PVC的删除将被推延,直到PVC不再被任何pod应用 长久化卷类型PersistentVolume类型以插件模式实现。Kubernetes目前反对以下插件类型: GCEPersistentDiskAWSElasticBlockStore AzureFile AzureDisk FC (Fibre Channel)FlexVolumeFlockerNFS iSCSIRBD (Ceph Block Device) CephFSCinder (OpenStack block storage) Glusterfs VsphereVolume Quobyte VolumesHostPathVMware Photon Portworx Volumes ScaleIO Volumes StorageOS长久卷演示代码 apiVersion: v1kind: PersistentVolumemetadata: name: pv0003spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: slow mountOptions: - hard - nfsvers=4.1 nfs: path: /tmp server: 172.17.0.2PV拜访模式PersistentVolume能够以资源提供者反对的任何形式挂载到主机上。如下表所示,供应商具备不同的性能,每个PV的拜访模式都将被设置为该卷反对的特定模式。例如,NFS能够反对多个读/写客户端,但特定的NFS PV可能以只读形式导出到服务器上。每个PV都有一套本人的用来形容特定性能的拜访模式 ReadWriteOnce——该卷能够被单个节点以读/写模式挂载ReadOnlyMany——该卷能够被多个节点以只读模式挂载ReadWriteMany——该卷能够被多个节点以读/写模式挂载在命令行中,拜访模式缩写为: ...

May 18, 2021 · 1 min · jiezi

关于kubernetes:从零开始的k8s之旅四集群架构

首先来看一个最简略的零碎架构图:由一个主节点和若干工作节点组成,开发者将一个利用列表提交到主节点,k8s会将它们部署到集群的工作节点,组件被部署在哪个节点对开发者和系统管理员来说都不必关怀。在这个层级上,k8s能够看成是集群的操作系统,帮忙开发者聚焦外围利用性能,不用去思考额定的服务如:服务发现、扩容、负载平衡、自复原或者选举leader等,同时也可能帮忙运维团队获取更高的资源利用率。视角拉近一点会看到k8s的架构是如下所示,在硬件层面,一个k8s集群由很多节点形成,次要分为两类: 主节点,控制面板(master)工作节点(worker)各节点具备的组件及其性能可参考我之前的文章[k8s-设计理念-原理图](https://segmentfault.com/a/1190000017535476) 最初看一个在k8s集群中是如何部署应用程序的繁难流程图。右边的容器被分为3组,这些容器组被称为pod,旁边的数字代表pod的正本数量,后续将会具体解说。pod个别由deployment控制器负责创立,开发人员提交的deployment.yaml外面会蕴含创立pod所需的信息,上面是一个nginx-deployment.yaml的例子。 apiVersion: apps/v1 // 以后应用的apiVersion版本kind: Deployment // 要创立的资源类型metadata: // 该资源的元数据,name是必须的元数据项 name: nginx-deployment labels: app: nginxspec: // 该Deployment的规格阐明 replicas: 2 // 正本数量 selector: // label选择器 matchLabels: app: nginx template: // 定义Pod的模板,这是配置文件的重要局部 metadata: // 定义Pod的元数据,至多要定义一个label labels: app: nginx spec: // 形容Pod的规格,此局部定义Pod中每一个容器的属性,name和image是必须的 containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80执行kubectl apply -f nginx-deployment.yaml通过 kubectl get 查看 nginx-deployment 的各种资源

May 18, 2021 · 1 min · jiezi

关于kubernetes:聊聊如何将gitlab-ci的环境变量透传给k8s-deploymentyaml

前言最近敌人接了一个外包,这家外包公司用gitlab来做cicd,敌人之前自动化部署基本上都是利用jenkins,没接触过过gitlab的cicd,敌人他对技术也是比拟有谋求,他发现这家公司k8s的yaml文件,很多字段其实能够抽出来,配合cicd动静传入,而不是把那些字段间接写死在yaml文件,比方docker镜像。刚好我之前也玩过一阵子基于gitlab的cicd,他就问我有没有什么思路,于是就有了本篇的写文素材 前置常识1、如何用gitlab来做cicd能够查看官网链接,如下 https://docs.gitlab.com/ee/ci/README.html 2、envsubst命令理解a、envsubst的作用这个命令能够把环境变量传递给文件,并实现文件的变量替换,要替换的变量格局$ {var}或$ var b、envsubst如何应用替换环境变量stdin输入到stdout:echo '{{$HOME}}' | envsubst将输出文件中的环境变量替换为stdout:envsubst < {{path/to/input_file}}将输出文件中的环境变量替换为文件,并将其输入到文件中: envsubst < {{path/to/input_file}} > {{path/to/output_file}}用空格分隔的列表,替换输出文件中的环境变量:envsubst '{{$USER $SHELL $HOME}}' < {{path/to/input_file}}上述命令内容来自如下博文,因为命令没有几行,我就也贴了上来 https://blog.csdn.net/oopxiajun2011/article/details/111668011 注: 在mac上,须要装置gettext,能力应用envsubst c、如何利用envsubst替换k8s deployment.yaml假如deployment.yaml有个镜像内容形如下 image: $DEPLOY_PROCJECT_IMAGE咱们能够执行如下命令 envsubst < deployment.yml | kubectl apply -f -这行命令的意思就是读取deployment.yml,并通过envsubst 把deployment.yml中的$DEPLOY_PROCJECT_IMAGE替换成相应的环境变量,并通过管道,把deployment.yml的内容传递给kubectl 如何将gitlab ci的环境变量透传给k8s deployment.yaml示例: 注: 敌人的公司采纳业务服务和部署服务.gitlab-ci.yml隔离,业务服务.gitlab-ci.yml通过触发部署服务的触发器进行部署,示例只列和本文相干的内容,其余配置信息做了清理 1、业务服务的.gitlab-ci.yml配置如下variables: REGISTRY: xxx.docker.com PROJECTNAME: hello-demo IMAGE: demo/hello-demo DEPLOY_VERSION: $CI_COMMIT_TIMESTAMPstages: - triggerDeploytriggerDeployK8S: stage: triggerDeploy image: $REGISTRY/devops/busyboxplus:curl script: - curl -X POST -F token=fc4754200aa027baedf97cf7d45a02 -F ref=master -F "variables[DEPLOY_PROJECT_NAME]=$PROJECTNAME" -F "variables[DEPLOY_PROCJECT_IMAGE]=$REGISTRY/$IMAGE:dev" -F "variables[DEPLOY_VERSION]=$DEPLOY_VERSION" http://xxx.gitlab.com/api/v4/projects/32/trigger/pipeline only: - dev tags: - dev其中 ...

May 18, 2021 · 1 min · jiezi

关于kubernetes:自建K8S迁移镜像应用至阿里云ACK最佳实践

简介:本最佳实际构建以下场景: 1、以河源ECS构建Harbor仓库,模仿IDC的镜像仓库服务。 2、以河源ECS构建Registry仓库,模仿IDC的镜像仓库服务。 3、以河源地区模的ECS搭建K8S集群,模仿线下IDC的K8S环境。 4、应用velero对云上的K8S利用进行定期备份,并存至OSS上,确保利用数据不 失落。 中转最佳实际:【自建K8S迁徙镜像、利用至阿里云ACK最佳实际】 云栖号最佳实际:【点击查看更多上云最佳实际】 这里有丰盛的企业上云最佳实际,从典型场景入门,提供一系列我的项目实际计划,升高企业上云门槛的同时满足您的需要! 场景形容本最佳实际构建以下场景: 1、以河源ECS构建Harbor仓库,模仿IDC的镜像仓库服务。 3、以河源ECS构建Registry仓库,模仿IDC的镜像仓库服务。 4、以河源地区模的ECS搭建K8S集群,模仿线下IDC的K8S环境。 5、应用velero对云上的K8S利用进行定期备份,并存至OSS上,确保利用数据不失落。 利用场景自建harbor镜像仓库,将镜像迁徙到阿里云容器镜像服务OCR(含企业版)。自建Registry镜像仓库,将镜像迁徙到阿里云容器服务OCR(含企业版)。自建&IDC的K8S业务,通过velero将利用迁徙至阿里云容器服务ACK。通过velero将K8S(云上&云下均可)利用备份至OSS,确保配置数据同城&异地容灾。产品列表对象存储OSS云架构设计工具CADT容器服务Kubernetes 版ACK容器镜像服务ACR 中转最佳实际 》》 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

May 18, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes存储之volume

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要利用时会呈现一些问题,首先,当容器解体时,kubelet会重启它,然而容器的文件将失落---容器以洁净的状态(镜像最后的状态)重新启动,其次,在pod 中同时运行多个容器是,这些容器之间通常须要共享文件,Kubernetes中的volume 形象就很好的解决了这些问题。 背景Kubernetes中的卷有明确的寿命--与封装它的Pod雷同,所以,卷的生命比Pod中所有容器都长,当这个容器重启时数据任然得以保留,当然,当Pod不存在时,卷也将不复存在,兴许更重要的是,Kubernetes反对多种类型的卷,Pod能够同时应用任意数量的卷。 卷的类型Kubernetes反对一下类型的卷: awsElasticBlockStore azureDisk azureFile cephfs csi downwardAPI enptyDirfc flocker gcePersistenDisk gitRepo glusterfs hostPath iscsi local nfspersistenVolumeClaim prejected portworxVolume quobyte rbd scaleIO secretstorageos vsphereVolumeempthDir暂存空间,例如用于基于磁盘的合并排序用作长时间计算解体复原时的检查点Web服务器容器提供数据时,保留内容管理器容器提取的文件apiVersion: v1kind: Podmetadata: name: test-pdspec: containers: - image: k8s.gcr.io/test-webserver name: test-container volumeMounts: - mountPath: /cache name: cache-volume - name: liveness-exec-container image: busybox imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","sleep 6000s"] voluemMounts: - mountPath: /test name: cache-volume volumes: - name: cahce-volume emptyDir: {}hostPathhostPath 卷将主节点的文件系统中的文件或目录挂载到集群中 hostPath 的用处如下: 运行须要拜访的Docker外部的容器;应用/var/lib/docker 的hostPath在容器中运行cAdvisor;应用/dev/cgroups 的 hostPath除了所需的path 属性外,用户还能够为hostPaht 卷指定type ...

May 17, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes存储之Secret

Secret解决了明码、token、密钥等敏感数据的配置问题,而不须要把这些敏感数据裸露到镜像或者Pod Spec中,Secret能够以Volume或者环境变量的形式应用 Secret有三种类型: Service Account: 用来拜访Kubernetes API,有Kubernetes主动创立,并且会主动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount 目录中Opaque:base64编码格局的Secret,用来存储明码、密钥等kubernetes.io/dockerconfigjson:用来存储公有docker registry的认证信息Service AccountService Account用来拜访Kubernetes API,有Kubernetes主动创立,并且会主动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount 目录中 $ kubectl run nginx --image nginxdeployment "nginx" created$ kubectl get pods...$ kubectl exec nginx-xxx ls /run/secrets/kubernetes.io/serviceaccountca.crtnamespacetokenOpaque Secret1.创立阐明 $ echo -n "admin" | base64YWRtaW4=$ echo -n "1f2d1e2e67df" | base64MWYyZDFlMmU2N2Rmsecrets.yaml apiVersion: v1kind: Secretmetadata: name: mysecrettype: Opaquedata: password: MWYyZDFlMmU2N2Rm username: YWRtaW4=2.应用形式 2.1 将Secret挂载到Volume中 apiVersion: v1kind: Podmetadata: labels: name: secret-test name: secret-testspec: volumes: - name: secrets secret: secretName: mysecret containers: - image: myapp:v1 name: db volumeMounts: - name: secrets mountPath: "/etc/secrets" readOnly: true2.2 将Secret导入到环境变量中 ...

May 16, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes存储之ConfigMap

ConfigMap性能在Kubernetes1.2版本中引入,许多应用程序会从配置文件,命令行参数或环境变量中读取配置信息,ConfigMap API给咱们提供了向容器中注入配置信息的机制,ConfigMap能够被用来保留单个属性,也能够用来保留整个配置文件或者JSON二进制对象 ConfigMap的创立1.应用目录创立 $ ls docs/user-guide/configmap/kubectl/game.propertiesui.properties$ cat docs/user-guide/configmap/kubectl/game.propertiesenemies=alienslives=3enemies.cheat=trueenemies.cheat.level=noGoodRottenenemies.code.passphrase=UUDDLRLRBABASsecret.code.allowed=truesecret.code.lives=30$ cat docs/user-guide/configmap/kubectl/ui.propertiescolor.good=purplecolor.bad=yellowaoolw.textmode=truehow.nice.to.look=fairlyNice$ kubectl create configmap game-config --from-file=docs/user-guide/configmap/kubectl--from-file 指定在目录下的所有文件都会被用在ConfigMap外面创立一个键值对,键的名字就是文件名,值就是文件的内容 2.应用文件创建 $ kubectl create configmap game-config --from-file=docs/user-guide/configmap/kubectl/game.properties$ kubectl get configmaps game-config -o yaml3.应用字面值创立 应用文字值创立,利用--from-literal 参数传递配置信息,该参数能够应用屡次,格局如下: $ kubectl create configmap special-config --from-literal=special.how --from-literal=special.type=charm$ kubectl get configmaps special-config -o yamlPod中应用ConfigMap应用ConfigMap来代替环境变量apiVersion: v1kind: ConfigMapmetadata: name :special-config namespace: defaultdata: special.how: very special.type.charmapiVersion: v1kind: ConfigMapmetadata: name: env-config namespace: defaultdata: log_level: INFOapiVersion: v1kind: Podmetadata: name: dapi-test-podspec: containers: - name: test-container image: myapp:v1 command: ["/bin/sh","-c","env"] env: - name: SPECIAL_LEVEL_KEY calueFrom: configMapKeyRef: name: special-config key: special.how - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type envFrom: - configMapRef: name: env-config restartPolicy: Never用ConfigMap设置命令行参数apiVersion: v1kind: ConfigMapmetadata: name: special-config namespace: defaultdata: special.how: very special.type: charmapiVersion: v1kind: Podmetadata: name: dapi-test-podspec: containers: - name: test-container image: myapp:v1 command: ["/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)"] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: special-config key: special.how - name: SPECIAL_TYPE_KEY calueFrom: configMapKeyRef: name: special-config key: special.type restartPolicy: Never通过数据卷插件应用ConfigMapapiVersion: v1kind: ConfigMapmetadata: name: special-config namespace: dafaultdata: special.how: very special.type: charm在数据卷外面应用这个ConfigMap,有不同的选项,最根本的就是将文件填入数据卷,在这个文件中,键就是文件名,值就是文件内容 ...

May 16, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes中Service的种类

Service的概念Kubernetes Service定义了这样一种形象:一个Pod的逻辑分组,一种能够拜访它们的策略--通常称为微服务,这一组Pod可能被Service拜访到,通常是通过Label Selector Service可能提供负载平衡能力,然而在应用上有以下限度: 只提供4层负载能力,而没有7层性能,然而有时咱们可能须要更多的匹配规定来转发申请,这点来说4层负载平衡时不反对的Service的类型Service的四种类型: ClusterIP:默认类型,主动调配一个仅Cluster外部可拜访的虚构IPNodePort:在ClusterIP根底上为Service在每台机器上绑定一个端口,这样就能够通过<NodeIP>:<NodePort>来拜访该服务LoadBalance:在NodePort的根底上,借助cloud provider创立一个内部负载均衡器,并将申请转发到<NodeIP>:<NodePort>ExternalName:把集群内部的服务引入到集群外部来,在集群外部间接应用,没有任何类型代理被创立,这只有Kubernetes1.7以上版本的kube-dns才反对VIP和Service代理在Kubernetes集群中,每个Node节点运行一个kube-proxy过程,kube-proxy负责Service实现一种虚构IP的模式,而不是ExternalName的模式,在Kubernetesv1.0版本,代理齐全在userspace,在Kubernetes v1.1版本,新增了iptables代理,但并不是默认的运行模式。从Kubernetes v1.2版本开始,默认就是iptables代理,在Kubernetes v1.8.0-beta.0中,增加了ipvs代理,在Kubernetes v1.14版本开始默认应用ipvs代理 在Kubernetesv1.0版本Service是4层(TCP/UDP over IP)概念,在Kubernetes v1.1版本新增了Ingress API(beta版),用来示意7层(HTTP)服务 ipvs代理模式 这种模式,kube-proxy会监督Kubernetes Service对象和Endpoints,调用netlink接口以绝对应地创立ipvs规定并定期与Kubernetes Service对象和Endpoint对象同步ipvs,以确保ipvs状态与冀望统一,拜访服务时,流量被重定向到其中一个后端Pod,与iptables相似,ipvs与netfilter的hook性能,但应用哈希表作为底层数据结构并在内核空间中工作,这意味着能够更快地重定向流量,并且在同步代理规定时具备更好的性能,此外,ipvs为负载平衡算法提供更多选项,例如: rr:轮训调度lc:最小连接数dn:指标哈希sh:源哈希sed:最短期望提早nq:不排队调度ClusterIPClusterIP次要在每个Node节点应用iptables/ipvs将发向ClusterIP对应端口的数据,转发到kube-proxy中,而后kube-proxy本人外部实现有负载平衡的办法,并能够查问到这个service下对应Pod的地址和端口,进而把数据转发给对应的Pod的地址和端口 为例实现该流程,次要须要以下几个组件的协同工作: APIServer用户通过kubectl命令向APIServer发送创立service的命令,APIServer接管到申请后将数据存储到etcd中kube-proxy Kubernetes的每个节点都有一个叫做kube-proxy的过程,这个过程负责感知service,pod的变动,并将变动信息写入本地的iptables/ipvs规定中iptables/ipvs应用NAT等技术将VIP的流量转至endpoint中创立Deployment信息 apiVersion: apps/v1kind: Deploymentmetadata: name: myapp-deploy namespace: defaultspec: replicas: 3 selector: matchLabels: app: myapp release: stabel template: metadata: labels: app: myapp release: stabel env: test spec: containers: - name: myapp image: myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80创立Service信息 apiVersion: v1kind: Servicemetadata: name: myapp namespace: defaultspec: type: ClusterIP selector: app: myapp #标签选择器 release: stabel ports: - name: http port: 80 targetPort: 80查问命令 ...

May 16, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes的控制器类型及使用案例

什么是控制器Kubernetes中内建了很多的controller(控制器),这些控制器相当于一个状态机,用来管制Pod的具体状态和行为 控制器的类型ReplicationController和ReplicaSetReplicationController(RC)用来确保容器利用的正本数始终维持在用户定义的正本数,即如果有容器异样退出,会主动创立新的Pod来代替,而如果异样多进去的容器也会主动回收。 在新版本的Kubernetes中倡议应用ReplicaSet来取代ReplicationController,ReplicaSet跟ReplicationController没有实质的区别,只是名字不一样,并且ReplicaSet反对汇合式的selector(标签)。 apiVersion: extensions/v1beta1kind: ReplicaSetmetadata: name: frontendspec: replicas: 3 selector: natchLatels: tier: frontend template: metadata: latels: tier: frontend sepc: containsers: - name: myapp image: myapp:v1 env: - name: GET_HOST_FROM values: dns ports: - containerPort: 80DeploymentDeployment为Pod和ReplicaSet提供了一个申明式定义(declarative)办法,用来代替以前的ReplicationController类不便的治理利用,典型的利用场景包含: 定义Deployment来创立Pod和ReplicaSet滚动降级和回滚利用扩容和缩容暂停和持续DeploymentapiVersion: extensions/v1beta1kind:Deploymentmetadata: name: nginx-deploymentspec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: myapp:v1 ports: - containerPort: 80扩容kubectl scale deployment nginx-deployment --replicats 10如果集群反对HPA的话,还能够为Deployment设置主动扩大kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80更新镜像也比较简单kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1回滚kubectl rollout undo deployment/nginx-deploymentkubectl rollout status deployments nginx-deployment #查看回滚状态kubectl rollout history deployment/nginx-deployment #查看回滚历史kubectl rollout pause deployment/nginx-deployment #暂停deployment的更新DaemonSetDaemon确保全副或者一些Node上运行一个Pod的正本,当有Node退出集群时,也会为他们新增一个Pod,当有Node从集群移除时,这些Pod也会被回收,删除DaemonSet将会删除它创立的所有Pod ...

May 15, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes中Pod的生命周期

Pod生命周期之Init容器Init容器Pod可能具备多个容器,利用运行在容器外面,然而它可能有一个或多个先于利用容器启动的Init容器 Init容器于一般的容器十分像,除了如下两点: Init容器总是运行到胜利实现为止每个Init容器都必须在下一个Init容器启动之前胜利实现如果Pod 的Init容器失败,Kubernetes会一直地重启该Pod,直到Init容器胜利为止,然而,如果Pod对应的restartPolicy为Nerver,它不会重新启动 因为Init容器具备与应用程序容器拆散的独自镜像,所以它们的启动相干代码具备如下劣势: 它们能够蕴含并运行实用工具,然而出于平安思考,是不倡议在应用程序容器中蕴含这些实用工具的它们能够蕴含实用工具和定制化来装置,然而不能呈现在应用程序镜像中,例如,创立镜像没必要FROM另一个镜像,只须要在装置过程中应用相似sed、awk、python或dig这样的工具应用程序镜像能够拆散出创立和部署的角色,而没有必要联结它们构建一个独自的镜像Init容器应用Linux Namespace,所以绝对应用程序容器来说具备不同的文件系统视图,因而,它们可能具备拜访Secret的权限,而应用程序容器则不能它们必须在应用程序容器启动之前运行实现,而应用程序容器是并行运行的,所以Init容器可能提供一中简略的阻塞或提早应用程序容器的启动办法,直到满足了一组先决条件Init模板apiVersion: v1kind: Podmetadata: name: myapp-pod labels: app: myappspec: containers: - name: myapp-container image: busybox command: ['sh','-c', 'echo The app is runing! && sleep 3600'] initContainers: - name: init-myservice image: busybox command: ['sh','-c','until nslookup myservice; do echo waiting for myservice; sleep 2; done;'] - name: init-mydb image: busybox command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;']kind: ServiceapiVersion: v1metadata: name: myservicespec: ports: - protocol: TCP port: 80 targetPort: 9376---kind: ServiceapiVersion: v1metadata: name: mydbspec: ports: - protocol: TCP port: 80 targetPort: 9377非凡阐明在Pod启动过程中,Init容器会按程序在网络和数据卷初始化(pause)之后启动,每个容器必须在下一个容器启动之前胜利退出如果因为运行时或失败退出,将导致容器启动事变,它会依据Pod的restartPolicy指定的策略进行重启,然而,如果Pod的restartPolicy设置为Always,Init容器失败时会应用RestartPolicy策略在所有的Init容器没有胜利之前,Pod将不会变成Ready状态,Init容器的端口将不会在Service中进行汇集。正在初始化的Pode出于Pending状态,但应该会将Initalizing状态设置为true如果Pod重启,所有Init容器必须从新执行对Init容器spec的批改被限度在容器image字段,批改其余字段都不会失效,更改Init容器的image字段,等价于重启该PodInit容器具备利用容器的所有字段,除了readinessProbe,因为Init容器无奈定义不同于实现(completion)的就绪(readiness)之外的其余状态,这会在验证过程中强制执行在Pod中的每个app和Init容器的名称必须惟一,与任何其余容器共享一个名称,会在验证时抛出谬误Pod生命周期之容器探针探针时有kubelet对容器执行的定期诊断,要执行诊断,kubelet调用由容器实现的Handler。有三种类型的处理程序: ...

May 15, 2021 · 2 min · jiezi

关于kubernetes:超详细k8s-面试题总结

简述ETCD及其特点?etcd 是 CoreOS 团队发动的开源我的项目,是一个治理配置信息和服务发现(service discovery)的我的项目,它的指标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现。 特点:简略:反对 REST 格调的 HTTP+JSON API平安:反对 HTTPS 形式的拜访疾速:反对并发 1k/s 的写操作牢靠:反对分布式构造,基于 Raft 的一致性算法,Raft 是一套通过选举主节点来实现分布式系统一致性的算法。简述ETCD适应的场景?etcd基于其优良的特点,可宽泛的利用于以下场景: 服务发现(Service Discovery):服务发现次要解决在同一个分布式集群中的过程或服务,要如何能力找到对方并建设连贯。实质上来说,服务发现就是想要理解集群中是否有过程在监听udp或tcp端口,并且通过名字就能够查找和连贯。 音讯公布与订阅:在分布式系统中,最实用的一种组件间通信形式就是音讯公布与订阅。即构建一个配置共享核心,数据提供者在这个配置核心公布音讯,而音讯使用者则订阅他们关怀的主题,一旦主题有音讯公布,就会实时告诉订阅者。通过这种形式能够做到分布式系统配置的集中式治理与动静更新。利用中用到的一些配置信息放到etcd上进行集中管理。 负载平衡:在分布式系统中,为了保障服务的高可用以及数据的一致性,通常都会把数据和服务部署多份,以此达到对等服务,即便其中的某一个服务生效了,也不影响应用。etcd自身分布式架构存储的信息拜访反对负载平衡。etcd集群化当前,每个etcd的外围节点都能够解决用户的申请。所以,把数据量小然而拜访频繁的音讯数据间接存储到etcd中也能够实现负载平衡的成果。 分布式告诉与协调:与音讯公布和订阅相似,都用到了etcd中的Watcher机制,通过注册与异步告诉机制,实现分布式环境下不同零碎之间的告诉与协调,从而对数据变更做到实时处理。 分布式锁:因为etcd应用Raft算法放弃了数据的强一致性,某次操作存储到集群中的值必然是全局统一的,所以很容易实现分布式锁。锁服务有两种应用形式,一是放弃独占,二是管制时序。 集群监控与Leader竞选:通过etcd来进行监控实现起来非常简单并且实时性强。 简述什么是Kubernetes?Kubernetes是一个全新的基于容器技术的分布式系统撑持平台。是Google开源的容器集群管理系统(谷歌外部:Borg)。在Docker技术的根底上,为容器化的利用提供部署运行、资源调度、服务发现和动静伸缩等一系列残缺性能,进步了大规模容器集群治理的便捷性。并且具备齐备的集群治理能力,多层次的平安防护和准入机制、多租户利用撑持能力、通明的服务注册和发现机制、內建智能负载均衡器、弱小的故障发现和自我修复能力、服务滚动降级和在线扩容能力、可扩大的资源主动调度机制以及多粒度的资源配额治理能力。 简述Kubernetes和Docker的关系?Docker 提供容器的生命周期治理和,Docker 镜像构建运行时容器。它的次要长处是将将软件/利用程序运行所需的设置和依赖项打包到一个容器中,从而实现了可移植性等长处。 Kubernetes 用于关联和编排在多个主机上运行的容器。 简述Kubernetes中什么是Minikube、Kubectl、Kubelet?Minikube 是一种能够在本地轻松运行一个单节点 Kubernetes 群集的工具。 Kubectl 是一个命令行工具,能够应用该工具管制Kubernetes集群管理器,如查看群集资源,创立、删除和更新组件,查看应用程序。 Kubelet 是一个代理服务,它在每个节点上运行,并使从服务器与主服务器通信。 简述Kubernetes常见的部署形式?常见的Kubernetes部署形式有: kubeadm:也是举荐的一种部署形式;二进制:CentOS 搭建 K8S,一次性胜利,珍藏了!minikube:在本地轻松运行一个单节点 Kubernetes 群集的工具。简略几步,无坑部署最小化 K8S 集群Kubernetes 部署如此简略,看齐全明确了简述Kubernetes如何实现集群治理?在集群治理方面,Kubernetes将集群中的机器划分为一个Master节点和一群工作节点Node。其中,在Master节点运行着集群治理相干的一组过程kube-apiserver、kube-controller-manager和kube-scheduler,这些过程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等治理能力,并且都是全自动实现的。举荐大家看看:轻松治理 Kubernetes 集群的7个工具。 简述Kubernetes的劣势、适应场景及其特点?Kubernetes作为一个齐备的分布式系统撑持平台,其次要劣势: 容器编排轻量级开源弹性伸缩负载平衡Kubernetes常见场景: 疾速部署利用疾速扩大利用无缝对接新的利用性能节俭资源,优化硬件资源的应用Kubernetes相干特点: 可移植: 反对私有云、公有云、混合云、多重云(multi-cloud)。可扩大: 模块化,、插件化、可挂载、可组合。自动化: 主动部署、主动重启、主动复制、主动伸缩/扩大。简述Kubernetes的毛病或以后的不足之处?Kubernetes以后存在的毛病(有余)如下: 装置过程和配置绝对艰难简单。治理服务绝对繁琐。运行和编译须要很多工夫。它比其余替代品更低廉。对于简略的应用程序来说,可能不须要波及Kubernetes即可满足。简述Kubernetes相干根底概念?master:k8s集群的治理节点,负责管理集群,提供集群的资源数据拜访入口。领有Etcd存储服务(可选),运行Api Server过程,Controller Manager服务过程及Scheduler服务过程。 node(worker):Node(worker)是Kubernetes集群架构中运行Pod的服务节点,是Kubernetes集群操作的单元,用来承载被调配Pod的运行,是Pod运行的宿主机。运行docker eninge服务,守护过程kunelet及负载均衡器kube-proxy。 pod:运行于Node节点上,若干相干容器的组合(Kubernetes 之 Pod 实现原理)。Pod内蕴含的容器运行在同一宿主机上,应用雷同的网络命名空间、IP地址和端口,可能通过localhost进行通信。Pod是Kurbernetes进行创立、调度和治理的最小单位,它提供了比容器更高层次的形象,使得部署和治理更加灵便。一个Pod能够蕴含一个容器或者多个相干容器。 label:Kubernetes中的Label本质是一系列的Key/Value键值对,其中key与value可自定义。Label能够附加到各种资源对象上,如Node、Pod、Service、RC等。一个资源对象能够定义任意数量的Label,同一个Label也能够被增加到任意数量的资源对象下来。Kubernetes通过Label Selector(标签选择器)查问和筛选资源对象。 ...

May 15, 2021 · 3 min · jiezi

关于kubernetes:Kubernetes的YAML字段解析

根本语法缩进时不容许应用Tab键,只容许应用空格缩进的空格数目不重要,只有雷同层级的元素左侧对齐即可标识正文,从这个字符始终到行尾,都会被解释器疏忽 ## 必须存在的属性 参数名字段类型阐明versionStringK8s API的版本,目前根本都为v1,能够应用kubectl api-version命令查看kindString定义的资源类型和角色:比方:PodmetadataObject元数据对象,福鼎值就写metadatametadata.nameString元数据对象名字,自定义metadata.namespaceString元数据命名空间,自定义SpecObject具体定义对象,固定值为Specspec.containers[]listSpec对象的容器列表定义,是个列表spec.containers[].nameString容器的名字spec.containers[].imageString要用到的镜像名称可选参数spec.containers[].imagePullPolicyString定义镜像拉取策略,有Always、Never、IfNotPresent三个值可选,Always示意每次都尝试从新拉取镜像;Never便是仅应用本地有的镜像;IfNotPresent示意本地有就用本地的,没有的话在线拉取镜像,如果没有设置则默认值为Alwaysspec.containers[].command[]List指定容器启动命令,因为是数组能够指定多个,不指定则应用镜像打包时应用的启动命令。spec.containers[].args[]List指定容器启动命令参数,因为是数组,能够指定多个spec.containersp[].workingDirString指定容器的工作目录spec.containers[].volumeMounts[]String指定容器外部的存储卷配置spec.containers[].volumeMounts[].nameString指定能够被容器挂载的存储卷的名称spec.containers[].volumeMounts[].mountPathString指定能够被容器挂载的存储卷的门路spec.containers[].volumeMounts[].readOnlyString设置存储卷的读写模式,true或者false默认为读写模式spec.containers[].ports[]List指定容器须要用到的端口列表spec.containers[].ports[].nameString指定端口名称spec.containers[].ports[].containerPortString指定容器须要监听的端口号spec.containers[].ports[].hostPortString指定容器所在主机须要监听的端口号,默认跟下面containerPort雷同,留神,设置了hostPort同一台主机无奈启动该容器的雷同正本(因为主机的端口号不能雷同,这样会抵触)spec.containers[].ports[].ProtocolString指定端口协定,反对TCP和UDP,默认为TCPspec.containers[].envList指定容器运行前须要设置的环境变量spec.restartPolicyString定义Pod的重启策略,可选值为Always、OnFailure,默认为Always;Always示意Pod一旦终止运行,则无论容器是如何终止的,kubelet服务都将重启它;OnFailure示意只有Pod以非零退出码终止时,kubelet才会重启该容器,如果容器失常完结,则kubelet将不会重启它;Never示意Pod终止后,kubelet将退出码报告给Master,不会重启该Podspec.nodeSelectorObject定义Node的Label过滤标签,以key:value格局指定spec.imagePullSecretsObject定义pull镜像时应用secret名称,以name:secretkey格局指定spec.hostNetworkBoolean定义是否应用主机网络模式,默认为false,设置true示意应用宿主机网络,不实用docker网桥,同时设置了true将无奈在同一台宿主机上启动第二个正本

May 15, 2021 · 1 min · jiezi

关于kubernetes:KubeVela-KEDA为应用带来与生俱来的弹性伸缩能力

简介: 在这篇博文中,咱们将简要解释须要思考的畛域,KEDA 如何使利用主动伸缩变得简略,以及为什么阿里云企业分布式应用服务(EDAS)在 KEDA 上齐全标准化。 联结作者 | Yan Xun,阿里云 EDAS 团队高级工程师Andy Shi,阿里云开发者倡导者Tom Kerkhove,Codit 容器化业务负责人兼 Azure 架构师、KEDA 维护者、CNCF 大使起源 | 阿里巴巴云原生公众号当你在伸缩 Kubernetes 时,你会想到一些畛域,然而如果你是 Kubernetes 的老手,你可能会感觉有些难以应酬。在这篇博文中,咱们将简要解释须要思考的畛域,KEDA 如何使利用主动伸缩变得简略,以及为什么阿里云企业分布式应用服务(EDAS)在 KEDA 上齐全标准化。 伸缩 Kubernetes当治理 Kubernetes 集群和应用程序时,你须要认真监督各种事件,比方: 集群容量——咱们是否有足够的可用资源来运行咱们的工作负载?应用程序工作负载——应用程序有足够的可用资源吗?它能跟上待实现的工作吗?(像队列深度)为了实现自动化,你通常会设置警报以取得告诉,甚至应用主动伸缩。Kubernetes 是一个很好的平台,它能够帮忙你实现这个即时可用的性能。通过应用 Cluster Autoscaler 组件能够轻松地伸缩集群,该组件将监督集群,以发现因为资源短缺而无奈调度的 pod,并开始相应地增加/删除节点。因为 Cluster Autoscaler 只在 pod 调度适度时才会启动,所以你可能会有一段时间距离,在此期间你的工作负载没有启动和运行。Virtual Kubelet(一个 CNCF 沙箱我的项目)是一个微小的帮忙,它容许你向 Kubernetes 集群增加一个“虚构节点”,pod 能够在其上调度。 通过这样做,平台供应商(如阿里巴巴、Azure、HashiCorp 和其余)容许你将挂起的 pod 溢出到集群之外,直到它提供所需的集群容量来缓解这个问题。除了伸缩集群,Kubernetes 还容许你轻松地伸缩应用程序: Horizontal Pod Autoscaler(HPA)容许你增加/删除更多的 Pod 到你的工作负载中,以 scale in/out(增加或删除正本)。Vertical Pod Autoscaler(VPA)容许你增加/删除资源到你的 Pod 以 scale up/down(增加或删除 CPU 或内存)。所有这些为你伸缩应用程序提供了一个很好的终点。 HPA 的局限性尽管 HPA 是一个很好的终点,但它次要关注 pod 自身的指标,容许你基于 CPU 和内存伸缩它。也就是说,你能够齐全配置它应该如何主动缩放,这使它弱小。尽管这对于某些工作负载来说是现实的,但你通常想要基于其余中央如 Prometheus、Kafka、云供应商或其余事件上的指标进行伸缩。多亏了内部指标反对,用户能够装置指标适配器,从内部服务中提供各种指标,并通过应用指标服务器对它们进行主动伸缩。然而,有一点须要留神,你只能在集群中运行一个指标服务器,这意味着你必须抉择自定义指标的起源。 ...

May 14, 2021 · 2 min · jiezi

关于kubernetes:K8S-CronJob简单入门和手动重复操作Say-Goodbye

有时,调度一个应用程序过程、一些反复的操作(如发送邮件、告警、验证等)是极为必要的。在server上,咱们通常应用一个cron,它极易设置和保护。如果你对此还不甚了解,能够拜访以下链接,你须要晓得的所有对于cron的信息都在此:https://en.wikipedia.org/wiki/Cron 在应用Docker的时候,你能够运行crontab来实现以上操作,但当你应用Kubernetes应该应用什么组件来进行上述操作呢? 实际上,Kubernetes的运行形式有所不同,因为在负载平衡的状况下可能有一个或多个雷同服务的实例,而不论启动多少个实例crontab仅运行一次。另一方面,咱们须要crontab为一个或多个pod的每个过程都运行一次。在Kubernetes中有一个称为CronJob的个性解决了这一问题。 本文将介绍CronJob如何工作及其限度条件,最初给出几个tips来帮忙你防止常见谬误。 以下示例均基于kind。 如何创立CronJob:apiVersion: batch/v1beta1kind: CronJobmetadata: name: my-cron-jobspec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: my-cron-job image: curlimages/curl resources: limits: cpu: "1" memory: "300Mi" requests: cpu: "1" memory: "300Mi" args: - /bin/sh - -c - date; echo "Starting an example of CronJob"; resp=$(curl -I --http2 https://www.google.com) ; echo $resp; exit 0 restartPolicy: Never successfulJobsHistoryLimit: 3 failedJobsHistoryLimit: 3CronJob曾经创立,它每分钟运行一个curl镜像。 同时,你须要设置资源限度(如CPU和内存),如果你将AWS、Azure或GCP实例作为args,最好的可视化形式是在Google上进行简略的curl即可。 这一实例永远不会重启,而且胜利和失败的历史job都有一个限度,在本例中这一次数设置为3。 spec.successfulJobsHistoryLimit:要保留的胜利实现的cronjob的数量spec.failedJobsHistoryLimit:要保留的失败的cronjob的数量如果你想理解更多对于CronJob API的信息,我强烈建议你浏览以下链接中的内容:https://docs.koki.io/short/resources/cron-job ...

May 14, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-Network-由浅入深

Kubernetes Network 由浅入深次要是学习深刻分析Kubernetes专栏课的笔记。一、单机容器网络名词网络栈:网络栈包含了网卡(Network Interface)、回环设施(Loopback Device)、路由表(Routing Table)和Iptables规定,对于一个过程来说,这些因素,就形成了它发动申请和响应网络申请的根本环境。网桥(Bridge):bridge是一个虚构网络设备,所以具备网络设备的特色,能够配置IP、MAC地址;Bridger是一个虚构交换机,具备和物理交换机相似的性能。它是工作在数据链路层的设施。Veth Pair: 虚构网线,用来连贯容器到网桥上的;它被创立进去当前,总是以两张虚构网卡(Veth Peer)的模式成对呈现,并且,从其中一个网卡收回的数据包会主动呈现在与之对应的网卡上,哪怕是这两张\_*网卡\_在不同的Network Namespace中。ARP: 是一个通过三层的IP地址找到对应二层MAC地址的协定。CAM表:虚构交换机(这里是网桥)通过MAC地址学习保护的端口和MAC地址的对应表。Host网络作为一个容器,在启动时能够通过指定-net=host,应用宿主机的Network Namespace。 $ docker run -d -net=host --name nginx-1 nginx应用Host网络的长处是网络性能较好,间接应用宿主机的网络栈,毛病是会引入共享网络资源的问题,比方端口抵触。所以,在少数状况下,咱们都心愿能应用本人Network Namespace里的网络栈,领有属于本人的IP和端口。 如何通信 如上图,形容了单节点容器网络的通信流程,上面次要按C1->C2的拜访流程来详细描述交互流程: # 先创立两个容器,用于模仿发动申请,启动两个centos容器,并在外面装置net-tools工具,才能够应用ifconfig命令# 创立C1,并装置net-tools$ docker run -d -it --name c1 centos /bin/bash$ docker exec -it c1 bash$ [root@60671509044e /]# yum install -y net-tools# 创立C2,并装置net-tools$ docker run -d -it --name c2 centos /bin/bash$ docker exec -it c2 bash$ [root@94a6c877b01a /]# yum install -y net-tools容器C1和C2启动之后,在容器中都有一条默认的路由规定,以后容器网段的所有申请都会走eth0网卡设施。 C1# 进入c1容器,查看ip以及路由表$ docker exec -it c1 bash# 查看IP$ ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.7 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:07 txqueuelen 0 (Ethernet) RX packets 6698 bytes 9678058 (9.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3518 bytes 195061 (190.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0# 查看路由 $ routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Ifacedefault _gateway 0.0.0.0 UG 0 0 0 eth0172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0C2# 进入C2容器查看IP和路由表$ docker exec -it c2 bash$ ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.8 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:08 txqueuelen 0 (Ethernet) RX packets 6771 bytes 9681937 (9.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3227 bytes 179347 (175.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0# 查看路由$ routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Ifacedefault _gateway 0.0.0.0 UG 0 0 0 eth0172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0上述容器事实有本人的IP以及MAC地址,并且每个容器中都有默认路由_gateway指向eth0网卡;并且_gateway有对应的MAC地址曾经存在于本地ARP缓存中。 ...

May 13, 2021 · 4 min · jiezi

关于kubernetes:混合云K8s容器化应用弹性伸缩实战

简介:混合云K8s容器化利用弹性伸缩实战 1. 前提条件本最佳实际的软件环境要求如下: 应用环境: ①容器服务ACK基于专有云V3.10.0版本。 ②公共云云企业网服务CEN。 ③公共云弹性伸缩组服务ESS。 配置条件: 1)应用专有云的容器服务或者在ECS上手动部署麻利PaaS。 2)开明云专线,买通容器服务所在VPC与公共云上的VPC。 3)开明公共云弹性伸缩组服务(ESS)。 2. 背景信息本实际基于K8s的业务集群运行在专有云上,对测试业务进行压力测试,次要基于以下三种产品和能力: ①利用阿里云的云企业网专线买通专有云和公共云,实现两朵云上VPC网络互通。 ②利用K8s(Kubernetes)的HPA能力,实现容器的程度伸缩。 ③利用K8s的Cluster Autoscaler和阿里云弹性伸缩组ESS能力实现节点的主动伸缩。 HPA(Horizontal Pod Autoscaler)是K8s的一种资源对象,可能依据CPU、内存等指标对statefulset、deployment等对象中的pod数量进行动静伸缩,使运行在下面的服务对指标的变动有肯定的自适应能力。 当被测试业务指标达到下限时,触发HPA主动扩容业务pod;当业务集群无奈承载更多pod时,触发公共云的ESS服务,在公共云内扩容出ECS并主动增加到专有云的K8s集群。 图 1:架构原理图 3. 配置HPA本示例创立了一个反对HPA的nginx利用,创立胜利后,当Pod的利用率超过本例中设置的20%利用率时,则会进行程度扩容,低于20%的时候会进行缩容。 1.若应用自建K8s集群,则通过yaml文件配置HPA1)创立一个nginx利用,必须为利用设置request值,否则HPA不会失效。 apiVersion:app/v1beta2kind: Deploymentspec: template: metadata: creationTimestamp: null labels: app: hpa-test spec: dnsPolicy: ClusterFirst terminationGracePeriodSeconds:30 containers: image: '192.168.**.***:5000/admin/hpa-example:v1' imagePullPolicy: IfNotPresent terminationMessagePolicy:File terminationMessagePath:/dev/termination-log name: hpa-test resources: requests: cpu: //必须设置request值 securityContext: {} restartPolicy:Always schedulerName:default-scheduler replicas: 1 selector: matchLabels: app: hpa-test revisionHistoryLimit: 10 strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% maxUnavailable: 25% progressDeadlineSeconds: 6002)创立HPA。 ...

May 13, 2021 · 3 min · jiezi

关于kubernetes:从零开始的k8s之旅一云原生前夜

前言罗马不是一天建成的,现在k8s被称为云原生时代的操作系统,霸主位置理论已不可动摇,在此之前,我简要梳理下容器技术衰亡的背景与发展史,而后看下近年来应用程序的开发部署是如何变动的,了解这些变动,可能清晰地感知应用k8s带来的微小劣势。 容器技术的历史容器最早的原型是对目录的形象,通过chroot技术把用户的文件系统根目录切换到某个指定的目录下,实现了简略的文件系统视图上的形象或虚拟化;然而这种技术只是提供了无限的文件系统隔离,并没有任何其余隔离伎俩,而且人们起初发现这种技术并不平安,用户能够逃离设定的根目录从而拜访host上的文件。 在内核版本2.3.41引入了pivot_root技术,它能够无效地防止chroot带来的安全性问题。今日的容器技术,比方LXC、Docker等,也都是应用了pivot_root来做根文件系统的切换。然而pivot_root也仅仅是在文件系统的隔离上做了一些加强,并没有在其余隔离性上有所提高。 起初呈现了基于Linux-VServer和SWsoft(当初的Odin)开发的Virtuozzo,尽管这些技术绝对过后的XEN和KVM,有显著的性能晋升,然而因为各种起因,并未在过后引起市场太多的关注。之后在Virtuozzo的根底上公布了OpenVZ技术,同时开始推动OpenVZ中的外围容器技术进入Linux内核主线,而此时IBM等公司也在推动相似的技术,最初在社区的单干下,造成了目前大家看到的Cgroup和Namespace,这时,容器技术才开始逐步进入公众的视线。 整个容器技术发展史如下图所示:更多对于容器的介绍参考这篇文章: 什么是容器:namespace和cgroup 从单体利用到微服务一图胜千言,这里间接上图:服务器是一个筐,什么都能够往里装。在晚期,服务大多都是单体利用,由多个组件严密地耦合在一起,其复杂性可想而知,即便是一个小的批改都必须大动干戈,保护这样的零碎能够说很多时候就是黑箱操作,零碎随时处于解体的边缘;这些问题迫使业界从新思考服务的架构模式,微服务架构应运而生,将大型单体利用拆分成小的可独立部署的微服务组件,每个微服务以独立的过程运行,并通过简略且定义良好的接口(API)与其余的微服务通信。这样带来的益处是显而易见的,通过解耦,零碎变得灵便且强壮。解决了一个问题,但带来了新的问题,组件部署的组合数在减少的同时,组件间依赖的组合数也在急剧减少。还有其余的诸如跨多过程和机器导致调试代码和定位异样调用变得越来越艰难等问题,操作系统、库、系统配置、网络环境以及其余所有的条件是如此芜杂,迫切需要一个统一的环境,或者叫做沙箱,也可称之为容器。 从Borg到k8s既如此容器横空出世,Docker大行其道,本着“解决一个问题会带来另一个新问题的准则”,果不其然,如何治理这些容器成了让业界头疼的新问题。一时间Docker Swarm、Apache Mesos、CoreOS Fleet等编排工具纷纷涌现。 谷歌在很早的时候就开发了一个Borg的外部零碎(起初还有一个新零碎叫Omega), 曾始终是Google激进得最好的机密之一。它是谷歌外部的大规模集群管理系统,负责对谷歌外部很多外围服务的调度和治理。Borg 的目标是让用户可能不用操心资源管理的问题,让他们专一于本人的外围业务,并且做到跨多个数据中心的资源利用率最大化。次要架构见下图:Borg有四个组件:BorgMaster、Borglet、borgcfg 和 Scheduler,各组件负责的性能如下: BorgMaster 是整个集群的大脑,负责保护整个集群的状态,并将数据长久化到 Paxos 存储中;Scheduer 负责工作的调度,依据利用的特点将其调度到具体的机器下来;Borglet 负责真正运行工作(在容器中);borgcfg 是 Borg 的命令行工具,用于跟 Borg 零碎交互,个别通过一个配置文件来提交工作。借助Borg零碎,Google宣称每周可解决几十亿容器。 Kubernetes能够看成是Borg的继任者,这个我的项目的将来指标是纠正Borg、Omega的谬误,最终超过这两位前辈,就目前的状况(2021)来看,k8s是相当胜利的,这股云原生浪潮将由k8s引领,云计算2.0势在必行。

May 12, 2021 · 1 min · jiezi

关于kubernetes:在django使用kubernetes健康检查

引言在上一篇文章中,我写了无关Kubernetes健康检查的文章,作为Python的开发人员和粉丝,我开始着手在Django中实现它。 运行健康检查是帮助Kubernetes让你的利用具备高可用性的好办法,例如Django利用。 然而,应用Django并不像听起来那样简略。健康检查是Kubernetes探查利用是否衰弱的一种形式,它们认为你的利用能够在未准备就绪的状况下启动,因而不要预设利用的启动程序,因为这个缘故,咱们须要查看数据库或者memcached是否已进行运行同时利用无法访问。 健康检查视图编写运行健康检查的简略办法是为其编写视图,相似这样: def liveliness(request): return HttpResponse("OK")def readiness(request): try: # Connect to database return HttpResponse("OK") except Exception, e: return HttpResponseServerError("db: cannot connect to database.") 然而Django在运行视图之前会运行许多用户代码,例如中间件和装璜器,所以这些故障会使就绪探针产生一些咱们不心愿看到的响应。 应用中间件解决健康检查因为许多Django中间件(例如Django的AuthenticationMiddleware)都应用该数据库,因而无奈将存活检查和就绪查看作为简略的视图来实现。 当您的利用无法访问数据库时,Django会生成一个异样,并在Django执行视图很久之前返回500谬误页面,这将无奈为Kubernetes提供最佳的开发体验。 为了局部解决Django应用程序的健康状况查看,我编写了一些中间件来实现健康状况查看,我想在不假如应用任何特定Django模型的状况下执行数据库查看,因而我间接生成了查问。 因为memcached客户端不反对ping办法,因而我还能够通过调用get_stats()来对服务器进行ping操作,从而查看高速缓存服务器是否可用。 import loggingfrom django.http import HttpResponse, HttpResponseServerErrorlogger = logging.getLogger("healthz")class HealthCheckMiddleware(object): def __init__(self, get_response): self.get_response = get_response # One-time configuration and initialization. def __call__(self, request): if request.method == "GET": if request.path == "/readiness": return self.readiness(request) elif request.path == "/healthz": return self.healthz(request) return self.get_response(request) def healthz(self, request): """ Returns that the server is alive. """ return HttpResponse("OK") def readiness(self, request): # Connect to each database and do a generic standard SQL query # that doesn't write any data and doesn't depend on any tables # being present. try: from django.db import connections for name in connections: cursor = connections[name].cursor() cursor.execute("SELECT 1;") row = cursor.fetchone() if row is None: return HttpResponseServerError("db: invalid response") except Exception, e: logger.exception(e) return HttpResponseServerError("db: cannot connect to database.") # Call get_stats() to connect to each memcached instance and get it's stats. # This can effectively check if each is online. try: from django.core.cache import caches from django.core.cache.backends.memcached import BaseMemcachedCache for cache in caches.all(): if isinstance(cache, BaseMemcachedCache): stats = cache._cache.get_stats() if len(stats) != len(cache._servers): return HttpResponseServerError("cache: cannot connect to cache.") except Exception, e: logger.exception(e) return HttpResponseServerError("cache: cannot connect to cache.") return HttpResponse("OK")你能够将其增加到MIDDLEWARE_CLASSES的结尾,以将健康状况查看增加到你的利用中,将其放在MIDDLEWARE_CLASSES的结尾可确保它在其余可能拜访数据库的中间件类之前运行。 ...

May 12, 2021 · 2 min · jiezi

关于kubernetes:使用Kubernetes健康检查

前言我最近看到了很多无关Kubernetes健康检查以及如何应用它们的问题,对此我将尽力解释它们以及运行状况查看的类型之间的差别以及每种查看将如何影响你的应用程序。 Liveness ProbesKubernetes健康检查分为存活探针和就绪探针,存活探针的目标是查看你的应用程序是否正在运行。通常状况下,你的应用程序可能会解体,而Kubernetes会看到该应用程序已终止并重新启动,然而存活探测的目标是捕捉应用程序解体或死锁而无奈终止的状况,因而,一个简略的HTTP响应就足够了。 这是我常常在Go应用程序中应用的运行健康检查的一个简略的例子。 http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("OK"))}http.ListenAndServe(":8080", nil)在deployment文件外面的内容是: livenessProbe: # an http probe httpGet: path: /healthz port: 8080 initialDelaySeconds: 15 timeoutSeconds: 1这只是通知Kubernetes该利用已启动并正在运行,initialDelaySeconds通知Kubernetes在启动Pod之后将运行状况查看提早启动此秒数。 如果你的应用程序须要一段时间能力启动,则能够应用此设置来解决问题。 timeoutSeconds通知Kubernetes应该期待多长时间能力进行健康检查响应,对于存活探针,这应该不会很长,然而你的确应该给你的利用足够的工夫来响应,即便在负载有余的状况下也是如此。 如果利用从不启动或没有HTTP错误代码响应,Kubernetes将重新启动Pod,你要竭尽所能地不要在存活探针上做任何花哨的事件,因为如果存活探针检测失败可能会导致应用程序中断。 Readiness Probes就绪探针与存活探针十分类似,不同之处在于探针探测失败的后果不同。 就绪探针旨在查看应用程序是否已筹备好对外提供服务。 这与存活探针有轻微的差异,例如,假如你的利用依赖于数据库和内存缓存,如果这两者都须要启动并运行以使你的应用程序可能对外提供服务,那么能够说这两个条件都是应用程序“就绪”所必须的。 如果针对你的应用程序的就绪探针失败,那么将从形成service的endpoints中删除该Pod,这使得Kubernetes的服务发现机制不会向尚未准备就绪的Pod导入流量,这对于启动新的service、动静伸缩,滚动更新等很有帮忙。“就绪”探针可确保在Pod启动和筹备对外提供服务之间的这段时间内,不向Pod导入流量。 就绪探针的定义与存活探针雷同,就绪探针定义为Deployment的一部分,如下所示: readinessProbe: # an http probe httpGet: path: /readiness port: 8080 initialDelaySeconds: 20 timeoutSeconds: 5readinessProbe: # an http probe httpGet: path: /readiness port: 8080 initialDelaySeconds: 20 timeoutSeconds: 5你将须要查看就绪探针是否能够连贯到所有应用程序的依赖项,以及要应用依赖于数据库和内存缓存的示例,接下来将查看是否可能同时连贯到这两者。大略相似这样,在这里,我查看了memcached和数据库,如果不可用,则返回503。 http.HandleFunc("/readiness", func(w http.ResponseWriter, r *http.Request) { ok := true errMsg = "" // Check memcache if mc != nil { err := mc.Set(&memcache.Item{Key: "healthz", Value: []byte("test")}) } if mc == nil || err != nil { ok = false errMsg += "Memcached not ok.¥n" } // Check database if db != nil { _, err := db.Query("SELECT 1;") } if db == nil || err != nil { ok = false errMsg += "Database not ok.¥n" } if ok { w.Write([]byte("OK")) } else { // Send 503 http.Error(w, errMsg, http.StatusServiceUnavailable) }})http.ListenAndServe(":8080", nil)更强壮的利用Liveness和Readiness探针的确有助于进步应用程序的稳定性,它们有助于确保流量仅流向已准备就绪的实例,并在应用程序无响应时自愈。 对于我的共事Kelsey Hightower所说的12 Fractured Apps),它们是更好的解决方案。 通过适当的运行健康检查,你能够按任何程序部署应用程序,而不用放心依赖关系或者简单的endpoints脚本,应用程序准备就绪后将开始提供流量,主动伸缩和滚动更新也将顺利进行。 ...

May 12, 2021 · 1 min · jiezi

关于kubernetes:运维攻坚之kubernetes-pod无故重启问题排查

背景某我的项目kubernetes环境某个利用每隔20分钟左右就会重启一次,工夫不固定,但在容器事件外面没有任何记录。 排查首先狐疑是健康检查没过导致容器主动重启,以下是健康检查的配置 依照该配置,查看距离30s,不衰弱阈值60,也就是1800s=30分钟后会标记为不衰弱,但很快就排除该猜想,理由是 手动调用健康检查是ok的后盾有健康检查的记录,记录显示也都是通过的如果是健康检查不过的话,事件外面会有记录,这里找不到记录失常状况下如果kubernetes重启pod那会在事件里记录重启的起因,但事件外面没有任何记录,所以可能不是kubernetes重启的,那么很容易想到一个可能性就是OOM,也就是过程因为内存应用超过限度触发OOM操作系统将其kill掉,查看操作系统日志/var/log/messages发现以下日志 May 11 15:01:36 k8s-node-prod-3 kernel: [17094.020710] oom_kill_process.cold.30+0xb/0x1cfMay 11 15:01:36 k8s-node-prod-3 kernel: [17094.020788] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj nameMay 11 15:01:36 k8s-node-prod-3 kernel: [17094.109707] oom_reaper: reaped process 25929 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kBMay 11 15:29:12 k8s-node-prod-3 kernel: [18750.337581] java invoked oom-killer: gfp_mask=0x6000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=969May 11 15:29:12 k8s-node-prod-3 kernel: [18750.337621] oom_kill_process.cold.30+0xb/0x1cfMay 11 15:29:12 k8s-node-prod-3 kernel: [18750.337709] [ pid ] uid tgid total_果然有OOM的记录,而且几次kill的事件也正合乎利用重启的工夫,再查看其余java过程的oom_score,居然高达1000多有很大危险会被再次kill掉,因而罪魁祸首就是OOM,那为什么会导致OOM呢,此时操作系统的残余内存还是很短缺,留神到容器利用的启动参数配置的内存是4096M ...

May 12, 2021 · 1 min · jiezi

关于kubernetes:K8S-生态周报-Rancher-Desktop-v010-抢先一览

「K8S 生态周报」内容次要蕴含我所接触到的 K8S 生态相干的每周值得举荐的一些信息。欢送订阅知乎专栏「k8s生态」。Trivy v0.17 正式公布Trivy 是一款由 Aqua Security 开源的镜像破绽平安扫描程序,在之前的周报中我曾经介绍过它很屡次了,特地方便使用!(吃我安利!)本周 Trivy 公布了 v0.17 版本,咱们一起来看看本次值得关注的变更。 破坏性变更Trivy 在之前的版本中,容许为 --skip-dirs 参数通过逗号(,)宰割,设定多个目录。自此版本中,将遵循大多数软件的默认行为,通过屡次传递--skip-dirs 来传递多个值,每个参数只解决一个目录。 v0.17 版本之前: trivy image --skip-dirs "/usr/lib/ruby/gems,/etc" fluent/fluentd:edgev0.17 版本及之后: trivy image --skip-dirs /usr/lib/ruby/gems --skip-dirs "/etc" fluent/fluentd:edge如果有在应用此个性的小伙伴,在降级时须要分外留神!免得影响到本人的工作流. 新增个性能够反对 Go 二进制文件扫描了。次要实现形式能够参考我之前写的文章《逆向 Go 二进制文件,获取其依赖信息》能够反对 JAVA 相干归档文件的破绽扫描了,比方 JAR,WAR 和 EAR 等格局。但请留神: 此性能目前无奈在离线环境中应用 ,须要发送 HTTP 申请以便拿到更多信息。所以如果网络环境较差,可能此过程会耗时久一些,能够通过减少 --timeout 参数来管制超时工夫。新增了 Plugin 机制,应用相似 kubectl 和 Helm 的 Plugin 机制。 发问:如果 trivy 集成了 kubectl 作为 plugin ,而 kubectl 又用 trivy 做了 plugin 那会怎么样呢? 欢送留言探讨~Sprig 函数能够在 trivy 的自定义模板中应用了。有没有很眼生?之前的周报中介绍过 Helm 3.5 也反对了同样的内容。更多对于此版本的详细信息请参考其 ReleaseNote ...

May 11, 2021 · 1 min · jiezi

关于kubernetes:云原生下的灰度体系建设

简介: 本篇文章,咱们将持续为大家介绍 ASI SRE(ASI,Alibaba Serverless infrastructure,阿里巴巴针对云原生利用设计的对立基础设施) 是如何摸索在 Kubernetes 体系下,建设 ASI 本身基础设施在大规模集群场景下的变更灰度能力的。 作者 | 墨封起源 | 阿里巴巴云原生公众号 一周前,咱们介绍了《面对大规模 K8s 集群,如何先于用户发现问题》。 本篇文章,咱们将持续为大家介绍 ASI SRE(ASI,Alibaba Serverless infrastructure,阿里巴巴针对云原生利用设计的对立基础设施) 是如何摸索在 Kubernetes 体系下,建设 ASI 本身基础设施在大规模集群场景下的变更灰度能力的。 咱们面临着什么ASI 诞生于阿里巴巴团体全面上云之际,承载着团体大量基础设施全面云原生化的同时,本身的架构、状态也在一直地演进。 ASI 整体上次要采纳 Kube-on-Kube 的架构,底层保护了一个外围的 Kubernetes 元集群,并在该集群部署各个租户集群的 master 管控组件:apiserver、controller-manager、scheduler,以及 etcd。而在每个业务集群中,则部署着各类 controller、webhook 等 addon 组件,独特撑持 ASI 的各项能力。而在数据面组件层面,局部 ASI 组件以 DaemonSet 的模式部署在节点上,也有另一部分采纳 RPM 包的部署模式。 同时,ASI 承载了团体、售卖区场景下数百个集群,几十万的节点。即使在 ASI 建设初期,其管辖的节点也达到了数万的级别。在 ASI 本身架构疾速倒退的过程中,组件及线上变更相当频繁,晚期时单日 ASI 的组件变更能够达到数百次。而 ASI 的外围根底组件诸如 CNI 插件、CSI 插件、etcd、Pouch 等,无论任意之一的谬误变更都可能会引起整个集群级别的故障,造成下层业务不可挽回的损失。 简而言之,集群规模大、组件数量多,变更频繁以及业务状态简单是在 ASI,或其余 Kubernetes 基础设施层建设灰度能力和变更零碎的几大严厉挑战。过后在阿里巴巴外部,ASI/Sigma 已有数套现有的变更零碎,但都存在肯定的局限性。 ...

May 11, 2021 · 4 min · jiezi

关于kubernetes:k8s网络解决方案性能PK

引言Kubernetes要求集群中的每个pod都具备惟一的,可路由的IP,Kubernetes自身不会调配IP,而是将工作留给第三方解决方案。 本次课题的指标是找到具备最低提早,最高吞吐量和最低装置老本的解决方案。 因为我的负载对提早敏感,因而我的目标是在绝对较高的网络利用率下测量较高的百分比提早,特地是最大负载的30%到50%之间的性能,因为我认为这是最能代表非过载零碎的最常见用例。 竞争对手们Docker with --net=host这是咱们的一个参考设置,所有其余竞争对手都会与此设置进行比拟。--net=host选项示意容器继承其主机的IP,即不波及容器网络。 依据先验准则,没有任何容器网络计划比其余的会有更好的体现,这就是为什么应用此设置作为参考的起因。 FlannelFlannel是一个虚构网络解决方案,由CoreOS保护,它是通过充沛验证可立刻投入生产的解决方案,因而装置老本最低。将带有Flannel的worker节点增加到k8s群集时,Flannel会做三件事: 应用etcd为新worker节点调配一个子网在机器上创立虚构网桥接口(称为docker0网桥)设置数据包转发后端:aws-vpc在Amazon AWS实例表中注册机器子网,此表的记录数限度为50,即如果将Flannel布与aws-vpc一起使 用,则集群的节点数量不能超过50,此外,尔后端仅实用于Amazon的AWS。host-gw通过近程主机IP创立到子网的IP路由。 须要运行Flannel的主机之间2层直连。vxlan创立一个虚构VXLAN接口因为Flannel应用网桥接口转发数据包,因而流量从一个容器到另一个容器的过程中,每个数据包都会通过两个网络栈。 IPvlanIPvlan是Linux内核中的驱动程序,可能创立具备惟一IP的虚构接口,而不用应用网桥接口。 要将IP调配给具备IPvlan的容器,你必须: 创立一个齐全没有网络接口的容器在默认网络名称空间中创立ipvlan接口将此接口挪动到容器的网络命名空间中IPvlan是一个绝对较新的解决方案,因而没有现成的工具能够主动执行此过程。 这使得很难在许多服务器和容器中部署IPvlan,即部署老本很高。然而,IPvlan不须要桥接接口,而是间接将数据包从NIC转发到虚构接口,因而冀望它的性能优于Flannel。 负载测试计划对于每个竞争对手,执行以下步骤: 在两台物理机上设置网络在一台机器上的容器中运行tcpkali,让其以恒定速率发送申请在另一台计算机上的容器中运行Nginx,让它以固定大小的文件响应捕捉零碎指标和tcpkali后果咱们以每秒50,000至450,000个申请(RPS)的申请速率运行基准。在每次申请时,Nginx都会响应一个固定大小的动态文件:350 B(内容为100 B,题目为250 B)或4 KB。 测试后果结果显示IPvlan有着最低的提早和最高的最大吞吐量,host-gw和aws-vpc的Flannel紧随其后,然而host-gw在最大负载下显示的后果更好。应用vxlan的Flannel在所有测试中均显示最差的后果,然而,我狐疑99.999%ile测试后果的异样是由一个bug引起的。4 KB响应的后果相似于350 B响应的后果,但有两个显著的区别:最大的RPS要低得多,因为在4 KB响应下仅需约270kRPS即可齐全加载10 Gbps NIC。吞吐量测试中IPvlan有限靠近--net=host。咱们以后的抉择是应用host-gw模式的Flannel,它没有太多的依赖关系(例如,不须要AWS或新的Linux版本),与IPvlan相比,它易于部署,并且具备足够的性能个性,IPvlan是备选计划,如果某个时候Flannel增加了IPvlan反对,咱们将会切换到它。 只管aws-vpc的性能比host-gw稍好,但其50台计算机节点的局限性以及将其硬连线到Amazon的AWS的事实对咱们来说都是一个阻碍。 50,000 RPS, 350 B在每秒50,000个的申请速度下,所有候选者都体现出令人满意的性能,次要趋势是:IPVlan体现最佳,host-gw和aws-vpc紧随其后,vxlan体现最差。 150,000 RPS, 350 BIPvlan略优于host-gw和aws-vpc,然而在99.99 %ile这个指标上是最差的,host-gw的性能略优于aws-vpc。 250,000 RPS, 350 B这种负载在生产中也很常见,因而这些后果尤为重要。IPvlan再次显示出最佳性能,然而在99.99和99.999 %ile这两个指标上aws-vpc更胜一筹,host-gw在95和99% %ile上优于aws-vpc。 350,000 RPS, 350 B在大多数状况下,提早靠近250,000 RPS(350 B状况),但在99.5 %ile之后迅速增长,这意味着咱们曾经靠近最大RPS。 450,000 RPS, 350 B这是实践上能产生正当后果的最大RPS,IPvlan再次当先,提早比--net-host差30%左右:乏味的是,host-gw的性能比aws-vpc更好: 500,000 RPS, 350 B在500,000 RPS下,只有IPvlan依然无效,体现甚至优于--net=host,然而提早是如此之高,以至于咱们认为这对提早敏感的程序毫无用处。 50k RPS, 4 KB较大的响应会造成较高的网络使用率,但测试后果看起来与较小的响应简直雷同: 150k RPS, 4 KBHost-gw具备令人诧异的99.999%ile,对于较低的百分位数也显示出良好的后果。 250k RPS, 4 KB这是在大的申请响应下的最大RPS,与小的申请响应测试用例不同,aws-vpc的性能比host-gw好得多,Vxlan再次从图中排除。 ...

May 11, 2021 · 1 min · jiezi

关于kubernetes:这个云原生开发的痛点你遇到了吗

简介:上云素来都不是一片坦途,在此过程中咱们总会遇到一些艰难和挑战,得益于云原生技术的日益成熟,这些问题肯定会有相应的解法。作者:纳海 端云互联最佳实际:https://help.aliyun.com/document\_detail/200032.html 背景  在云原生时代,国内外泛滥云厂商开释出弱小的技术红利,如何利用便宜、稳固且高效的云设施是当今的一个次要命题。在云上,咱们能够很不便地创立虚构网络、虚拟机、数据库、音讯队列等基础设施和中间件,也能够应用容器服务、EDAS、SAE、函数计算等PaaS和Serverless服务来加重利用管控的压力。 但事件并不是一帆风顺的。利用上云已是历史大潮不可阻挡,但随之而来开发者很快就领会到上云的另一面:由云上和云下网络不通所带来的开发体验割裂感。在上云之前,开发者能够在本地实现代码开发、测试、联调等开发流程闭环;而上云之后,数据库、缓存、音讯队列和其余微服务利用都部署在云上的虚构网络之中,咱们再无奈在本地实现开发流程。 如果是中东土豪,他可能会思考应用物理专线来买通网络。因为他只需领取光纤铺设费、楼内光缆租赁费、端口占用费、流量费等百万量级的钱,同时压服平安团队来容许齐全买通环境而已。 如果是业余运维人员,他可能会思考搭建VPN来买通网络。当他破费精力搭建VPN服务器,发现共事们还是用不起来,纷纷埋怨: “一关上VPN,整个本地零碎网络流量都转发到云端了,其余事件干不了啦!”“除了配置VPN,还要配置利用运行参数,太麻烦了!”“云端服务怎么调用不了本地服务,云端网络路由增加了吗?”...看到这些问题,运维小哥心田也感到心累... 而当初,咱们提供了一个开箱即用的插件工具,无需你破费大量的金钱或者人力。你所须要的只是在IDE中一键开启开关,而后通过IDE所启动的利用就能拜访到云端环境里的数据库、MQ、缓存和其余微服务。所有的事件都由插件来帮你实现。 介绍这款工具是咱们自主研发的“端云互联”插件,“端”指的是开发端,“云”指的是云上网络,通过某种形式实现“端”和“云”的双向互通,并且没有传统VPN的问题。 端云互联性能集成在Alibaba Cloud Toolkit(简称ACT)这个上云工具产品中,并反对Intellij IDEA和Eclipse两款IDE。你只需在插件市场中搜寻“Alibaba Cloud Toolkit”进行装置即可,例如在Intellij IDEA中搜寻如下: 咱们在2018年就开始了端云互联我的项目的研发,这个过程中迭代了大大小小的版本,共经验了三个里程碑,至今有数十万人次的应用。上面来介绍它的个性反对和实现原理。 端云互联1.01.0阶段解决了本地和云端双向互联的问题,使得本地服务不仅仅可拜访云端资源,还能够跟云端服务相互通信。 双向互联以下为端云互联的外围架构,整体分为两个模块:通道服务和代理机。 其中,模块性能如下: 代理机:负责云端的流量转发。端云互联计划对代理机的要求很低,一台一般规格的ECS就能够充当“乞丐版”的代理机。并且,Debian、Ubuntu、Redhat等Linux零碎曾经蕴含端云互联所依赖的底层库,无需额定装置其他软件。通道服务:负责本地的流量转发。当咱们关上端云互联开关并启动利用时,插件会在本地拉起一个通道服务过程。这个过程的职责非常简单,它只负责本地利用和云端代理机之间的流量转发,无其余操作。通道服务和代理机之间是应用加密通道来通信的,中间人无奈窃取通道中的数据。而在微服务利用中,咱们联合Java原生的代理参数和自研的流量拦挡计划来将利用的流量转发至通道服务。 开发人员在IDE中启动利用时,端云互联插件会主动拉起通道服务,并注入相干参数至利用中。启动后,利用流量主动转发至通道服务,无需人工干预。 从架构上来看,端云互联跟VPN有点相似,都分为服务端和客户端。但实际上,两者有很大的差别,下图进行了比照总结: 其中,在“云端拜访本地”这一点上,尽管两者都反对,但具体原理并不相同。如果采取VPN计划,那么其余云端服务拜访本地服务时,须要手动配置网络路由,否则网络不可达。而端云互联通过革新微服务框架,可使得云端服务调用代理机,再通过代理机转发到本地利用中,无需设置网络路由。在易用性和安全性上,端云互联都优于VPN。 端云互联2.0在1.0阶段,咱们实现了本地和云端的双向互通,这满足了最根本的开发需要。在理论业务中,客户提出了更高的要求。 咱们一个客户有宏大的研发团队,他们都应用端云互联进行开发,但在联调时发现一个问题:研发人员A发动的服务调用有时候调到别的节点去了,没有到所冀望的研发人员B的本地节点上。这个问题是因为微服务框架的路由机制引起的,当环境中一个服务存在多个节点时,会应用随机(或轮流)算法来进行调用。微服务模块越多,链路越长,这个问题就越重大。 在2.0中,咱们提供了多人精准联调能力,此能力可使得服务申请“指哪打哪”,可大幅提高服务联调效率。除此之外,咱们还提供基于代理的近程调试能力,不便本地对云端环境中的微服务节点进行调试,进步调试效率。 同时,通过横向产品反对,端云互联2.0可服务于云原生产品EDAS、SAE和MSE等开发者,受到宽泛好评。 多人精准联调下图形容了多人联调的一个典型场景: 小王负责服务A,小张负责服务B,在一次需要迭代中他们实现了代码开发,正在进行联调。因为微服务框架应用随机(或轮流)策略进行调用,导致了两个问题: 测试同学小马正在环境中进行功能测试,测试申请调用到小王和小张的本地节点上来了,导致测试不合乎预期;小王发动的测试申请调到其余节点去了,没到他和小张的节点上,联调效率很低;通过多人精准联调能力,能够使得只有小王发动的申请调到他的本地节点和小张的本地节点,而测试小马的申请只在云端稳固环境中调用。 小王和小张须要做的事件比较简单,他们只须要在控制台开启全链路流控性能,创立一个用于测试的流控环境。流控环境可配置申请辨认规定,可通过Cookie、Header、申请参数等维度来判断是否为测试申请,如果判断通过则将申请调用到该环境中的节点中去。 而后小王和小张在IDE中将本地节点增加到这个测试环境中去即可,如下所示: 这样配置实现后,那么只有合乎特色的申请才会调用到小王和小张的节点,下图中只有Header蕴含“测试”的申请才会到他们节点中: 近程调试近程调试(Remote Debug)始终都是排查问题的重要伎俩,但在云原生环境里近程调试并不是一件简略的事件。这是因为在默认状况下云上的微服务节点通常不能被公网拜访,如果须要进行近程调试,咱们须要对指标节点凋谢公网拜访,并且设置安全策略以放通调试端口流量。 如果以后有A,B,C三个服务,每个服务有3个节点,那么咱们须要别离建设3个平安组,并绑定9个公网网卡到机器节点。如下所示: 这种形式存在以下问题: 节约老本:每个微服务节点都须要绑定公网网卡,老本跟测试节点数成正相干。配置简单:在云上往往采取弹性伸缩的策略来保护机器节点,达到“用时即建,用完即放”的按需应用目标。而每当创立新的机器节点咱们都须要独自配置公网网卡和平安组,应用上较繁琐。存在安全性隐患:如果微服务节点都对外裸露公网拜访,会存在较大的平安危险。甚至在有些场景下,因为平安要求内网机器节点不容许挂载公网网卡。对于这些问题,端云互联反对基于代理的近程调试,如下所示: 调试申请通过通道服务来转发给代理机,再由代理机转发至指标调试节点。通道服务和代理机之间的通道是加密的。对于平安要求十分严格的场景,能够应用平安组(或白名单)策略来进一步提高代理机的平安水位。 在应用上,你只需配置Alibaba Cloud Remote Debug,配置内容跟IDE自带的近程调试配置基本相同,但反对应用代理进行连贯,如下所示: 其中有如下配置项: Proxy:指定云端代理机。当运行时,插件会主动拉起通道服务连贯代理机,无需人工干预。Host:指定近程调试的指标机器节点IP。图中为172.16.0.1。Port:指定近程调试的指标机器调试端口。图中为5005。云原生产品反对端云互联2.0反对了阿里云上微服务畛域三大产品,EDAS(企业级分布式应用服务)、SAE(Serverless利用引擎)和MSE(微服务引擎)。这三个产品都反对微服务治理能力,满足不同的企业需要,产品个性如下: 企业级分布式应用服务 EDAS(Enterprise Distributed Application Service):是利用全生命周期治理和监控的一站式 PaaS 平台,反对部署于 Kubernetes/ECS,无侵入反对 Java/Go/Python/PHP/.NetCore 等多语言利用的公布运行和服务治理 ,Java 反对 Spring Cloud、Apache Dubbo 近五年所有版本,多语言利用一键开启 Service Mesh。Serverless 利用引擎(Serverless App Engine,简称 SAE):实现了Serverless 架构 + 微服务架构的完满交融,真正按需应用、按量计费,节俭闲置计算资源,同时免去 IaaS 运维,无效晋升开发运维效率。SAE 反对 Spring Cloud、Dubbo 等风行的微服务架构,反对控制台、Jenkins、云效、插件等部署形式。除了微服务利用外,您还能通过 Docker 镜像部署任何语言的利用。微服务引擎(Micro Service Engine,简称MSE):是一个面向业界支流开源微服务生态的一站式微服务平台, 帮忙微服务用户更稳固、更便捷、更低成本的应用开源微服务技术构建微服务体系。提供注册核心、配置核心全托管(兼容Nacos/ZooKeeper/Eureka)、网关(兼容Zuul/Kong/Spring Cloud Gateway)和无侵入的开源加强服务治理能力。因而,无论你是EDAS用户、SAE用户还是MSE用户,都能够应用端云互联能力来进步上云的开发效率。在插件上,这三个产品的配置步骤是基本相同的,除了产品本身的差异性以外。配置页如下所示: ...

May 10, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-认识下Pod的管理者

大家好,我是小菜,后面几篇文章咱们曾经从 k8s 集群的搭建而后到 k8s 中NameSpace 再说到了 k8s 中 Pod 的应用,如果还干到意犹未尽,那么接下来的 Pod 控制器 同样是一道硬菜!死鬼~看完记得给我来个三连哦! 本文次要介绍 k8s中pod控制器的应用 如有须要,能够参考 如有帮忙,不忘 点赞 ❥ 微信公众号已开启,小菜良记,没关注的同学们记得关注哦! 前文回顾: 《k8s 集群搭建》不要让贫困扼杀了你学 k8s 的趣味!万字正告 - k8s入门,理当Pod后行!既然有 pod 的存在,那便须要对pod 进行治理,控制器又怎么了少的了,那么接下来的工夫交给小菜,带你一探到底! Pod控制器一、前头预热咱们曾经分明了Pod是 k8s 中最小的治理单元。想想咱们之前是怎么创立 pod,动动小脑袋,隐约想起如同有3种形式!1. 命令式对象治理 2. 命令式对象配置 3. 申明式对象配置 。 如果能想到这三种,阐明上篇没白学!然而这三种的创立形式,咱们都是围绕 pod 开展的,不论是通过命令间接创立,还是通过 yaml文件配置完再生成,咱们生成的 Kind 都是间接指明 Pod,好像咱们对 pod 的认知也局限于此了。然而明天,小菜就带你意识点不一样的货色,咱们能够通过 Pod管理器 来创立 pod! 1)概念什么是 pod 控制器呢?下面只是简略说了能够用来创立 pod,难道作用也仅此而已,那我何必又多此一举呢~ Pod 控制器,意如其名。就是用来管制 pod的,它是作为治理 pod 的中间层,应用 pod 控制器之后,只须要通知 pod 控制器,我想要几个pod,想要什么样的pod,它便会为咱们创立出满足条件的 pod,并确保每一个 pod 资源都是处于用户冀望的指标状态,如果 pod 资源在运行中呈现故障,它便会基于指定的策略从新编排 pod相当于控制器也就是一个管家,能够更好的为咱们治理 pod。 ...

May 10, 2021 · 4 min · jiezi

关于kubernetes:什么是Kubernetes-Pod

此‘容器’非彼容器很多人可能曾经晓得了这一点:其实并不存在真正的Linux“container”,在Linux中没有所谓的“容器”。 家喻户晓,容器是应用Linux内核的两个个性(称为namespaces和cgroups)运行的惯例过程。 namespace能够为过程提供“视图”用来暗藏namespace之外的所有内容,从而为本人提供一个独立的运行环境,在其中运行的过程将无奈看到或烦扰其余过程。 命名空间蕴含以下这些:• Hostname• Process IDs• File System• Network interfaces• Inter-Process Communication (IPC) 尽管我在下面说过,在名称空间中运行的过程不会烦扰到其余过程,然而一个过程实践上能够应用其所在的物理计算机上的所有资源,从而使其余过程无奈应用资源。 为了限度这一点,Linux推出了称为cgroups的个性。 过程能够像命名空间一样在cgroup中运行,然而cgroup限度了该过程能够应用的资源。 这些资源包含CPU,RAM,块设施I/O,网络I/O等,CPU通常受毫核(内核的千分之一)限度,而内存则受RAM字节数限度。 该过程自身能够失常运行,然而将只能应用cgroup限度范畴内的最大CPU,并且如果过程超出cgroup上设置的内存限度,则会呈现内存不足谬误。 对于namespace和cgroups能够参考之前的文章 什么是容器:namespces和cgroups 我想在这里指出的是cgroups和每个namespce类型都是独立的个性, 下面列出的命名空间的某些子集能够应用或基本不应用,你只能应用cgroup或两者的某种其余组合(好吧,你仍在应用名称空间和cgroup,但仅应用根目录cgroup)。命名空间和cgroup也可用于过程组(一个命名空间中运行的多个过程),这样的话,过程之间就能够看到彼此并进行交互,或者在单个cgroup中运行它们,这样这些过程将一起被限度在特定数量的CPU和RAM中。 组合的组合当在Docker上以通常形式运行容器时,Docker会为每个容器创立namespace和cgroup并让它们一一映射, 这就是开发人员对容器的通常认识。容器实质上是独立的孤岛,但它们可能具备映射到宿主机的存储卷或端口,以便它们能够进行通信。然而,通过一些额定的命令行参数,你能够应用单个namespace组合Docker容器。 首先,咱们创立一个nginx容器。 $ cat <<EOF >> nginx.conf> error_log stderr;> events { worker_connections 1024; }> http {> access_log /dev/stdout combined;> server {> listen 80 default_server;> server_name example.com www.example.com;> location / {> proxy_pass http://127.0.0.1:2368;> }> }> }> EOF$ docker run -d --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf -p 8080:80 nginx接着,在其中运行ghost容器,增加额定的参数以使其退出到nginx容器的命名空间之中。 ...

May 8, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes上的蓝绿部署

引言Kubernetes有一个资源对象,称为Deployments。 当你将应用程序更新到新版本时,Deployments具备进行容器滚动更新的性能。 滚动更新是一种更新应用程序的好办法,因为应用程序在更新过程中应用的资源与未更新时应用的资源数量大致相同,从而对性能和可用性的影响最小。 然而,有许多旧版应用程序不能很好地与滚动更新配合应用,某些应用程序只须要部署一个新版本并立刻转换到新版本即可。 为此,咱们须要执行蓝/绿部署,将现有版本(蓝色)一起部署应用程序的新正本(绿色), 而后将更新过的应用程序对应的ingress/router切换到新版本(绿色 ,接着期待旧的(蓝色)版本实现发送给它的申请,在绝大多数状况下,利用的流量会立即切换到新版本。Kubernetes不反对内置的蓝/绿部署,这里应用的办法是创立一个新的deployment,而后更新该应用程序的服务以指向新的deployment。 蓝色部署Kubernetes deployment指定一组应用程序实例,它创立了一个正本集(replicaset),该正本集负责放弃指定数量的实例失常运行。 通过将以下yaml保留到文件blue.yaml中来创立“ blue”deployment。 apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: nginx-1.10spec: replicas: 3 template: metadata: labels: name: nginx version: "1.10" spec: containers: - name: nginx image: nginx:1.10 ports: - name: http containerPort: 80应用kubectl命令行创立deployment $ kubectl apply -f blue.yaml部署实现后,咱们能够提供一种通过创立service来拜访deployment实例的办法。 service与deployment是拆散的,这意味着无需明确将service指向deployment。 你要做的是指定一个标签选择器(label selector),该标签选择器用于列出组成service的pod。 应用deployment时,通常会设置标签选择器使其与deployment的pod匹配。在本例中有两个标签,name= nginx和version= 1.10。 咱们将它们设置为以下service的标签选择器,将其保留到service.yaml。 apiVersion: v1kind: Servicemetadata: name: nginx labels: name: nginxspec: ports: - name: http port: 80 targetPort: 80 selector: name: nginx version: "1.10" type: LoadBalancer创立service的同时创立一个能够在群集内部拜访的load balancer。 ...

May 7, 2021 · 2 min · jiezi

关于kubernetes:Container-Runtimes四-Kubernetes-Container-Runtimes-CRI

引言这是对于容器运行时系列文章的第四篇,也是最初一篇。 从第1篇开始曾经有一段时间了,在那篇文章中,我概述了容器运行时,并探讨了低级和高级运行时之间的区别。 在第2篇文章中,我具体介绍了低级容器运行时,并构建了一个简略的低级运行时。 在第3篇文章中,我降级了技术栈,介绍了高级容器运行时。 Kubernetes运行时反对容器运行时接口(CRI)的高级容器运行时。 CRI在Kubernetes 1.5中引入,并充当kubelet和容器运行时之间的桥梁,冀望与Kubernetes集成的高级容器运行时实现CRI。 预计运行时将解决镜像治理并反对Kubernetes Pod,并治理各个容器,因而依据咱们在第3篇文章中的定义,Kubernetes运行时必须是高级运行时。低级运行时短少一些必要的个性。 因为第3篇文章介绍了无关高级容器运行时的所有内容,因而在本文中,我将重点介绍CRI,并介绍一些反对CRI的运行时。 为了更多地理解CRI,值得看一下Kubernetes架构。 Kubelet是一个位于Kubernetes集群中每个工作节点上的代理。 Kubelet负责管理其节点的容器工作负载,当波及到理论运行工作负载时,kubelet应用CRI与在同一节点上运行的容器运行时进行通信。 这样,CRI仅仅是一个形象层或API,它使您能够将容器运行时的实现独自拆分进去,而不用将其内置到kubelet中。 CRI运行时示例这里列出一些可与Kubernetes一起应用的CRI运行时。 containerdcontainerd是我在第3篇文章中提到的高级运行时。containerd可能是以后最风行的CRI运行时,它将CRI实现作为默认状况下启用的插件。 默认状况下,它在unix socket上开启监听,因而通过如下配置连贯到容器: cat <<EOF | sudo tee /etc/crictl.yamlruntime-endpoint: unix:///run/containerd/containerd.sockEOF这是一个乏味的高级运行时,因为它在1.2版开始通过称为“runtime handler”的货色反对多个低级运行时。 runtime handler是通过CRI中的一个字段传递的,基于该运行时处理程序的容器将运行一个名为shim的应用程序以启动容器。 它能够用于应用除runc之外的低级运行时来运行容器,例如gVisor,Kata Containers或Nabla Containers。 runtime handler在k8s 1.12 alpha版本的RuntimeClass object中正式被提交,这里有更多对于containerd's shim的概念介绍。 DockerDocker runtime第一个实现了对CRI的反对,并且作为kubelet和Docker之间的一个shim而实现。 从那以后,Docker已将其许多性能合成为容器,当初通过容器反对CRI。 装置最新版本的Docker时,将同时装置containerd和CRI间接与containerd通信。 因而,Docker自身并不需要反对CRI。 因而,依据你的理论状况,能够间接装置容器或者通过Docker来装置。 cri-ocri-o是一个轻量级的CRI运行时,它是Kubernetes特定的高级运行时。 它反对OCI兼容镜像的治理,并从任何OCI兼容镜像注册表中提取。 它反对runc和Clear Containers作为低级运行时,在实践上反对其余OCI兼容的低级运行时,但依赖于与runc OCI命令行界面的兼容性,因而在实践中它不如容器的shim API灵便。cri-o的endpoints默认状况下位于/var/run/crio/crio.sock,因而能够通过如下形式配置crictl: cat <<EOF | sudo tee /etc/crictl.yamlruntime-endpoint: unix:///var/run/crio/crio.sockEOFCRI标准CRI是一个protocol buffers和gRPC API。 该标准是在kubelet下的Kubernetes镜像仓库中的protobuf文件中定义的。 CRI定义了几种近程过程调用(RPCs)和音讯类型。 RPCs用于“镜像”(ImageService.PullImage),“创立容器”(RuntimeService.RunPodSandbox),“创立容器”(RuntimeService.CreateContainer),“启动容器”(RuntimeService.StartContainer),“进行容器”等操作 (RuntimeService.StopContainer)等 例如,通过CRI启动一个新的Kubernetes Pod的典型交互看起来相似于以下内容(以我本人的伪gRPC模式,每个RPC都会失去一个更大的申请对象,为简便起见,我对其进行了简化)。 RunPodSandbox和CreateContainer RPC在其响应中返回ID,这些ID在后续申请中应用: ImageService.PullImage({image: "image1"})ImageService.PullImage({image: "image2"})podID = RuntimeService.RunPodSandbox({name: "mypod"})id1 = RuntimeService.CreateContainer({ pod: podID, name: "container1", image: "image1",})id2 = RuntimeService.CreateContainer({ pod: podID, name: "container2", image: "image2",})RuntimeService.StartContainer({id: id1})RuntimeService.StartContainer({id: id2})应用crictl工具能够间接与CRI运行时进行交互,能够间接从命令即将gRPC消息发送到CRI运行时并用它来调试和测试CRI实现,而无需启动kubelet或Kubernetes集群,能够从GitHub上cri-tools版本页面下载crictl二进制文件来获取相干文件。能够通过在/etc/crictl.yaml下创立配置文件来配置crictl。 在这里,你应该将运行时的gRPC端点指定为Unix socket文件(unix:///path/to/file)或TCP端点(tcp://<host>:<port>)。 在本例中将应用containerd: ...

May 7, 2021 · 1 min · jiezi

关于kubernetes:kubernetes环境下harbor安装

介绍harbor反对docker compose和helm两种形式进行装置,个别状况下如果是kubernetes运行环境举荐用helm进行装置,如果是纯docker环境倡议用docker compose进行装置,本次装置应用helm进行装置,装置版本为v2.2.1 创立命名空间harbor蕴含服务较多,倡议独自创立命名空间进行装置,便于后续的治理 apiVersion: v1kind: Namespacemetadata: name: harbor labels: name: harbor另存为harbor-namespace.yaml文件,并执行kubectl apply -f harbor-namespace.yaml命令进行创立 创立共享目录目录必须创立在共享存储的介质下面,比方NFS等 mkdir -p /u02/appdata/harbor/registrymkdir -p /u02/appdata/harbor/chartmuseummkdir -p /u02/appdata/harbor/jobservicemkdir -p /u02/appdata/harbor/databasemkdir -p /u02/appdata/harbor/redismkdir -p /u02/appdata/harbor/trivychmod 777 /u02/appdata/harbor/registrychmod 777 /u02/appdata/harbor/chartmuseumchmod 777 /u02/appdata/harbor/jobservicechmod 777 /u02/appdata/harbor/databasechmod 777 /u02/appdata/harbor/redischmod 777 /u02/appdata/harbor/trivy创立PV PVCPV依据理论状况进行创立,这里间接创立本地目录PV,通过PVC进行绑定关联 apiVersion: v1kind: PersistentVolumemetadata: name: "harbor-registry-pv" labels: name: harbor-registry-pv release: stablespec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain hostPath: path: /u02/appdata/harbor/registry type: DirectoryOrCreate---apiVersion: v1kind: PersistentVolumemetadata: name: "harbor-chartmuseum-pv" labels: name: harbor-chartmuseum-pv release: stablespec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain hostPath: path: /u02/appdata/harbor/chartmuseum type: DirectoryOrCreate---apiVersion: v1kind: PersistentVolumemetadata: name: "harbor-jobservice-pv" labels: name: harbor-jobservice-pv release: stablespec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain hostPath: path: /u02/appdata/harbor/jobservice type: DirectoryOrCreate---apiVersion: v1kind: PersistentVolumemetadata: name: "harbor-database-pv" labels: name: harbor-database-pv release: stablespec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain hostPath: path: /u02/appdata/harbor/database type: DirectoryOrCreate---apiVersion: v1kind: PersistentVolumemetadata: name: "harbor-redis-pv" labels: name: harbor-redis-pv release: stablespec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain hostPath: path: /u02/appdata/harbor/redis type: DirectoryOrCreate---apiVersion: v1kind: PersistentVolumemetadata: name: "harbor-trivy-pv" labels: name: harbor-trivy-pv release: stablespec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain hostPath: path: /u02/appdata/harbor/trivy type: DirectoryOrCreate---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: harbor-registry-pvc namespace: harborspec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi selector: matchLabels: name: harbor-registry-pv release: stable---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: harbor-chartmuseum-pvc namespace: harborspec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi selector: matchLabels: name: harbor-chartmuseum-pv release: stable---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: harbor-jobservice-pvc namespace: harborspec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi selector: matchLabels: name: harbor-jobservice-pv release: stable---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: harbor-database-pvc namespace: harborspec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi selector: matchLabels: name: harbor-database-pv release: stable---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: harbor-redis-pvc namespace: harborspec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi selector: matchLabels: name: harbor-redis-pv release: stable---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: harbor-trivy-pvc namespace: harborspec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi selector: matchLabels: name: harbor-trivy-pv release: stable另存为harbor-pv.yaml文件,并执行kubectl apply -f harbor-pv.yaml命令进行创立 ...

May 3, 2021 · 3 min · jiezi

关于kubernetes:扩展-GRTN云原生趋势下的-RTC-架构演进

简介:在 2021 LiveVideoStackCon 音视频技术大会上海站,聚焦 “轻端重云和边缘架构新模式” 专场,阿里云视频云的 RTC 传输专家杨成立(忘篱)带来 “基于边缘云原生的 RTC 服务架构演进” 的主题演讲,与行业搭档分享视频云在 RTC 服务架构演进之路上的挑战和教训,以下为残缺的演讲内容。后端传输网络是 RTC 零碎的外围能力,比方阿里云的 GRTN、声网的 SD-RTN 等。本文介绍了阿里云视频云如何不断改进 RTC 架构,扩大 GRTN 网络,并基于云原生技术取得云的弱小能力。 集体介绍大家好,我是杨成立(忘篱),目前在阿里云负责 RTC 的传输网络,之前在蓝汛 CDN 负责直播的传输网络,这十年左右始终在做视频的后端服务,也是开源视频服务器 SRS 的作者,SRS 目前是寰球 Top1 的开源视频服务器。 后端服务都架构在云上,CDN 的趋势也是边缘云,这是因为云计算成为各种服务的基础设施,当然也包含视频的后端服务。开发者能够便捷的间接应用云厂商的 SDK 和视频云服务,也能够应用开源计划在云上构建本人的零碎。 我正好沉闷在视频开源和云服务这两个畛域,始终都有敌人询问这两个的差别,借这次机会正好分享下这个话题,心愿通过这次分享,大家能够理解,从一个开源服务器,到能够提供服务的商业系统,到底有哪些路要走。 RTC 服务介绍因为有些敌人不是做服务器的,我还是先介绍下 RTC 服务是什么吧。 直播通过这些年的倒退,大家都了解须要后端服务,比方 OBS 推流,是不能间接推给播放器的,而是通过 CDN 转发,CDN 就是直播的后端服务了。 RTC 是大不相同的,比方 WebRTC 自身设计是通话,通话场景大部分时候都是一对一的对话,所以 WebRTC 设计了多种传输方式,比方间接 P2P、通过 STUN 转发、通过 SFU 或 MCU 转发。 如果只是跑 DEMO,那么不必 RTC 服务器,间接 P2P 也是能够跑起来的。实在线上,必定是要通过服务器,当初应用最广的是 SFU 转发。次要起因如下: ...

April 29, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes-普及系列容器基础入门

随着云原生时代的降临,云以及分布式计算曾经是时下最受欢迎的技术之一了。其中 Docker 作为最出名的容器平台,到底有着怎么的魅力来让其无人不知无人不晓?废话不多说,让咱们开始逐层掀开容器技术的神秘面纱吧! Docker从传统 IT 到 IaaS 到 PaaS 的能力变迁 让工夫回到 2013 年,在该时候,虚拟机和云服务曾经很风行了。支流用户的常见做法,就是在云平台(比方腾讯云、AWS、OpenStack 等),像治理物理服务器一样用脚本来做治理和部署利用。 这样的做法始终存在本地环境和线上环境不统一导致部署呈现问题的危险,所以各家云平台的思路都是去模拟出更加靠近本地服务器的环境,来给用户提供更好的上云体验。所以开源的 PaaS 我的项目提供“利用托管”的能力,就是解决该问题的一个最佳计划。 在泛滥开源 PaaS 我的项目中,最热门的 Cloud Foundry 基本上曾经吸引了所有云厂商的眼光,开启了以开源 PaaS 为外围构建平台层服务能力的改革。 大家可能并不是很相熟 Cloud Foundry,简略地说,Cloud Foundry 所做的就是提供一个 "cf push" 命令行工具,让大家可能对一些支流语言的代码进行打包上传和散发。而后 Cloud Foundry 通过调用操作系统的 CGroups 和 Linux Namespace,独自为每一个利用创立一个隔离的沙盒环境,而后在其中启动这些利用的过程。 Cloud Foundry 的最外围命令 cf push 的业务流程图 所以过后 Cloud Foundry 最外围的能力,就是提供隔离的运行环境,也就是“容器”了。 过后的 PaaS 风潮参与者,dotCloud 是最不起眼的公司之一 同期,有一家名叫 dotCloud 的公司,因为它的主打产品跟 Cloud Foundry 社区是脱节的,所以长期以来都无人问津。终于,dotCloud 公司决定开源本人的容器我的项目 Docker。 但很惋惜在过后并没有人关注 dotCloud 的该决定,因为“容器”该概念素来就不是什么陈腐的货色,也不是 Docker 公司创造的。哪怕是在过后最热门的 PaaS 我的项目 Cloud Foundry 里,容器也只是其最底层,最没人关注的那一部分。 ...

April 28, 2021 · 2 min · jiezi

关于kubernetes:连续三年入围-Gartner-容器竞争格局阿里云容器服务新布局首次公开

简介: 近日,国内出名信息技术咨询机构 Gartner 公布 2021 年容器竞争格局报告,阿里云成为国内惟一间断三年入选的中国企业,产品丰盛度与成熟度持续保持寰球领先水平。 起源 | 阿里巴巴云原生公众号 近日,国内出名信息技术咨询机构 Gartner 公布 2021 年容器竞争格局报告,阿里云成为国内惟一间断三年入选的中国企业,产品丰盛度与成熟度持续保持寰球领先水平。 与今年相比,在 Kubernetes 反对、容器镜像、Serverless 容器、服务网格等传统维度根底上,本次报告新增了集群部署状态和管控立体两个维度,阿里云容器产品再次取得国内高度认可。 Gartner 指出容器曾经倒退成熟并跻身支流市场,不仅涌现了更加丰盛的容器企业落地场景,同时多家容器厂商也开始并购与整合。Gartner 称为了不便更多公众行业采纳容器,厂商须要不断丰富各类企业级利用镜像市场、减少对 aPaaS(利用平台即服务)的反对、实现多种云状态的部署与管控等等。 阿里云容器服务以后产品的布局,与此次 Gartner 的行业洞悉不约而同。 阿里云为企业级容器规模化生产推出大量新品,容器服务企业版 ACK Pro 与容器镜像服务企业版 ACR EE,满足可靠性、安全性的强烈需要;同时也在 Serverless 容器、机器学习、边缘计算以及分布式云等方向提供了相应性能,并曾经在如互联网、新批发、教育、医疗等企业落地。 Serverless 容器,简洁管控、不简略的海量扩容 Serverless 无服务化成为日益关注的热点,其主旨在于帮忙云上使用加重如服务器运维治理等与开发代码无关的工作量,转而更多地关注业务构建;并且于此同时还会尽可能地帮忙客户优化利用启动速度。 在面向事件驱动利用的函数计算(FC)、面向微服务利用的 Serverless 利用引擎(SAE)之外,阿里云还提供了 Serverless 容器产品:Serverless Kubernetes(ASK),在提供规范的 Kubernetes 界面的同时,岂但能够让用户享受到极致的弹性能力,并且实现免运维,客户能够疾速创立 Serverless 集群而无需治理 Kubernetes 节点和服务器,不用精心的布局容量,也无需关怀底层服务器。 Serverless Kubernetes 集群中的 Pod 基于阿里云弹性容器实例(ECI)运行在平安隔离的容器运行环境中。每个 Pod 容器实例底层通过轻量级虚拟化平安沙箱技术齐全强隔离,容器实例间互不影响。基于阿里云深度优化的 Serverless 容器架构,使得 ASK 集群能够轻松取得极大的弹性能力,而不用受限于集群的节点计算容量。以后 ASK 弹性能力曾经达到 30s 启动 500 运行的 Pod,单集群轻松反对 20K Pod 容量。 ...

April 27, 2021 · 1 min · jiezi

关于kubernetes:全球年青人召集令Hello-WorldHello-2050

简介:当你写下“Hello World”的那一刻,一个 0 与 1 交错的精彩世界给出了邀请函。年青的你跳上了世界的肩膀看到了将来的模样,沿途的灯塔都是如此迷人,未知的雨林更是万物成长。登程吗?就当初!第一站?@2050! 起源 | 阿里巴巴云原生公众号 敬爱的各位开发者,大家好: 当你写下“Hello World”的那一刻,一个 0 与 1 交错的精彩世界给出了邀请函。年青的你跳上了世界的肩膀看到了将来的模样,沿途的灯塔都是如此迷人,未知的雨林更是万物成长。登程吗?就当初!第一站?@2050! 2050,是王坚博士发动的一场属于寰球年青人的科技团圆 Party,这里平等自在、翻新凋谢、生动有趣、暮气沉沉! 王坚博士说, 没有年青人,就不会有阿里云。 年青人心中的将来肯定就是世界的将来。 2050 是年青人的热带雨林,万物皆可成长。 王坚人称“博士”,他是阿里巴巴团体技术委员会主席,阿里云创始人,云栖小镇及雪浪小镇创立者、城市大脑发起人……放下这些光环,现在他是 2050 大会的第一位志愿者。 2050 – 年青人因科技而团圆,已于 2019 年隆重揭幕,往年将于 4 月 23 - 25 日在杭州 · 云栖小镇举办 2050@2020&2021(去年和往年一并举办)。如何在云栖小镇 HIGH 三天?2050有十大容器出现大家发明进去的各种流动。 青年团圆——年青就要最认真见面 新生论坛——年青就要最大声分享 摸索空间——年青就要最靠近挑战 热带雨林——每个年青人都是新物种 星空露营——享受俯视星空 青春舞台——科技就像音乐 思维约会——分享工夫是真挚 热力静止——年青生机的散发 留鸟打算——致力让年青人见上另一位年青人 2050 青年——致敬为 2050 付出致力的年青人 会场路线图 住宿攻略 获取 PASS 门票:\_https://getmypass.2050.org.cn/#/\_自愿者指南详情:\_https://2050.org.cn/survival/19867/\_如果你刚好也会前来参加本次的 2050 大会, 请记得,来阿里巴巴云原生发动的“云原生开源团圆”,一起来畅聊云原生开源合作中所遇到的困惑和挑战。 云原生,为云而生,构筑数字世界新将来,正在帮忙千万企业打造出反对海量业务的技术根基。开源,自诞生以来曾经扭转了技术革新的产生和合作形式,也在继续改写软件商业生态的游戏规则。开源减速云原生化,有数社区开发者在其中汇聚成了一股重要推动力。 云原生 Kubernetes 已成为相对支流,落地中你遇到哪些困惑和挑战?你感觉 2050年的开源将是什么样子?云原生和开源又将会碰撞出什么火花?敬爱的正在扭转世界的你,窥探将来的明码或者就藏在这次云原生开源团圆中,咱们邀请你说出你的故事~ ...

April 26, 2021 · 1 min · jiezi

关于kubernetes:k3s-server-无法-kubectl-get-nodes-到-k3s-agent

k3s server 无奈 kubectl get nodes 到 k3s agentERROR ...[INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env[INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service[INFO] systemd: Enabling k3s-agent unit[INFO] systemd: Starting k3s-agentroot@192-168-1-102:~# systemctl status k3s-agent● k3s-agent.service - Lightweight Kubernetes Loaded: loaded (/etc/systemd/system/k3s-agent.service; enabled; vendor preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Fri 2021-04-23 16:46:30 CST; 1s ago Docs: https://k3s.io Process: 3591 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS) Process: 3592 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS) Process: 3593 ExecStart=/usr/local/bin/k3s agent (code=exited, status=1/FAILURE) Main PID: 3593 (code=exited, status=1/FAILURE)root@192-168-1-102:~# /usr/local/bin/k3s-agent-uninstall.sh Process: 3593 ExecStart=/usr/local/bin/k3s agent (code=exited, status=1/FAILURE)查看发现应用 sudo su 有异样pi@192-168-1-102:~ $ sudo susudo: unable to resolve host 192-168-1-102: Name or service not knownroot@192-168-1-102:/home/pi#sudo: unable to resolve host 192-168-1-102: Name or service not known批改 hostname 步骤有问题先前应用如下办法批改 hostnameroot@pi-102:/home/pi# nano /etc/hostname/etc/hostnamepi-102但 hosts 文件内 hostname 没变root@pi-102:/home/pi# nano /etc/hosts/etc/hosts27.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackff02::1 ip6-allnodesff02::2 ip6-allrouters127.0.1.1 raspberrypi/etc/hosts 批改为/etc/hosts27.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackff02::1 ip6-allnodesff02::2 ip6-allrouters127.0.1.1 pi-102重新部署 k3s agent 并查看状态root@pi-102:~# systemctl status k3s-agent● k3s-agent.service - Lightweight Kubernetes Loaded: loaded (/etc/systemd/system/k3s-agent.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2021-04-23 17:00:30 CST; 58s ago Docs: https://k3s.io Process: 1004 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS) Process: 1007 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS) Main PID: 1008 (k3s-agent) Tasks: 31 Memory: 184.7M CGroup: /system.slice/k3s-agent.service ├─1008 /usr/local/bin/k3s agent └─1029 containerd Apr 23 17:01:19 pi-102 k3s[1008]: I0423 17:01:19.221111 1008 shared_informer.go:240] Waiting for caches to sync for endpoint slice configApr 23 17:01:19 pi-102 k3s[1008]: I0423 17:01:19.321267 1008 shared_informer.go:247] Caches are synced for service configApr 23 17:01:19 pi-102 k3s[1008]: I0423 17:01:19.321412 1008 shared_informer.go:247] Caches are synced for endpoint slice config在 k3s server 中测试root@192-168-1-100:~# kubectl get nodesNAME STATUS ROLES AGE VERSION192-168-1-100 Ready control-plane,master 7h26m v1.20.6+k3s1raspberrypi-101 Ready worker 7h22m v1.20.6+k3s1pi-102 Ready <none> 30s v1.20.6+k3s1批改节点 pi-102 角色root@192-168-1-100:~# kubectl label node pi-102 node-role.kubernetes.io/worker=workernode/pi-102 labeledroot@192-168-1-100:~# kubectl get nodesNAME STATUS ROLES AGE VERSION192-168-1-100 Ready control-plane,master 7h27m v1.20.6+k3s1raspberrypi-101 Ready worker 7h23m v1.20.6+k3s1pi-102 Ready worker 98s v1.20.6+k3s1:-) 奇怪的谬误

April 23, 2021 · 2 min · jiezi

关于kubernetes:k8soperator-系列-基于-k8s-实现-Leader-选举

Leader election 实现形式: 投票和播送:Raft、Paxos 算法。分布式锁:强制锁、倡议锁。本文的侧重点是基于 k8s 实现 leader 选举在 operator 中的利用,所次要介绍基于分布式锁实现 Leader 选举。 分布式锁的实现依赖分布式一致性数据中心, k8s 的数据一致性依赖于底层的 etcd,etcd 应用的是 Raft 算法,Raft 的 Leader 选举就是应用投票和播送实现,但 Raft 比较复杂,不是本文的重点,有趣味能够自行查阅材料。 强制锁 和 倡议锁 的术语借鉴于 Linux 文件锁,k8s 上这两种实现与其十分类似。强制锁源码:https://github.com/operator-f... 实现原理: Lock:利用 k8s 资源的唯一性,胜利创立资源既抢到锁。例如,创立一个 configMap。UnLock:利用 k8s 的 GC,将 configMap 的 ownerReference 设为以后 pod,pod 销毁则 configMap 被 GC 删除,锁开释。长处: 实现简略。不会呈现多 Leader。毛病: ownerReference 不可跨 namespace。依赖 k8s GC,如果 GC 故障或提早,则会导致服务一段时间不可用。pod 重启(pod 没有被删除,只是容器重启)也不会开释锁。抢占式,会导致惊群效应。没有锁超时机制。应用err := leader.Become(context.TODO(), "demo-operator-lock")if err != nil { log.Error(err, "") os.Exit(1)}新版 operator-sdk(Ver >= v1.0.0)中已弃用基于 GC 的 LeaderElection。 ...

April 18, 2021 · 3 min · jiezi

关于云原生:阿里巴巴云原生-etcd-服务集群管控优化实践

简介: 这些年,阿里云原生 etcd 服务产生了天翻地覆的变动,这篇文章次要分享一下 etcd 服务在面对业务量大规模增长下遇到的问题以及咱们是如何解决的,心愿对读者理解 etcd 的应用和管控运维提供教训分享。 作者 | 陈星宇(宇慕)起源 | 阿里巴巴云原生公众号 背景Kubernetes 采纳 etcd 存储其外部外围元数据信息。通过这些年的倒退,尤其是随同着这两年云原生的疾速倒退,Kubernetes被人们宽泛认同并大规模被应用。随同阿里外部容器平台 ASI 及私有云 ACK 集群数飞速增长,底层存储 etcd 集群取得井喷式地增长,etcd 集群数从原来的十几个倒退到了目前达到几千个,它们散布在世界各地,为下层 Kubernetes 集群以及其余产品服务,服务用户超万个。 这些年,阿里云原生 etcd 服务产生了天翻地覆的变动,这篇文章次要分享一下 etcd 服务在面对业务量大规模增长下遇到的问题以及咱们是如何解决的,心愿对读者理解 etcd 的应用和管控运维提供教训分享。 具体将分三个局部进行介绍: etcd 集群老本优化,利用率晋升etcd 管控运维效率晋升etcd 内核架构降级etcd 集群运行老本优化、利用率晋升近些年,etcd 集群数井喷式增长。它的运行状态经验了从 1.0 到 2.0 到 3.0 的变动,具体如下图: 1.0 物理机时代在一开始,咱们管控的 etcd 集群数比拟少,咱们在宿主机上应用 docker 间接运行 etcd 容器。即图中的 1.0 模式。 2.0 云上时代1.0 模式运行 etcd 非常简单,但也存在应用物理机运行软件低效等常见问题,随着阿里巴巴全面上云的步调,etcd 也全面将运行环境切到了云上 ecs,存储也换成了云盘 ssd 或 essd。 全面上云劣势显著,利用阿里云底层 Iaas 的 ecs 弹性和存储云盘,etcd 集群可疾速实现垂直程度伸缩,故障迁徙也比 1.0 时容易的多。以集群升配操作为例,整个降级工夫从最后的半小时升高到当初的 10 分钟,能够兼顾业务应用峰值和日常一般压力,稳固承载阿里外部双十一业务顶峰以及内部多个私有云客户春节大促流动。 ...

April 15, 2021 · 2 min · jiezi

关于kubernetes:自建Kubernetes集群如何使用弹性容器实例ECI

简介: 虚构节点(Virtual Node)实现了Kubernetes与弹性容器实例ECI的无缝连贯,让Kubernetes集群轻松取得极大的弹性能力,而不用受限于集群的节点计算容量。您能够灵便动静的按需创立ECI Pod,免去集群容量布局的麻烦。本文次要介绍虚构节点和ECI,通过ack-virtual-node组件如何部署虚构节点及如何创立ECI Pod。虚构节点(Virtual Node)实现了Kubernetes与弹性容器实例ECI的无缝连贯,让Kubernetes集群轻松取得极大的弹性能力,而不用受限于集群的节点计算容量。您能够灵便动静的按需创立ECI Pod,免去集群容量布局的麻烦。本文次要介绍虚构节点和ECI,通过ack-virtual-node组件如何部署虚构节点及如何创立ECI Pod。前提条件• 自建Kubernetes集群版本须要高于1.14版本。• 您须要创立一个注册集群,并将自建Kubernetes集群接入注册集群。具体操作,请参见创立阿里云注册集群并接入自建Kubernetes集群。• 您须要开明弹性容器实例服务。登录弹性容器实例控制台开明相应的服务。• 您须要确认集群所在区域在ECI反对的地区列表内。登录弹性容器实例控制台查看曾经反对的地区和可用区。虚构节点和弹性容器实例ECI阿里云弹性容器实例ECI(Elastic Container Instance)是面向容器的无服务器弹性计算服务,提供免运维、强隔离、疾速启动的容器运行环境。应用ECI无需购买和治理底层ECS服务器,让您更加关注在容器利用而非底层基础设施的保护工作。您可按需创立ECI,仅为容器配置的资源付费(按量按秒计费)。虚构节点Virtual Node实现了Kubernetes与弹性容器实例ECI的无缝连贯,让Kubernetes集群轻松取得极大的弹性能力,而不用受限于集群的节点计算容量。您能够灵便动静的按需创立ECI Pod,免去集群容量布局的麻烦。它非常适合运行在如下多个场景,帮忙用户极大升高计算成本,晋升计算弹性效率。• 在线业务的波峰波谷弹性伸缩:如在线教育、电商等行业有着显著的波峰波谷计算特色。应用虚构节点能够显著缩小固定资源池的保护,升高计算成本。• 数据计算:应用虚构节点承载Spark、Presto等计算场景,无效升高计算成本。• CI/CD Pipeline:Jenkins、Gitlab-Runner。• Job工作:定时工作、AI。阿里云容器服务基于虚构节点和ECI提供了多种Serverless Container产品状态,包含Serverless Kubernetes(ASK)和ACK on ECI,充沛撑持各种弹性和免节点运维场景的用户诉求。步骤一:在自建集群中配置ack-virtual-node组件RAM权限在注册集群中装置组件前,您须要在接入集群中设置AK用来拜访云服务的权限。设置AK前,您须要创立RAM用户并为其增加拜访相干云资源的权限。 创立RAM用户。无关如何创立RAM用户的具体步骤,请参见创立RAM用户。创立权限策略。无关创立权限策略的具体操作步骤,请参见创立自定义策略。请受权RAM的AliyunECIFullAccess策略。为RAM用户增加权限。无关如何为RAM用户受权的具体步骤,请参见为RAM用户受权。为RAM用户创立AK。无关如何为子账户创立AK,请参见获取AccessKey。应用AK在自建Kubernetes集群中创立名为alibaba-addon-secret的Secret资源,步骤二中装置的ack-virtual-node组件将主动援用此AK拜访对应的云服务资源。kubectl -n kube-system create secret generic alibaba-addon-secret --from-literal='access-key-id=<your access key id>' --from-literal='access-key-secret=<your access key secret>'您须要将上述代码中和替换为您获取的AK信息。步骤二:在注册集群中部署ack-virtual-node组件在注册集群中部署ack-virtual-node组件的操作步骤如下:登录容器服务治理控制台。在集群列表页面找到指标注册集群,点击进入集群详情页面。点击运维治理->组件治理,找到ack-virtual-node组件并点击装置期待提醒装置胜利。步骤三:创立ECI Pod您能够通过以下两种办法创立ECI Pod。• 配置Pod标签。给Pod增加标签alibabacloud.com/eci=true,Pod将以ECI形式运行,其节点是虚构节点,示例如下:a. 执行以下命令给Pod增加标签。kubectl run nginx --image nginx -l alibabacloud.com/eci=truea. 执行以下命令查看Pod。kubectl get pod -o wide|grep virtual-kubeleta. 预期输入:nginx-7fc9f746b6-r4xgx 0/1 ContainerCreating 0 20s 192.168.XX.XX virtual-kubelet <none> <none>• 配置命名空间标签。给Pod所在的命名空间增加标签alibabacloud.com/eci=true,Pod将以ECI形式运行,其节点是虚构节点,示例如下:a. 执行以下命令创立虚构节点。kubectl create ns vka. 执行以下命令给Pod所在的命名空间增加标签。kubectl label namespace vk alibabacloud.com/eci=truea. 执行以下命令让命名空间中的Pod调度到虚构节点上。kubectl -n vk run nginx --image nginxa. 执行以下命令查看Pod。kubectl -n vk get pod -o wide|grep virtual-kubeleta. 预期输入:nginx-6f489b847d-vgj4d 1/1 Running 0 1m 192.168.XX.XX virtual-kubelet <none> <none>相干操作批改ACK虚构节点配置虚构节点Controller的配置决定了其调度ECI Pod的行为和ECI运行环境配置,包含虚构交换机和平安组配置等。您能够依据须要灵便的批改Controller配置,批改配置后不会影响曾经运行的ECI Pod,会立刻失效于新建的ECI Pod。执行以下命令批改虚构节点Controller的配置。kubectl -n kube-system edit deployment ack-virtual-node-controller罕用的变更操作如下:• 更新virtual-node controller版本。当您应用更新虚构节点性能时,须要更新Virtual Node Controller镜像至最新版本。• 批改平安组配置ECI_SECURITY_GROUP。您能够批改此环境变量,扭转ECI Pod的平安组。• 批改虚构交换机配置ECI_VSWITCH。您能够批改此环境变量,扭转ECI Pod所在的虚构交换机。倡议配置多个虚构交换机反对多可用区,当单可用区库存有余时,Controller会抉择另外一个可用区创立ECI Pod。• 批改kube-proxy配置ECI_KUBE_PROXY。此环境变量默认值为true,示意ECI Pod默认能够拜访集群中的ClusterIP Service。如果ECI Pod无需拜访ClusterIP Service时,例如Job计算场景,您能够设置此环境变量为false敞开kube-proxy性能。另外在一些规模化场景,例如集群中须要启动大量ECI Pod时,ECI中的kube-proxy和kubernetes apiserver之间的并发连接数也会大量减少,您同样能够抉择敞开kube-proxy性能,缩小对API Server的压力晋升可扩展性。• 批改kube-system/eci-profile configmap。您能够批改此ConfigMap配置更多ECI相干参数,例如虚构交换机、平安组等。删除虚构节点卸载ack-virtual-node组件。• 在自建集群中,删除所有ECI Pod后,在组件治理页面卸载ack-virtual-node组件即可。通过命令kubectl delete no删除相干虚构节点。阐明 当集群中存在ECI Pod时,卸载ack-virtual-node组件会导致ECI实例的残留。原文链接本文为阿里云原创内容,未经容许不得转载。

April 13, 2021 · 1 min · jiezi

关于kubernetes:kubernetes源码分析解析apiserver资源类型一

前言  2021年开始第4个月了,因为工作过于忙碌的缘故很久没有开始文章的写作。其实始终以来我集体把写文章这件事,当作推动本人学习成长的一种形式。   这篇文章是kubernetes源码剖析的第一个主题,后续会陆续更新。大抵的大纲为client-go、控制器、调度器、自定义控制器、operator、网络几个方面。   当操作资源与apiserver进行通信时,平时都是间接编写YAML资源文件,通过kubectl来提交创立对应等资源对象,那么它到底是怎么将YAML转换成对应等API进行通信? Kubernetes版本:v1.8.5 源码地址:https://github.com/kubernetes/ 1.apiserver介绍  k8s通过kube-apiserver组件提供API Server性能,API Server性能提供对k8s各类资源对象的减少改查,例如pod、rc、Service等HTTP Rest接口。 1.1 API版本介绍  理解api版本之前,首先要理解api的申明。Kubernetes在不同的API门路反对多个API版本,例如/api/v1或者/apis/batch。版本可分为: Alpha版本:例如 v1alpha1、v1alpha3示意该版本,默认状况下是被禁用的,能够随时删除对性能的反对,要慎用。Beta版本: 例如v1beta1、v2beta1、v2beta2示意该版本,默认状况下是启用的,示意代码曾经测试通过,然而对象的语义可能随后版本中不兼容。稳固版本: 例如v1示意稳定版,也会呈现在后续版本中。1.2 API门路介绍  在理解api版本信息后,能够一起来理解下Kubernetes API Server门路之间的关系。<center>图1-1 查看接口门路</center>通过如下命令能够查看api接口门路,如图1-1所示: #kubectl get --raw /除了通过以上命令能够看到api接口门路以外,还能够应用proxy进行代理,通过接口方式进行拜访。 #kubectl proxyStarting to serve on 127.0.0.1:8001  代理后间接能够关上http://localhost:8001/查看接...   通过查看门路后,能够把门路做一个性能上的细分,通过图1-2能够看出API的门路构造。<center>图1-2 门路解析</center>  本质上在Kubernetes 集群中,一个API对象在Etcd中的残缺资源门路,是由Group(API组)、Version(API组)和Resource(API资源类型)三个局部组成的。   Kubernetes API 反对通过规范 HTTP:GET、 POST、PUT 和 DELETE 在指定 PATH 门路上创立、更新、删除和检索操作,并应用 JSON作为默认的数据交互格局。 2.解析YAML与apiserver之间的关系  通过第1节中,理解到api的分层,版本关系。那么接下来一起理解下YAML和apiserver之间的关系。 2.1 编写一个简略的yaml文件  比方当初要创立一个nginx1.7.9的pod,那么能够编写一个编排的YAML。创立一个Deployment对象,那么能够这么写: apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deploymentspec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80apiVersion: api的分组及版本,例如 “apps/v1” ,apps对应分组,v1对应版本。kind: 对象资源类型,这里有Job、Service等,也能够自定义资源。 而资源Resource通常是小写复数,例如“Deployment”则是“deployments”。metadata·name: 对应名称spec·replicas: 启动pod对应的个数。spec·template·containers·image: 拉取镜像地址。spec·template·containers·name: pod对应名称。spec·template·containers·ports: pod对应端口。2.2 解析kubectl与apiserver的关系  kubectl其实就是一个和kubernetes apiserver交互的一个命令行工具。通常状况通过YAML对pod进行编排,或者通过YAML创立资源时,能够通过kubectl进行交互。命令如下: ...

April 9, 2021 · 1 min · jiezi

关于kubernetes:从-liteapiserver-看-SuperEdge-边缘节点自治

引言在 SuperEdge 0.2.0版本中,lite-apiserver 进行了重大的架构降级和性能加强。本文将从 lite-apiserver 实现及其与其它 SuperEdge 组件协同的角度,剖析 SuperEdge 的边缘自治能力,给大家的钻研和选型提供参考。 边缘节点自治在云边协同的边缘计算场景中,边缘节点通过公网与云端连贯。边缘节点泛滥,网络环境简单,网络品质参差不齐。边缘节点须要与云端弱网或断网状况下,持续失常工作,已运行的业务不受影响,达到边缘节点自治的目标。 为了实现边缘节点自治,须要解决以下场景: 边缘节点与云端断连,然而它自身失常,下面运行的业务容器应该不被驱赶,也没有新的业务容器调度到该节点上 边缘节点与云端断连时,边缘节点上的 Kubernetes 组件和业务容器可持续运行 边缘节点与云端断连时,边缘节点重启后,节点上的 Kubernetes 组件和业务容器可运行 边缘节点与云端复原后,边缘节点上的数据与云端保持一致 SuperEdge 应用分布式节点健康检查组件 edge-health 来解决场景1,应用 lite-apiserver 来应答场景2、3、4。 lite-apiserver 是运行在边缘节点上的轻量级 apiserver,它代理节点上所有组件和业务容器拜访云端 kube-apiserver 的申请,并对申请后果做高效缓存。在云边断连的状况下,利用这些缓存提供服务,实现边缘自治的能力。 lite-apiserver 设计个性lite-apiserver除了满足边缘节点自治的性能需要外,还须要满足以下设计个性: 反对所有 Client 类型作为边缘节点上拜访云端 kube-apiserver 的惟一“进口”,lite-apiserver 须要反对所有类型的 Client ,包含以 bin (如 kubelet 等)或 pod (如 flannelkube-proxy 等)模式运行的 Kubernetes 组件,以及以 InCluster 形式拜访 kube-apiserver 的业务容器。 更进一步,如果边缘节点网络环境非凡,须要以代理等形式能力拜访云端 kube-apiserver时,只用给 lite-apiserver 设置代理,所有组件即可失常拜访云端 kube-apiserver,不须要每个组件做独自的配置。 反对缓存所有类型资源反对缓存所有类型资源,Kubernetes 内置资源和 Custom Resources。 边缘节点上运行的 Kubernetes 组件和业务容器的申请 kube-apiserver 的资源多样,如果只缓存局部资源类型或仅反对 Kubernetes 内置资源类型,在云边断连时,可能因为读取不到对应的缓存导致组件或业务失败,达不到边缘节点自治的成果。当然,反对所有类型资源的缓存(尤其是 Custom Resources ),也给数据的解析和解决带来了不小挑战。 ...

April 7, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes-实战-05-服务让客户端发现-pod-并与之通信下

将服务裸露给内部客户端 P136 有以下三种形式能够在内部拜访服务: 将服务的类型设置成 NodePort将服务的类型设置为 LoadBalance创立一个 Ingress 资源应用 NodePort 类型的服务 P137通过创立一个 NodePort 服务,能够让 Kubernetes 在其所有节点上保留一个端口(所有节点上都应用雷同端口号),并将传入的连贯转发给作为服务局部的 pod 。 P137 创立 NodePort 类型的服务 P137 能够应用如下形容文件 kubia-svc-nodeport.yaml 创立一个 NodePort 类型的服务。 # 遵循 v1 版本的 Kubernetes APIapiVersion: v1# 资源类型为 Servicekind: Servicemetadata: # Service 的名称 name: kubia-nodeportspec: # 指定服务类型为 NodePort type: NodePort # 该服务可用的端口 ports: # 第一个可用端口的名字 - name: http # 可用端口为 80 port: 80 # 服务将连贯转发到容器的 8080 端口 targetPort: 8080 # 通过集群节点的 30000 端口能够拜访该服务 nodePort: 30000 # 第二个可用端口的名字 - name: https # 可用端口为 443 port: 443 # 服务将连贯转发到容器的 8443 端口 targetPort: 8443 # 通过集群节点的 32767 端口能够拜访该服务 nodePort: 32767 # 具备 app=kubia 标签的 pod 都属于该服务 selector: app: kubianodePort 属性不是强制的,如果疏忽就会随机抉择一个端口。 P137 ...

April 4, 2021 · 5 min · jiezi

关于kubernetes:Kubernetes-稳定性保障手册-可观测性专题

简介: 随同大家对稳定性器重水平的一直晋升、社区可观测性我的项目的炽热,可观测性成为了一个很热门的话题,站在不同的角度会产生不同的了解。 咱们从软件开发的生命周期登程,尝试造成对可观测性的一个宏观了解,并从 SRE 和 Serverless 两个角度具化可观测性的了解以及实际。 作者 | 悟鹏起源 | 阿里巴巴云原生公众号 《Kubernetes 稳定性保障手册》系列文章: Kubernetes 稳定性保障手册 -- 极简版Kubernetes 稳定性保障手册 -- 日志专题Kubernetes 稳定性保障手册 -- 可观测性专题(本文)随同大家对稳定性器重水平的一直晋升、社区可观测性我的项目的炽热,可观测性成为了一个很热门的话题,站在不同的角度会产生不同的了解。 咱们从软件开发的生命周期登程,尝试造成对可观测性的一个宏观了解,并从 SRE 和 Serverless 两个角度具化可观测性的了解以及实际。 目标加强认知,通过全局把握来晋升竞争力通过正当的设计和实际,为将来带来可能性指标针对可观测性的了解达成统一针对可观测性的倒退方向达成统一什么是可观测性?从 wikipedia: Observability 可了解到 可观测性 的定义: In control theory, observability is a measure of how well internal states of a system can be inferred from knowledge of its external outputs.Consider a physical system modeled in state-space representation. A system is said to be observable if, for any possible evolution of state and control vectors, the current state can be estimated using only the information from outputs (physically, this generally corresponds to information obtained by sensors). In other words, one can determine the behavior of the entire system from the system's outputs. On the other hand, if the system is not observable, there are state trajectories that are not distinguishable by only measuring the outputs. ...

April 2, 2021 · 2 min · jiezi

关于kubernetes:拥抱云原生基于eBPF技术实现Serverless节点访问K8S-Service

Serverless容器的服务发现2020年9月,UCloud上线了Serverless容器产品Cube,它具备了虚拟机级别的平安隔离、轻量化的零碎占用、秒级的启动速度,高度自动化的弹性伸缩,以及简洁明了的易用性。联合虚构节点技术(Virtual Kubelet),Cube能够和UCloud容器托管产品UK8S无缝对接,极大地丰盛了Kubernetes集群的弹性能力。如下图所示,Virtual Node作为一个虚构Node在Kubernetes集群中,每个Cube实例被视为VK节点上的一个Pod。 然而,Virtual Kubelet仅仅实现了集群中Cube实例的弹性伸缩。要使得Cube实例正式成为K8s集群小家庭的一员,运行在Cube中的利用须要能利用K8s的服务发现能力,即拜访Service地址。 为什么不是kube-proxy?家喻户晓, kube-proxy为K8s实现了service流量负载平衡。kube-proxy一直感知K8s内Service和Endpoints地址的对应关系及其变动,生成ServiceIP的流量转发规定。它提供了三种转发实现机制:userspace, iptables和ipvs, 其中userspace因为较高的性能代价已不再被应用。 然而,咱们发现,间接把kube-proxy部署在Cube虚拟机外部并不适合,有如下起因: 1 、kube-proxy采纳go语言开发,编译产生的指标文件体积宏大。以K8s v1.19.5 linux环境为例,经strip过的kube-proxy ELF可执行文件大小为37MB。对于一般K8s环境来说,这个体积能够忽略不计;但对于Serverless产品来说,为了保障秒起轻量级虚拟机,虚拟机操作系统和镜像须要高度裁剪,寸土寸金,咱们想要一个部署体积不超过10MB的proxy控制程序。 2 、kube-proxy的运行性能问题。同样因为应用go语言开发,绝对于C/C++和Rust等无gc、具备精密管制底层资源能力的高级语言来说,要付出更多的性能代价。Cube通常存在较细粒度的资源交付配额,例如0.5C 500MiB,咱们不心愿kube-proxy这类辅助组件喧宾夺主。 3 、ipvs的问题。在eBPF被广为周知之前,ipvs被认为是最正当的K8s service转发面实现。iptables因为扩展性问题被鞭尸已久,ipvs却能随着services和endpoints规模增大仍然保持稳定的转发能力和较低的规定刷新距离。 但事实是,ipvs并不完满,甚至存在重大的问题。 例如,同样实现nat , iptables是在PREROUTING或者OUTPUT实现DNAT;而ipvs须要经验INPUT和OUTPUT,链路更长。因而,较少svc和ep数量下的service ip压测场景下,无论是带宽还是短连贯申请提早,ipvs都会取得全场最低分。此外,conn_reuse_mode的参数为1导致的滚动公布时服务拜访失败的问题至今(2021年4月)也解决的不太洁净。 4 、iptables的问题。扩大差,更新慢,O(n)工夫复杂度的规定查找(这几句话背不进去是找不到一份K8s相干的工作的), 同样的问题还会呈现在基于iptables实现的NetworkPolicy上。1.6.2以下iptables甚至不反对full_random端口抉择,导致SNAT的性能在高并发短连贯的业务场景下雪上加霜。 eBPF能为容器网络带来什么?eBPF近年来被视为linux的革命性技术,它容许开发者在linux的内核里动静实时地加载运行本人编写的沙盒程序,无需更改内核源码或者加载内核模块。同时,用户态的程序能够通过bpf(2)零碎调用和bpf map构造与内核中的eBPF程序实时替换数据,如下图所示。 编写好的eBPF程序在内核中以事件触发的模式运行,这些事件能够是零碎调用入进口,网络收发包的要害门路点(xdp, tc, qdisc, socket),内核函数入进口kprobes/kretprobes和用户态函数入进口uprobes/uretprobes等。加载到网络收发门路的hook点的eBPF程序通常用于管制和批改网络报文, 来实现负载平衡,安全策略和监控观测。 cilium的呈现使得eBPF正式进入K8s的视线,并正在粗浅地扭转k8s的网络,平安,负载平衡,可观测性等畛域。从1.6开始,cilium能够100%替换kube-proxy,真正通过eBPF实现了kube-proxy的全副转发性能。让咱们首先考查一下ClusterIP(货色流量)的实现。 ClusterIP的实现无论对于TCP还是UDP来说,客户端拜访ClusterIP只须要实现针对ClusterIP的DNAT,把Frontend与对应的Backends地址记录在eBPF map中,这个表的内容即为前面执行DNAT的根据。那这个DNAT在什么环节实现呢? 对于个别环境,DNAT操作能够产生在tc egress,同时在tc ingress中对回程的流量进行反向操作,行将源地址由实在的PodIP改成ClusterIP, 此外实现NAT后须要从新计算IP和TCP头部的checksum。 如果是反对cgroup2的linux环境,应用cgroup2的sockaddr hook点进行DNAT。cgroup2为一些须要援用L4地址的socket零碎调用,如connect(2), sendmsg(2), recvmsg(2)提供了一个BPF拦挡层(BPF_PROG_TYPE_CGROUP_SOCK_ADDR)。这些BPF程序能够在packet生成之前实现对目标地址的批改,如下图所示。 对于tcp和有连贯的udp的流量(即针对udp fd调用过connect(2))来说, 只须要做一次正向转换,即利用bpf程序,将出向流量的目标地址改成Pod的地址。这种场景下,负载平衡是最高效的,因为开销一次性的,作用成果则继续贯通整个通信流的生命周期。 而对于无连贯的udp流量,还须要做一次反向转换,行将来自Pod的入向流量做一个SNAT,将源地址改回ClusterIP。如果缺了这一步操作,基于recvmsg的UDP利用会无奈收到来自ClusterIP的音讯,因为socket的对端地址被改写成了Pod的地址。流量示意图如下所示。 综述,这是一种用户无感知的地址转换。用户认为本人连贯的地址是Service, 但理论的tcp连贯间接指向Pod。一个能阐明问题的比照是,当你应用kube-proxy的时候,在Pod中进行tcpdump时,你能发现目标地址仍然是ClusterIP,因为ipvs或者iptables规定在host上;当你应用cilium时,在Pod中进行tcpdump,你曾经能发现目标地址是Backend Pod。NAT不须要借助conntrack就能实现,绝对于ipvs和iptables来说,转发门路缩小,性能更优。而比照方才提到的tc-bpf,它更轻量,无需从新计算checksum。 Cube的Service服务发现Cube为每个须要开启ClusterIP拜访性能的Serverless容器组启动了一个叫cproxy的agent程序来实现kube-proxy的外围性能。因为Cube的轻量级虚拟机镜像应用较高版本的linux内核,cproxy采纳了上述cgroup2 socket hook的形式进行ClusterIP转发。cproxy应用Rust开发,编译后的指标文件只有不到10MiB。运行开销相比kube-proxy也有不小劣势。部署构造如下所示。 以下是一些测试状况比照。咱们应用wrk对ClusterIP进行2000并发HTTP短连贯测试,别离比拟svc数量为10和svc数量为5000,察看申请耗时状况(单位ms)。 论断是cproxy无论在svc数量较少和较多的状况下,都领有最好的性能;ipvs在svc数量较大的状况下性能远好于iptables,但在svc数量较小的状况下,性能不如iptables。svc数量=10 svc数量=10 svc数量=5000 后续咱们会持续欠缺基于eBPF实现LoadBalancer(南北流量)转发,以及基于eBPF的网络拜访策略(NetworkPolicy)。 ...

April 2, 2021 · 1 min · jiezi

关于kubernetes:2021年无坑使用kubeadm搭建kubernetes集群

筹备工作1: 装置docker,省去不表。筹备工作2: 咱们须要禁用swap,swapoff -a查看uuid,确保集群内惟一。sudo cat /sys/class/dmi/id/product_uuidsudo netstat -ntlp |grep -E '6443|23[79,80]|1025[0,1,2]' 查看这些端口是否被占用,如果被占用,请手动开释装置kubectl: 1. curl -sSL https://dl.k8s.io/release/v1.20.3/bin/linux/amd64/kubeadm > /usr/bin/kubeadm 2. chmod a+rx /usr/bin/kubeadm3. kubeadm version下载k8s: 1. wget -q https://dl.k8s.io/v1.11.3/kubernetes-server-linux-amd64.tar.gz2. ls kubernetes/server/bin/ | grep -E 'kubeadm|kubelet|kubectl'3. mv kubernetes/server/bin/kube{adm,ctl,let} /usr/bin/配置kubectl: 1. cat <<'EOF' > /etc/systemd/system/kubelet.service [Unit] Description=kubelet: The Kubernetes Agent Documentation=http://kubernetes.io/docs/ [Service] ExecStart=/usr/bin/kubelet Restart=always StartLimitInterval=0 RestartSec=10 [Install] WantedBy=multi-user.target EOF2. mkdir -p /etc/systemd/system/kubelet.service.d3. cat <<'EOF' > /etc/systemd/system/kubelet.service.d/kubeadm.conf [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env EnvironmentFile=-/etc/default/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS EOF 4.systemctl enable kubelet装置前置依赖: ...

April 2, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-实战-05-服务让客户端发现-pod-并与之通信上

简介 P121pod 通常须要对来自集群外部其余 pod ,以及来自集群内部的客户端的 HTTP 申请作出响应,所以须要一种寻找其余 pod 的办法来应用其余 pod 提供的服务。 P121 在 Kubernetes 中通过服务 (service) 解决以下问题: P121 pod 是短暂的: pod 随时启动和敞开Kubernetes 在 pod 启动前会给曾经调度到节点上的 pod 调配 IP 地址:客户端不能提前晓得 pod 的 IP 地址程度伸缩意味着多个 pod 可能提供雷同的服务:每个 pod 都有本人的 IP 地址介绍服务 P122Kubernetes 服务是一种为一组性能雷同的 pod 提供但以不变的接入点的资源。当服务存在时,它的 IP 地址和端口不会扭转。与服务建设的连贯会被路由到提供该服务的任意一个 pod 上。 P122 创立服务 P123服务应用标签选择器(03. pod: 运行于 Kubernetes 中的容器 中介绍过标签选择器及应用形式)来指定属于同一组的 pod 。 P123 通过 kubectl expose 创立服务 P124 创立服务的最简略的办法就是通过 kubectl expose ,在 02. 开始应用 Kubernetes 和 Docker 中就应用该办法创立服务来裸露 Deployment 。 P124 ...

March 30, 2021 · 4 min · jiezi

关于kubernetes:Unable-to-connect-to-the-server-x509-certificate-has-xxxx

systemctl restart haproxysystemctl restart keepalived[root@master49 ~]# systemctl restart keepalived[root@master49 ~]# kubectl get nodeUnable to connect to the server: x509: certificate has expired or is not yet valid[root@master49 ~]# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:50:56:90:60:e2 brd ff:ff:ff:ff:ff:ff inet 172.16.197.49/24 brd 172.16.197.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever inet 172.16.197.200/32 scope global ens160 valid_lft forever preferred_lft forever3: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1 link/ipip 0.0.0.0 brd 0.0.0.04: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:79:10:bc:7b brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever看着配置的https://k8s-lb:16443 也有了端口万万没想到竟然是工夫问题影响的[root@master49 ~]# kubectl get nodeUnable to connect to the server: x509: certificate has expired or is not yet validMay 28 08:07:11 master49 kubelet: E0528 08:07:11.931549 19064 reflector.go:178] k8s.io/kubernetes/pkg/kubelet/config/apiserver.go:46: Failed to list *v1.Pod: Get https://k8s-lb:16443/api/v1/pods?fieldSelector=spec.nodeName%3Dmaster49&limit=500&resourceVersion=0: x509: certificate has expired or is not yet validMay 28 08:07:11 master49 kubelet: E0528 08:07:11.936527 19064 reflector.go:178] k8s.io/kubernetes/pkg/kubelet/kubelet.go:526: Failed to list *v1.Node: Get https://k8s-lb:16443/api/v1/nodes?fieldSelector=metadata.name%3Dmaster49&limit=500&resourceVersion=0: x509: certificate has expired or is not yet validMay 28 08:07:11 master49 kubelet: E0528 08:07:11.938526 19064 reflector.go:178] k8s.io/kubernetes/pkg/kubelet/kubelet.go:517: Failed to list *v1.Service: Get https://k8s-lb:16443/api/v1/services?limit=500&resourceVersion=0: x509: certificate has expired or is not yet validMay 28 08:07:11 master49 kubelet: E0528 08:07:11.941466 19064 reflector.go:178] k8s.io/kubernetes/pkg/kubelet/config/apiserver.go:46: Failed to list *v1.Pod: Get https://k8s-lb:16443/api/v1/pods?fieldSelector=spec.nodeName%3Dmaster49&limit=500&resourceVersion=0: x509: certificate has expired or is not yet validMay 28 08:07:11 master49 kubelet: E0528 08:07:11.946360 19064 reflector.go:178] k8s.io/kubernetes/pkg/kubelet/kubelet.go:526: Failed to list *v1.Node: Get https://k8s-lb:16443/api/v1/nodes?fieldSelector=metadata.name%3Dmaster49&limit=500&resourceVersion=0: x509: certificate has expired or is not yet valid^C[root@master49 ~]# dateThu May 28 08:07:15 CST 1998[root@master49 ~]# crontab -l52 23 * * * /usr/sbin/ntpdate us.pool.ntp.org[root@master49 ~]# /usr/sbin/ntpdate us.pool.ntp.org29 Mar 18:59:00 ntpdate[23754]: step time server 44.190.40.123 offset 720701478.575950 sec[root@master49 ~]# dateMon Mar 29 18:59:02 CST 2021[root@master49 ~]# kubectl get node

March 29, 2021 · 2 min · jiezi

关于kubernetes:阿里云云效技术专家一文详解kubernetes下5种常见发布模式如何选择

简介: Kubernetes下5场场景利用公布形式的抉择,每种公布模式适宜什么样的场景,以及如何在阿里云云效上高效落地。 作者:郑云龙,阿里云云效技术专家 Kubernetes面向通用场景提供了非常灵活的利用治理和运维形式,而作为云效CI/CD平台的开发同学,在日常和用户交换过程中,咱们常常会被用户问到对于公布的问题,比方不同职能团队之间应该如何配合、公布的最佳实际应该是什么样子的等等。 明天咱们就来聊聊Kubernetes下利用公布形式的抉择,每种公布模式适宜什么样的场景,以及如何在云效上高效落地。 Kubernetes利用首先咱们来看看个别状况下Kubernetes是如何治理利用的。 Kubernetes通过申明式的API,并提供了一系列的资源来满足各种各样的利用运维场景: • 从利用的角度咱们会关注利用容器(Pod),利用配置(ConfigMap/Secret),利用须要长久化的信息(Volume),利用与利用之间的服务发现(Service),以及如何将应用服务裸露给集群外的用户(Ingress)等。 • 从集群运维的角度看,因为利用运行在集群中咱们须要管制利用在集群中的权限(ServiceAccount/ClusterRole/Role)使得利用可能以最小所需权限准则在集群中运行,同时运维要治理和配置集群的存储资源(PV/PVC),同时对于资源无限的状况咱们还须要治理和管制利用自身的资源暂用以及配额(quata)等等等。 而在理论场景中因为利用应用的框架(Doubbo/Spring Cloud)的不同,利用对外提供的服务场景不同(后端或者前端),不同的利用可能只须要关注其中的一小部分资源比方当你采纳了像Spring Cloud或者Doubbo这类自带了服务发现的利用开发框架,你可能并不关怀Kubernetes所提供的服务发现能力(Service),只须要通过Deployment来部署和治理这些利用实例。 又比如说如果你采纳了独自的配置管理核心,那ConfigMap/Secret这些可能也不会呈现在你的Kubernetes资源清单中。又比如说,如果是一个面向用户前端利用,在利用部署是除了Deployment实例以外,你还要关系如何将这个服务裸露给内部用户,这是就须要相应的Ingress以及Service的资源来形容。 同时在单个利用在整个零碎中所处的地位不同又会导致咱们对于公布的验证形式也会产生差别,比方一个后端微服务的公布,咱们可能只须要确保公布过程零碎不中断即可,而对于前端利用咱们可能心愿公布可能当初一小部分用户上进行验证,在线上流量充沛测试后,再实现整个版本升级。 如上所示,对于利用而言采纳的技术架构不同,提供的服务的形式不同,对公布验证形式要求的不同都会导致Kubernetes的应用上产生各种各样的差别,而云效为了可能反对这些不同的差别提供了多种多样的公布模式,接下来咱们就来看看云效下罕用的这些公布模式,以及他们所实用的场景。 Kubernetes公布模式最原生:YAML公布 顾名思义,这是咱们在应用Kubernetes时最间接的利用部署形式,而在继续交付流水线中咱们个别将这些用于形容Kubernetes资源的YAML文件通过Git进行对立版本治理,通过云效CI/CD平台监听代码库的变更事件,并通过流水线将这些YAML变更同步到集群当中。这种形式也被称为GitOps模式。 在云效当中,咱们除了反对间接同步YAML到Kubernetes集群以外,还扩大了根本的模板能力,你能够通过在YAML文件中定义变量占位符如${IMAGE},通过流水线运行是通过Docker镜像构建或者阿里云镜像仓库触发器(帮忙文档:阿里云镜像仓库触发器触发流水线),动静产生要公布的镜像版本 如下所示: YAML公布反对任意资源类型,因而实用于如下场景: 1、开发自运维,团队并充沛了解和把握Kubernetes原生的公布策略,心愿通过YAML实现利用的降级与公布以及回滚,一般来说利用Git库会蕴含利用源码,Dockerfile以及部署利用所需的所有YAML文件(在某些状况下,YAML可能是由独自的Git仓库进行治理,以进行细粒度的权限管制)。 2、基础设施运维:运维团队通过Git治理集群的所有基础设施配置,并通过流水线实现集群的对立治理以及配置的同步 更多具体应用介绍请参考:云效Kubernetes YAML公布 **最简略:镜像降级** 在和一些云效用户的交换场景中,在也会有用户心愿开发团队可能尽可能少的了解Kubernetes相干概念,在这种状况下由专职的运维团队负责实现应用环境的部署和初始化。而开发团队只负责实现代码开发,并通过流水线自动化实现利用镜像构建,并应用该镜像对集群中已有的利用进行降级。开发团队只关怀利用的工作负载实例资源。 如下图所示,在云效流水线中咱们监听利用代码库的变动,并构建出相应的Docker镜像,而公布阶段只须要指定对集群中实例并关联前序工作产生的镜像即可实现利用的降级公布: 如上所述,该场景实用于: • 开发和运维拆散:运维团队充沛了解Kubernetes的原生公布策略,开发团队只负责产出代码以及利用镜像,由运维团队负责集群中利用的理论运维治理。 对于如何在云效中应用镜像降级能力,请参考:云效Kubernetes镜像降级 过程可控:分批公布 在后面两个小结中,咱们都强调用户须要充沛了解Kubernetes的原生公布策略,Kubernetes原生的公布策略次要是指RollingUpdate模式,用户通过申明降级策略,如maxSurge和maxUnavailable管制Pod的启动策略以及最大不可用Pod数,来确保即便利用公布出现异常的状况,也能保障服务的根本可用。 除此,因为利用启动往往有肯定的耗时,如果应用了Kubernetes的服务发现机制,咱们还须要配置如liveness以及readiness探针,来防止利用还在启动过程中就有不在打算内的流量进入到正在启动的实例当中。同时整个公布过程是不可逆的,如果认定以后公布呈现了异样咱们只能通过从新公布的形式来使利用回到可用状态。 而在云效的分批公布中,咱们以Service为最小公布单元,在公布开始阶段咱们将基于新版镜像创立出利用的版本V2,并依据以后利用的正本总数以及分批数量,对新旧两个版本的利用实例别离进行缩容和扩容,来管制理论进入到新版利用的流量比例,从而能够实现小规模的公布验证,在对公布进行充沛验证后再逐渐齐全下线老版利用。 同时批次之间反对暂停和手动复原让用户能够充沛对针对公布过程进行管制。 该模式实用于:采纳Kubernetes原生的服务发现机制,并心愿取得相比于原生Kubernetes公布更好过程控制性以及安全性的用户。 更多具体应用介绍,请参考帮忙文档:云效Kubernetes分批公布 内部流量可控:Ingress灰度公布 相比于分批公布灰度公布更强调更加可控和平安的线上验证。而灰度公布在Kubernetes中因为利用的部署模式的不同大抵分为两种,咱们首先来说第一种,基于Ingress的灰度公布,如下所示,咱们通过Ingress将集群内的服务裸露给内部用户: 在公布过程中咱们心愿可能通过cookie或者header的形式使得特定的用户或者开发人员,可能在线上对新版本援用进行验证,通过小局部可控的线上流量验证后,咱们的公布可靠性更好,如果呈现预期外的问题,也能够疾速回滚,并且整个灰度验证过程对非灰度用户齐全不可感知。 在云效流水线的Ingress灰度公布中,咱们以Ingress作为公布单元,当触发部署后,将会依据以后Ingress以及其关联的Service/Deployment资源,基于新版镜像创立出V2版本的Service/Deployment。 并通过Nginx Ingress的Annoation实现对流量规定申明,从而确保只有满足特定特色的流量能力进入到V2版本中,当处于灰度状态时,流水线将会期待人工验证,以触发公布或者或者回滚操作。 对于如何在云效流水线中应用灰度公布请参考帮忙文档:云效Nginx Ingress灰度公布 该模式实用于:采纳Ingress对外裸露应用服务,并且心愿可能通过灰度的形式对公布进行验证 外部流量可控:Istio/ASM灰度公布 而在微服务的场景中,并不是所有的服务都须要间接裸露给内部用户,如下所示: 当采纳微服务架构,咱们大部分的后端服务是只裸露与集群内,微服务之间通过Kubernetes Service进行互相拜访,在这种状况下,当采纳灰度公布模式时,咱们须要在Service级别进行流量管制,已确保指定的流量才进入到灰度的链路而不对失常用户产生影响。 不过因为Kubernetes原生在Service级别并不反对任何的流量管制规定,因而咱们须要在集群中部署Istio或者采纳阿里云ServiceMesh来对服务之间的流量进行细粒度的管制。 如下图所示,当应用Kubernetes蓝绿公布模式时,能够设置灰度流量规定,从而只有当申请中蕴含指定的Cookie配置的申请转发到灰度版本当中: 该模式实用于:采纳Istio或者阿里云ServiceMesh的Kubernetes用户,并且心愿可能通过灰度的形式对公布进行验证。 小结在本文中,咱们次要介绍了Kubernetes理论中的各种公布模式以及相干的实用场景,心愿可能帮忙用户疾速找到适宜本人的公布模式,当然如果你还有更多更好的交付实际,也能够在留言中进行分享。 ...

March 29, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-实战-04-副本机制和其他控制器部署托管的-pod

放弃 pod 衰弱 P84只有 pod 调度到某个节点,该节点上的 Kubelet 就会运行 pod 的容器,从此只有该 pod 存在,就会放弃运行。如果容器的主过程奔溃, Kubelet 就会主动重启容器;如果应用程序奔溃, Kubelet 就会主动重启应用程序。 P84 应用程序也可能因为有限循环或死锁等状况而进行响应。为确保利用在这种状况下能够重新启动,必须从内部查看应用程序的运行状况,而不是依赖于利用的外部检测。 P84 介绍存活探测器 P84Kubernetes 能够通过存活探测器 (liveness probe) 查看容器是否还在运行。能够为 pod 中的每个容器独自指定存活探测器。 Kubernetes 将定期执行探测器,如果探测失败,就会主动重启容器。 P84 留神:Kubernetes 还反对就绪探测器 (readiness probe) ,两者实用于两种不同的场景。 P84 Kubernetes 有三种探测容器的机制: P84 HTTP GET 探测器:对容器的 IP 地址(指定的端口和门路)执行 HTTP GET 申请。如果探测器收到响应,并且响应状态码不代表谬误(状态码为 2xx 或 3xx ),则认为探测胜利。如果服务器返回谬误响应状态码或者没有响应,那么探测就被认为是失败的,容器将被重启。TCP Socket探测器:尝试与容器指定端口建设 TCP 连贯。如果连贯胜利建设,则探测胜利。否则,容器将被重启。Exec 探测器:在容器内执行任意命令,并查看命令的退出状态码。如果状态码是 0 ,则探测胜利。所有其余状态码都被认为失败,容器将被重启。创立基于 HTTP 的存活探测器 P85为了让 HTTP GET 探测器探测失败,咱们须要批改 kubia 源码,使得其从第五次拜访之后开始始终返回 500 状态码 (Internal Server Error) 。 P85 ...

March 21, 2021 · 9 min · jiezi

关于kubernetes:使用nsenter进行docker网络连通性测试

背景在docker中,为了尽可能缩减镜像大小,经常不会蕴含一些罕用的工具,相似ping,curl,tcpdump等,尽管精简了镜像,但如果咱们须要在容器内部测试网络联通性时,没有这些工具就十分的头疼。其实容器外部和主机之间的网络环境是相互隔离的,处于独立的命名空间下,那如果能在主机上切换命名空间,就能够在主机上以容器的网络环境进行操作,就能够利用主机上的工具,可能实现这种需要的工具就是咱们明天要介绍的nsenter 应用nsenter [options] [program [arguments]]options:-t, --target pid:指定被进入命名空间的指标过程的pid-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间-G, --setgid gid:设置运行程序的gid-S, --setuid uid:设置运行程序的uid-r, --root[=directory]:设置根目录-w, --wd[=directory]:设置工作目录如果没有给出program,则默认执行$SHELL。ping以nginx镜像为例,nginx镜像默认是不蕴含ping命令,也不蕴含ip,ifconfig等常用命令 # docker run --name nginx-app -d nginx2c0b7246f4a10d043e07527fdc4c3237c7af9d643741c954d4a84ece37976014# docker exec -it nginx-app bashroot@2c0b7246f4a1:/# ping www.baidu.combash: ping: command not found# ip addrbash: ip: command not found# ifconfigbash: ifconfig: command not found很多时候咱们须要晓得容器外部解析的域名ip信息,如果没有这些工具,原本很简略的事就变得很麻烦,通过以下步骤就能够通过nsenter解决以上问题 获取容器pid# docker inspect nginx-app -f '{{.State.Pid}}'23069#也能够通过ContainerIDdocker inspect 2c0b7246f4a1 -f '{{.State.Pid}}'23069执行nsenter命令# nsenter -n -t23069# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.5 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:acff:fe11:5 prefixlen 64 scopeid 0x20<link> ether 02:42:ac:11:00:05 txqueuelen 0 (Ethernet) RX packets 3 bytes 222 (222.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0这个命令没有任何输入,通过ifconfig命令查看以后ip能够确定咱们曾经进入了容器的网络空间这时候主机上的命令都能够应用 ...

March 18, 2021 · 2 min · jiezi

关于kubernetes:kubeadm-的工作原理

kubeadm 的工作原理作者:张首富工夫:2020-06-04w x:y18163201 置信应用二进制部署过 k8s 集群的同学们都晓得,二进制部署集群太艰难了,有点根底的人部署起来还有胜利的心愿,要不然只能跟着他人的教程一步一步的去部署,部署的时候齐全不晓得这样操作的意义是啥?出问题了无从下手解决。对于初学者来说真的是节约生命,那有没有什么简略的形式来部署集群呢?这个问题在前几年可能没有很好的答案,然而在当初,答案几乎太多了,比方 kubeadm,rke 等形式,咱们明天就来介绍下 kubeadm 部署集群的工作原理。 这里默认你有点 k8s 根底,晓得他们都是有哪些组件形成的。 在集群部署的时候,他的每一个组件都是一个须要被执行的,独自的二进制文件,在当初容器化那么发达的期间,咱们必定来用 docker 来简化部署。然而容器化部署的时候会有一个很大的问题,如何容器化 kubelet。 咱们晓得 kubelet 是 kubernetes 我的项目用来操作 Docker 等容器运行时的外围组件,在每个 节点上都存在,能够除了跟容器运行时打交道外,kubelet 在配置容器网络、治理容器数据卷事 时,他都须要间接操作宿主机。 如果当初 kubelet 自身就运行在一个容器里,那么间接操作宿主机就会变得很麻烦。对于网络配置来说还好,kubelet 容器能够通过不开启 Network Namespace(--net host)的形式,间接共享宿主机的网络栈。可是,要让 kubelet 隔着容器的 Mount Namespace 和文件系统,操作宿主机的文件系统,就有点儿艰难了。 比方,如果用户想要应用 NFS 做容器的长久化数据卷,那么 kubelet 就须要在容器进行绑定挂载前,在宿主机的指定目录上,先挂载 NFS 的近程目录。 可是,这时候问题来了。因为当初 kubelet 是运行在容器里的,这就意味着它要做的这个“mount -F nfs”命令,被隔离在了一个独自的 Mount Namespace 中。即,kubelet 做的挂载操作,不能被“流传”到宿主机上。 对于这个问题,有人说,能够应用 setns() 零碎调用,在宿主机的 Mount Namespace 中执行这些挂载操作;也有人说,应该让 Docker 反对一个–mnt=host 的参数。然而,到目前为止,在容器里运行 kubelet,仍然没有很好的解决办法,我也不举荐你用容器去部署 Kubernetes 我的项目。 因而为了解决下面这个问题,kubeadm 抉择了一种计划: ...

March 17, 2021 · 3 min · jiezi

关于kubernetes:Kubernetes-实战-03-pod-运行于-Kubernetes-中的容器

介绍 pod P53pod 是 Kubernetes 中最为重要的外围概念,而其余对象仅仅用于 pod 治理、 pod 裸露或被 pod 应用。 pod 是一组并置的容器,代表了 Kubernetes 中的根本构建模块。 P53 当一个 pod 蕴含多个容器时,这些容器总是运行于同一个工作节点上——一个 pod 绝不会逾越多个工作节点。 P54 为何须要 pod P54为何多个容器比单个容器中蕴含多个过程要好 P54 假如一个由多个过程组成的应用程序,无论是通过 IPC (过程间通信)还是本地存储文件进行通信,都要求它们运行于同一台机器上。如果在单个容器中运行多个不相干的过程,那么放弃所有过程运行、治理它们的日志等将会是咱们的责任。例如,咱们须要蕴含一种在过程奔溃时可能主动重启的机制;同时这些过程都将记录到雷同的规范输入中,而此时咱们将很难确定每个过程别离记录了什么。 P54 理解 pod P55因为不能将多个过程汇集在一个独自的容器中,咱们须要另一种更高级的构造来将容器绑定在一起,并将它们作为一个单元进行治理,这就是 pod 背地的真正起因。 P55 在蕴含容器的 pod 下,咱们能够同时运行一些密切相关的过程,并为它们提供(简直)雷同的环境,此时这些过程就如同全副运行于单个容器中一样,同时又放弃着肯定的间隔。这样一来,咱们便能全面地利用容器所提供的个性,同时对这些过程来说它们就像运行在一起一样。 P55 同一 pod 中容器之间的局部隔离 P55 Kubernetes 通过配置 Docker 来让一个 pod 内的所有容器共享雷同的 Linux 命名空间,而不是每个容器都有本人的一组命名空间。 P55 因为一个 pod 中的所有容器都在雷同的 Network 和 UTS 命名空间下运行([01. Kubernetes 介绍](https://mp.weixin.qq.com/s/nf...),所以它们都共享雷同的主机名和网络接口。同样地,这些容器也都在雷同的 IPC 命名空间下运行,因而可能通过 IPC 进行通信。在最新的 Kubernetes 和 Docker 版本中,它们也可能共享雷同的 PID 命名空间,然而该个性默认未开启。 P55 ...

March 14, 2021 · 6 min · jiezi

关于kubernetes:如何快速验证您的Kubernetes配置文件

如果您始终在试用Kubernetes,就晓得这有多难。不仅有许多流动组件,pod和容器配置文件也会相当简单。这些清单文件变宏大后,您可能很容易疏忽某个重要的配置选项。 这么说吧:配置谬误的Kubernetes清单文件可能会导致平安问题,甚至可能害您多花钱,尤其是将pod部署在像AWS或谷歌云这些云托管服务上时,您须要为应用的服务付费。如果pod配置不当,会过多地应用一种或多种资源,因此耗用您的每月估算。 何不花工夫检查一下配置文件?因为那很耗时。 不过有一种较简略的办法。借助kube-score工具,您能够测试YAML文件,查看以下方面: 入站针对服务CronJobs有已配置的截止日期所有pod都已设置资源限度和申请所有pod都已设置与资源限度同样的资源申请所有pod都已设置与限度同样的CPU申请应用显式的非最新标签pullPolicy被设置为Always所有StatefulSet都由PDB规定了指标残缺的查看列表能够在这里找到:https://github.com/zegl/kube-...。 这款工具十分易于应用,输入将帮忙您增强YAML文件的标准,以便没有显著的安全漏洞或畸形的资源。 您如何应用这个不便的工具?上面介绍一下。 您须要什么? Kubernetes的运行中实例领有sudo特权的用户如何装置kube-score? 这很容易,因为kube-score是个简略的二进制文件。我将在Ubuntu Server 20.04上进行演示。要在该平台上装置kube-score,请登录进入到服务器,应用以下命令下载必要的文件: wget https://github.com/zegl/kube-...留神:请确保查看kube-score版本页面,确保下载的是最新版本。 应用以下命令解压缩tar文件: tar xvzf kube-score_1.10.1_linux_amd64.tar.gz当初,您应该在当前工作目录中看到kube-score文件。无妨用以下命令挪动它: sudo mv kube-score / usr / local / bin您已筹备好查看清单文件了。 如何应用kube-score? 应用kube-score异样简略。假如您想要查看文件test.yaml。转入到含有test.yaml文件的目录,而后执行以下命令: kube-score test.yaml对于发现的任何问题,输入后果会列出WARNING或CRITICAL(图A)。图A. 查看测试YAML文件的kube-score输入 这时,您能够分明地看到YAML文件中哪些配置须要留神。确保部署之前解决了那些问题。 如果您有运行中的容器或pod,能够应用以下命令对它们运行kube-score: kubectl api-resources --verbs=list --namespaced -o name | xargs -n1 -I{} bash -c "kubectl get {} --all-namespaces -oyaml && echo ---" | kube-score score -这样一来,您可能会发现内容多得多的输入(图B)。 图B. 对Kubernetes集群内的运行中容器应用kube-score 当然,kube-score并非完满,它可能无奈运行您须要的特定查看——确保查看残缺的查看列表,看看它的查看对您来说是否足够残缺。即便它无奈查看您须要的内容,kube-score在验证YAML文件方面也要比手动查看好得多,尤其是在您有泛滥简单清单文件的状况下。 试一下kube-score,看看它是不是使您部署的Kubernetes更安全可靠一点。

March 12, 2021 · 1 min · jiezi

关于kubernetes:关于多集群Kubernetes的一些思考

随着Kubernetes在企业中利用的越来越宽泛和遍及,越来越多的公司在生产环境中运维多个集群。本文次要讲述一些对于多集群Kubernetes的思考,包含为什么抉择多集群,多集群的益处以及多集群的落地计划。 VMware2020年Kubernetes应用报告中指出,在采纳kubernetes组织中20%的组织运行40+数目的集群。一:为什么企业须要多集群?单集群Kubernetes承载能力无限首先看看官网文档中对于单集群承载能力的形容: 在v1.12,Kubernetes反对最多具备5000个节点的集群。更具体地说,咱们反对满足以下所有条件的配置:1:不超过5000个节点2:Pod总数不超过1500003:总共不超过300000个容器4:每个节点不超过100个Pod尽管当初Kubernetes曾经倒退到v1.20,然而对于单集群承载能力始终没有变动。可见进步单集群负载能力并不是社区的倒退方向。 如果咱们的业务规模超过了5000台,那么企业不得不思考多个集群。 2:混合云或是多云架构决定了须要多个集群 到目前,其实多云或是混合云的架构很广泛了。 比方企业是一个全球化的公司,提供Global服务。 或像新浪微博一样,自建数据中心 + 阿里云,阿里云用于服务弹性流量。 另外私有云并没有设想中的海量资源。比方私有云的头部客户搞大促须要很大数量机器的时候,都是须要提前和私有云申请,而后私有云提前准备的。 为了防止被单家供应商锁定,或是出于老本等思考,企业抉择了多云架构,也决定了咱们须要多个集群。 3:不把鸡蛋放到一个篮子里 即便后面两条都未满足,那么咱们是否要把所有的工作负载部署到一个集群哪? 如果集群管制面呈现故障,那么所有的服务都会受到影响。 兴许大家认为Kubernetes的管制面自身就是高可用的(三个api-server),不会有整个管制层不可用的可能。 其实则不然,咱们在生产环境中,曾经解决很屡次相似故障了。如果一个利用(个别指须要调用api-server接口)在大量地调用api-server,会导致api-server接连挂掉,最终不可用。直到找到故障利用,并把故障利用删除。 所以在生产环境中,一是须要严格控制拜访api-server的权限,二是须要做好测试,三是能够思考业务利用和基础设施离开部署。其实单集群和多集群的抉择和”抉择一台超算 or 多台一般机器“的问题相似。起初分布式计算的倒退阐明大家抉择了多个一般机器。 二:多集群的益处多集群在以下三个方面,有着更好地体现: 可用性隔离性扩展性三:多集群应用程序架构实际上,能够通过两种模型来构建多集群应用程序架构 正本 :将应用程序复制到多个可用性区域或数据中心,每个集群都运行应用程序的残缺正本。咱们能够依附Smart DNS(在GCP,有Global 负载均衡器的概念) 将流量路由到间隔用户最近的集群,以实现最小的网络提早。如果咱们一个集群产生故障,咱们能够将流量路由到其余衰弱集群,实现故障转移。按服务划分:依照业务相干水平,将利用部署在不同的集群。这种模型,提供了十分好的隔离性,然而服务划分却比较复杂。四:社区多集群落地计划实际上,社区始终在摸索多集群Kubernetes的最佳实际,目前来看次要有以下两种。 1: 以Kubernetes为核心 着力于反对和扩大用于多集群用例的外围Kubernetes原语,从而为多个集群提供集中式治理立体。Kubernetes集群联邦我的项目采纳了这种办法。 了解集群联邦的最好办法是可视化跨多个Kubernetes集群的元集群。设想一下一个逻辑管制立体,该逻辑管制立体编排多个Kubernetes主节点,相似于每个主节点如何管制其本身集群中的节点。 其实集群联邦实质上做了两件事件: 跨集群散发资源:通过形象 Templates ,Placement,Overrides三个概念,能够实现将资源(比方Deployment)部署到不通的集群,并且实现多集群扩缩。多集群服务发现:反对多集群Service 和 Ingress。截止到目前,联邦我的项目尚处于alpha状态,当咱们抉择落地的时候,须要一定量的开发工作。2:以网络为核心 “以网络为核心”的办法专一于在集群之间创立网络连接,以便集群内的应用程序能够互相通信。 Istio的多集群反对,Linkerd服务镜像和Consul的Mesh网关是通过Service mesh 解决方案来实现网络连通。 而另外一种是Cilium对于多集群网络的计划。Cilium自身是一种CNI网络,该计划少了服务治理的性能。 Cilium Cluster Mesh解决方案通过隧道或间接路由,解决跨多个Kubernetes集群的Pod IP路由,而无需任何网关或代理。当然咱们须要布局好每个集群的POD CIDR。 每个Kubernetes集群都保护本人的etcd集群,其中蕴含该集群的状态。来自多个集群的状态永远不会混入etcd中。每个集群通过一组etcd代理公开其本人的etcd。在其余集群中运行的Cilium代理连贯到etcd代理以监督更改,并将多集群相干状态复制到本人的集群中。应用etcd代理可确保etcd察看程序的可伸缩性。拜访受TLS证书爱护。从一个集群到另一个集群的拜访始终是只读的。这样能够确保故障域放弃不变,即一个集群中的故障永远不会流传到其余集群中。通过简略的Kubernetes secret资源进行配置,该资源蕴含近程etcd代理的寻址信息以及集群名称和拜访etcd代理所需的证书。五:思考下面咱们讲到了两种落地多集群Kubernetes的计划,其实并不是非A即B。 比方,当咱们在落地大集群的过程中,很多公司只是用Kubernetes解决部署的问题。服务发现抉择consul,zk等注册核心,配置文件治理应用配置核心,负载平衡也没有应用kubernetes中Service。 此时联合两种计划是最佳实际。 集群联邦解决部署和公布的问题。Service mesh解决多集群流量拜访的问题。不过此时,工作负载集群中的Pod,Service mesh的管制面以及网关都须要对接内部的注册核心。具体架构如下:

March 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-实战-02-开始使用-Kubernetes-和-Docker

创立、运行及共享容器镜像 P23运行容器 P24运行 P24 能够运行 Docker 客户端可执行文件来执行各种 Docker 命令。例如:能够试着从 Docker Hub 的公共镜像仓库拉取、运行镜像。 Docker Hub 中有许多随时可用的常见镜像,其中就包含 busybox ,能够用来运行简略的命令,例如: echo "Hello world" 。 P24 docker run busybox echo "Hello world"原理 P25 执行 docker run 命令后: P25 Docker 查看 busybox:lastest 镜像是否存在于本机。如果不存在,则会主动从 Docker 镜像核心拉取镜像Docker 基于 busybox:lastest 镜像创立一个容器并在容器中运行命令 echo "Hello world"运行镜像 P25 docker run <image>docker run <image>:<tag>Docker 反对同一镜像的多个版本,每个版本必须有惟一的 tag 名,当援用镜像没有显式地指定 tag 时, Docker 会默认指定 tag 为 latest 。 P25 创立利用 P26const http = require('http');const os = require('os');console.log("Kubia server starting...");var handler = function(request, response) { console.log("Received request from " + request.connection.remoteAddress); response.writeHead(200); response.end("You've hit " + os.hostname() + "\n");};var www = http.createServer(handler);www.listen(8080);这个利用会接管 HTTP 申请并响应利用运行的服务器实在主机名(非宿主机名),当其部署在 Kubernetes 上并进行伸缩时(程度伸缩,复制利用到多个节点),能够发现 HTTP 申请切换到了利用的不同实例上。 P26 ...

March 7, 2021 · 5 min · jiezi

关于kubernetes:Rancher导入kubernetes集群

Rancher装置执行以下命令装置最新版本rancher docker run --privileged -d --restart=unless-stopped -p 8080:80 -p 4443:443 rancher/rancher导入kubernetes集群rancher docker运行后拜访http://host:4443设置明码即可进入rancher,点击导入集群抉择导入现有的kubernetes集群 抉择实现后界面会显示一些导入的命令,复制最初一个命令到后盾执行即可 这时候刷新页面,集群的状态处于Pending,失常状况下过一段时间状态会变为Waiting,再过一段时间状态变为Active阐明集群可用 遇到的问题如果集群状态长时间处于Pending状态,那必定是有问题的,失常状况下导入集群时会创立命名空间cattle-system,能够通过kubectl查看cattle-system的pod $ kubectl get pods --all-namespacesNAMESPACE NAME READY STATUS RESTARTS AGEcattle-system cattle-cluster-agent-6cc8877b86-lntq2 1/1 Running 0 2m39s如果没有任何数据显示阐明命令空间创立失败,如果有pod显示,那么能够通过查看pod日志查看具体的错误信息 kubectl logs -f cattle-cluster-agent-6cc8877b86-lntq2 -n cattle-systemkubectl describe pod cattle-cluster-agent-6cc8877b86-lntq2 -n cattle-system删除rancher如果你想删除rancher重新安装,能够依照以下步骤 删除相干资源,后面提到过创立时须要执行创立命令,相似上面这样curl --insecure -sfL https://172.16.239.223:4443/v3/import/vswxslzdw8s2xxsdrnzjk2r48h97pxr9hrr74p76k54qsnbkjjqpf2.yaml | kubectl apply -f -那么只有将 kubectl apply改为 kubectl delete就可删除所有资源 curl --insecure -sfL https://172.16.239.223:4443/v3/import/vswxslzdw8s2xxsdrnzjk2r48h97pxr9hrr74p76k54qsnbkjjqpf2.yaml | kubectl delete -f -删除rancher容器找到rancher的container id,应用命令docker rm -f强制删除 $ docker ps|grep rancher/rancher5f4a086eef80 rancher/rancher "entrypoint.sh" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp, 0.0.0.0:4443->443/tcp hardcore_payner$ docker rm -f 5f4a086eef80

March 5, 2021 · 1 min · jiezi

关于kubernetes:CNCF-宣布-Open-Policy-Agent-毕业

翻译:Bach(才云)校对:雾雾(才云) OPA 我的项目地址:openpolicyagent.org 长期致力于云原生软件生态构建的云原生计算基金会(CNCF)于 2 月 4 日正式发表,Open Policy Agent(OPA)成为第 15个毕业的我的项目。在晋升为毕业(graduation)级别的过程中,OPA 展示了其宽泛的采纳、凋谢的治理流程、残缺性能成熟度以及对社区持续性和包容性的动摇承诺。OPA 是一个开源的、通用的策略引擎,它反对跨整个堆栈执行对立的、上下文感知的策略。该我的项目于 2018 年 4 月进入 CNCF 沙箱,一年后进入孵化阶段。来自大概 30 个组织的 90 多名人员为 OPA 贡献力量,维护者来自四个组织,包含谷歌、微软、VMware 和 Styra。 去年 OPA 的增长就十分惊人。slack.openpolicyagent.org 上的用户数量增长了 3 倍(超过 3600 个用户),Docker 镜像下载数量超过了 3900 万(增长 1000%)。这种增长大部分起因在于大家对持重策略的需要,即云原生生态系统中的代码解决方案。 目前,OPA 已被高盛、Netflix、Pinterest、T-Mobile 等机构宽泛采纳。依据最近对 150 多个组织的 OPA 用户考察,91% 的组织示意他们在从 QA 到生产阶段应用 OPA。超过半数的受访者示意,至多在两个用例中应用了 OPA。OPA 最常见的用例是配置受权(例如 Kubernetes 准入管制)和 API 受权。该我的项目已胜利集成了几个 CNCF 我的项目,包含 Kubernetes、Envoy、CoreDNS、Helm、SPIFFE/SPIRE 等。它还与 Gatekeeper 集成,为准入策略执行和审核提供 Kubernetes 原生体验。 CNCF CTO Chris Aniszczyk 示意:“随着云原生生态系统的增长,对组织来说,领有为古代云原生部署而构建的策略执行工具十分重要。自从退出 CNCF 以来,OPA 通过 Gatekeeper 我的项目与 Kubernetes 进行了严密的整合,同时也反对 Kubernetes 之外的各种用例。” ...

February 28, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-实战-01-Kubernetes-介绍

简介 P2Kubernetes 能主动调度、配置、监管和故障解决,使开发者能够自主部署利用,并且管制部署的频率,齐全脱离运维团队的帮忙。 Kubernetes 同时能让运维团队监控整个零碎,并且在硬件故障时从新调度利用。 P2 Kubernetes 形象了数据中心的硬件基础设施,使得对外裸露的只是一个微小的资源池。 在部署多组件利用时, Kubernetes 会为每个组件都抉择一个适合的服务器,部署之后它可能保障每个组件能够轻易地发现其余组件,并彼此之间实现通信。 P2 Kubernetes 零碎的需要 P2近年来,应用程序的开发部署的变动起因: P2 大型单体利用被拆解为更多的小型微服务利用运行所依赖的基础架构的变动从单体利用到微服务 P2单体利用由很多个组件组成,这些组件严密地耦合在一起,并且在同一个操作系统过程中运行,所以在开发、部署、治理的时候必须以同一个实体进行。 P2 单体利用通常须要一台能为整个利用提供足够资源的高性能服务器,有两种办法能够应答一直增长的零碎负荷: P3 垂直扩大:晋升单机性能 —— 减少 CPU 、内存或其余系统资源 长处:不须要应用程序做任何变动毛病:老本很快会越来越高,并且通常会有瓶颈程度扩大:减少服务器数量 长处:能线性裁减零碎性能毛病:须要在架构层面反对程度扩大,局部组件难于甚至不太可能去做程度扩大(像关系型数据库)所思垂直扩大总会达到单机性能的极限,所以终极解决方案是程度扩大,同时也能够通过垂直扩大进行辅助。 认真回忆一下,发现咱们平时也是这样解决的。因为历史起因,咱们我的项目外围性能的大部分代码在同一个利用中,导致启动就会占用大量资源,单机解决能力较差。在经验各种配置下压测后,抉择了适合的配置,而后就间接程度扩大,并且逐步将一些压力大的接口拆成微服务提供接口或者间接解决各种申请。 如果单体利用的任何一个局部不能扩大,整个利用就不能扩大,除非咱们想方法把它拆离开。 P3 将利用拆解为多个微服务 P3 服务之间能够通过相似 HTTP 这样的同步协定通信,也能够通过像 AMQP 这样的异步协定通信,并且微服务也能够选用最适宜的开发语言来实现。 P3 每个微服务都是独立的,能够独立开发和部署。只有 API 不变或者向前兼容,改变一个微服务,并不会要求对其余微服务进行改变或者重新部署。 P3 微服务的扩容 P3 单体零碎必须要对整个零碎扩容,而微服务只需针对单个服务扩容。因而,咱们能够抉择仅扩容那些须要更多资源的服务而放弃其余的服务依然维持在原来的规模。当单体利用因为其中一部分无奈扩容而整体被限度扩容时,能够把利用拆分成多个微服务,将能扩容的服务进行程度扩大,不能进行扩容的组件进行垂直扩大。 P4 部署微服务 P4 当组件数量减少时,部署相干的决定就变得越来越艰难。因为不仅组件部署的组合数在减少,而且组件间依赖的组合数也在以更大的因素减少,并且配置工作变得繁杂易错,同时因为跨了多个过程和机器,调试代码和定位异样调用变得艰难。 P4 环境需要的差别 P5 因为组件之间依赖的差异性,应用程序须要同一个库的不同版本是不可避免的。当多个利用在同一个主机上运行就有可能会有依赖抵触。 P5 为应用程序提供一个统一的环境 P5开发和运维团队须要解决的一个最大的问题是程序运行环境的差异性: P5 开发环境和生产环境之间各个生产机器之间生产机器环境随工夫的推移而变动为了缩小会在生产环境才裸露的问题,最现实的做法就是让利用在开发和生产阶段能够运行在齐全一样的环境下,它们有齐全一样的操作系统、库、系统配置、网络环境和其余所有条件。这个环境不会随着工夫的推移而变动,并且在一台服务器上部署新的利用时,不会影响机器上已有的利用。 P6 迈向继续交付: DevOps 和无运维 P6在过来,开发团队的工作是创立利用并交付给运维团队,而后运维团队部署利用并使它运行。 P6 而当初,让一个团队参加利用的开发、部署、运维的整个生命周期更好。这意味着开发者、 QA 和运维团队彼此之间的单干须要贯通整个流程。这种实际被称为 DevOps 。 P6 ...

February 28, 2021 · 3 min · jiezi

关于kubernetes:k8sprometheus

<article class=“article fmt article-content”><p>promethus</p><p>基于k8s</p><p>收集数据</p><p>node-exporter</p><p>vi node-exporter-ds.yml</p><p><code></code></p><p>apiVersion: extensions/v1beta1</p><p>kind: DaemonSet</p><p>metadata:</p><p> name: node-exporter</p><p> labels:</p><p> app: node-exporter</p><p>spec:</p><p> template:</p><p> metadata:</p><p> labels:</p><p> app: node-exporter</p><p> spec:</p><p> hostNetwork: true</p><p> containers:</p><p> - image: prom/node-exporter</p><p> name: node-exporter</p><p> ports:</p><p> - containerPort: 9100</p><p> volumeMounts:</p><p> - mountPath: “/etc/localtime”</p><p> name: timezone</p><p> volumes:</p><p> - name: timezone</p><p> hostPath:</p><p> path: /etc/localtime</p><p></p><p>存储,长久卷,创立一个10G的pv,基于nfs</p><p>vi prometheus-pv.yaml</p><p><code></code></p><p>apiVersion: v1</p><p>kind: PersistentVolume</p><p>metadata:</p><p> name: gwj-pv-prometheus</p><p> labels:</p><p> app: gwj-pv</p><p>spec:</p><p> capacity:</p><p> storage: 10Gi</p><p> volumeMode: Filesystem</p><p> accessModes:</p><p> - ReadWriteMany</p><p> persistentVolumeReclaimPolicy: Recycle</p><p> storageClassName: slow</p><p> mountOptions:</p><p> - hard</p><p> - nfsvers=4.1</p><p> nfs:</p><p> path: /storage/gwj-prometheus</p><p> server: 10.1.99.1</p><p></p><p>长久卷申领,基于刚刚创立的pv,申领一个5G的pvc</p><p>vi prometheus-pvc.yaml</p><p><code></code></p><p>apiVersion: v1</p><p>kind: PersistentVolumeClaim</p><p>metadata:</p><p> name: gwj-prometheus-pvc</p><p> namespace: gwj</p><p>spec:</p><p> accessModes:</p><p> - ReadWriteMany</p><p> volumeMode: Filesystem</p><p> resources:</p><p> requests:</p><p> storage: 5Gi</p><p> selector:</p><p> matchLabels:</p><p> app: gwj-pv</p><p> storageClassName: slow</p><p></p><p>设置prometheus rbac权限</p><p>clusterrole.rbac.authorization.k8s.io/gwj-prometheus-clusterrole created</p><p>serviceaccount/gwj-prometheus created</p><p>clusterrolebinding.rbac.authorization.k8s.io/gwj-prometheus-rolebinding created</p><p>vi prometheus-rbac.yml</p><p><code></code></p><p>apiVersion: rbac.authorization.k8s.io/v1beta1</p><p>kind: ClusterRole</p><p>metadata:</p><p> name: gwj-prometheus-clusterrole</p><p>rules:</p><ul><li>apiGroups: [""]</li></ul><p> resources:</p><p> - nodes</p><p> - nodes/proxy</p><p> - services</p><p> - endpoints</p><p> - pods</p><p> verbs: [“get”, “list”, “watch”]</p><ul><li>apiGroups:</li></ul><p> - extensions</p><p> resources:</p><p> - ingresses</p><p> verbs: [“get”, “list”, “watch”]</p><ul><li>nonResourceURLs: ["/metrics"]</li></ul><p> verbs: [“get”]</p><hr/><p>apiVersion: v1</p><p>kind: ServiceAccount</p><p>metadata:</p><p> namespace: gwj</p><p> name: gwj-prometheus</p><hr/><p>apiVersion: rbac.authorization.k8s.io/v1beta1</p><p>kind: ClusterRoleBinding</p><p>metadata:</p><p> name: gwj-prometheus-rolebinding</p><p>roleRef:</p><p> apiGroup: rbac.authorization.k8s.io</p><p> kind: ClusterRole</p><p> name: gwj-prometheus-clusterrole</p><p>subjects:</p><ul><li>kind: ServiceAccount</li></ul><p> name: gwj-prometheus</p><p> namespace: gwj</p><p></p><p>创立prometheus 配置文件,应用configmap</p><p>vi prometheus-cm.yml</p><p><code></code></p><p>apiVersion: v1</p><p>kind: ConfigMap</p><p>metadata:</p><p> name: gwj-prometheus-cm</p><p> namespace: gwj</p><p>data:</p><p> prometheus.yml: |</p><p> rule_files:</p><p> - /etc/prometheus/rules.yml</p><p> alerting:</p><p> alertmanagers:</p><p> - static_configs:</p><p> - targets: [“gwj-alertmanger-svc:80”]</p><p> global:</p><p> scrape_interval: 10s</p><p> scrape_timeout: 10s</p><p> evaluation_interval: 10s</p><p> scrape_configs:</p><p> - job_name: ‘kubernetes-nodes’</p><p> scheme: https</p><p> tls_config:</p><p> ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt</p><p> bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token</p><p> kubernetes_sd_configs:</p><p> - role: node</p><p> relabel_configs:</p><p> - action: labelmap</p><p> regex: _meta_kubernetes_node_label(.+)</p><p> - source_labels: [__meta_kubernetes_node_name]</p><p> regex: (.+)</p><p> target_label: <strong>metrics_path</strong></p><p> replacement: /api/v1/nodes/${1}/proxy/metrics</p><p> - target_label: <strong>address</strong></p><p> replacement: kubernetes.default.svc:443</p><p> - job_name: ‘kubernetes-node-exporter’</p><p> tls_config:</p><p> ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt</p><p> bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token</p><p> kubernetes_sd_configs:</p><p> - role: node</p><p> relabel_configs:</p><p> - action: labelmap</p><p> regex: _meta_kubernetes_node_label(.+)</p><p> - source_labels: [__meta_kubernetes_role]</p><p> action: replace</p><p> target_label: kubernetes_role</p><p> - source_labels: [address]</p><p> regex: ‘(.*):10250’</p><p> replacement: ‘${1}:9100’</p><p> target_label: <strong>address</strong></p><p> - job_name: ‘kubernetes-pods’</p><p> kubernetes_sd_configs:</p><p> - role: pod</p><p> relabel_configs:</p><p> - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]</p><p> action: keep</p><p> regex: true</p><p> - source_labels: [address, __meta_kubernetes_pod_annotation_prometheus_io_port]</p><p> action: replace</p><p> target_label: <strong>address</strong></p><p> regex: (<sup id=“fnref-1”>1</sup>+)(?::d+)?;(d+)</p><p> replacement: $1:$2</p><p> - action: labelmap</p><p> regex: _meta_kubernetes_pod_label(.+)</p><p> - source_labels: [__meta_kubernetes_namespace]</p><p> action: replace</p><p> target_label: kubernetes_namespace</p><p> - source_labels: [__meta_kubernetes_pod_name]</p><p> action: replace</p><p> target_label: kubernetes_pod_name</p><p> - job_name: ‘kubernetes-cadvisor’</p><p> scheme: https</p><p> tls_config:</p><p> ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt</p><p> bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token</p><p> kubernetes_sd_configs:</p><p> - role: node</p><p> relabel_configs:</p><p> - action: labelmap</p><p> regex: _meta_kubernetes_node_label(.+)</p><p> - target_label: <strong>address</strong></p><p> replacement: kubernetes.default.svc:443</p><p> - source_labels: [__meta_kubernetes_node_name]</p><p> regex: (.+)</p><p> target_label: <strong>metrics_path</strong></p><p> replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor</p><p> - job_name: ‘kubernetes-service-endpoints’</p><p> kubernetes_sd_configs:</p><p> - role: endpoints</p><p> relabel_configs:</p><p> - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]</p><p> action: keep</p><p> regex: true</p><p> - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]</p><p> action: replace</p><p> target_label: <strong>scheme</strong></p><p> regex: (https?)</p><p> - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]</p><p> action: replace</p><p> target_label: <strong>metrics_path</strong></p><p> regex: (.+)</p><p> - source_labels: [address, __meta_kubernetes_service_annotation_prometheus_io_port]</p><p> action: replace</p><p> target_label: <strong>address</strong></p><p> regex: (<sup id=“fnref-1”>1</sup>+)(?::d+)?;(d+)</p><p> replacement: $1:$2</p><p> - action: labelmap</p><p> regex: _meta_kubernetes_service_label(.+)</p><p> - source_labels: [__meta_kubernetes_namespace]</p><p> action: replace</p><p> target_label: kubernetes_namespace</p><p> - source_labels: [__meta_kubernetes_service_name]</p><p> action: replace</p><p> target_label: kubernetes_name</p><p> rules.yml: |</p><p> groups:</p><p> - name: kebernetes_rules</p><p> rules:</p><p> - alert: InstanceDown</p><p> expr: up{job=“kubernetes-node-exporter”} == 0</p><p> for: 5m</p><p> labels:</p><p> severity: page</p><p> annotations:</p><p> summary: “Instance {{ $labels.instance }} down”</p><p> description: “{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."</p><p> - alert: APIHighRequestLatency</p><p> expr: api_http_request_latencies_second{quantile=“0.5”} > 1</p><p> for: 10m</p><p> annotations:</p><p> summary: “High request latency on {{ $labels.instance }}"</p><p> description: “{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"</p><p> - alert: StatefulSetReplicasMismatch</p><p> annotations:</p><p> summary: “Replicas miss match”</p><p> description: StatefulSet {{ $labels.namespace }}/{{ $labels.statefulset }} has not matched the expected number of replicas for longer than 3 minutes.</p><p> expr: label_join(kube_statefulset_status_replicas_ready != kube_statefulset_replicas, “instance”, “/”, “namespace”, “statefulset”)</p><p> for: 3m</p><p> labels:</p><p> severity: critical</p><p> - alert: PodFrequentlyRestarting</p><p> expr: increase(kube_pod_container_status_restarts_total[1h]) > 5</p><p> for: 5m</p><p> labels:</p><p> severity: warning</p><p> annotations:</p><p> description: Pod {{ $labels.namespaces }}/{{ $labels.pod }} is was restarted {{ $value }} times within the last hour</p><p> summary: Pod is restarting frequently</p><p> - alert: DeploymentReplicasNotUpdated</p><p> expr: ((kube_deployment_status_replicas_updated != kube_deployment_spec_replicas)</p><p> or (kube_deployment_status_replicas_available != kube_deployment_spec_replicas))</p><p> unless (kube_deployment_spec_paused == 1)</p><p> for: 5m</p><p> labels:</p><p> severity: critical</p><p> annotations:</p><p> description: Replicas are not updated and available for deployment {{ $labels.namespace }}/{{ $labels.deployment }}</p><p> summary: Deployment replicas are outdated</p><p> - alert: DaemonSetRolloutStuck</p><p> expr: kube_daemonset_status_number_ready / kube_daemonset_status_desired_number_scheduled * 100 < 100</p><p> for: 5m</p><p> labels:</p><p> severity: critical</p><p> annotations:</p><p> description: Only {{ $value }}% of desired pods scheduled and ready for daemonset {{ $labels.namespace }}/{{ $labels.daemonset }}</p><p> summary: DaemonSet is missing pods</p><p> - alert: DaemonSetsNotScheduled</p><p> expr: kube_daemonset_status_desired_number_scheduled - kube_daemonset_status_current_number_scheduled > 0</p><p> for: 10m</p><p> labels:</p><p> severity: warning</p><p> annotations:</p><p> description: ‘{{<code>{{ $value }}</code>}} Pods of DaemonSet {{<code>{{ $labels.namespace }}</code>}}/{{<code>{{ $labels.daemonset }}</code>}} are not scheduled.’</p><p> summary: Daemonsets are not scheduled correctly</p><p> - alert: DaemonSetsMissScheduled</p><p> expr: kube_daemonset_status_number_misscheduled > 0</p><p> for: 10m</p><p> labels:</p><p> severity: warning</p><p> annotations:</p><p> description: ‘{{<code>{{ $value }}</code>}} Pods of DaemonSet {{<code>{{ $labels.namespace }}</code>}}/{{<code>{{ $labels.daemonset }}</code>}} are running where they are not supposed to run.’</p><p> summary: Daemonsets are not scheduled correctly</p><p> - alert: Node_Boot_Time</p><p> expr: (node_time_seconds - node_boot_time_seconds) <= 150</p><p> for: 15s</p><p> annotations:</p><p> summary: “机器{{ $labels.instacnce }} 刚刚重启,工夫少于 150s”</p><p> - alert: Available_Percent</p><p> expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes <= 0.2</p><p> for: 15s</p><p> annotations:</p><p> summary: “机器{{ $labels.instacnce }} available less than 20%"</p><p> - alert: FD_Used_Percent</p><p> expr: (node_filefd_allocated / node_filefd_maximum) >= 0.8</p><p> for: 15s</p><p> annotations:</p><p> summary: “机器{{ $labels.instacnce }} FD used more than 80%"</p><p></p><p>依据刚刚创立的cm的要求,创立alertmanger 用于告警</p><p>vi alertmanger.yml</p><p><code></code></p><hr/><p>kind: Service</p><p>apiVersion: v1</p><p>metadata:</p><p> name: gwj-alertmanger-svc</p><p> namespace: gwj</p><p>spec:</p><p> selector:</p><p> app: gwj-alert-pod</p><p> ports:</p><p> - protocol: TCP</p><p> port: 80</p><p> targetPort: 9093</p><hr/><p>apiVersion: apps/v1</p><p>kind: StatefulSet</p><p>metadata:</p><p> name: gwj-alert-sts</p><p> namespace: gwj</p><p> labels:</p><p> app: gwj-alert-sts</p><p>spec:</p><p> replicas: 1</p><p> serviceName: gwj-alertmanger-svc</p><p> selector:</p><p> matchLabels:</p><p> app: gwj-alert-pod</p><p> template:</p><p> metadata:</p><p> labels:</p><p> app: gwj-alert-pod</p><p> spec:</p><p> containers:</p><p> - image: prom/alertmanager:v0.14.0</p><p> name: gwj-alert-pod</p><p> ports:</p><p> - containerPort: 9093</p><p> protocol: TCP</p><p> volumeMounts:</p><p> - mountPath: “/etc/localtime”</p><p> name: timezone</p><p> volumes:</p><p> - name: timezone</p><p> hostPath:</p><p> path: /etc/localtime</p><p></p><p>kubectl apply -f alertmanger.yml</p><p> service/gwj-alertmanger-svc created</p><p> statefulset.apps/gwj-alert-sts created</p><p>创立prometheus statefulset来创立prometheus</p><p>service/gwj-prometheus-svc created</p><p>statefulset.apps/gwj-prometheus-sts created</p><p>/prometheus</p><p>pvc: gwj-prometheus-pvc</p><p>/etc/prometheus/</p><p>configMap:</p><p> name: gwj-prometheus-cm</p><p>vi prometheus-sts.yml</p><p><code></code></p><hr/><p>kind: Service</p><p>apiVersion: v1</p><p>metadata:</p><p> name: gwj-prometheus-svc</p><p> namespace: gwj</p><p> labels:</p><p> app: gwj-prometheus-svc</p><p>spec:</p><p> ports:</p><p> - port: 80</p><p> targetPort: 9090</p><p> selector:</p><p> app: gwj-prometheus-pod</p><hr/><p>apiVersion: apps/v1</p><p>kind: StatefulSet</p><p>metadata:</p><p> name: gwj-prometheus-sts</p><p> namespace: gwj</p><p> labels:</p><p> app: gwj-prometheus-sts</p><p>spec:</p><p> replicas: 1</p><p> serviceName: gwj-prometheus-svc</p><p> selector:</p><p> matchLabels:</p><p> app: gwj-prometheus-pod</p><p> template:</p><p> metadata:</p><p> labels:</p><p> app: gwj-prometheus-pod</p><p> spec:</p><p> containers:</p><p> - image: prom/prometheus:v2.9.2</p><p> name: gwj-prometheus-pod</p><p> ports:</p><p> - containerPort: 9090</p><p> protocol: TCP</p><p> volumeMounts:</p><p> - mountPath: “/prometheus”</p><p> name: data</p><p> - mountPath: “/etc/prometheus/"</p><p> name: config-volume</p><p> - mountPath: “/etc/localtime”</p><p> name: timezone</p><p> resources:</p><p> requests:</p><p> cpu: 100m</p><p> memory: 100Mi</p><p> limits:</p><p> cpu: 500m</p><p> memory: 2000Mi</p><p> serviceAccountName: gwj-prometheus</p><p> volumes:</p><p> - name: data</p><p> persistentVolumeClaim:</p><p> claimName: gwj-prometheus-pvc</p><p> - name: config-volume</p><p> configMap:</p><p> name: gwj-prometheus-cm</p><p> - name: gwj-prometheus-rule-cm</p><p> configMap:</p><p> name: gwj-prometheus-rule-cm</p><p> - name: timezone</p><p> hostPath:</p><p> path: /etc/localtime</p><p></p><p>kubectl apply -f prometheus-sts.yml</p><p> service/gwj-prometheus-svc created</p><p> statefulset.apps/gwj-prometheus-sts created</p><p>创立ingress,依据域名散发到不同的service</p><p>vi prometheus-ingress.yml</p><p><code></code></p><hr/><p>apiVersion: extensions/v1beta1</p><p>kind: Ingress</p><p>metadata:</p><p> namespace: gwj</p><p> annotations:</p><p> name: gwj-ingress-prometheus</p><p>spec:</p><p> rules:</p><p> - host: gwj.syncbug.com</p><p> http:</p><p> paths:</p><p> - path: /</p><p> backend:</p><p> serviceName: gwj-prometheus-svc</p><p> servicePort: 80</p><p> - host: gwj-alert.syncbug.com</p><p> http:</p><p> paths:</p><p> - path: /</p><p> backend:</p><p> serviceName: gwj-alertmanger-svc</p><p> servicePort: 80</p><p></p><p>kubectl apply -f prometheus-ingress.yml</p><p> ingress.extensions/gwj-ingress-prometheus created</p><p>拜访对应的域名</p><p>gwj.syncbug.com</p><p>查看指标对象是否正确</p><p>http://gwj.syncbug.com/targets</p><p>查看配置文件是否正确</p><p>http://gwj.syncbug.com/config</p><p>gwj-alert.syncbug.com</p><p>===grafana</p><p>vi grafana-pv.yaml</p><p><code></code></p><p>apiVersion: v1</p><p>kind: PersistentVolume</p><p>metadata:</p><p> name: gwj-pv-grafana</p><p> labels:</p><p> app: gwj-pv-gra</p><p>spec:</p><p> capacity:</p><p> storage: 2Gi</p><p> volumeMode: Filesystem</p><p> accessModes:</p><p> - ReadWriteMany</p><p> persistentVolumeReclaimPolicy: Recycle</p><p> storageClassName: slow</p><p> mountOptions:</p><p> - hard</p><p> - nfsvers=4.1</p><p> nfs:</p><p> path: /storage/gwj-grafana</p><p> server: 10.1.99.1</p><p></p><p>vi grafana-pvc.yaml</p><p><code></code></p><p>apiVersion: v1</p><p>kind: PersistentVolumeClaim</p><p>metadata:</p><p> name: gwj-grafana-pvc</p><p> namespace: gwj</p><p>spec:</p><p> accessModes:</p><p> - ReadWriteMany</p><p> volumeMode: Filesystem</p><p> resources:</p><p> requests:</p><p> storage: 1Gi</p><p> selector:</p><p> matchLabels:</p><p> app: gwj-pv-gra</p><p> storageClassName: slow</p><p></p><p>vi grafana-deployment.yaml</p><p><code></code></p><p>apiVersion: extensions/v1beta1</p><p>kind: Deployment</p><p>metadata:</p><p> labels:</p><p> name: grafana</p><p> name: grafana</p><p> namespace: gwj</p><p>spec:</p><p> replicas: 1</p><p> revisionHistoryLimit: 10</p><p> selector:</p><p> matchLabels:</p><p> app: grafana</p><p> template:</p><p> metadata:</p><p> labels:</p><p> app: grafana</p><p> name: grafana</p><p> spec:</p><p> containers:</p><p> - env:</p><p> - name: GF_PATHS_DATA</p><p> value: /var/lib/grafana/</p><p> - name: GF_PATHS_PLUGINS</p><p> value: /var/lib/grafana/plugins</p><p> image: grafana/grafana:6.2.4</p><p> imagePullPolicy: IfNotPresent</p><p> name: grafana</p><p> ports:</p><p> - containerPort: 3000</p><p> name: grafana</p><p> protocol: TCP</p><p> volumeMounts:</p><p> - mountPath: /var/lib/grafana/</p><p> name: data</p><p> - mountPath: /etc/localtime</p><p> name: localtime</p><p> dnsPolicy: ClusterFirst</p><p> restartPolicy: Always</p><p> volumes:</p><p> - name: data</p><p> persistentVolumeClaim:</p><p> claimName: gwj-grafana-pvc</p><p> - name: localtime</p><p> hostPath:</p><p> path: /etc/localtime</p><p></p><p>vi grafana-ingress.yaml</p><p><code></code></p><hr/><p>apiVersion: extensions/v1beta1</p><p>kind: Ingress</p><p>metadata:</p><p> namespace: gwj</p><p> annotations:</p><p> name: gwj-ingress-grafana</p><p>spec:</p><p> rules:</p><p> - host: gwj-grafana.syncbug.com</p><p> http:</p><p> paths:</p><p> - path: /</p><p> backend:</p><p> serviceName: gwj-grafana-svc</p><p> servicePort: 80</p><hr/><p>kind: Service</p><p>apiVersion: v1</p><p>metadata:</p><p> name: gwj-grafana-svc</p><p> namespace: gwj</p><p>spec:</p><p> selector:</p><p> app: grafana</p><p> ports:</p><p> - protocol: TCP</p><p> port: 80</p><p> targetPort: 3000</p><p></p><p>进入grafana,gwj-grafana.syncbug.com</p><p>默认: admin admin</p><p>输出datasource: http://gwj-prometheus-svc:80</p><p>import模版</p><hr/><ol><li id=“fn-1”>: ↩</li></ol></article> ...

February 23, 2021 · 6 min · jiezi

关于kubernetes:k8skubeadm

参考文档:https://www.kubernetes.org.cn... systemctl stop firewalldsystemctl disable firewalldsetenforce 0swapoff -avi /etc/sysctl.d/k8s.conf<code>net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1</code>----modprobe br_netfiltersysctl -p /etc/sysctl.d/k8s.conf装置Dockeryum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo##yum makecache fastyum install -y --setopt=obsoletes=0 docker-ce-18.06.1.ce-3.el7systemctl start dockersystemctl enable dockeriptables -L======api-server======2.应用kubeadm部署Kubernetescat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpgEOFyum install -y kubelet kubeadm kubectlsystemctl enable kubelet.servicekubeadm init \ --kubernetes-version=v1.15.2 \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=192.168.1.193<output>Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.1.193:6443 --token bkghil.heogscphzlpgaq4d \ --discovery-token-ca-cert-hash sha256:cad63137866251c1772c6c786fd1810998ed8b662179aca32bb04b4231003665 </output>mkdir /root/.kubecp /etc/kubernetes/admin.conf /root/.kube/configkubectl get cs集群初始化如果遇到问题,能够应用上面的命令进行清理:<code>kubeadm resetifconfig cni0 downip link delete cni0ifconfig flannel.1 downip link delete flannel.1rm -rf /var/lib/cni/</code>2.3 装置Pod Networkmkdir -p ~/k8s/cd ~/k8swget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlkubectl apply -f kube-flannel.ymlkubectl get pod --all-namespaces -o wide 确保所有的Pod都处于Running状态。2.4 master 节点不参加调度,查看确认[root@master ~]# kubectl describe node master | grep TaintTaints: node-role.kubernetes.io/master:NoSchedule=======nodes========2.5 向Kubernetes集群中增加Node节点===node1=====cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpgEOFyum install -y kubelet kubeadmkubeadm join 192.168.1.193:6443 --token bkghil.heogscphzlpgaq4d --discovery-token-ca-cert-hash sha256:cad63137866251c1772c6c786fd1810998ed8b662179aca32bb04b4231003665systemctl start kubelet.servicesystemctl enable kubelet.service2.6 测试dnskubectl run -i -t nameserver --image=tutum/dnsutils --restart=Neverroot@nameserver:/# nslookup kubernetes.defaultServer: 10.96.0.10Address: 10.96.0.10#53Name: kubernetes.default.svc.cluster.localAddress: 10.96.0.1

February 23, 2021 · 1 min · jiezi

关于kubernetes:k8setcd

master: 192.168.1.193 node1: 192.168.1.194node2: 192.168.1.195tls认证须要为 etcd 集群创立加密通信的 TLS 证书,这里复用以前创立的 kubernetes 证书cp ca.pem kubernetes-key.pem kubernetes.pem /etc/kubernetes/ssl====install etcd=====yum install etcd -ymkdir /var/lib/etcd/创立etcd.service 文件master vi /usr/lib/systemd/system/etcd.service<code>[Unit]Description=Etcd ServerAfter=network.targetAfter=network-online.targetWants=network-online.targetDocumentation=https://github.com/coreos[Service]Type=notifyUser=rootWorkingDirectory=/var/lib/etcd/ExecStart=/usr/bin/etcd \--name node1 \--cert-file=/etc/kubernetes/ssl/kubernetes.pem \--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \--peer-cert-file=/etc/kubernetes/ssl/kubernetes.pem \--peer-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \--trusted-ca-file=/etc/kubernetes/ssl/ca.pem \--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \--initial-advertise-peer-urls https://192.168.1.193:2380 \--listen-peer-urls https://192.168.1.193:2380 \--listen-client-urls https://192.168.1.193:2379,http://localhost:2379 \--advertise-client-urls https://192.168.1.193:2379 \--initial-cluster-token cluster1 \--initial-cluster node1=https://192.168.1.193:2380,node2=https://192.168.1.194:2380,node3=https://192.168.1.195:2380 \--initial-cluster-state new \--data-dir=/var/lib/etcdRestart=on-failureRestartSec=5LimitNOFILE=65536[Install]WantedBy=multi-user.target</code>node1 vi /usr/lib/systemd/system/etcd.service<code>[Unit]Description=Etcd ServerAfter=network.targetAfter=network-online.targetWants=network-online.targetDocumentation=https://github.com/coreos[Service]Type=notifyUser=rootWorkingDirectory=/var/lib/etcd/ExecStart=/usr/bin/etcd \--name node2 \--cert-file=/etc/kubernetes/ssl/kubernetes.pem \--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \--peer-cert-file=/etc/kubernetes/ssl/kubernetes.pem \--peer-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \--trusted-ca-file=/etc/kubernetes/ssl/ca.pem \--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \--initial-advertise-peer-urls https://192.168.1.194:2380 \--listen-peer-urls https://192.168.1.194:2380 \--listen-client-urls https://192.168.1.194:2379,http://localhost:2379 \--advertise-client-urls https://192.168.1.194:2379 \--initial-cluster-token cluster1 \--initial-cluster node1=https://192.168.1.193:2380,node2=https://192.168.1.194:2380,node3=https://192.168.1.195:2380 \--initial-cluster-state new \--data-dir=/var/lib/etcdRestart=on-failureRestartSec=5LimitNOFILE=65536[Install]WantedBy=multi-user.target</code>node2 vi /usr/lib/systemd/system/etcd.service<code>[Unit]Description=Etcd ServerAfter=network.targetAfter=network-online.targetWants=network-online.targetDocumentation=https://github.com/coreos[Service]Type=notifyUser=rootWorkingDirectory=/var/lib/etcd/ExecStart=/usr/bin/etcd \--name node3 \--cert-file=/etc/kubernetes/ssl/kubernetes.pem \--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \--peer-cert-file=/etc/kubernetes/ssl/kubernetes.pem \--peer-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \--trusted-ca-file=/etc/kubernetes/ssl/ca.pem \--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \--initial-advertise-peer-urls https://192.168.1.195:2380 \--listen-peer-urls https://192.168.1.195:2380 \--listen-client-urls https://192.168.1.195:2379,http://localhost:2379 \--advertise-client-urls https://192.168.1.195:2379 \--initial-cluster-token cluster1 \--initial-cluster node1=https://192.168.1.193:2380,node2=https://192.168.1.194:2380,node3=https://192.168.1.195:2380 \--initial-cluster-state new \--data-dir=/var/lib/etcdRestart=on-failureRestartSec=5LimitNOFILE=65536[Install]WantedBy=multi-user.target</code>###start etc cluster###systemctl start etcd###etcd test###etcdctl --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem cluster-health如果重建集群,须要删除rm -rf /var/lib/etcd/*

February 23, 2021 · 1 min · jiezi

关于kubernetes:k8sdns

github地址 https://github.com/kubernetes/kubernetes/tree/master/cluster/addonskubedns 记录的是service和ip之间的映射关系,称为DNS解析记录,记录在内存当中,应用树形构造在内存中保留监控到的记录。这个组件仅仅是记录下来当前,并不提供查问。dnsmasq 从后面记录的中央查问相干service的解析记录,之所以用dnsmasq来查问,因为它提供DNS查问缓存,在内存中实现查问,查问速度十分快!exechealthz kubedns负责监控并记录,dnsmasq帮其它服务做查问, 两个组件必须要同时运行,如果其中一个出问题了,那么dns零碎将无奈解析,exechealthz专门来监控它们的衰弱状态

February 23, 2021 · 1 min · jiezi

关于kubernetes:k8sdashboard

—查看整个集群状态,节点资源分配状况,绝对于命令行可视化,操作还是命令行方便 参考文档:https://github.com/kubernetes/dashboardwget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yamlorvi kubernetes-dashboard.yaml<code># ------------------- Dashboard Secret ------------------- #apiVersion: v1kind: Secretmetadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard-certs namespace: kube-systemtype: Opaque---# ------------------- Dashboard Service Account ------------------- #apiVersion: v1kind: ServiceAccountmetadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: kubernetes-dashboard-minimal namespace: kube-systemroleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: cluster-adminsubjects:- kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system---# ------------------- Dashboard Deployment ------------------- #kind: DeploymentapiVersion: apps/v1metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-systemspec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: kubernetes-dashboard template: metadata: labels: k8s-app: kubernetes-dashboard spec: containers: - name: kubernetes-dashboard image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1 ports: - containerPort: 8443 protocol: TCP args: - --auto-generate-certificates # Uncomment the following line to manually specify Kubernetes API server Host # If not specified, Dashboard will attempt to auto discover the API server and connect # to it. Uncomment only if the default does not work. # - --apiserver-host=http://my-address:port volumeMounts: - name: kubernetes-dashboard-certs mountPath: /certs # Create on-disk volume to store exec logs - mountPath: /tmp name: tmp-volume livenessProbe: httpGet: scheme: HTTPS path: / port: 8443 initialDelaySeconds: 30 timeoutSeconds: 30 volumes: - name: kubernetes-dashboard-certs secret: secretName: kubernetes-dashboard-certs - name: tmp-volume emptyDir: {} serviceAccountName: kubernetes-dashboard # Comment the following tolerations if Dashboard must not be deployed on master tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule---# ------------------- Dashboard Service ------------------- #kind: ServiceapiVersion: v1metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-systemspec: type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 30001 selector: k8s-app: kubernetes-dashboard</code>kubectl apply -f kubernetes-dashboard.yamlkubectl get pods -n kube-system -o wide|grep 'dashboard'http://node:30001======get secrets======kubectl get serviceaccount kubernetes-dashboard -n kube-system -o yamlkubectl get secrets kubernetes-dashboard-token-4grjw -n kube-system -o yamlecho "$token"|base64 -d

February 23, 2021 · 2 min · jiezi

关于kubernetes:k8scronjob

cronjob: https://kubernetes.io/zh/docs/concepts/workloads/controllers/cron-jobs/https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/jobs:https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#writing-a-job-spec cron job -> (0-2)job -> pod一个 CronJob 对象相似于 crontab (cron table)文件中的一行。它依据指定的预约打算周期性地运行一个 JobCron Job 在每次调度运行工夫内 大略 会创立一个 Job 对象。咱们之所以说 大略 ,是因为在特定的环境下可能会创立两个 Job,或者一个 Job 都没创立。咱们尝试少产生这种状况,但却不能完全避免。因而,创立 Job 操作应该是 _幂等的_。Job 依据它所创立的 Pod 的并行度,负责重试创立 Pod,并就决定这一组 Pod 的胜利或失败。 Cron Job 基本不会去查看 Pod-- 查看cronjobkubectl get cronjob -n niuniukubectl get cronjob -n niuniu --watch---apiVersion: batch/v1beta1kind: CronJobmetadata: namespace: niuniu name: autocheckout labels: app: cronspec: schedule: "*/1 * * * *" concurrencyPolicy: Allow startingDeadlineSeconds: 300 successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 1 jobTemplate:.spec.startingDeadlineSeconds 字段是可选的。它示意启动 Job 的期限(秒级别),如果因为任何起因而错过了被调度的工夫,那么错过执行工夫的 Job 将被认为是失败的。如果没有指定,则没有期限并发策略.spec.concurrencyPolicy 字段也是可选的。它指定了如何解决被 Cron Job 创立的 Job 的并发执行。只容许指定上面策略中的一种: Allow(默认):容许并发运行 Job Forbid:禁止并发运行,如果前一个还没有实现,则间接跳过下一个 Replace:勾销以后正在运行的 Job,用一个新的来替换留神,以后策略只能利用于同一个 Cron Job 创立的 Job。如果存在多个 Cron Job,它们创立的 Job 之间总是容许并发运行。挂起.spec.suspend 字段也是可选的。如果设置为 true,后续所有执行都将被挂起。它对曾经开始执行的 Job 不起作用。默认值为 false。Job 历史限度.spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit 它们指定了能够保留实现和失败 Job 数量的限度。默认没有限度,所有胜利和失败的 Job 都会被保留。然而,当运行一个 Cron Job 时,很快就会沉积很多 Job,举荐设置这两个字段的值。设置限度值为 0,相干类型的 Job 实现后将不会被保留。

February 23, 2021 · 1 min · jiezi

关于kubernetes:k8scert

Kubernetes集群都有一个集群根证书颁发机构(CA) -- 验证API server证书 -- 验证kubelet客户端证书 CA证书包被散发到集群中的每个节点 -- 作为一个secret附加散发到默认service account让Pod中运行的应用程序信赖集群根CA通常须要一些额定的应用程序配置: CA证书包 -- TLS客户端或服务器信赖的CA证书列表=====install cfssl=====wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64chmod +x cfssl_linux-amd64mv cfssl_linux-amd64 /usr/local/bin/cfsslwget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64chmod +x cfssljson_linux-amd64mv cfssljson_linux-amd64 /usr/local/bin/cfssljsonwget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64chmod +x cfssl-certinfo_linux-amd64mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo=====create CA=====mkdir /root/sslcd /root/sslcfssl print-defaults config > config.jsoncfssl print-defaults csr > csr.json# 依据config.json文件的格局创立如下的ca-config.json文件# 过期工夫设置成了 87600hcat > ca-config.json <<EOF{ "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "87600h" } } }}EOF创立 ca-csr.json 文件vi ca-csr.json<code>{ "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ], "ca": { "expiry": "87600h" }}</code>生成 CA 证书和私钥cfssl gencert -initca ca-csr.json | cfssljson -bare cals -lt ca*-rw-r--r--. 1 root root 1001 4月 15 12:00 ca.csr-rw-------. 1 root root 1675 4月 15 12:00 ca-key.pem-rw-r--r--. 1 root root 1359 4月 15 12:00 ca.pem创立 kubernetes 证书vi kubernetes-csr.json<code>{ "CN": "kubernetes", "hosts": [ "127.0.0.1", "192.168.1.193", "192.168.1.194", "192.168.1.195", "10.254.0.1", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ]}</code>如果 hosts 字段不为空则须要指定受权应用该证书的 IP 或域名列表,因为该证书后续被 etcd 集群和 kubernetes master 集群应用,所以下面别离指定了 etcd 集群、kubernetes master 集群的主机 IP 和 kubernetes 服务的服务 IP(个别是 kube-apiserver 指定的 service-cluster-ip-range 网段的第一个IP,如 10.254.0.1)cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetesll kubernetes*-rw-r--r--. 1 root root 1261 4月 15 15:24 kubernetes.csr-rw-r--r--. 1 root root 560 4月 15 15:24 kubernetes-csr.json-rw-------. 1 root root 1679 4月 15 15:24 kubernetes-key.pem-rw-r--r--. 1 root root 1627 4月 15 15:24 kubernetes.pem创立 admin-csr.json 证书这个admin 证书,是未来生成管理员用的kube config 配置文件用的,当初咱们个别倡议应用RBAC 来对kubernetes 进行角色权限管制, kubernetes 将证书中的CN 字段 作为User, O 字段作为 Group(具体参考 Kubernetes中的用户与身份认证受权中 X509 Client Certs 一段)。vi admin-csr.json<code>{ "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "system:masters", "OU": "System" } ]}</code>cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare adminll admin*-rw-r--r--. 1 root root 1009 4月 15 17:23 admin.csr-rw-r--r--. 1 root root 229 4月 15 17:10 admin-csr.json-rw-------. 1 root root 1679 4月 15 17:23 admin-key.pem-rw-r--r--. 1 root root 1399 4月 15 17:23 admin.pem创立 kube-proxy 证书vi kube-proxy-csr.json<code>{ "CN": "system:kube-proxy", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ]}</code>cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy========校验证书=========应用 openssl 命令openssl x509 -noout -text -in kubernetes.pem应用 cfssl-certinfo 命令cfssl-certinfo -cert kubernetes.pem散发证书mkdir -p /etc/kubernetes/sslcp *.pem /etc/kubernetes/ssl散发证书给节点mkdir -p /etc/kubernetes/sslscp *.pem root@192.168.1.194:/etc/kubernetes/ssl/scp *.pem root@192.168.1.195:/etc/kubernetes/ssl/

February 23, 2021 · 2 min · jiezi

关于kubernetes:k8s-node-操作与维护

查看设置标签 kubectl get nodes --show-labelskubectl label nodes node1 monitor=prometheus使节点离线,这将阻止新的 pod 落到它们下面,驱赶现有的pod(除了DaemonSet)。默认工夫为5 分钟,由 controller-manager 的 --pod-eviction-timeout 管制,pod不会从新抉择节点kubectl drain x.x.x.x --ignore-daemonsets查看108上的podkubectl get pods --all-namespaces -o wide |grep 'x.x.x.x'kubectl get nodesx.x.x.x Ready,SchedulingDisabled从新使节点可调度kubectl uncordon x.x.x.xkubectl get nodesx.x.x.x Ready 查看xxx上的podkubectl get pods --all-namespaces -o wide |grep 'x.x.x.x'

February 23, 2021 · 1 min · jiezi

关于kubernetes:k8s-证书更新

cat /etc/kubernetes/kubelet.conf openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep 'Not'openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep 'Not'rm -f /var/lib/kubelet/pki/kubelet-client-current.pemsystemctl restart kubeletopenssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep 'Not' kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve

February 23, 2021 · 1 min · jiezi

关于kubernetes:在Kubernetes上运行Flink

Flink是目前最热门的分布式流/批处理框架,而Kubernetes是目前最热门的资源管理和调度平台。Flink反对在Kubernetes上采纳Session模式或Application模式部署作业。基于实践经验,本文次要探讨在Kubernetes上部署Flink作业须要留神的中央。 环境: k8s: 1.15flink-client:flink-1.11.2测试虽基于flink-1.11.2,参考1.12的文档也不妨: native_kubernetes k8s上运行flink工作有两种模式,session模式和application模式(晚期还有一种pre-job模式,但已废除) session模式下,在k8s上会部署一个运行jobmanager的pod(以及包含deployment/rs/service/configmap等资源)。后续通过提交命令提交的工作,都由这个jobmanager的pod负责向k8s申请taskmanager的pod。这种模式与standalone有些相似,惟一的不同是,standalone模式须要实现部署好master和worker。 application模式下,每个作业会在k8s上部署一套jm和tm,这跟yarn模式是相似的。 筹备RBCA基于上述原理,不论是哪种模式都须要pod有权限创立其余资源,因而须要思考RBAC。 正如文档所说,须要当时为default这个servicename设置对应的role,实际中咱们部署如下配置,参考kubernetes-log-user-systemserviceaccountdefaultdefault-cannot-get-services: apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: fabric8-rbacsubjects: - kind: ServiceAccount # Reference to upper's `metadata.name` name: default # Reference to upper's `metadata.namespace` namespace: defaultroleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io最开始遗留上述步骤节约了大量的调试工夫。 在k8s节点上提交另外,提交工作最好在k8s的节点上进行,因为如下起因 KubeConfig, which has access to list, create, delete pods and services, configurable via ~/.kube/config. You can verify permissions by running kubectl auth can-i <list|create|edit|delete> pods.CoreDNSk8s上须要实现装置好CoreDNS 解决日志配置flink1.11的客户端对log配置解决并不好,这造成调试和排错艰难,所以倡议上来先解决一下客户端的配置: 在flink-conf.yaml减少如下配置: kubernetes.container-start-command-template: %java% %classpath% %jvmmem% %jvmopts% %logging% %class% %args%kubernetes.container.image.pull-policy: Alwayskubernetes.container-start-command-template的作用是生成jobmanager pod时的启动命令。这里去掉提交命令中最初的的%redirect%。默认%redirect%会将规范输入和规范谬误重定向到文件,如果pod出错挂掉的话,无奈通过kubectl logs命令查看日志镜像始终拉取。在内网环境下,流量不是问题,始终拉取镜像,不便前面批改根底镜像后,能及时拉取将logback-console.xml和log4j-console.properties重命名为logback.xml和log4j.properties。这将使得日志打印到stdout和stderr,否则日志将打印到文件 ...

February 9, 2021 · 1 min · jiezi

关于kubernetes:看KubeEdge携手K8S如何管理中国高速公路上的10万边缘节点

摘要:为保障高速公路上门架零碎的落地我的项目的胜利落地,抉择K8s和KubeEdge来进行整体的利用和边缘节点治理。一、我的项目背景本我的项目是在高速公路ETC联网和推动勾销省界收费站的大前提下,门架零碎的落地,也就是要把门架部署在覆盖全国范畴的高速公路上,收集车辆通行的牌示信息,以及相应的交易信息。 整体的状况是在边缘侧,即高速公路上会部署大量的门架和相应的控制器,相应的边缘终端,这些终端大略10万台,其上部署了相干的利用以收集相干信息。超过50万个利用部署到边缘节点,收集到信息后,通过免费专网向省核心以及路网核心上传对应的数据。 本次我的项目的工作挑战次要有两个方面: 将近10万台异构设施的治理,包含arm,x86等异构设施。 50余万个利用的生命周期治理 为保障我的项目的胜利落地,咱们对整体架构做了选型,最终抉择了K8s和KubeEdge来进行整体的利用和边缘节点治理。 二、为什么抉择Kubernetes在我的项目里,尽管说是部署在边缘侧的利用,但它的复杂程度曾经和云上是相似的了,在边缘侧部署的利用曾经是由很多个微服务组成的。所以Kubernetes对于撑持这种微服务化的、云原生化的利用部署和大规模治理的能力,同样也实用于这个我的项目在边缘侧的应用。 具体来说,有一些典型的部署需要: 双机热备 多机多活互备 有关联的利用同节点部署以晋升利用间交互效率 同一利用的不同实例跨节点部署以晋升可用性 根据边缘节点的不同属性将利用部署于不同分组中 定义独立于节点的利用部署以及实现满足条件的新边缘节点上线后主动装置利用 这些需要,用K8s的这些Deployment、Pod、ReplicaSet、DaemonSet等外围对象来示意,是非常适合的。所以咱们就抉择了Kubernetes。 当然,还有一些重要的边缘侧特有的需要是原生的Kubernetes不具备的,但Kubernetes的架构是十分好的,易于扩大,灵活性很高,能够基于原生Kubernetes架构根底,依据边缘治理的非凡需要进行扩大。 三、为什么抉择KubeEdge一是业务本身的特点来决定的。这个业务的量十分大,波及的边缘节点散布在全国各地,所以它的边缘侧是多硬件架构、多厂家的,咱们须要异构的反对; 边缘工控机低至4核ARM SOC、1G可用内存,咱们须要低资源占用的计划来治理边缘侧的节点;治理运维简单,从路网核心到最终路段,分为6级治理档次,治理老本高,咱们须要高集成度边缘的计划,让边缘足够简略,把出问题的概率降到最低,升高运维老本。 二是从边缘环境的特点来看的。从网络的角度来看,网络分为部省、省站两层,屡次转发,咱们须要边缘接入具备高灵活性,可反对专线、代理、公网、有线和无线接入等多种形式;各地基础设施的建设不同,有些省份的网络带宽低至3M,咱们须要边缘和云之间的治理带宽占用降到最低;有些高速公路上的网络条件是十分差的,经常出现断网的状况。咱们须要边缘计划有离线自治的能力。 整体计划 接下来我会把整体计划关上成几层来别离介绍。 利用部署 首先是利用部署,就像我方才说的,在边缘侧要部署的业务非常复杂,它是由多个微服务所形成的云原生化的架构。所以咱们这些微服务以及中间件都容器化之后能够十分好的适应各种不同的异构操作系统,不便对立治理。 如下图所示,微服务架构分成前端和后端,前端次要把业务通过Deployment的形式部署到门架上,与后端之间是通过EdgeMesh实现的。通过这种服务发现的形式,实现微服务前后端业务的通信。而后端业务容器自身是无状态的,能够通过Deployment来部署。 前面的Redis包含MySql就能够通过Statefulset的形式来进行部署。通过这样的部署模型,咱们能够很完满的进行封装和自动化治理高可用的边缘侧的整套业务零碎。 但如果仅仅是用原生的K8s部署形式,并不能齐全满足咱们的需要,因为在我的项目里要部署的量十分大,左图的环境只是利用于一个收费站,而一个路段要治理几百上千个收费站,一一部署老本过高。所以咱们基于K8s之上又构建了一个工作工作流的引擎零碎,把每一个部署微服务的步骤定义为一个job。用批量的形式大量、疾速部署成千盈百个同样的微服务零碎和环境。 大规模节点接入 除了下面提到的挑战,在应答大规模节点接入的状况下也遇见过一些问题: 每个省有本人的管理权限,咱们按K8s集群的配置配了多个K8s集群来进行治理,一个省对应一个K8s集群,而后在K8s之上通过对立的管理层解决简单跨集群数据统计等操作,从核心侧治理每个省的边缘侧,这就是多集群的管理手段。 咱们曾遇见一种景象,路网核心或省核心做网络降级等动作之后,网络有时候会呈现问题,所有省的边缘节点,失去与K8s的连贯,等网络复原之后,又会产生所有节点同时连贯核心侧的K8s集群,引起大量的并发连贯,对核心侧的零碎造成冲击,导致利用异样。为了应答这种状况,咱们通过动静退却算法缓解节点同时接入所造成的流量冲击。 须要精简NodeStatus和PodStatus上报的信息。就前文所提到的,各地基础设施的建设不同,有些省份的网络带宽低至3M,所以咱们须要减小状态信息的大小,升高上报流量的冲击,升高对网络的影响。 镜像仓库Mirror分级减速,无效升高了对网络的冲击,进步大批量部署的部署效率。 边缘业务高可用 接下来的是边缘业务高可用,依照原生K8s的降级状态,它会先删除旧版本Pod,再创立新Pod并在这个过程中去拉取新版本镜像。这种操作在私有云网络条件较好的状况下,是没太大问题的。但在边缘侧,这样就会造成业务长时间的中断,免费数据缺失。所以针对这一个流程,咱们也是做了相应的降级和优化。 咱们先把降级下载镜像的告诉下发做预下载,下载胜利之后再删除已有的旧Pod,启动新利用,优化了利用降级对服务中断的工夫的影响,将业务降级时整体业务中断的工夫从分钟级缩减到了10s内。 同时,思考到边缘设施有主备部署的状况,而边缘侧又不像云上有ELB服务。咱们又在边缘节点中容器化部署了Keepalived,通过VIP,为门架的摄像头等设施提供对应的K8s集群内的容器服务。 四、总结以后基于KubeEdge的边缘管理系统治理着全国29个省、市 、自治区的将近100,000个边缘节点,超过500,000边缘利用的部署。撑持了高速公路门架业务的一直调整、更新,满足了每日3亿条以上的信息采集。 为日后车路协同、主动驾驶等翻新业务的倒退提供了良好的平台撑持。 K8s提供的通用部署和调度模型很适宜部署大规模边缘利用。 单纯原生K8s不能满足边缘侧业务的所有需要,KubeEdge集成K8s云原生治理能力,同时对边缘业务部署和治理提供了很好的反对。 本文分享自华为云社区《如何应用Kubernetes治理中国高速公路上的10万边缘节点?》,原文作者:技术火炬手。 点击关注,第一工夫理解华为云陈腐技术~

February 5, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-准入控制器详解

Kubernetes 管制立体由几个组件组成。其中一个组件是 kube-apiserver,简略的 API server。它公开了一个 REST 端点,用户、集群组件以及客户端应用程序能够通过该端点与集群进行通信。总的来说,它会进行以下操作: 从客户端应用程序(如 kubectl)接管规范 HTTP 申请。验证传入申请并利用受权策略。在胜利的身份验证中,它能依据端点对象(Pod、Deployments、Namespace 等)和 http 动作(Create、Put、Get、Delete 等)执行操作。对 etcd 数据存储进行更改以保留数据。操作实现,它就向客户端发送响应。 申请流程 当初让咱们思考这样一种状况:在申请通过身份验证后,但在对 etcd 数据存储进行任何更改之前,咱们须要拦挡该申请。例如: 拦挡客户端发送的申请。解析申请并执行操作。依据申请的后果,决定对 etcd 进行更改还是回绝对 etcd 进行更改。Kubernetes 准入控制器就是用于这种状况的插件。在代码层面,准入控制器逻辑与 API server 逻辑解耦,这样用户就能够开发自定义拦截器(custom interceptor),无论何时对象被创立、更新或从 etcd 中删除,都能够调用该拦截器。 有了准入控制器,从任意起源到 API server 的申请流将如下所示: 准入控制器阶段(来自官网文档) 官网文档地址:https://kubernetes.io/blog/20...依据准入控制器执行的操作类型,它能够分为 3 种类型: Mutating(变更)Validating(验证)Both(两者都有)Mutating:这种控制器能够解析申请,并在申请向下发送之前对申请进行更改(变更申请)。 示例:AlwaysPullImages Validating:这种控制器能够解析申请并依据特定数据进行验证。 示例:NamespaceExists Both:这种控制器能够执行变更和验证两种操作。 示例:CertificateSigning 无关这些控制器更多信息,查看官网文档:https://kubernetes.io/docs/re...准入控制器过程包含按程序执行的2个阶段: Mutating(变更)阶段(先执行)Validation (验证)阶段(变更阶段后执行)Kubernetes 集群曾经在应用准入控制器来执行许多工作。 Kubernetes 附带的准入控制器列表:https://kubernetes.io/docs/re...通过该列表,咱们能够发现大多数操作,如 AlwaysPullImages、DefaultStorageClass、PodSecurityPolicy 等,实际上都是由不同的准入控制器执行的。 如何启用或禁用准入控制器?要启用准入控制器,咱们必须在启动 kube-apiserver 时,将以逗号分隔的准入控制器插件名称列表传递给 --enable-ading-plugins。对于默认插件,命令如下所示: 要禁用准入控制器插件,能够将插件名称列表传递给 --disable-admission-plugins。它将笼罩默认启用的插件列表。 默认准入控制器NamespaceLifecycleLimitRangerServiceAccountTaintNodesByConditionPriorityDefaultTolerationSecondsDefaultStorageClassStorageObjectInUseProtectionPersistentVolumeClaimResizeRuntimeClassCertificateApprovalCertificateSigningCertificateSubjectRestrictionDefaultIngressClassMutatingAdmissionWebhookValidatingAdmissionWebhookResourceQuota为什么要应用准入控制器?准入控制器能提供额定的平安和治理层,以帮忙 Kubernetes 集群的用户应用。 执行策略:通过应用自定义准入控制器,咱们能够验证申请并查看它是否蕴含特定的所需信息。例如,咱们能够查看 Pod 是否设置了正确的标签。如果没有,那能够一起回绝该申请。某些状况下,如果申请中短少一些字段,咱们也能够更改这些字段。例如,如果 Pod 没有设置资源限度,咱们能够为 Pod 增加特定的资源限度。通过这样的形式,除非明确指定,集群中的所有 Pod 都将依据咱们的要求设置资源限度。Limit Range 就是这种实现。 ...

February 4, 2021 · 1 min · jiezi

关于kubernetes:kubeadm-安装指定版本的-k8s-集群

什么是 kubeadm?kubeadm 是 Google 官网举荐应用的 kubernetes 集群安装程序,能够应用它来疾速创立单机或者高可用 kubernetes 集群,以及不便地提供一些日常保护操作,例如:节点的扩容缩容、集群证书更新、集群版本升级等。 装置指定版本的 kubernetes 集群如果要应用 kubeadm 装置 k8s 集群,那么每一个 k8s 集群节点上都必须部署 3 个程序: kubeadm:k8s 集群的装置器;kubelet:调配和治理以后节点上的 POD/Container,新版本的 CRI 反对 docker、containerd 等;kubectl:与 k8s 集群进行通信的客户端,例如:获取 k8s 集群信息或者资源状态,部署 k8s 资源等。个别状况下,kubeadm 装置器的版本号和 kubernetes 集群的版本根本保持一致,也就是说,kubeadm-v1.16 的装置器,它只能也只会装置 kubernetes-v1.16 系列的版本。假如咱们当初要装置 kubernetes-v1.16 的版本,那么咱们须要执行以下的操作: 1. 装置 v-1.16 的 kubeadm/kubelet/kubectl因为 kubeadm 的官网源在国外,所以如果不迷信上网的状况下,间接下载 kubeadm 以及 kuberenets 集群组件镜像(k8s.gcr.io)会十分迟缓,这里咱们间接采纳阿里云的 kubernetes 镜像库来进行装置。 先配置 kubeadm 的装置源: CentOS / RHEL / Fedoracat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOFsetenforce 0Debian / Ubuntuapt-get update && apt-get install -y apt-transport-httpscurl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.listdeb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial mainEOF apt-get update查看可装置的 kubeadm 版本: ...

February 1, 2021 · 2 min · jiezi

关于kubernetes:扎根CNCF社区贡献五年是怎样的体验听听华为云原生开源团队的负责人怎么说

摘要:本月咱们要重点介绍王泽锋(Kevin Wang),他是 CNCF 社区的长期贡献者,华为云原生开源团队的负责人,KubeEdge 和 Volcano 我的项目的联结创始人。Kevin 答复了几个对于他过来五年在 CNCF 社区的经验相干问题。 CNCF (Cloud Native Computing Foundation) 成立于2015年12月,隶属于Linux Foundation,是非营利性组织。 CNCF (云原生计算基金会)致力于培养和保护一个厂商中立的开源生态系统,来推广云原生技术。通过将最前沿的模式民主化,让这些翻新为公众所用。 通知咱们你是如何开始参加 CNCF 社区的。我与 Kubernetes 和 CNCF 社区的旅程始于 2015 年。过后,我正在帮忙一些客户将他们的传统业务迁徙到云上。在工作中我辨认了 Kubernetes 的一些待加强性能,并开始参加社区奉献。 Kubernetes 社区是我见过最凋谢的开源社区。Kubernetes 欢送我探讨 issue、提交 proposal、发送 Pull Request 和发表评论。我是最早为 Kubernetes 做出重大贡献的中国 maintainer 之一。在 2015 年到 2018 年之间,我领导了 Kubernetes 的多个高级调度性能和子项目的开发工作。 2018 年,在帮忙客户在边缘构建商业利用的过程中,我与共事联结创建了KubeEdge[1]开源我的项目。该我的项目成为 了 CNCF 第一个将云原生技术利用到边缘计算的开源我的项目。 我联结发动的另一个令人兴奋的开源我的项目是Volcano[2],CNCF 的首个云原生批量计算我的项目,帮忙人工智能、大数据和高性能计算等工作负载在 CNCF 技术栈上更好地运行。Volcano 于 2019 年开源,并于 2020 年 4 月捐献给 CNCF。 作为 CNCF 的一部分对这些我的项目有什么益处?自退出 CNCF 以来,KubeEdge 曾经收到来自寰球 550 多名贡献者和 50 家组织的奉献,并于 2020 年 9 月升级孵化阶段。 ...

January 29, 2021 · 1 min · jiezi

关于kubernetes:灵雀云KubeOVN进入CNCF沙箱成为CNCF首个容器网络项目

昨日,云原生计算基金会 (CNCF) 发表由灵雀云开源的容器网络我的项目Kube-OVN 正式进入 CNCF 沙箱(Sandbox)托管。这是寰球范畴内首个被CNCF纳入托管的开源CNI网络我的项目,也是国内容器公司首次将独立设计研发的我的项目胜利奉献进入CNCF基金会。 Kube-OVN是一款由灵雀云自主研发的企业级云原生Kubernetes容器网络编排零碎,它基于SDN网络虚拟化技术,为企业提供灵便易用的容器网络。Kube-OVN通过将OpenStack畛域成熟的网络性能平移到Kubernetes,交融了平安强化、智能运维、硬件加速等多方面的个性,极大加强了Kubernetes容器网络的安全性、可运维性、管理性和性能,为Kubernetes生态的落地带来了的独特的价值。也因其补齐现有开源社区网络计划的性能、装置简单明了、保护难度低、输入稳固等个性,吸引了寰球范畴内泛滥用户的关注,已成为了开源社区最受欢迎的Kubernetes网络解决方案之一。与此同时,Kube-OVN也失去了行业的高度认可,取得了中国开源云联盟颁发的“优良开源我的项目”等荣誉。 自19年中旬开源以来,Kube-OVN已在Github上播种700+的star,有来自灵雀云、中国电信、Intel、华为、锐捷网络等诸多公司的24位贡献者参加代码编写,同时积攒了50+企业用户,其中不乏联通、电信、华为、中国电子、字节跳动、Rakuten(日本)等诸多巨头公司。不到两年的工夫,Kube-OVN胜利实现了上千集群级别的大规模企业级我的项目、海内我的项目落地,以及商业化的初步尝试。Kube-OVN进入CNCF沙箱托管,将反哺云原生中最外围的局部——Kubernetes运行环境解决方案的倒退及成熟。Kube-OVN将提供跨云网络管理、传统网络架构与基础设施的互联互通、边缘集群落地等简单利用场景的能力反对;同时将解除Kubernetes网络面临的性能和安全监控的掣肘,为基于Kubernetes架构原生设计的零碎提供最为成熟的网络底座,晋升用户对Kubernetes生态Runtime的稳定性和易用性。得益于CNCF这个开源中立家园的环境, Kube-OVN也行将驶入我的项目性能倒退和落地实际的“快车道”。接下来,Kube-OVN将强化社区经营并推出一系列社区活动,心愿携手更多开发者和用户,将翻新技术和利用需要联合,用代码解决用户理论诉求,让Kubernetes网络体系可用,好用,真正开释开源社区的价值。作为Kube-OVN开源我的项目的发起者,灵雀云将持续放弃开源、凋谢的理念,积极参与国内和国内开源组织的生态建设,并帮助Kube-OVN社区培养和保护一个中立的开源生态我的项目,实现与更多的云平台、云原生基础设施及上下游生态搭档的单干,助推其飞得更高更远,走向毕业!

January 28, 2021 · 1 min · jiezi

关于kubernetes:Pod删除流程

ApiServer解决不论是通过kubectl命令还是程序通过api接口删除pod,最终都是通过Api Server进行解决。Api Server提供了restful接口,解决DELETE的办法地位在k8s.io/apiserver/pkg/endpoints/install.go文件中registerResourceHandlers函数,实现如下: case "DELETE": // Delete a resource. article := GetArticleForNoun(kind, " ") doc := "delete" + article + kind if isSubresource { doc = "delete " + subresource + " of" + article + kind } deleteReturnType := versionedStatus if deleteReturnsDeletedObject { deleteReturnType = producedObject } handler := metrics.InstrumentRouteFunc(action.Verb, group, version, resource, subresource, requestScope, metrics.APIServerComponent, deprecated, removedRelease, restfulDeleteResource(gracefulDeleter, isGracefulDeleter, reqScope, admit)) if enableWarningHeaders { handler = utilwarning.AddWarningsHandler(handler, warnings) } route := ws.DELETE(action.Path).To(handler). Doc(doc). Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")). Operation("delete"+namespaced+kind+strings.Title(subresource)+operationSuffix). Produces(append(storageMeta.ProducesMIMETypes(action.Verb), mediaTypes...)...). Writes(deleteReturnType). Returns(http.StatusOK, "OK", deleteReturnType). Returns(http.StatusAccepted, "Accepted", deleteReturnType) if isGracefulDeleter { route.Reads(versionedDeleterObject) route.ParameterNamed("body").Required(false) if err := AddObjectParams(ws, route, versionedDeleteOptions); err != nil { return nil, nil, err } } addParams(route, action.Params) routes = append(routes, route)其中调用了restfulDeleteResource办法 ...

January 22, 2021 · 4 min · jiezi