关于kubernetes:Kubernetes-持久化数据存储-StorageClass

文章链接PV 和 PVC 模式要先创立好 PV,而后再定义好 PVC 进行一对一的绑定。那么如果遇到大集群,也一一的创立吗?这样来说保护老本很高,工作量大。这个时候就有了 Kubernetes 提供一种主动创立 PV 的机制,叫 StorageClass ,它的作用就是创立 PV 的模板。 StorageClass 会定义两局部: PV的属性:比方存储的大小、类型等PV须要应用到的存储插件比方Ceph等;有了这两局部信息,Kubernetes 就可能依据用户提交的 PVC ,找到对应的 StorageClass ,而后 Kubernetes 就会调用 StorageClass 申明的存储插件,主动创立 PV 。 不过要应用 NFS ,咱们就须要一个 nfs-client 的插件。这个插件会使 NFS 服务主动帮咱们创立 PV 。 主动创立的 PV 会以 ${namespace}-${pvcName}-${pvName} 的格局存储如果 PV 被回收,则会以 archieved-${namespace}-${pvcName}-${pvName} 的格局存储具体能够参考 GithubPV、PVC、NFS不再介绍,没有实现的请查看 kubernetes应用PV和PVC治理数据存储 创立ServiceAccount创立 ServiceAccount 的目标是为了给 nfs-client 受权。 # 下载 rbac.yamlwget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/rbac.yaml部署 rbac.yaml kubectl apply -f rbac.yaml # 输入如下serviceaccount/nfs-client-provisioner createdclusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner createdclusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner createdrole.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner createdrolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created创立 nfs-client应用 Deployment 来创立 nfs-client ...

September 8, 2021 · 3 min · jiezi

关于kubernetes:kubernetes-使用-PV-和-PVC-管理数据存储

文章链接容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要利用时会呈现一些问题。首先,当容器解体时,kubelet 会重启它,然而容器中的文件将失落——容器以洁净的状态(镜像最后的状态)重新启动。其次,在 Pod 中同时运行多个容器时,这些容器之间通常须要共享文件。所以我会用 NFS 为例,创立 PV 、PVC. PV 属于集群中的资源。PVC 是对这些资源的申请,也作为对资源的申请的查看。 PV 和 PVC 之间的相互作用遵循这样的生命周期. PersistentVolume(PV)PersistentVolume(PV)是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV 是 Volume 之类的卷插件,但具备独立于应用 PV 的 Pod 的生命周期。此 API 对象蕴含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统。 PV 有两种形式来配置:动态和动静。 动态集群管理员创立一些 PV。它们带有可供群集用户应用的理论存储的细节。它们存在于 Kubernetes API 中,可用于生产。动静依据 StorageClasses,当管理员创立的动态 PV 都不匹配用户的 PersistentVolumeClaim 时,集群可能会尝试动静地为 PVC 创立卷。 装置并配置 nfs rpcbindyum install -y nfs-utils rpcbindmkdir -p /home/bsh/nfsvim /etc/exports/home/bsh/nfs *(rw,sync,no_root_squash)配置详解:ro只读拜访rw读写访问sync所有数据在申请时写入共享asyncNFS在写入数据前能够相应申请secureNFS通过1024以下的平安TCP/IP端口发送insecureNFS通过1024以上的端口发送wdelay如果多个用户要写入NFS目录,则归组写入(默认)no_wdelay如果多个用户要写入NFS目录,则立刻写入,当应用async时,无需此设置。Hide在NFS共享目录中不共享其子目录no_hide共享NFS目录的子目录subtree_check如果共享/usr/bin之类的子目录时,强制NFS查看父目录的权限(默认)no_subtree_check和下面绝对,不查看父目录权限all_squash共享文件的UID和GID映射匿名用户anonymous,适宜专用目录。no_all_squash保留共享文件的UID和GID(默认)root_squashroot用户的所有申请映射成如anonymous用户一样的权限(默认)no_root_squasroot用户具备根目录的齐全治理拜访权限anonuid=xxx指定NFS服务器/etc/passwd文件中匿名用户的UID启动 nfs rpcbind systemctl enable nfs rpcbindsystemctl start nfs rpcbind创立PV创立 yaml 文件vim tomcat-log-pv.yaml apiVersion: v1kind: PersistentVolumemetadata: name: tomcatspec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: path: /home/bsh/nfs/tomcat-log server: 10.0.10.51创立 pv ...

September 6, 2021 · 2 min · jiezi

关于kubernetes:thanos部署四-store和compactor

本篇thanos部署是基于prometheus-operator,prometheus-operator为thanos提供了在CRD和controller上的反对。 store组件部署store statefulsetstore提供了StoreAPI,以便querier查问object storage中的历史数据;# cat thanos-store-sts.yamlapiVersion: apps/v1kind: StatefulSetmetadata: name: thanos-store namespace: monitoring labels: app: thanos-storespec: serviceName: "thanos-store" replicas: 1 selector: matchLabels: app: thanos-store template: metadata: labels: app: thanos-store annotations: prometheus.io/scrape: "true" prometheus.io/port: "10902" spec: containers: - name: thanos-store image: thanosio/thanos:v0.18.0 args: - "store" - "--log.level=debug" - "--data-dir=/var/thanos/store" - "--objstore.config-file=/config/thanos.yaml" ports: - name: http containerPort: 10902 - name: grpc containerPort: 10901 - name: cluster containerPort: 10900 volumeMounts: - name: config mountPath: /config/ readOnly: true - name: data mountPath: /var/thanos/store volumes: - name: data emptyDir: {} - name: config secret: secretName: thanos-objstore-configvolumes减少了之前创立的secret: thanos-objstore-conf,其配置了拜访minio的办法; ...

September 4, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes121搭建harbor

背景:始终应用的腾讯云的集体仓库做镜像仓库。早些时候腾讯云有了tcr容器镜像服务:瞄了一眼感觉略贵。集体也就50个之内的image。就想用一下镜像平安,破绽扫描。也没有那么强硬的需要。600多块一个月还是感觉略贵!还是老老实实搭建一下harbor吧! kubernetes1.21搭建harbor注:开始在tke下面尝试的是kubernetes1.20.6两个版本差距不大就疏忽吧。最初是在我的腾讯云自建的kubernetes1.21集群上。参考了早些时候集体写的博客:https://duiniwukenaihe.github.io/2019/10/29/k8s-helm-install-hrbor/ 1. 下载harbor-helm仓库git clone形式 git clone https://github.com/goharbor/harbor-helmhelm必备当然了这里曾经装置了helm3,helm环境是必备的 wget https://get.helm.sh/helm-v3.6.3-linux-amd64.tar.gztar zxvf helm-v3.6.3-linux-amd64.tar.gcd linux-amd64cp helm /usr/local/bin/helm fetch这里也能够间接helm增加仓库的形式,算是温习一下helm命令吧。我是间接用了git clone的形式 [root@k8s-master-01 harbor-helm]# helm repo add harbor https://helm.goharbor.io"harbor" has been added to your repositories[root@k8s-master-01 harbor-helm]# cd /data/[root@k8s-master-01 data]# helm search repo harborNAME CHART VERSION APP VERSION DESCRIPTION harbor/harbor 1.7.2 2.3.2 An open source trusted cloud native registry th...[root@k8s-master-01 data]# helm fetch harbor/harbor --version 1.7.2 批改配置文件批改value.yaml配置文件:集群应用traefik代理内部拜访。expose type设置了clusterIP.设置了externalURL,storageclass。如下: type: externalURL: storageclass:注:因为cbs最小单位容许为10g切步长为10g.故除了registry外其余的存储都应用了10G.当然了应用其余存储可集体正当设置! helm install装置helm install harbor -f values.yaml . --namespace kube-opskubectl get pods -n kube-ops -w 注:此图后补的 ...

September 3, 2021 · 3 min · jiezi

关于kubernetes:kubernetes-安装-ingress-controller

文章链接 ingress-nginxingress 官方网站ingress 仓库地址ingress-nginx v1.0 最新版本 v1.0 实用于 Kubernetes 版本 v1.19+ (包含 v1.19 )Kubernetes-v1.22+ 须要应用 ingress-nginx>=1.0,因为 networking.k8s.io/v1beta 曾经移除 间接部署 ingress-nginx间接部署比较简单,间接拉去 girhub 的文件就能够了,如果遇到长时间无响应,能够终止工作从新拉取。拉取镜像局部,能够批改为一下的镜像地址 wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yamlsed -i 's@k8s.gcr.io/ingress-nginx/controller:v1.0.0\(.*\)@willdockerhub/ingress-nginx-controller:v1.0.0@' deploy.yamlsed -i 's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0\(.*\)$@hzde0128/kube-webhook-certgen:v1.0@' deploy.yamlkubectl apply -f ingress-nginx.yaml查看装置Completed 状态的是失常的,能够疏忽。 [root@master ~]# kubectl get po -n ingress-nginxNAME READY STATUS RESTARTS AGEingress-nginx-admission-create-pm6sw 0/1 Completed 0 22mingress-nginx-admission-patch-m8w94 0/1 Completed 0 22mingress-nginx-controller-7d4df87d89-272ft 1/1 Running 0 22m[root@master ~]# kubectl get svc -n ingress-nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEingress-nginx-controller NodePort 10.96.88.139 <none> 80:30497/TCP,443:32581/TCP 22mingress-nginx-controller-admission ClusterIP 10.96.193.26 <none> 443/TCP 22m创立利用yamlvim tomcat.yamlapiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deployment labels: app: tomcat spec: replicas: 2 selector: matchLabels: app: tomcat minReadySeconds: 1 progressDeadlineSeconds: 60 revisionHistoryLimit: 2 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 template: metadata: labels: app: tomcat spec: containers: - name: tomcat image: wenlongxue/tomcat:tomcat-demo-62-8fe6052 imagePullPolicy: Always ports: - containerPort: 8080 resources: requests: memory: "2Gi" cpu: "80m" limits: memory: "2Gi" cpu: "80m" readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 180 periodSeconds: 5 timeoutSeconds: 3 successThreshold: 1 failureThreshold: 30---apiVersion: v1kind: Servicemetadata: name: tomcat-service labels: app: tomcat spec: selector: app: tomcat ports: - name: tomcat-port protocol: TCP port: 8080 targetPort: 8080 type: ClusterIP 部署 tomcat 利用 ...

September 2, 2021 · 4 min · jiezi

关于kubernetes:Kuberntes中Sysctl中的配置phpfpm并发只能300

背景:kubernetes集群中部署利用,对利用进行压力测试。jmeter进行压力测试大略是每秒300个左右的申请(每分钟elasticsearch中采集的申请有18000个)。查看日志有nginx的erro log: 然而我的cpu 内存资源也都没有打满。通过搜索引擎搜寻发现与上面博客的环境根本类似,php-fpm也是走的socket: 参见:http://www.bubuko.com/infodetail-3600189.html 解决问题:批改net.core.somaxconn进入本人的nginx-php容器查看: bash-5.0# cat /proc/sys/net/core/somaxconn128随机找了一个work节点查看主机的somaxconn: root@ap-shanghai-k8s-node-1:~# cat /proc/sys/net/core/somaxconn32768注:这是一个tke集群。参数都是默认的。未进行批改上面批改一下利用的配置文件: apiVersion: apps/v1kind: Deploymentmetadata: name: paper-miniprogramspec: replicas: 1 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 selector: matchLabels: app: paper-miniprogram template: metadata: labels: app: paper-miniprogram spec: containers: - name: paper-miniprogram image: ccr.ccs.tencentyun.com/xxxx/paper-miniprogram:{data} ports: - containerPort: 80 resources: requests: memory: "1024M" cpu: "1000m" limits: memory: "1024M" cpu: "1000m" imagePullSecrets: - name: tencent---apiVersion: v1kind: Servicemetadata: name: paper-miniprogram labels: app: paper-miniprogramspec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: paper-miniprogram批改如下:减少initContainers配置 ...

August 30, 2021 · 1 min · jiezi

关于kubernetes:每天打卡5分钟学会k8s-第四章集群架构

明天讲的是kubernetes的架构简讲吧,kuberbetes cluster有Master和Node【slave】组成,节点上运行多个kubernetes服务。 Master 节点Master是kubernetes cluster的大脑,运行着的Daemon服务包含kube-apiserver、kube-scheduler、kube-controller-manager、etcd和pod网络(例如flannel)。 API Server(kube-apiserver)这个提供了Rest API,也就是咱们应用层所说的前端接口,各种客户端工具CLI/UI治理的资源的货色,如果你 须要进行二次开发的话,这个服务须要把握。 scheduler(kube-scheduler)负责讲Pod放在那个Node上运行,也就是调度时会充分考虑cluster的拓扑构造,以后各个节点的负载,以及利用对高可用、数据亲和性的需要 Controller Manager负责Cluster各种资源,爱护资源处于预期的状态,也就是运行的服务器资源,管制在一个适合的中央,不会像老AMD CPU那种状况。一方有难,八方围观。在Controller有能够分了好几种Controller,replication、endpoints、namescpace、serviceaccounts等 不同的controller治理的不同的资源,例如 replication 治理的是deployment、statefulset、daemonset的生命周期,namespace治理的是Namespace资源 4.etcd etcd是一个key/value分布式数据库,因为他是go写的。所以这货色也就成为了k8s用来保留资状态信息和配置信息应用,自带的负载平衡里的服务发现也用到它。 pod网络这个比拟重要了,因为docker是不能跨主机通信的。如果要跨主机通信,就必须本人手动开启port映射,如果你的容器过多,那你操作就很麻烦。flannel刚好就帮你解决了这个问题,当然还有其余的网络计划,这是flannel用的人多,材料多一点。 Node节点所有的node是pod打工的中央,kubernetes反对docker、rkt等容器Runtime。Node上运行的组件有Kubelet、kube-proxy和Pod网络。 Kubelet kubelet是node的agent。当scheduler确定在某个node上运行pod后,会将pod的具体配置image、volume等信息发送该街道到kubelet而后依据这些信息创立和运行容器,并向master报告状态。 kube-proxy service在逻辑上代表了后端的多个pod,外界是通过service拜访pod。service接管到request须要通过proxy进行代理pod进行容器替换,如果你的pod是多个正本的话,这里也会帮你主动进行负载平衡。也就是说如果你应用了k8s有效在应用nginx进行手动负载平衡这些愚昧的操作。我看到很多php的教程是这么搞docker。 上面咱们就看看残缺的结构图 从图中你会发现master也存在kubelet和kube-proxy,那是因为master也能够运行利用,如果你好奇的话能够去试试应用rancher,就算是单节点它也能够创立pod容器的。 咱们要查看k8s上曾经运行的pod能够用上面的命令,和你用docker ps一样频繁 kubectl get pod --all-namespaces -o wide k8s的零碎组件被放到了kube-system namespace中。这里有一个kube组件,它为cluster提供了dns服务。这个服务在k8s初始化的时候作为附加服务装置 kubelet是惟一没有以容器模式运行的k8s组件,它在ubuntu中通过systemd服务中。你能够应用进行查看服务信息 systemctl status kubelet用例子把他们串起来以下所有的命令都是第一章有说到 kubectl run httpd-app --image=httpd --replicas=2 k8s部署了deployment httpd-app,有两个正本pod,别离运行在k8s-node1和k8s-node2 他们运作的步骤是这样的 kubectl发送部署申请到API ServerAPI Server告诉Controller Mananger创立一个deployment podScheduler执行调度工作、将两个pod别离散发到两个集群节点上收到信息的节点,会本人创立并运行pod,利用的配置和以后运行状态信息保留在etcd中,执行kubectl get pod时API Server会从etcd中读取这些数据,flannel会为每个pod进行调配ip。

August 29, 2021 · 1 min · jiezi

关于kubernetes:每天打卡5分钟学习k8s

明天咱们来到了最好玩的环节,就是部署咱们的k8s cluster集群服务。个别的集群环境无3不成群,所以个别的起码单元咱们都须要3台服务器,比方下图所示。 k8s-master是Master,k8s-node1和k8s-node2是node节点,也能够认为slave节点。 在国内应用最多的零碎是centos,为了方便使用ubuntu是的,因为apt的软件库是真的很弱小。 咱们装置能够参考https://kubernetes.io/docs/setup/independent/install-kubeadm 留神的是,k8s的所有组件和docker镜像都放在Google本人的网站,也就被墙掉了,不过好在阿里是国内最好服务平台支持者,也是国内软件的贡献者,因为他搞阿里云服务寰球第三,这些源也是提供的。须要咱们本人批改 个别的企业也不会本人搭建k8s,都是买阿里云或者rander的,这里的话大略理解一下就好了 装置Dokcer 所有的节点都须要装置Dockerapt-get update && apt-get install docker.io装置kubelet,kubeadm和kubectl所有节点都要装置 kubelet 运行cluster所有节点上,负责启动pod和容器kubeadm:用于初始化clusterkubectl:就是命令行控制台咯,对资源和容器进行CRUD#应用root用户操作apt-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 updateapt-get install -y kubelet kubeadm kubectl初始化Master kubeadm init -apiserver-advertise-address 192.168.65.120 --pod-netword-cidr=10.244.0.0/16-apiserver-advertise-address 值得是用那个Master的那个interface与Cluster的其余节点通信。 --pod-netword-cidr 是Pod的网络范畴 看到这一串内容阐明创立胜利,并copy操作mkidr那一部分内容。而后看到那个join的货色嘛?那个是在节点主机操作的。 k8s在初始化的时候做了一些的操作 k8s 执行前查看生成token和证书生成KubeConfig文件,kubelet须要这个文件与Master通信装置Master组件,会从Googel的Registry下载Docker镜像装置kube-proxy和kube-dnsk8s初始实现提醒配置kubectl提醒如何装置Pod网络9。 提醒如何注册其余节点到Cluster配置Kubectl## 其实就是刚刚执行胜利后的那串货色su - ubuntumkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.config $HOME/.kube/configsudo shown $(id -u):$(id -g) $HOME/.kube/config装置Pod 网络要集群能工作必须装置这个,要不Pod无奈进行通信,有很多网络计划,这里用到的是flannel ...

August 28, 2021 · 1 min · jiezi

关于kubernetes:每天5分钟学习k8s第二章重要的概念

在实际之前,必须先学习k8s的几个重要概念,他们是组成k8s的集群基石 1. Cluster:计算、存储和网络资源的汇合,k8s利用这些资源运行基于容器的利用。2. Master:次要工作时用来做调度应用的,治理各个节点的生命周期3. Node:负责是容器的利用运行。由Master治理,Node监控Pod的状况,并及时反馈。4. Pod: k8s的最小单元,每一个Pod有一个或多个容器。Pod的一个整体在Node上运行,并被Master调度。k8s 引入 Pod 次要是两方面 4.1 可管理性:pod提供比容器更高的形象,将他们封装一个部署单元中,k8s以pod最小单元进行调度,扩大,资源共享,治理生命周期 4.2 通信资源和资源共享:pod中的所有容器都是用同一个namespace,雷同的Ip地址和Port空间。同样的资源共享应用的volume到pod。 pods有两种应用的形式: 1) 运行繁多容器:one-container-per-Pod是K8s常常用到的模型。你能够了解为一个pod就是一容器。 2) 运行多个容器:如果你容器和容器间接须要间接资源共享的话,这模型能够更好的解决问题。举个官网的例子 File Puller会定期从内部的Content Manager中拉取最新的文件,将其存在共享的volume中。web Server从volume读取文件,Response Consumer的申请。 这两个容器有严密的合作,他们一起为Consumer提供最新的数据;同时也通过volume共享数据。 5 Controllerk8s通常不能间接创立pod,而是通过Contoller来治理Pod。在k8s外面又提供了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等。 1) Deploymen是最罕用的Controller,比方在线教程中就是通过创立Deploymen来部署利用的。Deploymen能够治理多个Pod正本。并确保Pod依照冀望的状态运行。 2) ReplicaSet实现多个Pod的多正本治理。应用Deploymen时会主动创立ReplicaSet,也就是说Deploymen是通过ReplicaSe来治理多个正本的。 3) StatefuleSe:可能保障Pod整个生命周期名称是不变的。 4) Job 用于运行完结就删除的利用,而其余Controller中的Pod通常是长期应用运行的。 6 ServiceDeploymen 能够部署doge正本,每个Pod都有本人的Ip,内部是如何拜访这些正本呢? 通过Pod的IP嘛? 要晓得Pod很可能会被频繁地删除和重启,他们的ip是会变动,用ip来拜访不太事实。所以就有了Service,k8s Service定一个外界拜访一组特定的Pod的形式。Service有本人的Ip和端口,Service为Pod提供了负载平衡。 k8s运行Pod与拜访容器pod这两项工作别离有Contoller和Service执行 7 Namespace和docker一样应用Namespace进行隔离Controller、Pod等资源。 k8s默认创立两个Namespace default:创立资源时如果不指定,将被放到这个Namespace中 kube-system:k8s本人创立的系统资源将放到这个Namespace中。

August 27, 2021 · 1 min · jiezi

关于kubernetes:每天打卡5分钟学习k8s第一章Kubernetes跑起来

Kubernetes(k8s)是谷歌的一个开源我的项目,当初不用说过多的介绍了吧。他的火,曾经和vue,React这些名词一样,一提遍地都是。不必它推广,天然有人会说到它的存在。 k8s当初始终以疾速的倒退进行着。咱们一起来学习的是k8s的1.7和1.8版本。 1.1 先跑起来 依照一贯的学习思路,咱们会在最短的工夫搭建一个零碎,这样能尽快的对学习对象感性认识。先玩起来,疾速理解基本概念,容易到放弃。 当然,要搭建一个可运作的零碎是十分难的,很侥幸的是k8s官网曾经给咱们筹备了一个最小可用的零碎。 在官网的这里网址 https://kubernetes.io/zh/docs... 会领导大家如何搭建kubernetes集群、部署利用、拜访利用、扩大利用、更新利用等罕用的场景、迅速建设理性认知。 1.2 创立k8s集群 点击 创立集群 -> 交互式教程 - 创立集群 右边是操作阐明,左边是命令终端。 咱们在终端输出一下内容,创立一个节点 minikube startkubectl get nodes 这样咱们就创立了一个单节点集群。这个节点为minikube,须要留神的是以后命令的中央并不是minikube,咱们能够通过k8s的命令行工具kubectl近程操治理集群 如果咱们须要查看集群信息能够利用 kubectl cluster-info 查看集群信息. 所显示的内容都是集群中运行的服务。 为了节俭大家的工夫,前面的操作会简化一些操作。具体的阐明和步骤请参考官网。1.3 部署利用应用过dokcer的同学,大家都会应用到docker run命令,刚好在k8s外面也有这么一个对应的命令 kubectl run kubernetes-bootcamp \ --image=docker.io/jocatalin/kubernetes-bootcamp:v1 \ --port=8080名字为 kubernetes-bootcamp , 应用的是docker镜像应用--image指定,--port设置端口. 咱们运行的货色,在k8s外面叫做pod,pod是k8s调度的最小单元。也就是咱们说的资源。在docker外面查看运行的容器咱们是应用 docker ps 命令,在k8s外面。咱们就得应用 kubectl get pods 1.4 拜访利用默认状况下,所有的pod只能在集群外部拜访。对于下面的例子和docker一样要映射端口号,咱们须要容器的8080端口 kubectl expose pod/kubernetes-bootcamp \--type="NodePort" \--port 8080 留神画红线的局部 执行kubectl get services能够查看端口的状况 咱们的端口被映射到了31527 curl minikube:31527 ...

August 27, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes构建过程分析

构建形式Kubernetes的构建形式能够分为3种,别离是本地环境构建、容器环境构建、Bazel环境构建。 Kubernetes构建形式: 本地环境构建1) make2) make all容器环境构建1) make release2) make quick-releaseBazel环境构建1) make bazel-build上面将具体介绍前两种构建形式: 本地环境构建执行make或者make all命令,会编译Kubernetes的所有组件,组件二进制文件输入的相对路径是_output/bin。如果咱们须要对Makefile的执行过程进行调试,能够在make命令前面加-n参数,输入但不执行所有执行命令,这样能够展现更具体的编译构建过程。假如咱们想独自构建某个组价,如kubectl组件,则须要指定WHAT参数。命令示例如下: make WHAT=cmd/kubectlMakefile是一个十分自动化构建工具,能够用来构建和测试Go语言的应用程序,Makefile还实用于大多数编程语言,在Kubernetes的源码根目录中,有两个与Makefile相干的文件,性能别离如下: Makefile:顶层Makefile文件,形容了整个我的项目所有代码文件的编译程序、编译规定及编译后的二进制文件输入等。Makefile.generated_file:形容了代码生成的逻辑。本地构建过程通过调用hack/make-rules/build.sh脚本开始构建组件,传入要构建的组件名称,不指定组件名称则构建所有组件。hack/make-rules/build.sh代码示例如下: kube::golang::build_binaries "$@"build_binaries接管构建的组件名称,设置构建所须要的环境及一些编译时所需的Go flags选项,而后通过go install构建组件: go install "${build_args[@]}" "$@"在go install命令执行实现后,二进制输入的目录为_output/bin。最初,能够应用make clean命令来清理构建环境。 容器环境构建通过容器(Docker)进行Kubernetes构建也非常简单,Kubernetes提供了两种容器环境下得构建形式:make release 和make quick-release,它们之间的区别如下: make release:构建所有指标平台(Darwin、Linux、Windows),构建过程会比拟久,并同时执行单元测试过程。make quick-release:疾速构建,只构建以后平台,并略过单元测试过程。Kubernetes容器环境构建流程:构建环境的配置及验证:kube::build::verify_prereqs构建容器镜像:kube::build::build_image构建代码:kube::build::run_build_command make cross将文件从容器复制到主机:kube::build::copy_output打包:kube::release::package_tarballs在容器环境构建过程中,有多个容器镜像参加其中,别离介绍如下: build 容器(kube-cross):即构建容器,在该容器中会对代码文件执行构建操作,实现后会被删除。data容器:即存储容器,用于寄存构建过程中所须要的的所有文件。raync容器:即同步容器:用于在容器和主机之间传输数据,实现后会被删除。上面介绍一下Kubernetes容器环境构建过程。1.kube::build::verfy_prereqs进行构建环境的配置及验证。该过程会查看本机是否装置了Docker容器环境,对于Darwin平台,该过程会查看本机是否装置了docker-machine环境。 2.kube::build::build_image依据Dockerfile文件构建容器镜像。Dockerfile文件来源于build/build-image/Dockerfile,代码示例如下:代码门路:build/common.sh function kube::build::build_image() { mkdir -p "${LOCAL_OUTPUT_BUILD_CONTEXT}" ... cp "${KUBE_ROOT}/build/build-image/Dockerfile" "${LOCAL_OUTPUT_BUILD_CONTEXT}/Dockerfile" cp "${KUBE_ROOT}/build/build-image/rsyncd.sh" "${LOCAL_OUTPUT_BUILD_CONTEXT}/" dd if=/dev/urandom bs=512 count=1 2>/dev/null | LC_ALL=C tr -dc 'A-Za-z0-9' | dd bs=32 count=1 2>/dev/null > "${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password" chmod go= "${LOCAL_OUTPUT_BUILD_CONTEXT}/rsyncd.password" kube::build::update_dockerfile kube::build::set_proxy kube::build::docker_build "${KUBE_BUILD_IMAGE}" "${LOCAL_OUTPUT_BUILD_CONTEXT}" 'false' ... kube::build::ensure_data_container kube::build::sync_to_container}构建容器镜像的流程如下: ...

August 23, 2021 · 1 min · jiezi

关于kubernetes:基于Kubernetes1201版本开发调试环境搭建

接下来的一段时间将要学习Kubernetes源码,为了更好的查看源码和调试程序,因而搭建了一个Kubernetes开发调试环境,该环境能够联合断点调试了解代码的运行过程。 筹备虚拟机并装置必要软件$ yum install -y docker wget curl vim golang etcd openssl git g++ gcc$ echo "export GOROOT=/usr/local/goexport GOPATH=/home/workspaceexport PATH=$PATH:$GOROOT/bin:$GOPATH/bin" >> /etc/profile$ source /etc/profile装置证书生成工具$ go get -u -v github.com/cloudflare/cfssl/cmd/...装置调试工具$ go get -u -v github.com/go-delve/delve/cmd/dlv 留神: 如果上述两种工具装置失败或者因为网络的起因无奈装置能够间接在github上将源码下载到$GOPATH/pkg/github.com下进入对应的目录执行 make install进行装置,装置胜利后在$GOPATH 目录的bin目录下生成可执行程序 筹备源码及编译出调试版本clone Kubernetes代码$ git clone https://github.com/kubernetes/kubernetes.git $GOPATH/src/k8s.io/kubernetes$ cd $GOPATH/src/k8s.io/kubernetes$ git checkout -b v1.20.1 # 切换到v1.20.1分支clone etcd代码$ git clone https://https://github.com/etcd-io/etcd.git $GOPATH/src/k8s.io/etcd$ cd $GOPATH/src/k8s.io/etcd$ git checkout -b v3.4.13 # 切换到v3.4.13分支执行单机集群启动脚本$ cd $GOPATH/src/k8s.io/kubernetes$ ./hack/local-up-cluster.sh # 执行工夫较长,急躁期待make: Entering directory `/home/workspace/src/k8s.io/kubernetes'make[1]: Entering directory `/home/workspace/src/k8s.io/kubernetes'make[1]: Leaving directory `/home/workspace/src/k8s.io/kubernetes'make[1]: Entering directory `/home/workspace/src/k8s.io/kubernetes'+++ [0818 08:46:21] Building go targets for linux/amd64: ./vendor/k8s.io/code-generator/cmd/prerelease-lifecycle-gen+++ [0818 08:46:29] Building go targets for linux/amd64: ./vendor/k8s.io/code-generator/cmd/deepcopy-gen+++ [0818 08:46:49] Building go targets for linux/amd64: ./vendor/k8s.io/code-generator/cmd/defaulter-gen+++ [0818 08:47:10] Building go targets for linux/amd64: ./vendor/k8s.io/code-generator/cmd/conversion-gen+++ [0818 08:48:04] Building go targets for linux/amd64: ./vendor/k8s.io/kube-openapi/cmd/openapi-gen+++ [0818 08:48:35] Building go targets for linux/amd64: ./vendor/github.com/go-bindata/go-bindata/go-bindatamake[1]: Leaving directory `/home/workspace/src/k8s.io/kubernetes'+++ [0818 08:48:38] Building go targets for linux/amd64: cmd/kubectl cmd/kube-apiserver cmd/kube-controller-manager cmd/cloud-controller-manager cmd/kubelet cmd/kube-proxy cmd/kube-schedulermake: Leaving directory `/home/workspace/src/k8s.io/kubernetes'Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?Kubelet cgroup driver defaulted to use:/home/workspace/src/k8s.io/kubernetes/third_party/etcd:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/go/bin:/home/workspace/bin:/root/binetcd version 3.4.13 or greater required.You can use 'hack/install-etcd.sh' to install a copy in third_party/.解决上述问题$ ./hack/install-etcd.sh # 执行工夫较长,急躁期待Downloading https://github.com/coreos/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz succeedetcd v3.4.13 installed. To use:export PATH="/home/workspace/src/k8s.io/kubernetes/third_party/etcd:${PATH}"# 如果在内网环境无奈下载上述包能够通过手动编译并建设软连贯解决$ go env -w GOPROXY=https://goproxy.cn,direct$ cd $GOPATH/src/k8s.io/etcd$ go mod vendor$ make$ cp bin/etcd $GOPATH/src/k8s.io/kubernetes/third_party/etcd-v3.4.13-linux-amd64$ ln -fns etcd-v3.4.13-linux-amd64 etcd# 再次执行上面脚本$ ./hack/local-up-cluster.sh -O # 前提确保docker服务失常, 其中-O参数示意间接运行上次编译后的kubernetes相干组件,不再编译,如果能够胜利启动则示意单机集群启动胜利skipped the build. WARNING: You're not using the default seccomp profileWARNING: bridge-nf-call-iptables is disabledWARNING: bridge-nf-call-ip6tables is disabledKubelet cgroup driver defaulted to use: systemd/home/workspace/src/k8s.io/kubernetes/third_party/etcd:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/go/bin:/home/workspace/bin:/root/binAPI SERVER secure port is free, proceeding...Detected host and ready to start services. Doing some housekeeping first...Using GO_OUT /home/workspace/src/k8s.io/kubernetes/_output/binStarting services now!Starting etcdetcd --advertise-client-urls http://127.0.0.1:2379 --data-dir /tmp/tmp.oUDPwStJvj --listen-client-urls http://127.0.0.1:2379 --log-level=debug > "/tmp/etcd.log" 2>/dev/nullWaiting for etcd to come up.+++ [0818 09:28:25] On try 2, etcd: : {"health":"true"}{"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"2","raft_term":"2"}}Generating a 2048 bit RSA private key..........................................+++........+++writing new private key to '/var/run/kubernetes/server-ca.key'-----Generating a 2048 bit RSA private key.....................+++..............................+++writing new private key to '/var/run/kubernetes/client-ca.key'-----Generating a 2048 bit RSA private key......................+++...........+++writing new private key to '/var/run/kubernetes/request-header-ca.key'-----2021/08/18 09:28:26 [INFO] generate received request2021/08/18 09:28:26 [INFO] received CSR2021/08/18 09:28:26 [INFO] generating key: rsa-20482021/08/18 09:28:26 [INFO] encoded CSR2021/08/18 09:28:26 [INFO] signed certificate with serial number 1944668198545486959178087658848077051979668935142021/08/18 09:28:26 [INFO] generate received request2021/08/18 09:28:26 [INFO] received CSR2021/08/18 09:28:26 [INFO] generating key: rsa-20482021/08/18 09:28:26 [INFO] encoded CSR2021/08/18 09:28:26 [INFO] signed certificate with serial number 2603362207932002728319812248475921959601264396352021/08/18 09:28:26 [INFO] generate received request2021/08/18 09:28:26 [INFO] received CSR2021/08/18 09:28:26 [INFO] generating key: rsa-20482021/08/18 09:28:27 [INFO] encoded CSR2021/08/18 09:28:27 [INFO] signed certificate with serial number 650897408210385411292065578082634437400044055792021/08/18 09:28:27 [INFO] generate received request2021/08/18 09:28:27 [INFO] received CSR2021/08/18 09:28:27 [INFO] generating key: rsa-20482021/08/18 09:28:27 [INFO] encoded CSR2021/08/18 09:28:27 [INFO] signed certificate with serial number 1328546049532766555281109603247667662361210220032021/08/18 09:28:27 [INFO] generate received request2021/08/18 09:28:27 [INFO] received CSR2021/08/18 09:28:27 [INFO] generating key: rsa-20482021/08/18 09:28:28 [INFO] encoded CSR2021/08/18 09:28:28 [INFO] signed certificate with serial number 5098373112824191733942807363773879646092935887592021/08/18 09:28:28 [INFO] generate received request2021/08/18 09:28:28 [INFO] received CSR2021/08/18 09:28:28 [INFO] generating key: rsa-20482021/08/18 09:28:29 [INFO] encoded CSR2021/08/18 09:28:29 [INFO] signed certificate with serial number 3153609466862973249791119885899873309893610143872021/08/18 09:28:29 [INFO] generate received request2021/08/18 09:28:29 [INFO] received CSR2021/08/18 09:28:29 [INFO] generating key: rsa-20482021/08/18 09:28:29 [INFO] encoded CSR2021/08/18 09:28:29 [INFO] signed certificate with serial number 1009537356452097450336378717730674703064826136382021/08/18 09:28:29 [INFO] generate received request2021/08/18 09:28:29 [INFO] received CSR2021/08/18 09:28:29 [INFO] generating key: rsa-20482021/08/18 09:28:30 [INFO] encoded CSR2021/08/18 09:28:30 [INFO] signed certificate with serial number 719845605910186326782888521350059363008185160184Waiting for apiserver to come up+++ [0818 09:28:40] On try 7, apiserver: : okclusterrolebinding.rbac.authorization.k8s.io/kube-apiserver-kubelet-admin createdclusterrolebinding.rbac.authorization.k8s.io/kubelet-csr createdCluster "local-up-cluster" set.use 'kubectl --kubeconfig=/var/run/kubernetes/admin-kube-aggregator.kubeconfig' to use the aggregated API serverservice/kube-dns createdserviceaccount/kube-dns createdconfigmap/kube-dns createddeployment.apps/kube-dns createdKube-dns addon successfully deployed.WARNING : The kubelet is configured to not fail even if swap is enabled; production deployments should disable swap.2021/08/18 09:28:43 [INFO] generate received request2021/08/18 09:28:43 [INFO] received CSR2021/08/18 09:28:43 [INFO] generating key: rsa-20482021/08/18 09:28:44 [INFO] encoded CSR2021/08/18 09:28:44 [INFO] signed certificate with serial number 185139553486611438539303446897387693685807865483kubelet ( 120208 ) is running.wait kubelet readyNo resources foundNo resources foundNo resources foundNo resources foundNo resources foundNo resources foundNo resources found127.0.0.1 NotReady <none> 2s v1.20.12021/08/18 09:29:02 [INFO] generate received request2021/08/18 09:29:02 [INFO] received CSR2021/08/18 09:29:02 [INFO] generating key: rsa-20482021/08/18 09:29:02 [INFO] encoded CSR2021/08/18 09:29:02 [INFO] signed certificate with serial number 88607895468152274682757139244368051799851531300Create default storage class forstorageclass.storage.k8s.io/standard createdLocal Kubernetes cluster is running. Press Ctrl-C to shut it down.Logs: /tmp/kube-apiserver.log /tmp/kube-controller-manager.log /tmp/kube-proxy.log /tmp/kube-scheduler.log /tmp/kubelet.logTo start using your cluster, you can open up another terminal/tab and run: export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig cluster/kubectl.shAlternatively, you can write to the default kubeconfig: export KUBERNETES_PROVIDER=local cluster/kubectl.sh config set-cluster local --server=https://localhost:6443 --certificate-authority=/var/run/kubernetes/server-ca.crt cluster/kubectl.sh config set-credentials myself --client-key=/var/run/kubernetes/client-admin.key --client-certificate=/var/run/kubernetes/client-admin.crt cluster/kubectl.sh config set-context local --cluster=local --user=myself cluster/kubectl.sh config use-context local cluster/kubectl.sh查看Kubernetes各组件启动参数及PID$ ps -ef|grep kube|grep -v grep能够看到挪动7个过程,别离如下:root 119660 119248 10 09:28 pts/4 00:00:50 /home/workspace/src/k8s.io/kubernetes/_output/bin/kube-apiserver --authorization-mode=Node,RBAC --cloud-provider= --cloud-config= --v=3 --vmodule= --audit-policy-file=/tmp/kube-audit-policy-file --audit-log-path=/tmp/kube-apiserver-audit.log --authorization-webhook-config-file= --authentication-token-webhook-config-file= --cert-dir=/var/run/kubernetes --client-ca-file=/var/run/kubernetes/client-ca.crt --kubelet-client-certificate=/var/run/kubernetes/client-kube-apiserver.crt --kubelet-client-key=/var/run/kubernetes/client-kube-apiserver.key --service-account-key-file=/tmp/kube-serviceaccount.key --service-account-lookup=true --service-account-issuer=https://kubernetes.default.svc --service-account-signing-key-file=/tmp/kube-serviceaccount.key --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,Priority,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota --disable-admission-plugins= --admission-control-config-file= --bind-address=0.0.0.0 --secure-port=6443 --tls-cert-file=/var/run/kubernetes/serving-kube-apiserver.crt --tls-private-key-file=/var/run/kubernetes/serving-kube-apiserver.key --storage-backend=etcd3 --storage-media-type=application/vnd.kubernetes.protobuf --etcd-servers=http://127.0.0.1:2379 --service-cluster-ip-range=10.0.0.0/24 --feature-gates=AllAlpha=false --external-hostname=localhost --requestheader-username-headers=X-Remote-User --requestheader-group-headers=X-Remote-Group --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-client-ca-file=/var/run/kubernetes/request-header-ca.crt --requestheader-allowed-names=system:auth-proxy --proxy-client-cert-file=/var/run/kubernetes/client-auth-proxy.crt --proxy-client-key-file=/var/run/kubernetes/client-auth-proxy.key --cors-allowed-origins=/127.0.0.1(:[0-9]+)?$,/localhost(:[0-9]+)?$root 120034 119248 3 09:28 pts/4 00:00:16 /home/workspace/src/k8s.io/kubernetes/_output/bin/kube-controller-manager --v=3 --vmodule= --service-account-private-key-file=/tmp/kube-serviceaccount.key --service-cluster-ip-range=10.0.0.0/24 --root-ca-file=/var/run/kubernetes/server-ca.crt --cluster-signing-cert-file=/var/run/kubernetes/client-ca.crt --cluster-signing-key-file=/var/run/kubernetes/client-ca.key --enable-hostpath-provisioner=false --pvclaimbinder-sync-period=15s --feature-gates=AllAlpha=false --cloud-provider= --cloud-config= --kubeconfig /var/run/kubernetes/controller.kubeconfig --use-service-account-credentials --controllers=* --leader-elect=false --cert-dir=/var/run/kubernetes --master=https://localhost:6443root 120036 119248 1 09:28 pts/4 00:00:05 /home/workspace/src/k8s.io/kubernetes/_output/bin/kube-scheduler --v=3 --config=/tmp/kube-scheduler.yaml --feature-gates=AllAlpha=false --master=https://localhost:6443root 120208 119248 0 09:28 pts/4 00:00:00 sudo -E /home/workspace/src/k8s.io/kubernetes/_output/bin/kubelet --v=3 --vmodule= --chaos-chance=0.0 --container-runtime=docker --hostname-override=127.0.0.1 --cloud-provider= --cloud-config= --bootstrap-kubeconfig=/var/run/kubernetes/kubelet.kubeconfig --kubeconfig=/var/run/kubernetes/kubelet-rotated.kubeconfig --config=/tmp/kubelet.yamlroot 120211 120208 3 09:28 pts/4 00:00:15 /home/workspace/src/k8s.io/kubernetes/_output/bin/kubelet --v=3 --vmodule= --chaos-chance=0.0 --container-runtime=docker --hostname-override=127.0.0.1 --cloud-provider= --cloud-config= --bootstrap-kubeconfig=/var/run/kubernetes/kubelet.kubeconfig --kubeconfig=/var/run/kubernetes/kubelet-rotated.kubeconfig --config=/tmp/kubelet.yamlroot 120957 119248 0 09:29 pts/4 00:00:00 sudo /home/workspace/src/k8s.io/kubernetes/_output/bin/kube-proxy --v=3 --config=/tmp/kube-proxy.yaml --master=https://localhost:6443root 120980 120957 0 09:29 pts/4 00:00:00 /home/workspace/src/k8s.io/kubernetes/_output/bin/kube-proxy --v=3 --config=/tmp/kube-proxy.yaml --master=https://localhost:6443配置近程调试我这里应用的近程共享文件工具是samba,Samba的配置这里就不赘述了,能够在网上找到一大堆 ...

August 23, 2021 · 5 min · jiezi

关于kubernetes:Kubernetes-入门到进阶实战

download:Kubernetes 入门到进阶实战Kubernetes本文内容仅为集体理解,如有偏颇,欢迎斧正。 一、传统的运维形式在了解Kubernetes之前,咱们有必要先简略了解一下传统的运维模式。在传统的我的项目架构中(单体or微服务),咱们一般将我的项目打包为war或fatJar的形式进行部署。 在部署时,需要人工创建相应的服务器及资源,并搭建我的项目运行的依赖环境,预估服务需要占用的内存与CPU,共事还要考虑到高可用的部署环境,在不同配置的服务器上部署相应的服务。当服务意外崩溃或者服务器意外宕机时,需要人工处理。总结一下传统部署的不足如下: 依赖服务器环境,需要各服务器资源对立。无奈充分利用服务器等资源,使用率一般仅能达到70%。无奈或很难做到容灾复原。需要人工进行服务扩容,修改服务配置。服务资源散乱(域名,服务器,负载,数据库),无奈做集中管理。工夫消耗较多,减少运维成本。需要借助第三方工具进行资源监控,较为麻烦。需要对开发、测试、生产环境进行区别治理。要想解决以上的问题是相比照较麻烦的,特地是现在的我的项目多为微服务我的项目,少则几十,多则上百,极大的减少了运维的难度和成本。 一、Kubernetes是什么?官网文档中描述为:v Kubernetes一个用于容器集群的自动化部署、扩容以及运维的开源平台。通过Kubernetes,你可能疾速无效地响应用户需要;疾速而有预期地部署你的利用;极速地扩大你的利用;无缝对接新利用功能;俭约资源,优化硬件资源的使用。为容器编排治理提供了完整的开源打算。 介绍一下其中提到的几个词: 容器咱们现在常说的容器一般是指Docker容器,通过容器隔离的个性和宿主机进行解耦,使咱们的服务不需要依赖于宿主机而运行,与宿主机互不影响,Docker容器十分轻量。而kubernetes则负责治理服务中所有的Docker容器,创建、运行、重启与删除容器。疾速响应集体理解为两个方面。一、新增或者修改需要时,可能疾速进行部署测试(CICD);二、kubernetes可能根据不同条件进行动静扩缩容,举个栗子,用户访问量突然由1000人回升到100000人时,现有的服务已经无奈撑持,kubernetes会主动将用户服务模块减少更多实例以保障以后的零碎访问量。扩大在疾速响应的个性中已经有所提及,这里再补充一点: Kubernetes外部有欠缺的注册发现机制,当某个服务的实例减少时,kubernetes会主动将其加入服务列表中,罢黜在传统运维中需要人工保护服务列表的问题。对接新利用kubernetes是一个通用的容器编排框架,反对不同类型的语言,或者是语言无关的,新减少的利用都会以一个新的对象进行接入。硬件资源这一点我感觉是kubernetess很基本然而非常重要的一个长处了,kubernetes在部署利用时会主动查看各个服务器的cpu与内存使用量,同时会根据服务申请的cpu与内存资源,将服务部署到最合适的服务器。(其实这就是容器调度的核心功能了)小学问: 因kubernetes名字过长,一般简称为k8s,因为k与s之间有8个字母,故而称之。 二、Kubernetes解决了什么问题?上面以几个case进行阐述,便于理解。 服务器环境kubernetes是使用Docker进行容器治理的,所以天生具备Docker的所有个性,只需要使用相应环境的Docker镜像就可能运行服务,还需要关心宿主机是redhat、centos还是ubuntu,只需在宿主机上安装Docker环境即可,相比传统运维,缩小了各种依赖环境的冲突,升高运维成本,也便利整体服务的迁徙。 服务器资源管理对于kubernetes来说,是不关心有几台服务器的,每个服务器都是一个资源对象(Node),kubernetes关心的是这个Node上有几可用的cpu和内存。例如现在有两台服务器 server01 (4c16g), 已用(2c7.5G)server02 (4c16g), 已用(3c13G)现在有一个服务ServiceA需要部署,ServiceA申明自己运行需要至多3G内存,这时kubernetes会根据调度策略将其部署到server01上,很显著server01的资源是更加短缺的。实际上kubernetes的调度策略要简单的多,kubernetes会监控整体服务器资源的状态进行调度,而以前的运维形式只能由人工判断资源使用。这里只做简略示例。 各个服务器节点的状态 总体集群的资源状态 服务容灾复原说简略点,就是服务挂了之后,能够主动复原。例如现在有一个ServiceA,运行在server01上,kubernetes会通过外部的kubelet组件监控ServiceA服务过程的状态,一旦发现过程丢失(服务本身挂掉或者整个server01的服务器挂掉),就会尝试换一台资源短缺的服务器重新部署ServiceA并启动,这样就可能确保咱们的服务一直是可用状态,而不需要人工保护。 硬件资源利用后面已经说过,kubernetes会根据节点(Node)的CPU与内存资源的可用量对服务进行部署调度,在调度策略中,可能配置不同的调度策略。例如现在有两台服务器: server01 (4c16g), 已用(3c7.5G)server02 (4c16g), 已用(1c13G)需要部署两个服务 serviceA-Java, 申请2G内存,0.5CPU单位ServiceB-Nginx, 申请200M内存,申请1CPU单位这里kubernetes如果讲道理的话,会将ServiceA-Java部署到server01,将serviceB-Nginx部署到server02。这里server01的内存和server02的CPU资源都失去了充分的利用。通过集体实践,相比之前的部署形式,kubernetes俭约了很多资源,资源利用是非常高效的。 服务资源创建kubernetes创建服务是非常便利的,分为以下两个方面: 自有服务在kubernetes中,进行我的项目服务部署是十分便利的,只需要构建好相应的镜像,编写一个yaml文件即可实现服务的部署。yaml示例 apiVersion: apps/v1beta1kind: Deploymentmetadata: # 部署的模块名称 name: phantom-server-admin # 需要部署哪个环境 namespace: developspec: # 部署的实例数量 replicas: 1 template: metadata: labels: # 给这个部署打个标签,便利之后进行抉择 app: phantom-server-adminspec: containers: # 服务的名称 - name: phantom-server-admin # 服务的镜像 image: phantom-server-admin:v1 ports: # 服务的端口 - containerPort: 7006 resources: limits: # 该服务需要的内存 memory: 1000Mi

August 23, 2021 · 1 min · jiezi

关于kubernetes:产品如何做Kubernetes一致性认证

Certified Kubernetes是CNCF基金会在2018年推出的Kubernetes一致性认证打算。它由CNCF基金会提供的一套诊断测试工具(Sonobuoy)并运行在Kubernetes中。各云厂商如果须要将本人产品纳入到Certified Kubernetes当中,就须要依照操作领导进行本身测试,并将测试后果上传给CNCF社区,当报告审核通过,交付肯定的费用(CNCF Members收费)后,就会失去CNCF基金会给企业颁发一个Certified Kubernetes的认证。也就是说失去认证后企业就能在本人的产品宣传上应用CNCF基金会的Certified Kubernetes商标和在产品中应用带Kubernetes字样的名称。Certified Kubernetes Logo大略长这个样子。 Certified Kubernetes益处一致性 只有取得了一致性认证,用户在对任何Kubernetes厂商发行版进行装置或交互时,失去的和原生Kuberentes性能简直统一的体验 及时更新 为了放弃认证,CNCF基金会要求厂商须要每年或更频繁地提供对最版本的Kubernetes反对。通常状况下来说,厂商提交的产品适配的版本,为官网最新的主要发型版本(x.y)以及最近的两个发行版(x.y-1 和 x.y-2) 例子。在Kubernetes v1.23公布后,新的合格产品最后能够针对Kubernetes v1.23、v1.22或v1.21进行自我认证,但不能针对v1.20再进行测试。 理解Kubernetes的同学都晓得,K8S简直每年会以3-4个大版本进行迭代,这样就等于让各大厂商必须跟这个K8S的迭代进行适配。也侧面上增强了社区对于各大厂商的管制可确认性 任何终端用户都能够通过运行用于认证的雷同的开源一致性应用程序(Sonobuoy)来确认他们的发行版或平台依然符合要求,免得用户被厂商锁定。 SonobuoySonobuoy 是一个诊断工具,通过它咱们能够拜访且以非破坏性的形式运行一组插件(其中包含Kubernetes一致性认证的测试)使咱们更轻松地理解 Kubernetes 集群的状态。同时Sonobuoy 也是一种可定制、可扩大和黑盒的形式生成无关Kubernetes集群的相干报告工具。 咱们能够用Sonobuoy来对Kubernetes内的资源做如下用例测试: 集成的端到端 (e2e) 一致性测试工作负载调试扩大插件来采集自定义数据环境筹备在应用Sonobuoy之前咱们须要筹备好如下环境: 一个能够失常拜访的Kubernetes集群领有被测试Kubernetes集群的ADMIN权限,以及它的kubeconfig文件kubectl命令(某些告警场景会用,Certified Kubernetes不须要)sonobuoy的docker镜像本地的私有化镜像仓库(强烈建议要有!!!)装置在下述链接中下载最新版本的Sonobuoy二进制文件,将它解压后,并把可执行文件sonobuoy门路增加到零碎的PATH环境变量下即可。 https://github.com/vmware-tan... 运行测试规范的一致性测试集目前是由 kubernetes e2e套件中的 [Conformance] 标签定义的。所以咱们须要应用如下命令进行部署。 $ sonobuoy run --mode=certified-conformanceINFO[0000] created object name=sonobuoy namespace= resource=namespacesINFO[0000] created object name=sonobuoy-serviceaccount namespace=sonobuoy resource=serviceaccountsINFO[0001] created object name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterrolebindingsINFO[0001] created object name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterrolesINFO[0001] created object name=sonobuoy-config-cm namespace=sonobuoy resource=configmapsINFO[0001] created object name=sonobuoy-plugins-cm namespace=sonobuoy resource=configmapsINFO[0001] created object name=sonobuoy namespace=sonobuoy resource=podsINFO[0001] created object name=plugin-e2e-cm namespace=sonobuoy resource=configmapsINFO[0001] created object name=sonobuoy-aggregator namespace=sonobuoy resource=services当sonobuoy容器失常运后,它就会开始创立e2e容器和systemd-log容器开始进行相干的测试和日志收集。 ...

August 19, 2021 · 3 min · jiezi

关于kubernetes:KubeDL-加入-CNCF-Sandbox加速-AI-产业云原生化

简介: 2021 年 6 月 23 日,云原生计算基金会(CNCF)发表通过寰球 TOC 投票接收 KubeDL 成为 CNCF Sandbox 我的项目。KubeDL 是阿里开源的基于 Kubernetes 的 AI 工作负载治理框架,取自"Kubernetes-Deep-Learning"的缩写,心愿可能依靠阿里巴巴的场景,将大规模机器学习作业调度与治理的教训反哺社区。 作者 | KubeDL 团队 2021 年 6 月 23 日,云原生计算基金会(CNCF)发表通过寰球 TOC 投票接收 KubeDL 成为 CNCF Sandbox 我的项目。KubeDL 是阿里开源的基于 Kubernetes 的 AI 工作负载治理框架,取自"Kubernetes-Deep-Learning"的缩写,心愿可能依靠阿里巴巴的场景,将大规模机器学习作业调度与治理的教训反哺社区。 我的项目地址:http://kubedl.io 我的项目介绍随着 TensorFlow, PyTorch,XGBoost 等支流 AI 框架的一直成熟,和以 GPU/TPU 为代表的多种AI异构计算芯片的井喷式涌现,人工智能正疾速进入“大规模工业化”落地的阶段。从算法工程师着手设计第一层神经网络构造,到最终上线服务于实在的利用场景,除 AI 算法的研发外还须要大量基础架构层面的零碎反对,包含数据收集和清理、分布式训练引擎、资源调度与编排、模型治理,推理服务调优,可观测等。如以下经典图例所展现,泛滥零碎组件的协同组成了残缺的机器学习流水线。 与此同时,以 Kubernetes 为代表的云原生技术蓬勃发展,通过优良的形象和弱小的可扩展性,将应用层与 IaaS(Infrastructure as a Service)层的基础设施完满解耦:利用可能以“云”的范式按需应用资源,无需关注底层基础设施的复杂性,从而解放生产力并专一于本身畛域的翻新。 Kubernetes 的呈现解决了云资源如何高效交付的问题,但对于 AI 这类自身具备高度复杂性的工作负载还无奈做到很好地原生反对,如何整合各类框架的差别并保留其通用性,同时围绕 AI 工作负载的运行时去建设一系列欠缺的周边生态及工具,业界还在一直摸索与尝试。在实践中,咱们发现了 AI 负载运行在 Kubernetes 生态中面临着如下挑战: ...

August 18, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes-Traefik集成Pilot

背景:根底环境:centos8+kubeadm1.20.5+cilium+hubble环境搭建,Kubernetes 1.20.5 装置traefik在腾讯云下的实际。当然了两头有一次事变。跳过了1.20.5降级1.21了。从新初始化了kubeadm搭建了v1.21.3的版本。偶尔看到阳明大佬的文章:Traefik 公布控制面板 SaaS 服务 Pilot就想体验一下自定义的中间件!当然了本人当初还不会写这些插件。就先拿一个demo练练手吧! Kubernetes traefik集成Pilot注册账号:偷懒了间接抉择了github形式登陆 创立实例当然了实例的名字能够自定义指向Instance的箭头的实例是零碎主动生成的实例名称,当然了还是能够批改的! traefik配置文件减少pilot配置复制yaml配置增加到 traefik-config.yaml文件中(当然了也能够间接批改traefik-config configmap),集体习惯这样的形式去操作失常的步骤就是删除一下traefik的pod而后重新启动一下就能够了。能够一个一个删除pods等容器启动起来。而后再pilot页面就能够看到利用注册过去了!然而这里因为我部署的traefik image版本为2.4.9版本。容器启动后pod注册后呈现黄色不平安的标记通过提醒查问到https://github.com/traefik/traefik/security/advisories/GHSA-m697-4v8f-55qg页面。让我降级到2.4.13版本 故:批改traefik-deploy.yaml或者间接批改daemonsets中镜像标签: kubectl edit daemonsets -n traefik 验证pilot中pod注册胜利查看pilot页面:期待pod重启结束能够看到pilot页面七个pod都注册胜利了 pilot中其余设置增加Alerting邮件报警测试一下查看一下测试邮件: 当然了也能够搞一下webhook测试一下 查看Metrics很不敌对不能实时,也不能抉择时间段。看下我早些时候做的一个另外一个吧!根本就是上面这样的 其它plugins商店还是比拟空,布局也很乱同一个利用不同版本同时呈现看着就很不爽......其余的就当前体验吧!心愿能有更多好玩的插件呢!

August 17, 2021 · 1 min · jiezi

关于kubernetes:ChaosBlade从混沌工程实验工具到混沌工程平台

简介: ChaosBlade 是阿里巴巴 2019 年开源的混沌工程项目,已退出到 CNCF Sandbox 中。起初蕴含面向多环境、多语言的混沌工程试验工具 chaosblade,到当初倒退到面向多集群、多环境、多语言的混沌工程平台 chaosblade-box,平台反对试验工具托管和工具自动化部署,通过对立用户试验界面,将用户的精力聚焦在通过混沌工程解决云原生过程中高可用问题上。本文从混沌试验模型形象、混沌试验工具开源和混沌工程平台降级我的项目三阶段登程,具体介绍 ChaosBlade。 作者 | 肖长军(穹谷) 桑杰 ChaosBlade 是阿里巴巴 2019 年开源的混沌工程项目,已退出到 CNCF Sandbox 中。起初蕴含面向多环境、多语言的混沌工程试验工具 chaosblade,到当初倒退到面向多集群、多环境、多语言的混沌工程平台 chaosblade-box,平台反对试验工具托管和工具自动化部署,通过对立用户试验界面,将用户的精力聚焦在通过混沌工程解决云原生过程中高可用问题上。本文从混沌试验模型形象、混沌试验工具开源和混沌工程平台降级我的项目三阶段登程,具体介绍 ChaosBlade。 在往年可信云测评中,阿里云故障演练平台以最高分首批通过可信云混沌工程平台能力要求最高等级-先进级认证。 混沌试验模型ChaosBlade 我的项目笼罩根底资源、应用服务、容器服务等混沌试验场景。在试验工具设计之初就思考了场景模型对立,便于场景扩大和积淀,也为平台托管试验工具实现对立场景调用提供模型根据。ChaosBlade 我的项目中所有的试验场景均遵循此试验模型设计,上面通过试验模型的推导、介绍、意义和具体的利用来具体介绍此模型。 1、试验模型的推导混沌试验次要蕴含故障模拟,咱们个别对故障的形容如下: 10.0.0.1 机器上挂载的 A 磁盘满造成了服务不可用; 所有节点上的 B dubbo 服务因为执行迟缓造成上游 A dubbo 服务调用提早,从而造成用户拜访迟缓; Kubernetes A 集群中 B 节点上 CPU 所有核使用率满载,造成 A 集群中的 Pod 调度异样; Kubernetes C 集群中 D Pod 网络异样,造成 D 相干的 Service 拜访异样。 通过上述,咱们能够应用以下句式来形容故障:因为某某机器(或集群中的资源,如 Node,Pod)上的哪个组件产生了什么故障,从而造成了相干影响。咱们也能够通过下图来看故障形容拆分: 能够通过这四局部来形容现有的故障场景,所有咱们形象出了一个故障场景模型,也称为混沌试验模型。 2、试验模型的介绍此试验模型详细描述如下: Scope: 试验施行范畴,指具体实施试验的机器、集群及其资源等。 ...

August 16, 2021 · 2 min · jiezi

关于kubernetes:K8S学习笔记06-RBAC-Ingress

集群平安机制apiserver对立协调:认证 > 鉴权(受权)> 准入管制 认证传输平安: 对外不裸露8080端口,只能外部拜访,对外应用的端口6443客户端身份认证罕用形式 https证书认证,基于ca证书http token认证,通过token来辨认用户http根本认证,用户名 + 明码认证鉴权:RBACRBAC:基于角色的访问控制,某个角色设置拜访内容,而后用户调配该角色后,就领有该角色的拜访权限 角色Role:特定命名空间拜访权限ClusterRole:所有命名空间的拜访权限角色绑定roleBinding:角色绑定到主体ClusterRoleBinding:集群角色绑定到主体主体user:用户group:用户组serviceAccount:服务账号测试1.创立命名空间 kubectl create ns roledemo2.在命名空间下创立一个Pod kubectl run nginx --image=nginx -n roledemo3.创立角色tip:这个角色只对pod 有 get、list权限 # 创立kubectl apply -f rbac-role.yaml# 查看kubectl get role -n roledemo4.角色绑定用户 # 创立角色绑定kubectl apply -f rbac-rolebinding.yaml# 查看角色绑定kubectl get role, rolebinding -n roledemo5.应用证书辨认身份这里蕴含了很多证书文件,在TSL目录下,须要复制过去通过上面命令执行咱们的脚本 ./rbac-user.sh测试 # 切换命名空间看输入后果区别kubectl get pods -n roledemo --kubeconfig=./mary-kubeconfig 准入管制就是准入控制器的列表,对api-server的申请进行过滤:如果列表有申请的内容就通过,没有的话 就回绝 Ingress前言原来咱们须要将端口号对外裸露,通过 ip + 端口号就能够进行拜访 原来是应用Service中的NodePort来实现 在每个节点上都会启动端口在拜访的时候通过任何节点,通过ip + 端口号就能实现拜访然而NodePort还存在一些缺点 因为端口不能反复,所以每个端口只能应用一次,一个端口对应一个利用理论拜访中都是用域名,依据不同域名跳转到不同端口服务中 Ingress和Pod关系Pod 和 Ingress 是通过Service进行关联的,而Ingress作为对立入口,由Service关联一组Pod中 首先service就是关联咱们的pod而后ingress作为入口,首先须要到service,而后发现一组pod发现pod后,就能够做负载平衡等操作Ingress工作流程不同域名对应不同的Service,而后service治理不同的pod 须要留神,ingress不是内置的组件,须要咱们独自的装置 ...

August 15, 2021 · 3 min · jiezi

关于kubernetes:K8S学习笔记05-配置管理SecretConfigMap

SecretSecret的次要作用就是加密数据,而后存在etcd外面,让Pod容器以挂载Volume形式进行拜访场景:用户名 和 明码进行加密 个别场景的是对某个字符串进行base64编码 进行加密 echo -n 'admin' | base64echo -n 'admin123' | base64变量模式挂载到Pod1.创立secret加密数据 secret.yamlapiVersion: v1kind: Secretmetadata: name: mysecrettype: Opaquedata: username: YWRtaW4= password: YWRtaW4xMjM=创立secret kubectl create -f secret.yaml查看secret kubectl get secretNAME TYPE DATA AGEmysecret Opaque 2 18s2.以变量模式挂载到pod容器中创立yaml文件 secret-val.yaml apiVersion: v1kind: Podmetadata: name: mypodspec: containers: - name: nginx image: nginx env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password执行 kubectl apply -f secret-val.yaml查看容器中有没有变量 ...

August 15, 2021 · 2 min · jiezi

关于kubernetes:K8S学习笔记03-ControllerServiceDaemonJobCronJobRCRS

Controller什么是ControllerController是在集群上治理和运行容器的对象 Pod和Controller的关系Pod是通过Controller实现利用的运维,比方弹性伸缩,滚动降级等 Pod 和 Controller之间是通过label标签来建设关系,同时Controller又被称为控制器工作负载 Deployment控制器利用Deployment利用场景部署无状态利用治理Pod和ReplicaSet部署,滚动降级等利用场景:web服务,微服务Deployment示意用户对K8S集群的一次更新操作。Deployment是一个比RS( Replica Set, RS) 利用模型更广的 API 对象,能够是创立一个新的服务,更新一个新的服务,也能够是滚动降级一个服务。滚动降级一个服务,理论是创立一个新的RS,而后逐步将新 RS 中正本数减少到现实状态,将旧RS中的正本数缩小到0的复合操作。 这样一个复合操作用一个RS是不好形容的,所以用一个更通用的Deployment来形容。以K8S的倒退方向,将来对所有长期伺服型的业务的治理,都会通过Deployment来治理。 Deployment部署无状态利用kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml咱们看到的 selector 和 label 就是咱们Pod 和 Controller之间建设关系的桥梁 部署利用 kubectl apply -f web.yaml对外裸露端口 kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml--port:外部的端口号,用于集群外部拜访--target-port:容器向外裸露的端口号--name:名称--type:类型重新部署 kubectl apply -f web.yamlkubectl get pods,svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/web1 NodePort 10.102.100.115 <none> 80:30222/TCP 59s测试拜访 curl http://119.45.29.8:30222/利用降级回滚1.先装置nginx1.14版本 vim web.yaml#指定nginx1.14- image: nginx:1.14#重新部署kubectl apply -f web.yaml#查看部署状态kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESweb-66bf4959f5-lgxmr 1/1 Running 0 83s 10.244.2.10 k8s-node2 <none> <none>#到指定节点(k8s-node2)查看镜像版本docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx 1.14 295c7be07902 2 years ago 109MB2.降级nginx1.15 ...

August 15, 2021 · 2 min · jiezi

关于kubernetes:K8S学习笔记03-YAML和POD

YAML文件K8S集群中,通过YAML(资源清单文件)来对资源管理和资源对象编排部署概述YAML仍是一种标记语言。YAML是一个可读性高,用来表白数据序列的格局。根本语法应用空格缩进空格数不重要,只有雷同层级元素左侧对齐即可低版本缩进不容许应用Tab,只容许空格应用#标识正文,正文整行应用---标识新的yaml文件开始文件组成部分控制器定义 (开始 ~ template)被管制对象 (template ~ 完结):镜像、版本、端口等示例 属性阐明 属性名称介绍备注apiVersionAPI版本kubectl api-versionskind资源类型kubectl api-resourcesmetadata资源元数据 spec资源规格 replicas正本数量 selector标签选择器 templatePod模板 metadataPod元数据 specPod规格 containers容器配置 YAML编写kubectl create 生产yaml文件 kubectl create deployment web --image=nginx -o yaml --dry-run > web.yaml 应用kubectl get导出yaml文件 kubectl get deploy nginx -o=yaml --export > web2.yamlPOD基本概念Pod是k8s中可创立和治理的最小单元和资源对象模型Pod是由一个或多个容器组成的(根容器Pause + N个用户业务容器)一个Pod中的容器共享网络命名空间Pod是短暂存在的存在意义一个容器(Docker)一个过程,运行一个利用Pod是多过程设计,运行多个利用Pod是为了亲密性利用(交互,网络,频繁 调用)产生的实现机制共享网络:通过Pause容器,把其余业务容器退出到Pause容器里,让所有业务在同一个命名空间中,实现网络共享共享存储:应用Volume数据卷进行长久化存储示例 镜像拉取策略 imagePullPolicyapiVersion: v1kind:Podmetadata: name: mypodspec: containers: - name: nginx image: nginx:1.14 imagePullPolicy: Always # IfNotPresent:默认值,镜像在宿主机上不存在才拉取# Always:每次创立Pod都会从新拉取一次镜像# Never:Pod永远不会被动拉取这个镜像资源限度 resourcesrequest:示意调度所需的资源limits:示意最大所占用的资源apiVersion: v1kind:Podmetadata: name: mypodspec: containers: - name: db image: mysql env: - name: MYSQL_ROOT_PASSWORD value: "password" resouces: requests: memory: "64Mi" cpu: "250m" limits: memory: 128Mi" cpu: "500m" # 1核 = 1000m 重启机制 restartPolicyapiVersion: v1kind:Podmetadata: name: mypodspec: containers: - name: busybox image: busybox:1.28.4 args: - /bin/sh - -c - sleep 36000 restartPolicy: Never# Always:当容器终止退出后,总是重启容器,默认策略 【nginx等,须要一直提供服务】# OnFailure:当容器异样退出(退出状态码非0)时,才重启容器。# Never:当容器终止退出,从不重启容器 【批量工作】 健康检查存活查看(livenessProbe):如果查看失败,将杀死容器,依据Pod的restartPolicy操作就绪查看(readinessProbe):如果查看失败,K8S会把Pod从service endpoints中剔除 ...

August 14, 2021 · 2 min · jiezi

关于kubernetes:K8S学习笔记02-集群命令行工具kubectl

集群命令行工具kubectlkubectl [command] [Type] [NAME] [flags]command: 对资源的操作。如create,get,deacribe和deleteType: 指定资源类型(大小写敏感)NAME: 资源名称(大小写敏感)flags: 可选参数根底命令命令介绍create通过文件名或规范输出创立资源expose将一个资源公开为一个新的Servicerun在集群中运行一个特定的镜像set在对象上设置特定的性能get显示一个或多个资源explain文档参考资料edit应用默认的编辑器编辑一个资源delete通过文件名,规范输出,资源名称或标签来删除资源部署命令命令介绍rollout治理资源的公布rolling-update对给定的复制控制器滚动更新scale扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Jobautoscale创立一个主动抉择扩容或缩容并设置Pod数量集群治理命令命令介绍certificate批改证书资源cluster-info显示集群信息top显示资源(CPU/M)cordon标记节点不可调度uncordon标记节点可被调度drain驱赶节点上的利用,筹备下线保护taint批改节点taint标记故障和调试命令命令介绍describe显示特定资源或资源组的详细信息logs在一个Pod中打印一个容器日志,如果Pod只有一个容器,容器名称是可选的attach附加到一个运行的容器exec执行命令到容器port-forward转发一个或多个proxy运行一个proxy到Kubernetes API Servercp拷贝文件或目录到容器中auth查看受权其它命令命令介绍apply通过文件名或规范输出对资源利用配置patch应用补丁批改、更新资源的字段replace通过文件名或规范输出替换一个资源convert不同的API版本之间转换配置文件label更新资源上的标签annotate更新资源上的正文completion用于实现kubectl工具主动补全api-versions打印受反对的API版本config批改kubeconfig文件(用于拜访API,比方配置认证信息)help所有命令帮忙plugin运行一个命令行插件version打印客户端和服务版本信息

August 14, 2021 · 1 min · jiezi

关于kubernetes:深入剖析Kubenetes学习笔记01

容器,只是一种非凡的过程一个“容器”,实际上是一个由 Linux Namespace、Linux Cgroups 和 rootfs 三种技术构建进去的过程的隔离环境。虚拟机是在宿主机中装置并运行一个新的操作系统;Docker只是在宿主机创立过程时加上了Namespace参数Docker默认启用的Namespace:PID,UTS,network,user,mount,IPC,cgroup容器是一个单过程模型,在一个容器中不能同时运行两个不同的利用。单过程的意思不是只能运行一个过程,而是只有一个过程是docker可控的隔离与限度在Linux内核中,有很多资源和对象是不能Namespace化的,比方工夫。Linux Cgroups(Linux Control Group)是Linux内核中用来为过程设置资源限度的一个重要性能,次要作用是限度一个过程组可能应用的的资源下限,包含CPU、内存、磁盘、网络带宽等。Cgroups还能对过程进行优先级设置、审计,以及过程挂起复原。Cgroups以文件和门路的形式组织在/sys/fs/cgroup 门路下,上面的子目录如cpu、memory也叫子系统。深刻了解容器镜像Mount NamespaceMount Namespace批改的,是容器过程对文件系统“挂载点”的认知。Mount Namespace 跟其余 Namespace 的应用略有不同的中央:它对容器过程视图的扭转,肯定是随同着挂载操作(mount)能力失效。rootfs 根文件系统rootfs是挂载在容器根目录上、用来为容器过程提供隔离后执行环境的文件系统,也就是所谓的“容器镜像”。rootfs 只是一个操作系统所蕴含的文件、配置和目录,并不包含操作系统内核。同一台机器上的所有容器,都共享宿主机操作系统的内核。容器的 rootfs 由只读层,可读写层,Init 层组成UnionFS (Union File System) 联结文件系统Docker 在镜像的设计中,引入了层(layer)的概念。也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量 rootfs。Docker 镜像应用的 rootfs,往往由多个“层”组成。每一层都是 Ubuntu 操作系统文件与目录的一部分;而在应用镜像时,Docker 会把这些增量联结挂载在一个对立的挂载点上(等价于后面例子里的“/C”目录)Kubernetes的实质镜像和容器一组联结挂载在 /var/lib/docker/aufs/mnt 上的 rootfs,这一部分咱们称为“容器镜像”(Container Image),是容器的动态视图;一个由 Namespace+Cgroups 形成的隔离环境,这一部分咱们称为“容器运行时”(Container Runtime),是容器的动静视图。Kubernetes解决的问题在一个给定的集群上运行利用。路由网关、程度扩大、监控、备份、劫难复原等一系列运维能力。Kubernetes我的项目架构 管制节点(Master节点)kube-apiserver 负责API服务kube-scheduler 负责调度kube-controller-manager 负责容器编排整个集群的长久化数据,由kube-apiserver解决后保留在Etcd中计算节点(Node节点)kubelet 同容器运行时打交道(比方Docker我的项目)CRI(Container Runtime Interface):定义容器运行时外围参数的近程调用接口。CNI(Container Networking Interface):容器网络插件CSI(Container Storage Interface):容器存储插件Device Plugin:治理宿主物理设施的组件Kubenetes的设计思维从更宏观的角度,以对立的形式来定义工作之间的各种关系,并且为未来反对更多品种的关系留有余地。“申明式 API”。这种 API 对应的“编排对象”和“服务对象”,都是 Kubernetes 我的项目中的 API 对象(API Object)PodPod 是 Kubernetes 我的项目中最根底的一个对象。划分规定:须要十分频繁的交互和拜访,或间接通过本地文件进行信息替换的利用。Pod 里的容器共享同一个 Network Namespace、同一组数据卷ServiceService 服务的次要作用,就是作为 Pod 的代理入口(Portal),从而代替 Pod 对外裸露一个固定的网络地址。Service 后端真正代理的 Pod 的 IP 地址、端口等信息的自动更新、保护,则是 Kubernetes 我的项目的职责。其余Secret:保留在etcd里的键值对数据,Web利用Pod启动时挂载到容器里,通过Secret拜访数据库。Job:一次性运行的 Pod(比方,大数据工作)DaemonSet:每个宿主机上必须且只能运行一个正本的守护过程服务CronJob:定时工作

August 12, 2021 · 1 min · jiezi

关于kubernetes:当容器应用越发广泛我们又该如何监测容器

简介: 随着容器技术蓬勃发展与落地推广,越来越多企业的业务运行于容器中。作为支流部署形式之一,容器将团队的工作和关注点宰割开,开发团队只需关注利用程序逻辑和依赖项,而运维团队只需关注部署和治理,无需再为特定软件版本和应用程序特定配置等应用程序细节而胆战心惊。这意味着开发团队和运维团队能够破费更少工夫进行调试上线,将更多工夫用于向最终用户交付新性能。容器使企业能够更加轻松的进步应用程序可移植性和操作弹性。据 CNCF 的调研报告显示,73% 受访者正在应用容器来进步生产敏捷性并放慢翻新速度。 作者 | 白玙 为什么咱们须要容器监测在大规模应用容器过程中,面对高动静且须要继续监测的容器化环境,建设监测体系对于维持运行环境稳固、优化资源老本具备微小意义。每个容器镜像可能有大量运行实例,因为新镜像和新版本的引入速度很快,故障很容易通过容器、应用程序和架构扩散。这使得在问题产生后,为了避免异样扩散,立刻进行问题根因定位变得至关重要。通过大量实际,咱们认为在容器应用过程中,以下组件的监测至关重要: 主机服务器;容器运行时;Orchestrator 管制立体;中间件依赖;在容器内运行的应用程序。在残缺的监测体系下,通过深刻理解指标、日志和链路,团队不仅能够理解在集群以及在容器运行时和应用程序中产生的事件,也能够为团队进行业务决策时提供数据反对,比方何时扩大/缩减实例/工作/Pod、更改实例类型。DevOps 工程师还能够通过增加自动化告警以及相干配置,来进步故障排除以及资源管理效率,比方通过被动监测内存利用率,当资源耗费靠近所设定的阈值时告诉运维团队对可用 CPU 、内存资源耗尽之前增加额定节点。这其中的价值包含: 及早发现问题,以防止零碎中断;跨云环境剖析容器健康状况;辨认调配过多/有余的可用资源的集群,调整应用程序以取得更好性能;创立智能警报,进步报警精准率,防止误报;借助监测数据进行优化,获得最佳零碎性能,升高经营老本。但在理论落地过程中,运维团队会感觉以上价值绝对通俗,仿佛现有运维工具都能达到上述目标。但针对容器相干场景,如果无奈构建相应监测体系,随着业务一直扩张,就不得不面临以下两个十分辣手的针对性问题: 1、排障工夫拖长,SLA 无奈满足。开发团队与运维团队很难理解正在运行的内容及其执行状况。保护应用程序、满足 SLA 和故障排除异样艰难。 2、可扩展性被连累,无奈实现弹性。按需疾速扩大应用程序或微服务实例的能力是容器化环境的重要要求。监测体系是掂量需要和用户体验的惟一可视化办法。扩大太晚,导致性能与用户体验的降落;过晚放大规模,又会导致资源以及老本的节约。 因而,当容器监测的问题以及价值,一直叠加且浮出水面,越来越多运维团队开始器重容器监测体系的搭建。但在理论落地容器监测这一过程中,又遇到各种各样意料之外的问题。 比方短暂存在个性带来的跟踪艰难,因为容器本身存在着复杂性,容器不仅蕴含底层代码,还蕴含利用程序运行所需的所有底层服务。随着新部署投入生产,并更改代码和底层服务,容器化应用程序会频繁更新,这就减少了出错的可能。疾速创立、疾速销毁的个性,使得在大规模简单零碎中跟踪变动变得异样艰难。 又比方,因为共享资源带来的监控艰难,因为容器应用的内存和 CPU 等资源在一台或多台主机之间共享,因而很难监控物理主机上资源耗费状况,也导致很难取得容器性能或应用程序健康状况的良好批示。 最初,就是传统工具难以满足容器监测需要。传统的监测解决方案通常不足虚拟化环境所需的指标、跟踪和日志所需的工具,容器的衰弱和性能指标及工具更是如此。 因而,联合以上的价值、问题、难点,咱们在建设容器监测体系时,须要从以下几个维度进行考量与设计: 无侵入性:监测SDK或者探针集成到业务代码是否存在侵入性,影响业务稳固下; 整体性:是否能够观测整个应用程序在业务和技术平台方面的体现; 多源性:是否能够从不同数据源获取相干指标和日志集进行汇总显示、剖析和警报; 便捷性:是否能够关联事件和日志,发现异常并主被动地排除故障并升高损失,相干告警策略配置是否便捷。 在明确业务需要以及设计监测体系过程中,有十分多开源工具供运维团队抉择,但运维团队还须要评估可能存在的业务与项目风险。这其中包含: 存在影响业务稳定性的未知危险,监测服务是否能够做到“无痕”。监测过程自身是否影响零碎失常运作。 开源或自研的人力/工夫投入难以预计,关联组件或资源须要自行配置或搭建,不足相应反对与服务,随着业务一直变动,是否可能消耗更多人力及工夫老本。且面对大规模场景下性能问题,开源或企业自有团队是否能够疾速应答。 阿里云 Kubernetes 监测:让容器集群监测更直观、更简略因而,基于上述洞察考量与大量实践经验,阿里云推出 Kubernetes 监测服务。阿里云 Kubernetes 监测是一套针对 Kubernetes 集群开发的一站式可观测性产品。基于 Kubernetes 集群下的指标、利用链路、日志和事件,阿里云 Kubernetes 监测旨在为 IT 开发运维人员提供整体的可观测性计划。阿里云 Kubernetes 监测具备以下六大个性: 代码无侵入:通过旁路技术,无需代码埋点,即可获取到网络性能数据。多语言反对:通过内核层进行网络协议解析,反对任意语言及框架。低耗高性能:基于 eBPF 技术,以极低消耗获取网络性能数据。资源主动拓扑:通过网络拓扑,资源拓扑展现相干资源的关联状况。数据多维展示:反对可观测的各种类型数据(监测指标、链路、日志和事件)。打造关联闭环:残缺关联架构层、应用层、容器运行层、容器管控层、根底资源层相干可观测数据。与此同时,绝对于与开源容器监测,阿里云 Kubernetes 监测具备更加贴近业务场景的差异化价值: 数据量无下限:指标、链路、日志等数据独立存储,借助云存储能力确保低成本大容量存储。 资源高效关联交互:通过监测网络申请,残缺构建网络拓扑,便于查看服务依赖状态,晋升运维效率。除了网络拓扑之外,3D 拓扑性能反对同时查看网络拓扑和资源拓扑,晋升问题定位速度。 多样化数据组合:指标、链路、日志等数据可视化展现并自由组合,开掘运维优化点。 构建残缺监测体系:与利用实时监测服务的其余子产品,独特构建残缺监测体系。利用监测关注利用语言运行时、利用框架与业务代码;Kubernetes 监测关注容器化利用的容器运行时、容器管控层与零碎调用,两个监测均服务于利用,关注利用的不同档次,两个产品互为补充。Prometheus 是指标采集,存储,查问的基础设施,利用监测与 Kubernetes 监测的指标类数据均依赖 Prometheus。 基于以上产品个性与差异化价值,咱们利用在以下场景: 通过 Kubernetes 监测的零碎默认或者自定义巡检规定,发现节点,服务与工作负载的异样。Kubernetes 监测从性能、资源、管控三个维度对节点、服务与工作负载进行异样巡检,将剖析后果直观地通过失常、正告、重大等状态配合特定色彩进行展现,帮忙运维人员直观感知用户节点,服务与工作负载运行状态。 ...

August 12, 2021 · 1 min · jiezi

关于kubernetes:kubernetes学习笔记一-Pod控制器及-Security-Context安全上下文

目录一、kubernetes组件1.1 示例:HTTPS拜访 kubernetes API Server 二、Pod控制器2.1 kubernetes yaml文件资源定义标准2.2 Pod env环境变量2.3 容器端口裸露 2种办法示例1:通过hostPort裸露端口示例2:通过hostNetwork 应用宿主机的网络名称空间三、平安上下文 Security Context3.1 常用字段 Pod级别的平安上下文3.2 常用字段 容器级别的平安上下文 示例1 要求:1.普通用户运行容器;2.普通用户运行容器示例2 要求:1.批改网络权限;2.实现8080端口转80端口示例3 要求: 增加网络管理权限 kubernetes 常用命令kubernetes资源援用格局<type>/<name>: pods/mypod,depolyment/demoapp #能够同时对不同的资源进行操作<type> <name>: pods mypod,deployment demoapp #只能对同一类型资源操作示例: [root@k8s-master ~]# kubectl delete pods/mypod depolyment/demoapp #胜利[root@k8s-master ~]# kubectl delete pods mypod mypod2 #胜利[root@k8s-master ~]# kubectl delete pods mypod depolyment demoapp #失败 会把pods前面的所以字段都当成pod kubectl 常用命令[root@k8s-master ~]# kubectl api-resources #查看资源类型与对象缩写[root@k8s-master ~]# kubectl get all #查看所有资源[root@k8s-master ~]# kubectl get pod # 可应用get查看pod、svc、ns、deployment简直所有资源状态[root@k8s-master ~]# kubectl describe pod <PodName> #可应用describe 查看pod、svc、ns、deployment简直所有资源状态更具体的形容信息,包含pod的错误信息等[root@k8s-master ~]# kubectl delete pod <PodName> #删除pod同样能够针对所有资源可用[root@k8s-master ~]# kubectl get pod --all-namespaces -o wide #所有名称空间下的pod <-o wide> 查看更详细描述 同样能够针对所有资源可用[root@k8s-master ~]# kubectl delete pod <PodName> #删除pod同样能够针对所有资源可用kubectl get pod --show-labels #查看标签[root@k8s-master ~]# kubectl get node --show-labels #查看节点标[root@k8s-master ~]# kubectl get cm -o yaml #以yaml格局输入[root@k8s-master ~]# kubectl create -f pop.yaml #命令式创建对象[root@k8s-master ~]# kubectl apply -f pod.yaml #申明式(幂等)创建对象[root@k8s-master ~]# kubectl edit pod myapp-pod #编辑pod[root@k8s-master ~]# kubectl logs myapp-pod -c test #查看pop的日志 -c 指定容器 如果只1个容器不须要指定[root@k8s-master ~]# kubectl exec readiness-httpget-pod -n xx -it -- /bin/sh #进入容器 如果多个容器 -c指定容[root@k8s-master ~]# kubectl exec liveness-httpget-pod -it -- rm -fr /usr/share/nginx/html/index.html #执行命令[root@k8s-master ~]# kubectl explain deployment #查看资源的文档 版本及定义的字段 其中<[]object> []KIND: DeploymentVERSION: apps/v1DESCRIPTION: Deployment enables declarative updates for Pods and ReplicaSets.FIELDS: apiVersion <string> #字段为字符 metadata <Object> #字身为对象 可通过kubectl explain deployment.metadata 可查看具体的阐明$ kubectl explain deployment.spec selector <Object> -required- #必须字段$ kubectl explain pod.spec containers<[]Object> -required- #在yaml中示意对象为列表 能够有多个对象kubernetes组件 ...

August 11, 2021 · 8 min · jiezi

关于kubernetes:在-k8s-中安装-jenkins-并配置实现-CICD

咱们把世界看错,反说它坑骗了咱们。—— 泰戈尔《飞鸟集》一. 概述在学习应用一个工具之前,咱们须要晓得怎么装置它。本文将本人学习的过程记录下来,一方面坚固学习的内容,另一方面心愿对有同样需要的小伙伴提供一些帮忙。 开源工具形容官网文档官网装置文档docker 装置jenkinsdevops继续集成工具jenkins 官网jenkins 疾速装置docker 装置下面表格列出了官网的装置地址,如果须要疾速体验应用,倡议间接应用 docker 装置,一行命令就能够启动利用: docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts-jdk11本文介绍在 k8s 中装置并应用 jenkins,次要通过两种形式装置实际: 本人编写 yaml 文件装置应用 helm 装置装置环境这里应用 minikube 进行装置,在 k8s 集群中根本应用是一样的minikube : v1.18.1helm : v3.5.3二. 自定义 yaml 文件装置 jenkins因为 jenkins 须要长久化数据,所以咱们须要创立 PVC ,倡议应用 storageClass 动态创建 PVC,在 minikube 中有一个默认的 storageClass,名称是:standard,能够应用上面的命令查看: # kubectl get scNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEstandard (default) k8s.io/minikube-hostpath Delete Immediate false 50m对于 storageClass 的应用能够查看官网:https://kubernetes.io/zh/docs...创立 jenkins-deploy.yaml 文件,文件内容如下: ###############应用 storageClass 创立 pvc ###################---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: jenkins-data-pvc namespace: defaultspec: accessModes: - ReadWriteMany # 指定 storageClass 的名字,这里应用 minikube 默认的 standard storageClassName: "standard" resources: requests: storage: 10Gi###############创立一个ServiceAccount 名称为:jenkins-admin###################---apiVersion: v1kind: ServiceAccountmetadata: name: jenkins-admin namespace: default labels: name: jenkins###############绑定账户jenkins-admin 为集群管理员角色,为了管制权限倡议绑定自定义角色###################---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: name: jenkins-admin labels: name: jenkinssubjects: - kind: ServiceAccount name: jenkins-admin namespace: defaultroleRef: kind: ClusterRole # cluster-admin 是 k8s 集群中默认的管理员角色 name: cluster-admin apiGroup: rbac.authorization.k8s.io############### 在 default 命名空间创立 deployment ###################---apiVersion: apps/v1kind: Deploymentmetadata: name: jenkins namespace: defaultspec: replicas: 1 selector: matchLabels: app: jenkins template: metadata: labels: app: jenkins spec: terminationGracePeriodSeconds: 10 # 留神:k8s 1.21.x 中 serviceAccount 改名为 serviceAccountName # 这里填写下面创立的 serviceAccount 的 name serviceAccount: jenkins-admin containers: - name: jenkins image: jenkins/jenkins:lts-jdk11 imagePullPolicy: IfNotPresent env: - name: JAVA_OPTS value: -Duser.timezone=Asia/Shanghai ports: - containerPort: 8080 name: web protocol: TCP - containerPort: 50000 name: agent protocol: TCP resources: limits: cpu: 1000m memory: 1Gi requests: cpu: 500m memory: 512Mi livenessProbe: httpGet: path: /login port: 8080 initialDelaySeconds: 60 timeoutSeconds: 5 failureThreshold: 12 readinessProbe: httpGet: path: /login port: 8080 initialDelaySeconds: 60 timeoutSeconds: 5 failureThreshold: 12 volumeMounts: - name: jenkinshome mountPath: /var/jenkins_home volumes: - name: jenkinshome persistentVolumeClaim: claimName: jenkins-data-pvc############### 在 default 命名空间创立 service ###################---apiVersion: v1kind: Servicemetadata: name: jenkins namespace: default labels: app: jenkinsspec: selector: app: jenkins type: ClusterIP ports: - name: web port: 8080 targetPort: 8080---apiVersion: v1kind: Servicemetadata: name: jenkins-agent namespace: default labels: app: jenkinsspec: selector: app: jenkins type: ClusterIP ports: - name: agent port: 50000 targetPort: 50000应用上面的命令部署 jenkins: ...

August 6, 2021 · 4 min · jiezi

关于kubernetes:未完待续笔记-K8S-基础使用

[笔记] K8S 根底应用https://kubernetes.io/docshttps://kubernetes.io/zh/docs下面俩是这玩意儿的官网文档,或者挺全的,但反正我感觉就没说到点上:想查啥它不说啥,只管自个儿念经。 所以我就想本人搞一个,万一本人哪天阿尔兹海默失忆了,如果那时候还活着的话,兴许也还能从新拾起来这部分把握过的货色。 根本这 k8s 的一大特点就是概念贼 TM 多。它那套文档喜爱先介绍概念,那我就对着干,先从介绍怎么使开始吧: 个别在应用中根本不会用到 kubectl 以外的命令。 根本的应用就是这些的简略示例: 查有哪些 Pod进入 Pod还有一个很有用的基本概念: Pod 和 Container 到底是啥子关系查 Pod如果你想查有哪些 Pod 的话: kubectl get po如果想指定 wahaha 这个命名空间(不晓得这是啥没关系用用就能晓得想查概念可本人查): kubectl get po -n wahaha这个 -n 也能够写成 --namespace ,前者是简写。 好了,会用这些,你就迈出了一大步。如果你有 Pod ,那你看到的打印应该会是一个如同表格一样比拟参差的文本输入。想看更多字段能够【在前面加上】 -o wide : kubectl get po -n wahaha -o wide(当前呈现【在前面加上】的字样就示意上面的命令是上一条提到的命令前面加上所述内容——当然要有空格离开!我并不是在说字符串拼接!) 如果想间接看全副的 Pod 就这样: kubectl get po -A还有别的查法:就是带上选项 -l 而后用选择器去找那种,在 label 有特定定义的 Pod 。 进 Pod个别如果你有一个 Pod 叫 abc (在默认命名空间下),而且这个 Pod 只有一个容器,那进去的方法就是: ...

August 6, 2021 · 5 min · jiezi

关于kubernetes:Docker与k8s的恩怨情仇七-服务发现大法让你的内外交互原地起飞

转载请注明出处:葡萄城官网,葡萄城为开发者提供业余的开发工具、解决方案和服务,赋能开发者。在上节中咱们介绍了活字格私有云版在k8s上部署,以及如何实现容器之间的编排与管理控制。为了进一步实现内外交互调用,则须要实现服务发现的性能。也就是咱们后面提到“人与狗”之间的关系。 做过微服务的同学可能理解过什么叫服务发现,spring cloud我的项目中的Eureka框架就是实现这个性能的,其次要工作就是注册外部的服务,以供其余集群的服务能够调用、拜访这个服务。   咱们正当猜想Kubernetes的存在很有可能激发了各种微服务框架产生服务发现机制。 在Kubernetes中服务发现对应的模块是Service与Ingress,接下来,咱们别离来说说这两个性能。 Service与IngressService相似于服务的注册性能。   其逻辑很简略,在kubernetes申明一个服务,从而生成一个VIP(虚构网络),所有Kubernetes集群中的其余组件,都能够通过这个VIP来拜访这个服务,并且这个服务是不会随Service的扭转而扭转的,只有创立就是终生存在。 Service而服务的内容是什么呢?这部分和上述的Deployment一样,是通过selector选择器确定的。咱们能够通过下述yaml来创立一个服务: apiVersion: v1kind: Servicemetadata:  name: hostnamesspec:  selector:    app: hostnames  ports:  - name: default    protocol: TCP    port: 80    targetPort: 9376通过上一篇的介绍,咱们能够理解这个服务所须要代理的内容是app==hostnames的Pod。同时这里也有一个新的字段ports,这个字段是阐明该代理的服务的申请形式(protocol)、对外裸露的端口(port)、外部的端口(targetPort)别离是什么。   咱们能够通过这个sample-service.yaml的文件创建一个Service并且查看一个Service: # 创立kubectl apply -f sample-service.yaml # 查看kubectl get services hostnames 在这个service中存在一个ClusterIP,这个IP就是这个Service生成的VIP,在集群外部的其余成员,都能够通过这个VIP来拜访这个Service。然而因为咱们当初没有任何的具体服务让这个Service代理,因而当初申请这个IP是不会胜利的。   那么,咱们须要为这个Service创立一个具体实现:以下的sample-deployment.yaml文件是创立一个多正本的Pod,其Pod的性能是返回本人的podname: apiVersion: apps/v1kind: Deploymentmetadata:  name: hostnamesspec:  selector:    matchLabels:      app: hostnames  replicas: 3  template:    metadata:      labels:        app: hostnames    spec:      containers:      - name: hostnames        image: k8s.gcr.io/serve_hostname        ports:        - containerPort: 9376          protocol: TCP~在这段代码中,咱们把容器的9376端口裸露的进去,因为这个Pod是通过这个端口与内部通行的。同样咱们执行以下命令创立和查看这个pod正本: # 创立kubectl apply -f sample-deployment.yaml # 查看kubectl get pods -l app=hostnames 在这部分内容中能够看到这个pod正本曾经创立胜利了。此时,依据我上一节所说的控制器模式,Service也有对应的解决Service的控制器,其外部发现了有满足app==hostnames的服务,行将这个服务和Service进行了绑定 。此时,咱们就能够通过任意一台集群内的主机来申请方才上文中的ClusterIP: 在这一部分能够看到,咱们进行了很屡次申请,然而每次返回的后果都不同,这是因为Service在其外部通过网络插件(CNI)做了负载平衡解决,所以咱们能够通过Service来实现的负载平衡性能。 学习过程中的“误入歧路”在学习理解这部分内容的时候,我始终有一个误会:认为Service是必须对应Deployment这种Pod的编排控制器对象能力工作的,所以把Service --> Deployment --> Pods这条逻辑关系熟记于心,但这种了解其实是谬误的。   在Kubernetes中,每个性能组件各司其职,他们只会解决本人该做的事,比方这里,Service绑定Pod所依赖的是选择器中的app==hostnames,而这个定义是呈现在Deployment中定义在Pod中的,因而Service和Deployment齐全没有关系,它们俩谁也不意识谁,关系能够用下图来形容: 并且,在之前的学习中还谬误地认为负载平衡服务是由Deployment提供的,其实这个性能是Service中的网络插件来解决的,并且用户同样也能够自定义应用的网络查件或者负载平衡算法是什么,Kubernetes给了用户足够大的自由度。 Ingress有了Service之后,咱们的服务就能够在集群中随便拜访达到服务之间的交换关系了, 然而要想让咱们的服务让最终的用户拜访到,咱们还须要最初一个组件Ingress。   Ingress是Kubernetes中的反向代理服务,它能够解析配置的域名指向到咱们外部的Service中,其定义能够通过下述的yaml来实现: apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: sample-ingressspec:  rules:  - host: hostname.sample.com    http:      paths:      - path: /        backend:          serviceName: hostnames          servicePort: 80上述代码中,咱们将hostname.sample.com这个域名指向了方才定义的hostnames这个Service。通过这样的操作,咱们的服务便就能够通过定义域名配置供内部的服务进行拜访了。而Ingress的创立命令,也和后面所说的一样: kubectl apply -f sample-ingress.yaml   有了这部分配置,咱们的性能原则上就可能让内部拜访了。但在理论利用中咱们本地没有可供测试的环境,本地的Kubernetes环境是通过kindD生成的,其外围是多个Docker Container而不是多台机器。上述内容在Container外部运行,是应用Docker模仿Kubernetes的性能,因而这也是本文中惟一无奈验证胜利的一个功能模块。 残缺部署一个活字格利用通过上节咱们一起学习了Pod间的编排控制器的应用,本节中实现了内外交互调用,进一步实现服务发现的性能,咱们当初就能够再次回到之前提出的问题: 到底如何胜利部署一个活字格利用。   通过介绍整个Kubernetes的根底应用的流程,咱们能够看到一个服务在Kubernetes变成Pod,通过Deployment部署,通过Service服务发现,通过Ingress反向代理的全过程,通过这些模块的协力配合之后,咱们的活字格利用终于能够部署在这个Kubernetes集群中了。 心愿这张图片展现,可能为大家带来更加直观的感觉。   总结截止到本章,咱们曾经残缺介绍了活字格私有云版做k8s部署的全过程。下一节将会为大家带来本系列文章的最初一篇——Kubernetes总览,让大家对Kubernetes集群内容局部有一个整体性印象,对一些深层次性能做一个总结。   感兴趣的小伙伴不要错过~咱们下篇接着聊。

August 5, 2021 · 1 min · jiezi

关于kubernetes:K8S-生态周报-Kubernetes-v1220-正式发布新特性一览

「K8S 生态周报」内容次要蕴含我所接触到的 K8S 生态相干的每周值得举荐的一些信息。欢送订阅知乎专栏「k8s生态」。Kubernetes v1.22 曾经在明天正式公布了,这是 2021 年的第二个正式公布的版本。此版本中共蕴含 53 项加强更新,其中 13 项达到 stable,24 项达到 beta 还有 16 项为 alpha。当然,也有 3 项个性被标记为废除。 从往年的 4 月份,Kubernetes 的公布节奏由原来的每 3 个月一个版本批改成了每 4 个月一个版本,这也是第一个利用了此节奏的长周期版本。咱们一起来看看有哪些值得注意的变更吧! Server-side Apply 个性达到 GAServer-side Apply 这个个性次要指标是把逻辑从 kubectl apply 挪动到 kube-apiserver 中,这能够修复以后遇到的很多无关所有权抵触的问题。 还记得在之前的『K8S生态周报』中我曾为你介绍过 Kubernetes 新增的 .meta.managedFields 吗?Server-side Apply 以后就是通过此个性来跟踪对象字段的更改的。 同时此个性的益处在与你能够间接通过 API 实现申明式配置的操作,而无需依赖于特定的 kubectl apply 命令,比方间接通过 curl 即可实现。 此性能的用法如下: kubectl apply --server-side [--dry-run=server]Pod Security Policy 的替代品PodSecurity admission controller 是在 Kubernets v1.21 中被废除的 Pod Security Policies 的替代品。 ...

August 5, 2021 · 2 min · jiezi

关于kubernetes:k8s-pod随记

1.规范的yaml文件apiVersion: v1kind: Podmetadata: name: pod-base namespace: dev labels: user: slqspec: #nodeName: node1 #nodeSelector: # env: uat affinity: podAntiAffinity: #podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: user operator: In values: ["slq"] topologyKey: kubernetes.io/hostname #nodeAffinity: # preferredDuringSchedulingIgnoredDuringExecution: # - weight: 1 # preference: # matchExpressions: # - key: env # operator: In # values: ["uat","test"] #nodeAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # nodeSelectorTerms: # - matchExpressions: # - key: env # operator: In # values: ["uat"] containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent # newer IfNotPresent ports: - name: nginx-port containerPort: 80 protocol: TCP resources: limits: # cpu: "1" memory: "10Gi" requests: # cpu: "1" memory: "10Mi" lifecycle: postStart: exec: command: ["/bin/sh","-c", "echo poststart... > /usr/share/nginx/html/index.html"] #tcpSocket: #port: 80 preStop: exec: command: ["/usr/sbin/nginx","-s","quit"] livenessProbe: #exec: # command: ["/bin/ls","/tmp/"] #tcpSocket: #port: 80 httpGet: scheme: HTTP port: 80 path: / restartPolicy: Never #Always OnFailure Never initContainers: - name: busybox image: busybox:1.30 imagePullPolicy: IfNotPresent# command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 10;done;"] command: ["/bin/sh","-c","touch /tmp/hello.txt"] env: - name: "username" value: "root" - name: "pwd" value: "123456"2.pod 重要点记录pod资源清单: apiVersion: v1 #必选,版本号,例如v1kind: Pod #必选,资源类型,例如 Podmetadata: #必选,元数据 name: string #必选,Pod名称 namespace: string #Pod所属的命名空间,默认为"default" labels: #自定义标签列表 - name: string spec: #必选,Pod中容器的具体定义 containers: #必选,Pod中容器列表 - name: string #必选,容器名称 image: string #必选,容器的镜像名称 imagePullPolicy: [ Always|Never|IfNotPresent ] #获取镜像的策略 command: [string] #容器的启动命令列表,如不指定,应用打包时应用的启动命令 args: [string] #容器的启动命令参数列表 workingDir: string #容器的工作目录 volumeMounts: #挂载到容器外部的存储卷配置 - name: string #援用pod定义的共享存储卷的名称,需用volumes[]局部定义的的卷名 mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符 readOnly: boolean #是否为只读模式 ports: #须要裸露的端口库号列表 - name: string #端口的名称 containerPort: int #容器须要监听的端口号 hostPort: int #容器所在主机须要监听的端口号,默认与Container雷同 protocol: string #端口协定,反对TCP和UDP,默认TCP env: #容器运行前需设置的环境变量列表 - name: string #环境变量名称 value: string #环境变量的值 resources: #资源限度和申请的设置 limits: #资源限度的设置 cpu: string #Cpu的限度,单位为core数,将用于docker run --cpu-shares参数 memory: string #内存限度,单位能够为Mib/Gib,将用于docker run --memory参数 requests: #资源申请的设置 cpu: string #Cpu申请,容器启动的初始可用数量 memory: string #内存申请,容器启动的初始可用数量 lifecycle: #生命周期钩子 postStart: #容器启动后立刻执行此钩子,如果执行失败,会依据重启策略进行重启 preStop: #容器终止前执行此钩子,无论后果如何,容器都会终止 livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将主动重启该容器 exec: #对Pod容器内查看形式设置为exec形式 command: [string] #exec形式须要制订的命令或脚本 httpGet: #对Pod内个容器健康检查办法设置为HttpGet,须要制订Path、port path: string port: number host: string scheme: string HttpHeaders: - name: string value: string tcpSocket: #对Pod内个容器健康检查形式设置为tcpSocket形式 port: number initialDelaySeconds: 0 #容器启动实现后首次探测的工夫,单位为秒 timeoutSeconds: 0 #对容器健康检查探测期待响应的超时工夫,单位秒,默认1秒 periodSeconds: 0 #对容器监控查看的定期探测工夫设置,单位秒,默认10秒一次 successThreshold: 0 failureThreshold: 0 securityContext: privileged: false restartPolicy: [Always | Never | OnFailure] #Pod的重启策略 nodeName: <string> #设置NodeName示意将该Pod调度到指定到名称的node节点上 nodeSelector: obeject #设置NodeSelector示意将该Pod调度到蕴含这个label的node上 imagePullSecrets: #Pull镜像时应用的secret名称,以key:secretkey格局指定 - name: string hostNetwork: false #是否应用主机网络模式,默认为false,如果设置为true,示意应用宿主机网络 volumes: #在该pod上定义共享存储卷列表 - name: string #共享存储卷名称 (volumes类型有很多种) emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个长期目录。为空值 hostPath: string #类型为hostPath的存储卷,示意挂载Pod所在宿主机的目录 path: string #Pod所在宿主机的目录,将被用于同期中mount的目录 secret: #类型为secret的存储卷,挂载集群与定义的secret对象到容器外部 scretname: string items: - key: string path: string configMap: #类型为configMap的存储卷,挂载预约义的configMap对象到容器外部 name: string items: - key: string path: string kubectl explain pod containers: 能够定义多个容器对象 name image imagePullPolicy command args env ports apiVersion: v1kind: Podmetadata: name: pod-base namespace: dev labels: user: slqspec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent - name: busybox image: busybox:1.3.0 imagePullPolicy: IfNotPresent 进入容器中执行命令kubectl exec pod-base -n dev -it -c busybox /bin/sh //pod-base pod名称 dev 命名空间 busybox 容器名称 limit: cpu: "1" memory: "1024M"requests: cpu: "2" memory: "10M" pod的生命周期: 创立 运行初始化容器 运行主容器过程 容器启动后钩子、容器终止前钩子函数 容器的存活 探测就绪性探测 创立和终止过程: 创立过程: 创立api申请到api-server,api-server将申请信息保留到etcd中,间接返回响应,调度器通过etcd watch机制获取创立pod的信息,而后依据算法计算调配到哪些节点进行创立容器 具体的节点通过watch机制察看到须要创立容器,而后创立容器,创立实现之后返回后果到api-server,api-server批改pod信息 终止过程: api-server收到终止pod的申请,首先有个宽限期30s,将pod的状态改为终止状态,kubelet监控到pod为终止状态就开启敞开pod的过程 端点控制器监控到pod对象处于终止状态,会将其在可拜访的列表中移除 如果存在prestop钩子函数,则会在标记为终止状态后立即启动执行 宽限期完结后,pod如果仍在运行,则会收到立即进行的信号,kubelet会申请api-server将该资源的宽限期改为0,间接删除实现 初始化容器过程: 主容器的启动前置工作 kubectl get pod pod-base -n dev -w 动静查看pod-base pod的变动 容器启动前钩子函数:post start 容器终止前钩子函数: pre stop lifecycle: poststart: exec: command: - cat - /tmp/healthy tcpSocket: port: 80 httpGet: path: /abc #url地址 port: 80 host: 192.168.109.100 scheme: HTTP The Pod "pod-base" is invalid: spec.containers[0].lifecycle.postStart.tcpSocket: Forbidden: may not specify more than 1 handler type[root@node1 ~]# kubectl get pod pod-base -n devNAME READY STATUS RESTARTS AGEpod-base 0/1 CrashLoopBackOff 3 63s容器存活探测: liveness probes 代表服务可能失常提供服务就绪性探测: readiness probes 代表服务曾经筹备好了两种形式均反对三种形式:三种形式只能应用其中一种,不能同时应用两种或者三种---livenessProbe: exec: command: - cat - /tmp/healthy---livenessProbe: tcpSocket: port: 8080---livenessProbe: httpGet: path: / port: 80 host: 127.0.0.1 scheme: HTTP---kubectl describe pod pod-base -n dev------------------------------------------Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 96s default-scheduler Successfully assigned dev/pod-base to node2 Normal Created 104s kubelet Created container busybox Normal Pulled 104s kubelet Container image "busybox:1.30" already present on machine Normal Started 103s kubelet Started container busybox Normal Created 45s (x3 over 103s) kubelet Created container nginx Normal Started 44s (x3 over 102s) kubelet Started container nginx Normal Pulled 15s (x4 over 103s) kubelet Container image "nginx" already present on machine Warning Unhealthy 15s (x9 over 95s) kubelet Liveness probe failed: /bin/cat: /tmp/hello.txt: No such file or directory Normal Killing 15s (x3 over 75s) kubelet Container nginx failed liveness probe, will be restarted ----------------------------------------- kubectl explain pod.spec.containers.livenessProbe pod的重启策略: Always OnFailure Never-------------------------------------------------------------------------------------------------------------------------------------pod的调度定向调度:NodeName NodeSelector亲和性调度:NodeAffinity PodAffinity PodAntiAffinity污点: Taints TolerationNodeName: node1NodeSelector: env: uatkubectl label nodes node1 env=prodkubectl label nodes node2 env=devkubectl label nodes node3 env=uat亲和性调度:nodeAffinity (node亲和性): pod.spec.affinity.nodeAffinity requiredDuringSchedulingIgnoredDuringExecution key Exists DoesNotExist- matchExpressions: - key: env #匹配领有env标签的节点 Exists DoesNotExist operator: Exists - key: env #匹配env标签值为dev和uat的节点 In NotIn operator: In values: ["dev","uat"] - key: env #匹配env标签值大于dev的节点 Gt Lt 应用的较少 operator: Gt values: "dev" preferredDuringSchedulingIgnoreDuringExecution: #优先调度到满足指定规定的node preference: //注意事项:1.如果同时定义了nodeSelector和nodeAffinity,那么必须两个都满足,pod能力运行在指定的node上2.如果nodeAffinity指定了多个nodeSelectorTerms,那么只须要其中一个可能匹配胜利即可3.如果一个nodeSelectorTerms中有多个matchExpressions,则一个节点必须满足所有的能力匹配胜利4.如果一个pod所在的node在pod运行期间产生了变动,不再合乎该pod的节点亲和性需要,则零碎将疏忽此变动podAffinity (pod亲和性):podAntiAffinity (pod反亲和性): pod亲和性: pod.spec.affinity.podAffinity: requiredDuringSchedulingIgnoredDuringExecution: #硬限度 namespace topologyKey labelSelector matchExpressions key values operator matchLabels preferredDuringSchedulingIgnoreDuringExecution: #软限度 podAffinityTerm namespace topologyKey labelSelector matchExpressions key values operator matchLabels weight 反亲和性podAntiAffinity: 其余和podAntiAffinity统一定向调度和亲和性调度都是从pod的角度定义调度信息的污点:在node外面配置一些属性来定义调度信息设置node上的信息确定pod是否调度过去,污点排挤关系key=value:effectPreferNoSchedular 尽量不调度到该节点NoSchedular 调度器将不会调度到该节点上,也不会把该节点上的pod调度到其余节点上NoExecute 不会调度到该节点上,而且会把该节点的node 调度到别的节点上设置污点 : kubectl taint nodes node3 key=value:effect删除污点: kubectl taint nodes node3 taintEff-去除所有污点: kubectl taint nodes node1 key-查看污点: kubectl describe nodes node1 ---------------->Taints kubectl run taint1 --image=nginx -n dev kubectl run taint2 --image=nginx -n dev kubectl run taint3 --image=nginx -n dev kubectl taint nodes node3 taintEff=eff:PreferNoSchedulekubectl taint nodes node3 taintEff:PreferNoSchedule-kubectl taint nodes node3 taintEff-如果屡次设置,或有反复值的容忍: Toleration: key: "taintEff" operator: "Equal" value: "eff" effect: "NoExecute" tolerationSeconds #容忍工夫,pod在node上的停留时间

August 4, 2021 · 4 min · jiezi

关于kubernetes:基于ECIFaaS构建游戏战斗结算服最佳实践

简介:在游戏行业的很多游戏类型中,尤其是SLG,为了避免客户端舞弊,在每局战斗之后,在客户端预判玩家胜利的状况下,须要服务端来进行战斗数据的结算,从而确定玩家是不是真正的胜利。战斗结算是强CPU密集型,结算零碎每日须要大量的计算力,尤其是开服或者流动期间突然涌入的大量玩家,导致须要的计算量霎时几倍增长,同时须要结算零碎保持稳定的延时来保障玩家的用户体验。 中转最佳实际:【基于ECI+FaaS构建游戏战斗结算服最佳实际】 云栖号最佳实际:【点击查看更多上云最佳实际】 这里有丰盛的企业上云最佳实际,从典型场景入门,提供一系列我的项目实际计划,升高企业上云门槛的同时满足您的需要! 场景形容在游戏行业的很多游戏类型中,尤其是SLG,为了避免客户端舞弊,在每局战斗之后,在客户端预判玩家胜利的状况下,须要服务端来进行战斗数据的结算,从而确定玩家是不是真正的胜利。战斗结算是强CPU密集型,结算零碎每日须要大量的计算力,尤其是开服或者流动期间突然涌入的大量玩家,导致须要的计算量霎时几倍增长,同时须要结算零碎保持稳定的延时来保障玩家的用户体验。 利用场景自建harbor镜像仓库,将镜像迁徙到阿里云容器镜像服务OCR(含企业版)。自建Registry镜像仓库,将镜像迁徙到阿里云容器服务OCR(含企业版)。自建&IDC的K8S业务,通过velero将利用迁徙至阿里云容器服务ACK。通过velero将K8S(云上&云下均可)利用备份至OSS,确保配置数据同城&异地容灾。产品列表容器KubernetesACK容器实例ECI容器镜像仓库ACR函数计算FC访问控制RAM专有网络VPC云服务器ECS 中转最佳实际 》》 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

August 4, 2021 · 1 min · jiezi

关于kubernetes:Kuberneters-搭建openLDAP

背景:要装置一系列的工具 ,如:jenkins spinnaker gitlab。账号零碎是一件烦人的事件。前两年本人也试过openladap这样的对立账号治理认证。当初就想再用一下.把几个软件的账户零碎整合一下(次要是想上spinnaker了)。搭建形式根本参照:https://mutoulazy.github.io/2021/04/01/kubernetes/openLDAP/#%E5%9C%A8k8s%E4%B8%AD%E9%83%A8%E7%BD%B2。不过这个哥们写的配置文件也比拟乱,起码的pv,pvc应该先创立吧?yaml程序整的杂七乱八的都是创立了服务后导出的.....,另外还有这里两个的能够参考:Kubernetes - - k8s - v1.12.3 OpenLDAP对立认证kubernetes实战(十一):k8s应用openLDAP对立认证反正就联合这几个搞一下吧! kubernetes 搭建openLDAP1.创立pvc默认存储cbs,间接应用了腾讯云的cbs块存储(最小10G的步长也是10G) cat <<EOF > pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata: name: ldap-data-pvc namespace: kube-opsspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: cbs---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: ldap-config-pvc namespace: kube-opsspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: cbsEOFkubectl apply -f pvc.yaml 2. 创立ldap deployment svc服务cat <<EOF > ldap-deployment.yamlkind: DeploymentapiVersion: apps/v1metadata: name: openldap namespace: kube-ops labels: app: openldap annotations: app.kubernetes.io/alias-name: LDAP app.kubernetes.io/description: 认证核心spec: replicas: 1 selector: matchLabels: app: openldap template: metadata: labels: app: openldap spec: containers: - name: openldap image: 'osixia/openldap:1.5.0' ports: - name: tcp-389 containerPort: 389 protocol: TCP - name: tcp-636 containerPort: 636 protocol: TCP env: - name: LDAP_ORGANISATION value: devops - name: LDAP_DOMAIN value: xxx.com - name: LDAP_ADMIN_PASSWORD value: xxxxxxxx - name: LDAP_CONFIG_PASSWORD value: xxxxxxx - name: LDAP_BACKEND value: mdb resources: limits: cpu: 500m memory: 500Mi requests: cpu: 100m memory: 100Mi volumeMounts: - name: ldap-config-pvc mountPath: /etc/ldap/slapd.d - name: ldap-data-pvc mountPath: /var/lib/ldap volumes: - name: ldap-config-pvc persistentVolumeClaim: claimName: ldap-config-pvc - name: ldap-data-pvc persistentVolumeClaim: claimName: ldap-data-pvc---apiVersion: v1kind: Servicemetadata: name: openldap-svc namespace: kube-ops labels: app: openldap-svcspec: ports: - name: tcp-389 port: 389 protocol: TCP targetPort: 389 - name: tcp-636 port: 636 protocol: TCP targetPort: 636 selector: app: openldapEOFkubectl apply -f ldap-deployment.yaml ...

August 3, 2021 · 2 min · jiezi

关于kubernetes:在-k8s-中安装并使用-nexus

生存是属于每个人本人的感触,不属于任何他人的认识。—— 余华《活着》一. 概述在学习应用一个工具之前,咱们须要晓得怎么装置它。本文将本人学习的过程记录下来,一方面坚固学习的内容,另一方面心愿对有同样需要的小伙伴提供一些帮忙。 开源工具形容官网文档官网装置文档docker 装置nexusmaven 仓库管理工具nexus 官网nexus 疾速装置docker 装置下面表格列出了官网的装置地址,如果须要疾速体验应用,倡议间接应用 docker 装置,一行命令就能够启动利用: docker run -d -p 8081:8081 --name nexus sonatype/nexus3下文将介绍在 k8s 中装置并应用 nexus,这里将应用两种形式装置: 本人编写部署清单 nexus-deploy.yaml 装置应用 helm 装置装置环境这里应用 minikube 进行装置,在 k8s 集群中根本应用是一样的minikube : v1.18.1helm : v3.5.3二. 编写部署清单 nexus-deploy.yaml 装置因为 nexus 须要长久化数据,所以咱们须要创立 PVC ,倡议应用 storageClass 动态创建 PVC,在 minikube 中有一个默认的 storageClass,名称是:standard,能够应用上面的命令查看: # kubectl get scNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEstandard (default) k8s.io/minikube-hostpath Delete Immediate false 50mstorageClass 的应用能够查看官网:https://kubernetes.io/zh/docs...创立 nexus-deploy.yaml 文件,文件内容如下: ---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: nexus-data-pvc namespace: defaultspec: accessModes: - ReadWriteMany # 指定 storageClass 的名字,这里应用默认的 standard storageClassName: "standard" resources: requests: storage: 10Gi---apiVersion: apps/v1kind: Deploymentmetadata: namespace: default name: nexus3 labels: app: nexus3spec: replicas: 1 selector: matchLabels: app: nexus3 template: metadata: labels: app: nexus3 spec: containers: - name: nexus3 image: sonatype/nexus3:3.32.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8081 name: web protocol: TCP livenessProbe: httpGet: path: / port: 8081 initialDelaySeconds: 100 periodSeconds: 30 failureThreshold: 6 readinessProbe: httpGet: path: / port: 8081 initialDelaySeconds: 100 periodSeconds: 30 failureThreshold: 6 resources: limits: cpu: 4000m memory: 2Gi requests: cpu: 500m memory: 512Mi volumeMounts: - name: nexus-data mountPath: /nexus-data volumes: - name: nexus-data persistentVolumeClaim: claimName: nexus-data-pvcapiVersion: v1kind: Servicemetadata: name: nexus3 namespace: default labels: app: nexus3spec: selector: app: nexus3 type: ClusterIP ports: - name: web protocol: TCP port: 8081 targetPort: 8081应用如下命令部署利用: ...

August 3, 2021 · 3 min · jiezi

关于kubernetes:中国首位-K8s-ingressnginx-reviewer-同时提名成为-Apache-APISIX-committer

近日,来自干流科技的工程师张晋涛被增加为 Kubernetes ingress-nginx 我的项目的 reviewer,这也是首位来自中国的 Kubernetes Ingress Controller reviewer,与此同时,张晋涛也通过投票提名成为 Apache APISIX committer。 以下是 OSCHINA 对张晋涛的专访: 对于 Kubernetes Ingress Controller Ingress 是 Kubernetes 名称或规定的定义,是用于将内部 HTTP(S)流量路由到服务(Service)的规定汇合,也是 Kubernetes 中十分重要的内部流量入口。Ingress Controller 是将 Kubernetes 集群状态同步到网关的组件的统称,它并非 Kubernetes 自带组件。在泛滥 Ingress Controller 组件中,Kubernetes ingress-nginx 是以后应用最为宽泛的 Ingress Controller,也是由 Kubernetes 官网保护的 Ingress Controller 组件之一。 提名 PR 中说道,张晋涛为 Kubernetes ingress-nginx 审查 PR 做了十分多的帮忙。张晋涛最后是一名 Web 开发者,做前后端开发,2014 年接触 Docker 后,认定容器技术将会成为支流,便抉择深钻容器技术。之后,张晋涛陆续创作了《Kubernetes 上手实际》和 《Docker 外围常识必知必会》等专栏,并在 2019 年开始继续经营「K8S 生态周报」。同时他也是 Apache APISIX committer, 以及 Containerd、Docker、Helm、Kubernetes、KIND 等泛滥开源我的项目 contributor。他称本人是一个酷爱开源、喜爱折腾的工程师。他认为,参加开源奉献和开源社区活动,次要还是应该从趣味登程。对于云原生的倒退,他认为 Kubernetes 是云原生的基石,将来的三五年内依然会是最次要的技术方向,并且正在向 IoT 等畛域扩大。此外,近两年张晋涛也开始重视钻研 Kubernetes 安全性问题。 ...

August 2, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes集群安装kubeprometheus后无法执行kubectl-top-node

背景:Kubernetes 1.20.5 装置Prometheus-Oprator嗯,我的集群是1.21.3了尽管是......执行kubectl top nodes如下: 解决问题过程:网上一堆各种说法的,然而没有一个是实用于我的。把monitoring下所有的pod的日志看了一个遍,而后在prometheus-adapter中发现日志如下:嗯想起来了我的集群都不是默认的cluster.local!如果有跟我一样自定义命名集群的须要留神批改这个这个配置!而后找一下配置文件中哪个文件有此项配置:比拟笨的形式: grep -A2 -B2 cluster.local 一个一个前缀的排除。最初确认是prometheus-adapter-deployment.yaml配置文件,批改一下: kubectl apply -f prometheus-adapter-deployment.yamlkubectl get pods -n monitoring期待pod更新重新启动验证: [root@k8s-master-01 manifests]# kubectl top nodesW0731 11:24:57.758043 1760118 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flagNAME CPU(cores) CPU% MEMORY(bytes) MEMORY% k8s-master-01 231m 5% 2497Mi 31% k8s-master-02 227m 5% 1989Mi 25% k8s-master-03 235m 5% 2071Mi 26% k8s-node-01 490m 3% 4023Mi 12% k8s-node-02 221m 1% 4854Mi 15% k8s-node-03 616m 3% 10671Mi 33% k8s-node-04 644m 4% 6238Mi 19% k8s-node-05 620m 3% 9058Mi 28% k8s-node-06 196m 4% 5436Mi 69尽信书则不如无书。还是多看一下集体环境的日志。而后标注一下集体集群的批改中央。更快的定位问题,并解决问题! ...

July 31, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes通过containerd访问registry的30443端口

问题形容因为Kubernetes默认状况下只凋谢30000-32767这些端口,然而docker-registry在部署在Kubernetes中的时候conrainerd拜访就会呈现端口不匹配的问题,次要起因是containerd默认状况下HTTPS形式的拜访端口为443,然而依照Kubernetes默认的设置,docker-registry在部署的时候对外裸露的端口在30000-32767之间,因而要么批改Kubernetes默认的端口开启443端口,要么让containerd在拜访HTTPS的默认端口为30000-32767之间。 解决方案一. 批改Kubernetes默认端口范畴#解决办法为批改apiserver的启动参数vim /etc/kubernetes/manifests/kube-apiserver.yaml# 增加如下配置- --service-node-port-range=1-65535上述配置为将默认端口都凋谢,然而这种解决方案存在安全性问题,因而不举荐应用。 二. 批改containerd源码使得HTTPS默认端口为指定值1. 在Kubernetes中部署docker registry的时候向外裸露的端口设置为30443(也能够设置其余值)部署过程看我另外一篇文章:https://blog.csdn.net/weixin_... docker-registry.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: docker-registry namespace: defaultspec: selector: matchLabels: app: docker-registry spec: nodeSelector: kubernetes.io/hostname: master1 containers: - name: docker-registry image: docker.io/library/registry:2.7.1 imagePullPolicy: IfNotPresent ports: - containerPort: 8443 env: - name: REGISTRY_HTTP_ADDR value: "0.0.0.0:8443" - name: REGISTRY_HTTP_TLS_CERTIFICATE value: "/certs/Yuan.crt" - name: REGISTRY_HTTP_TLS_KEY value: "/certs/Yuan.key" - name: REGISTRY_AUTH value: "htpasswd" - name: REGISTRY_AUTH_HTPASSWD_PATH value: "/auth/htpasswd" - name: REGISTRY_AUTH_HTPASSWD_REALM value: "Registry Realm" volumeMounts: - name: reg-data mountPath: /vat/lib/registry - name: reg-auth mountPath: /auth - name: reg-certs mountPath: /certs volumes: - name: reg-data hostPath: path: /home/docker-registry/images - name: reg-auth hostPath: path: /home/docker-registry/auth - name: reg-certs hostPath: path: /home/docker-registry/certs---apiVersion: v1kind: Servicemetadata: name: docker-registry namespace: defaultspec: type: NodePort ports: - port: 8443 targetPort: 8443 nodePort: 30443 protocol: TCP selector: app: docker-registry# 部署$ kubectl apply -f docker-registry.yaml# 查看Pod$ kubectl get po# 查看svc,这里就能够看到docker registry对外裸露的端口号为30443$ kubectl get svc2. 尝试拉取镜像通过命令: ...

July 30, 2021 · 2 min · jiezi

关于kubernetes:kubeadm方式搭建k8s环境

1.环境信息三台centos7.9虚机 192.168.56.102 node1 (2个cpu)192.168.56.103 node2192.168.56.104 node3 设置三台机器间免密登录 ssh-keygen -t rsa~/.ssh/cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keyschmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keysssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@node1批改主机名 hostname node1 //长期批改hostnamectl set-hostname node1 //永恒批改禁用防火墙 systemctl stop firewalldsystemctl disable firewalld禁用selinux setenforce 0 //长期敞开sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config //永恒敞开禁用缓冲区 swapoff -a/etc/fstab //正文swap装置docker 装置工具和驱动 yum install -y yum-utils device-mapper-persistent-data lvm2增加yum源yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo启用源yum-config-manager --enable docker-ce-nightly卸载历史版本yum remove docker docker-common docker-selinux docker-engine docer-io装置dockeryum install docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io-19.03.15 -y //指定版本为19.03 启动dockersystemctl start dockersystemctl enable docker批改/etc/docker/daemon.json ...

July 29, 2021 · 3 min · jiezi

关于kubernetes:Forrester-首席分析师对话阿里云容器服务负责人容器的未来趋势是什么

简介:Digital Beats 顶峰对话,深度解读容器畛域倒退。云原生容器次要趋势是什么?什么推动了Kubernetes 企业级落地?1、直播主题《深度解读容器畛域倒退》 2、直播工夫 7月20日 10:00 3、直播嘉宾 Forrester 首席分析师 Jeffrey Hammond、阿里云容器服务负责人易立, 独特解读容器技术以及容器倒退的新思路。 4、直播简介 Digital Beats 顶峰对话,深度解读容器畛域倒退。 云原生容器次要趋势是什么? 什么推动了Kubernetes 企业级落地? 听听阿里云容器服务负责人易立和 Forrester Jeffrey Hammond 的分享。 5、立刻报名点击 https://www.aliyun.com/activity/middleware/ACK,立刻报名流动! 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

July 27, 2021 · 1 min · jiezi

关于kubernetes:阿里云云原生团队招聘来啦

简介:现在,企业上云曾经成为一种必然趋势。与此同时,作为诞生于云计算时代的新技术理念,云原生也让企业用云形式从“上云”到“云上”转变。云原生领有传统 IT 无法比拟的劣势,它能从技术理念、外围架构、最佳实际等方面,帮忙企业 IT 平滑、疾速、渐进式地落地上云之路。能够预测 , 在将来企业放慢数字化转型的过程中 , 云原生肯定会失去最宽泛的利用。 招聘对象** 校招:招聘应届和实习的本硕博同学 社招:招聘有肯定工作教训的本硕博同学 凋谢职位 **Golang 研发工程师 JAVA 研发工程师 C/C++ 研发工程师** 部门介绍咱们是谁 现在,企业上云曾经成为一种必然趋势。与此同时,作为诞生于云计算时代的新技术理念,云原生也让企业用云形式从“上云”到“云上”转变。 云原生领有传统 IT 无法比拟的劣势,它能从技术理念、外围架构、最佳实际等方面,帮忙企业 IT 平滑、疾速、渐进式地落地上云之路。能够预测 , 在将来企业放慢数字化转型的过程中 , 云原生肯定会失去最宽泛的利用。 通过云原生,能够让企业最大化应用云的能力,聚焦于本身业务倒退,也能够让开发者基于云原生的技术和产品,晋升开发效率,并将精力更多地聚焦于业务逻辑实现。云原生正在成为新基建落地的重要技术抓手,只有提前拥抱新基础设施,才不会被时代淘汰。 2020 年,越来越多的企业动摇了上云和实现数字化转型的信念,而云原生技术则是实现数字化转型的最短门路。在过来传统工作形式下,一家企业想应用云原生的技术或产品,须要破费大量精力钻研一些开源我的项目,本人做运维和治理,还须要思考集成、稳定性保障等问题。明天,为了不便企业和开发者应用云原生技术和产品,更好地承受云原生理念,阿里云做了很多工作。 一方面,咱们在外部踊跃推动云原生技术应用,阿里云外部有十分丰盛、大规模的应用场景,通过这些场景充沛打磨云原生技术;另一方面,阿里云领有国内最丰盛的云原生产品家族、最全面的云原生开源奉献以及最大规模的云原生利用实际,去为最大云原生客户群体赋能。在容器、 DevOps、分布式应用、服务网格、数据智能和 Serverless 等畛域,均为企业提供丰盛的技术和产品体系,笼罩八大类别 100 余款产品,满足不同行业和场景的需要。 在这里,你会参加到容器、Kubernetes、Service Mesh、Serverless 等技术研发与摸索中来;你也会与多位技术专家组成云原生技术团队。 在这里,你会参加到寰球顶级的开源我的项目(如 Kubernetes、Containerd、OAM、Apache Dubbo、Nacos、Arthas)研发工作中,一起拓展云技术的边界,既赋能阿里巴巴寰球经济体,更服务全世界的开发者用户。 团队专家: **丁宇(花名:叔同,研究员),云原生利用平台团队负责人。2010 年退出淘宝,9 次参加双 11 作战,阿里高可用架构、双 11 稳定性负责人,阿里容器、调度、集群治理、运维技术负责人,推动和参加了双 11 几代技术架构的演进和降级。 易立(花名:微垣,资深技术专家),目前负责阿里云区块链服务和容器服务的研发工作。之前曾在IBM中国开发核心工作,负责资深技术专员;作为架构师和次要开发人员负责或参加了一系列在云计算、区块链、Web 2.0,SOA畛域的产品研发和翻新。本科和硕士毕业于北京大学。 张磊(高级技术专家),Kubernetes我的项目资深成员和联结维护者,次要关注容器运行时接口(CRI)、调度、资源管理和基于虚拟化技术的容器运行时等个性,独特负责Kubernetes上游和阿里团体大型集群管理系统的工程工作,曾就任于微软研究院(MSR)和KataContainers团队。 ...

July 27, 2021 · 1 min · jiezi

关于kubernetes:基于k8s多集群隔离环境下的devops实现

简介:本计划应用两个独立的k8s集群:用户已有的k8s模仿测试,ack集群模仿生产环境,保障环境的高度隔离,互不影响。通过gitlab+Jenkins的黄金组合,实现容器利用的自动化构建和继续部署,进步迭代效率。 中转最佳实际:【基于k8s多集群隔离环境下的devops实现】 云栖号最佳实际:【点击查看更多上云最佳实际】 这里有丰盛的企业上云最佳实际,从典型场景入门,提供一系列我的项目实际计划,升高企业上云门槛的同时满足您的需要! 场景形容DevOps是一组过程、办法与零碎的统称,并通过工具实现自动化部署,确保部署工作的可重复性、缩小部署出错的可能性。随着微服务、中台架构的衰亡,devops重要性日益显著。 本计划应用两个独立的k8s集群:用户已有的k8s模仿测试,ack集群模仿生产环境,保障环境的高度隔离,互不影响。通过gitlab+Jenkins的黄金组合,实现容器利用的自动化构建和继续部署,进步迭代效率。 解决问题1.微服务利用的CI/CD。 2.测试和生产环境的高度隔离。 3.自动化的测试与部署。 4.现有CI对接ACK。 产品列表专有网络VPC容器服务ACK容器镜像服务ACR弹性公网IP负载平衡SLB 中转最佳实际 》》 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

July 26, 2021 · 1 min · jiezi

关于kubernetes:聊聊kubernetes

从一个零碎的上线说起即便是一个最简略的零碎,从代码到线上,从运维到降级都要经验以下生命周期 前端代码编译(不同线上环境抉择不同配置)前端代码打包后端代码编译(不同线上环境抉择不同配置)后端代码打包搭建nginx部署前端代码搭建tomcat部署后端代码前端利用集群后端利用集群配置负载平衡利用监控故障重启滚动降级利用回滚弹性伸缩零碎运维交接这些步骤如果都是人工来做,每一步都存在危险 代码编译(编译程序版本不统一,遗记批改配置文件,生产跑测试的配置)环境搭建(不同环境受限网络环境,操作系统版本等差别,同样的程序在不同环境中可能体现不统一)负载配置(增加节点须要人工操作,节点故障无奈进行故障转移)利用监控(人工监控不事实)故障重启(无奈进行人工操作,人工滞后于故障)滚动降级(无奈进行人工操作)利用回滚(须要在计划层面上预留回滚机制,比方保留之前版本的部署包)弹性伸缩(无奈进行人工操作)运维交接(每个零碎都须要交接,代码仓库,打包办法,部署步骤,重启步骤,降级步骤等)咱们在运维交接过程中碰到十分多代码与线上运行不统一,存在代码失落问题,有可能是之前运维的共事部署后没有提交最新代码,工夫久了代码就找不到,特地是对于长时间没有更新的零碎,咱们无奈保障目前的代码就是最新的代码,代码不统一对运维是灾难性的,总之一句话就是 人是不牢靠的 现实的状况下,开发提交完代码,所有就与他无关 不必由开发人员个人电脑进行编译,编译应该是对立的平台,对立的环境,对立的规范环境不能搭建两次,就像你写两边得帆,就算写上几千几万次,你无奈找到两次齐全一样的集群是自动化的,什么意思呢,集群应该是一个配置项在那,而不是咱们须要针对单机和集群采取齐全不一样的装置形式,部署形式监控是自动化,多样化,可配置,借助图表可能疾速判断零碎问题弹性伸缩也要自动化,可能依据零碎负载状况主动进行伸缩故障重启,利用回滚都是自动化,可能主动重启,部署失败可能主动回滚交接是标准化,所有零碎的交接都是一个模板kubernetes解决了什么问题 保障环境完全一致提供集群配置故障重启弹性伸缩jenkins解决了什么问题 线上编译,打包,部署prometheus解决了什么问题 监控预警告诉如果能做到以上这些自动化,那么交接的内容就是,如果启动这个流程 某我的项目流水线 所有的扭转源于docker任何事物的倒退都须要标准化,今人早在两千多年前就意识到标准化的重要性,秦始皇对立六国后履行车同轨书文同文就是一种标准化,自此中华名族才实现了真正意义上的大一统。聪慧的IT人也在标准化上提出了各种计划 W3C规范制订了互联网规范,从此互联网进入高速倒退阶段JDBC规范让程序员从适配不同数据库的噩梦中解脱J2EE规范让java成为了最风行的后端开发语言TCP/IP协定奠定了互联网的根底等等规范说白了就是对事物的极致形象,那么一个利用的形象是什么呢,利用有太多属性了,拍脑袋就能够列举很多 编程语言不一样运行环境不一样依赖不同的第三方零碎打包编译的形式不一样部署形式不一样重启的形式不一样,systemctl想实现这个指标等等而且这种差异性都不是小问题,都是刀刀要命的大问题,如果不解决利用都无奈失常运行,如果真的硬要形象那么只会导致利用变得更加的简单,聪慧的程序员从集装箱中找到了灵感,货物和利用有很多共通的中央 大小不一样体积不一样运输工具不一样装载形式不一样卸载形式不一样生物的多样性能力让咱们这个星球变得生机勃勃,但多样性也导致了标准化的艰难,人类很聪慧,设计出了集装箱零碎 咱们只运集装箱,你们本人想方法把获取装到集装箱 咱们把利用装到docker中就跟咱们把货物装到集装箱,那么对利用的治理就变为对docker的治理,跟集装箱一样,对货物的治理就变为对集装箱的治理,事件就变得简略多了。 事实上,早在docker之前,咱们就在摸索标准化,比方虚拟机,拷贝虚拟机也能实现相似docker的性能,那为什么这种计划没有流行起来呢,因为虚拟机太重了,货车装羽毛,效率太低了,docker相比虚拟机有很多劣势 轻量级,docker自身占系统资源极少启动快,指的是docker自身启动很快,相比虚拟机而言易迁徙,docker实质就是一个dockerfile的文本文件,虚拟机动不动就是好几个G好治理,只需把握大量命令就能治理利用对于没有接触过docker的同学,你能够了解为超轻量级虚拟机,尽管docker和虚拟机有实质的区别,但能够让你对docker有个初步的印象。 为什么还有kubernetes实际上,在没有kubernetes呈现之前,尽管docker热度很高,然而很少有企业在生产中真正用起来,因为docker解决了大问题,但小问题还有很多 官网没有治理界面,不敌对无奈跨主机通信,导致无奈大规模应用没有监控机制,无奈监控利用状态短少下层服务,docker只提供基础设施短少编排服务,即一个零碎往往须要编写多个dockerfile,尽管前面有composer,但这是后话短少大公司背书说到底,docker解决了利用部署,利用运维这两个大问题,然而利用治理,利用编排,利用监控,弹性伸缩等等这些和利用相干的问题还没解决,kubernetes的呈现才真正意义上实现了大一统,自此docker才真正施展出其微小威力。 从这张图能够看出,kubernetes就是一个docker的管理系统,在架构上处于docker之上,利用之下,往上能够为利用赋能,提供利用多种IT资源,往下,能够调度docker,实现利用的对立治理。kubernetes能为利用提供什么呢,其实就是开篇提到的那些利用开发过程中的问题都能在kubernetes中找到解决方案,比方 提供Deployment解决利用部署的问题提供Service解决利用负载的问题提供ConfigMap解决不同环境配置的问题提供Ingress解决利用拜访的问题提供PersistentVolume解决利用存储问题等等根本你能想到在开发中碰到的非业务问题都能在kubernetes中找到解决方案,kubernetes就像一个利用的小镇一样,为利用提供各种所需资源 五分钟搭建一个kubernetes环境这部分内容次要目标是打消大家对kubernetes的恐怖,不要感觉kubernetes很简单,kubernetes刚公布时的确装置起来比拟麻烦,然而近几年有很多计划让kubernetes装置变得非常简单,只需一行命令就能实现装置 设置主机名#配置主机名hostnamectl set-hostname k1#增加hosts172.16.8.49 k1172.16.8.50 k2#创立用户groupadd dockeruseradd -g docker rkepasswd rke#配置互信ssh-keygenssh-copy-id rke@k2装置dockeryum install dockersystemctl start docker装置kubernetes# 下载rkehttps://github.com/rancher/rke/releases# cluster.ymlnodes:- address: k1 internal_address: k1 role: [controlplane,etcd] hostname_override: k1 user: rke- address: k2 internal_address: k2 role: [worker] hostname_override: k2 user: rkeservices: kubelet: extra_args: max-pods: "10000" kube-api: service_node_port_range: "1-65535"authentication: strategy: x509authorization: mode: rbac# 执行rke up./rke_linux-amd64 up装置kubectlwget https://storage.googleapis.com/kubernetes-release/release/v1.20.5/bin/linux/amd64/kubectlinstall -o rke -g docker -m 0755 kubectl /usr/local/bin/kubectl$ kubectl get nodesNAME STATUS ROLES AGE VERSIONk1 Ready controlplane,etcd 6m53s v1.20.8k2 Ready worker 6m52s v1.20.8装置rancherdocker run --privileged -d --restart=unless-stopped -p 8080:80 -p 4443:443 rancher/rancherkubernetes架构总架构 ...

July 24, 2021 · 4 min · jiezi

关于kubernetes:好消息TDengine的K8s部署方案终于正式落地

好消息!好消息!明天咱们有一个令人激动的好消息要发表! 尽管开局的文风看着有些“震惊党”,然而心愿大家不要介意。因为从明天开始,TDengine终于正式推出了基于K8s上的部署计划。 这么久以来,咱们时常看到用户问什么时候能力看到TDengine在K8s上的部署计划——当初,这一天终于来了。 Kubernetes是一个用于自动化部署、扩大和治理容器化应用程序的开源零碎。作为该畛域的事实标准,K8s能够促成欠缺组件和工具的生态系统,以加重应用程序在私有云或公有云中部署和运维的累赘。 因而,有了K8s的助力,TDengine的性能和轻便性以及弱小的资源利用能力都会锦上添花。 所以,咱们着实有必要“震惊”一下。 (图二来自于:K8s官网文档) 早在2019年,Gartner公司的报告就显示:以后世界的联网设施数在该年曾经超过142亿,预计2021年将达到250亿,如此宏大的设施数量会产生海量的数据。 另一方面,IDC(国内数据中心)的钻研报告称:到2022年,90%的新利用将具备微服务架构,这些架构可进步设计、调试、更新和利用第三方代码的能力,35%的生产利用将是云原生的。 因而,在云原生的场景解决海量的数据是将来的大势所趋。而容器化,作为基础设施和微服务的实践者,可能实现产品的疾速部署迭代,灵便扩容缩容,隔离利用。它的这些特色,正是云原生重要的组成部分。 现在,TDengine终于也正式踏入了这一畛域。 家喻户晓,除了时序数据库之外,TDengine还提供缓存、音讯队列、订阅、流式计算等性能,为物联网、工业互联网大数据的解决提供全栈的技术计划。所以,如果TDengine能失去容器化的加成,对于应用旧有大数据体系工具的用户来说,这样的替换无异于“鸟枪换炮”,应用体验和保护难度都会失去量变级别的优化。 为此,涛思数据提供了一组Docker镜像,并应用这组镜像别离实现了TDengine在minikube及rancher rk2 环境下的部署和测试,初步实现了Helm Chart反对(Chart名称:tdengine, 以后版本 0.1.0,Chart地址:https://github.com/taosdata/TDengine-Operator/raw/main/helm/tdengine-0.1.0.tgz)。 Docker构建流程及Helm源代码托管在 TDengine-Operator 仓库中;初步的中英文文档应用GitHub Pages公布在:https://taosdata.github.io/TDengine-Operator/ 。 中文文档见:https://taosdata.github.io/TDengine-Operator/zh/index.html ; 英文文档见 https://github.com/taosdata/TDengine-Operator/en/index.html 。 在部署过程中,因为数据库节点间存在主从关系之类的独立特色,并不是单纯截然不同的数据节点,即每个节点都是“有状态”的。因而咱们选用的是statefulset(“有状态利用”的控制器)来部署集群。它能提供给pod以稳固的程序,稳固的网络,稳固的存储。这样能够保障数据库节点在复原后不论是数据状态还是网络状态都能够维持原样,从而爱护TDengine集群的稳定性和易维护性。 接下来,利用Docker的entrypoint 个性,咱们每次在减少pod的正本数时,都会通过脚本主动连贯firstEP(即是第一个创立的pod),而后执行“create dnode +新节点的fqdn+端口”。因为statefulset个性使得pod的创立具备程序性,名字具备唯一性,所以咱们用这些个性来辨别不同TDengine节点的地址信息。 综上逻辑,因而在操作的时候,咱们只须要在控制器的yaml中指定正本(replica)数量,就能够间接失去一个相等数量的数据库集群,从而实现TDengine集群的疾速搭建。 示范如下: 与之相似,咱们只需依照文档操作,在线调整正本数就能够不便的动静扩容和缩容,非常便捷。但因为文章篇幅无限,不能赘述太多。所以,如果想理解更多其余TDengine在K8s上的部署形式和实现,欢送大家浏览:https://taosdata.github.io/TDengine-Operator/并本人实操一番。该文档对一些错误操作和部署时须要注意的细节也做了阐明。 附上本计划作者、涛思数据工程师霍琳贺想对大家说的话: 为了反对TDengine在Kubernetes上的部署,特编写此文档。此文档齐全开源,源码托管在 taosdata/TDengine-Operator,并欢送所有人对此文档进行批改,您能够间接提交Pull Request,也能够增加 Issue,任何一种形式都将是咱们的荣幸。TDengine欠缺离不开社区的共同努力,谢谢! 在本文档中,咱们将从部署一套Kubernetes环境开始,介绍如何启动Kubernetes,并在Kubernetes上从头部署TDengine集群,简略介绍如何在K8s环境中进行TDengine集群的扩容和缩容,其中咱们未能残缺反对的中央也会有阐明,可能呈现问题的操作也作了简要的提醒。 如果在实际操作过程中遇到问题,您总是能够通过官网微信 tdengine 分割到咱们。 如您所见,TDengine还在一直地优化本人的生态和性能,感激大家一路以来的反对与陪伴。

July 23, 2021 · 1 min · jiezi

关于kubernetes:快速集成Citrix-ADC与Istio实现微服务应用内的流量优化

简 介随着微服务网络的变动和增长,它们之间的交互可能难以治理和了解。这就是为什么将服务网格作为独自的基础架构层很不便的起因。服务网格是一种大规模解决微服务的办法。它能够解决路由和终止流量、监控和跟踪,服务交付和路由、负载平衡、断路(circuit breaking)以及互相认证。服务网格采纳了这些组件,并使它们成为基础架构层的一部分,从而无需开发人员编写反对这些性能的特定代码。 Istio是一个非常受欢迎的开源服务网格,曾经内置在Rancher Kubernetes治理平台中。这一集成使得开发人员能够专一于业务逻辑,而其余的能够交给Kubernetes和Istio解决。 Citrix ADC(https://www.citrix.com/products/citrix-adc/platforms.html)是针对单体和基于微服务的利用的综合利用交付和负载平衡解决方案。其高级流量治理性能能够进步利用性能并提供全面的安全性。Citrix ADC与Istio集成,作为服务网格环境的Ingress网关,并作为sidecar proxy来管制微服务间的通信。这一集成能够让你严格爱护和优化进入基于微服务的应用环境及其外部的流量。Citrix ADC的Ingress部署被配置为Kubernetes服务的负载均衡器。作为sidecar proxy,Citrix ADC解决服务到服务的通信,并使这种通信牢靠、平安、可察看和可治理。 在本文中,咱们将探讨Citrix ADC作为Istio Ingress 网关和sidecar proxy与在Rancher上部署的Istio服务网格的集成。咱们将引入新的catalog模板,用于部署Citrix ADC作为Ingress网关和sidecar proxy injector。 Rancher catalog为DevOps工程师提供了一个UI平台,以部署和运行具备监控、审计和日志等开箱即用性能的应用程序。你能够在Rancher Catalog中找到Citrix Istio ingress网关和sidecar注入器。 将Citrix ADC作为Istio的ingress网关Istio ingress网关作为输出流量的入口点,确保对服务网格的访问控制。它还执行路由和负载平衡。Citrix ADC CPX、MPX 或 VPX 可部署为ingress网关,以管制 Istio服务网格的ingress流量。 Citrix ADC MPX或VPX作为Ingress 网关 在Rancher Catalog中Citrix ADC VPX/MPX作为Ingress网关 当 Citrix ADC MPX/VPX 作为 Ingress Gateway 设施部署时,Istio-adaptor 容器次要在 Ingress Gateway 部署治理的 pod 内运行。 Citrix ADC CPX作为Istio Ingress网关 当 Citrix ADC CPX 部署为 Ingress Gateway 时,CPX 和 Istio-adaptor 均作为容器在 Ingress Gateway Pod 中运行。 ...

July 23, 2021 · 2 min · jiezi

关于kubernetes:Flink-112-资源管理新特性

简介:介绍 Flink 1.12 资源管理的一些个性,包含内存治理、资源调度、扩大资源框架。 本文由社区志愿者陈政羽整顿,Apache Flink Committer、阿里巴巴技术专家宋辛童,Apache Flink Contributor、阿里巴巴高级开发工程师郭旸泽分享,次要介绍 Flink 1.12 资源管理的一些个性。内容次要分为 4 局部: 内存治理资源调度扩大资源框架将来布局GitHub 地址 https://github.com/apache/flink 欢送大家给 Flink 点赞送 star~ 一、内存治理首先回顾 Flink 的内存模型变迁。下图右边别离为 Flink 1.10、Flink 1.11 引入的新的内存模型。只管波及的模块较多,但 80% - 90% 的用户仅需关注真正用于工作执行的 Task Heap Memory、Task Off-Heap Memory、Network Memory、Managed Memory 四局部。 其它模块大部分是 Flink 的框架内存,失常不须要调整,即便遇到问题也能够通过社区文档来解决。除此之外,“一个作业到底须要多少内存能力满足理论生产需要” 也是大家不得不面临的问题,比方其余指标的性能应用、作业是否因为内存不足影响了性能,是否存在资源节约等。 针对上述内容,社区在 Flink 1.12 版本提供了一个全新的, 对于 Task manager 和 Job manager 的 Web UI。 在新的 Web UI 中,能够间接将每一项监控指标配置值、理论应用状况对应到内存模型中进行直观的展现。在此基础上,能够更分明的理解到作业的运行状况、该如何调整、用哪些配置参数调整等 (社区也有相应的文档提供反对)。通过新的 Web UI,大家能更好的理解作业的应用状况,内存治理也更不便。 1. 本地内存(Managed Memory)Flink 托管内存实际上是 Flink 特有的一种本地内存,不受 JVM 和 GC 的治理,而是由 Flink 自行进行治理。 ...

July 22, 2021 · 5 min · jiezi

关于kubernetes:Kubernetes实战高可用集群的搭建和部署

摘要:官网只提到了一句“应用负载均衡器将 apiserver 裸露给工作节点”,而这恰好是部署过程中须要解决的重点问题。本文分享自华为云社区《Kubernetes 高可用集群落地二三事》,作者:zuozewei。 一、高可用拓扑能够设置 HA 集群: 应用重叠(stacked)管制立体节点,其中 etcd 节点与管制立体节点共存;应用内部 etcd 节点,其中 etcd 在与管制立体不同的节点上运行;在设置 HA 集群之前,应该认真思考每种拓扑的优缺点。 1、重叠(Stacked) etcd 拓扑 次要特点: etcd 分布式数据存储集群重叠在 kubeadm 治理的管制立体节点上,作为管制立体的一个组件运行。每个管制立体节点运行 kube-apiserver,kube-scheduler 和 kube-controller-manager 实例。kube-apiserver 应用 LB 裸露给工作节点。每个管制立体节点创立一个本地 etcd 成员(member),这个 etcd 成员只与该节点的 kube-apiserver 通信。这同样实用于本地 kube-controller-manager 和 kube-scheduler 实例。简略详情:每个 master 节点上运行一个 apiserver 和 etcd, etcd 只与本节点 apiserver 通信。这种拓扑将管制立体和 etcd 成员耦合在同一节点上。绝对应用内部 etcd 集群,设置起来更简略,而且更易于正本治理。然而重叠集群存在耦合失败的危险。如果一个节点产生故障,则 etcd 成员和管制立体实例都将失落,并且冗余会受到影响。能够通过增加更多管制立体节点来升高此危险。应该为 HA 集群运行至多三个重叠的管制立体节点(避免脑裂)。这是 kubeadm 中的默认拓扑。当应用 kubeadm init 和 kubeadm join --control-plane 时,在管制立体节点上会主动创立本地 etcd 成员。2、内部 etcd 拓扑 ...

July 22, 2021 · 7 min · jiezi

关于kubernetes:Kubernetes-11912升级到1209强调一下selfLink

背景:继续降级过程:Kubernetes 1.16.15降级到1.17.17,Kubernetes 1.17.17降级到1.18.20,Kubernetes 1.18.20降级到1.19.12 集群配置:主机名零碎ipk8s-vipslb10.0.0.37k8s-master-01centos710.0.0.41k8s-master-02centos710.0.0.34k8s-master-03centos710.0.0.26k8s-node-01centos710.0.0.36k8s-node-02centos710.0.0.83k8s-node-03centos710.0.0.40k8s-node-04centos710.0.0.49k8s-node-05centos710.0.0.45k8s-node-06centos710.0.0.181. 参考官网文档参照:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/ 2. 确认可降级版本与降级计划yum list --showduplicates kubeadm --disableexcludes=kubernetes通过以上命令查问到1.20以后最新版本是1.20.9-0版本。master有三个节点还是依照集体习惯先降级k8s-master-03节点 3. 降级k8s-master-03节点管制立体仍然k8s-master-03执行: 1. yum降级kubernetes插件yum install kubeadm-1.20.9-0 kubelet-1.20.9-0 kubectl-1.20.9-0 --disableexcludes=kubernetes 2. 凌空节点查看集群是否能够降级仍然算是复习drain命令: kubectl drain k8s-master-03 --ignore-daemonsetssudo kubeadm upgrade plan 3. 降级版本到1.20.9kubeadm upgrade apply 1.20.9 [root@k8s-master-03 ~]# sudo systemctl daemon-reload[root@k8s-master-03 ~]# sudo systemctl restart kubelet[root@k8s-master-03 ~]# kubectl uncordon k8s-master-03node/k8s-master-03 uncordoned[root@k8s-master-03 ~]# kubectl get nodes[root@k8s-master-03 ~]# kubectl get pods -n kube-system 4. 降级其余管制立体(k8s-master-01 k8s-master-02)yum install kubeadm-1.20.9-0 kubelet-1.20.9-0 kubectl-1.20.9-0 --disableexcludes=kubernetessudo kubeadm upgrade nodesudo systemctl daemon-reloadsudo systemctl restart kubelet ...

July 20, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes-11820升级到11912

背景:降级是一件继续的事件:Kubernetes 1.16.15降级到1.17.17,Kubernetes 1.17.17降级到1.18.20 集群配置:主机名零碎ipk8s-vipslb10.0.0.37k8s-master-01centos710.0.0.41k8s-master-02centos710.0.0.34k8s-master-03centos710.0.0.26k8s-node-01centos710.0.0.36k8s-node-02centos710.0.0.83k8s-node-03centos710.0.0.40k8s-node-04centos710.0.0.49k8s-node-05centos710.0.0.45k8s-node-06centos710.0.0.181. 参考官网文档参照:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/ 2. 确认可降级版本与降级计划yum list --showduplicates kubeadm --disableexcludes=kubernetes通过以上命令查问到1.19以后最新版本是1.19.12-0版本。master有三个节点还是依照集体习惯先降级k8s-master-03节点 3. 降级k8s-master-03节点管制立体仍然k8s-master-03执行: 1. yum降级kubernetes插件yum install kubeadm-1.19.12-0 kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes 2. 凌空节点查看集群是否能够降级仍然算是复习drain命令: kubectl drain k8s-master-03 --ignore-daemonsetssudo kubeadm upgrade plan 3. 降级版本到1.19.12kubeadm upgrade apply 1.19.12留神:特意强调一下work节点的版本也都是1.18.20了,没有呈现夸更多版本的情况了 [root@k8s-master-03 ~]# sudo systemctl daemon-reload[root@k8s-master-03 ~]# sudo systemctl restart kubelet[root@k8s-master-03 ~]# kubectl uncordon k8s-master-03node/k8s-master-03 uncordoned 4. 降级其余管制立体(k8s-master-01 k8s-master-02)sudo yum install kubeadm-1.19.12-0 kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetessudo kubeadm upgrade nodesudo systemctl daemon-reloadsudo systemctl restart kubelet 5. work节点的降级sudo yum install kubeadm-1.19.12-0 kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetessudo kubeadm upgrade nodesudo systemctl daemon-reloadsudo systemctl restart kubelet ...

July 19, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-11717升级到11820

背景:参照:https://www.yuque.com/duiniwukenaihe/ehb02i/kdvrku 实现了1.16.15到1.17.17 的降级,当初降级到1.18版本 集群配置主机名零碎ipk8s-vipslb10.0.0.37k8s-master-01centos710.0.0.41k8s-master-02centos710.0.0.34k8s-master-03centos710.0.0.26k8s-node-01centos710.0.0.36k8s-node-02centos710.0.0.83k8s-node-03centos710.0.0.40k8s-node-04centos710.0.0.49k8s-node-05centos710.0.0.45k8s-node-06centos710.0.0.181. 参考官网文档参照:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/https://v1-17.docs.kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/kubeadm 创立的 Kubernetes 集群从 1.16.x 版本升级到 1.17.x 版本,以及从版本 1.17.x 降级到 1.17.y ,其中 y > x。当初持续将版本升级到1.18。从1.16降级到1.17有点了解谬误:1.16.15我认为只能先降级到1.17.15。认真看了下文档是没有这说法的。我就筹备从1.17.17降级到1.18的最新版本了! 2. 确认可降级版本与降级计划yum list --showduplicates kubeadm --disableexcludes=kubernetes通过以上命令查问到1.18以后最新版本是1.18.20-0版本。master有三个节点还是依照集体习惯先降级k8s-master-03节点 3. 降级k8s-master-03节点管制立体仍然k8s-master-03执行: 1. yum降级kubernetes插件yum install kubeadm-1.18.20-0 kubelet-1.18.20-0 kubectl-1.18.20-0 --disableexcludes=kubernetes 2. 凌空节点查看集群是否能够降级特意整一下凌空(1.16.15降级到1.17.17的时候没有整。就当复习一下drain命令了) kubectl drain k8s-master-03 --ignore-daemonsetssudo kubeadm upgrade plan 3. 降级版本到1.18.201. 小插曲嗯操作降级到1.18.20版本 kubeadm upgrade apply 1.18.20嗯有一个work节点没有降级版本仍然是1.16.15版本哈哈哈提醒一下。master节点应该是向下兼容一个版本的。先把test-ubuntu-01节点降级到1.17.17 [root@k8s-master-01 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONk8s-master-01 Ready master 317d v1.17.17k8s-master-02 Ready master 317d v1.17.17k8s-master-03 Ready,SchedulingDisabled master 317d v1.17.17k8s-node-01 Ready node 569d v1.17.17k8s-node-02 Ready node 22d v1.17.17k8s-node-03 Ready node 569d v1.17.17k8s-node-04 Ready node 567d v1.17.17k8s-node-05 Ready node 567d v1.17.17k8s-node-06 Ready node 212d v1.17.17sh02-node-01 Ready node 16d v1.17.17test-ubuntu-01 Ready,SchedulingDisabled <none> 22d v1.16.15tm-node-002 Ready,SchedulingDisabled node 174d v1.17.17tm-node-003 Ready <none> 119d v1.17.17先降级下test-ubuntu-01节点如下(此操作在test-ubuntu-01节点执行): ...

July 16, 2021 · 2 min · jiezi

关于kubernetes:Kubernets-traefik代理ws-wss应用

背景:团队要公布一组利用,springboot开发的ws利用。而后须要对外。反对ws wss协定。jenkins写完pipeline公布工作。记得过来没有上容器的时候都是用的腾讯云的cls 挂证书映射cvm端口。我当初的网络环境是这样的:Kubernetes 1.20.5 装置traefik在腾讯云下的实际(当然了本次的环境是跑在tke1.20.6下面的,都是依照下面实例搭建的---除了我新建了一个namespace traefik,并将traefik利用都装置在了这个命名空间内!这样做的起因是tke的kebe-system下的pod太多了!我有强迫症) 部署与剖析过程:1. 对于我的利用:利用的部署形式是statefulset,如下: cat <<EOF > xxx-gateway.yamlapiVersion: apps/v1kind: StatefulSetmetadata: name: xxx-gatewayspec: serviceName: xxx-gateway replicas: 1 selector: matchLabels: app: xxx-gateway template: metadata: labels: app: xxx-gateway spec: containers: - name: xxx-gateway image: ccr.ccs.tencentyun.com/xxx-master/xxx-gateway:202107151002 env: - name: SPRING_PROFILES_ACTIVE value: "official" - name: SPRING_APPLICATION_JSON valueFrom: configMapKeyRef: name: spring-config key: dev-config.json ports: - containerPort: 8443 resources: requests: memory: "512M" cpu: "500m" limits: memory: "512M" cpu: "500m" imagePullSecrets: - name: tencent---apiVersion: v1kind: Servicemetadata: name: xxx-gateway labels: app: xxx-gatewayspec: ports: - port: 8443 selector: app: xxx-gateway clusterIP: NoneEOFkubectl apply -f xxx-gateway.yaml -n official偷个懒间接copy了一个其余利用的 ingress yaml批改了一下,如下: ...

July 15, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes上应用部署利器之Helm-IDCF

上一篇文章 Kubernetes上利用部署之三步曲 中提到了一句话 Kubernetes上所有皆资源,咱们通过创立pods(deployment),service,ingress三种资源实现了 HelloDevOps利用的部署,一个简略的利用就有了三个yaml文件,然而实在实际中,利用(微服务利用)必定不止一个,这样下来,就会有十多个,甚至几十个yaml文件,如果每次部署都用 kubectl 来对相应的资源进行增(create),删(delete),改(edit),查(get),那么这种治理形式无疑是复杂多变甚至是劫难的,在这种状况下,Kubernetes提供了Helm来让整个流程变得简略起来。 Helm 介绍正如官网所说, Helm is the packagemanager for Kubernetes and Helm is the best way to find,share,and use software built for Kubernetes. 顾名思义,Helm 是kubernetes的包管理器,就像apt-get 与之Ubuntu和yum与之Redhat和Centos。 Helm 基本原理 Helm 是C/S模型,总共有两局部组成: Helm客户端(Helm)和服务器端(Tiller,以2.x版本为例,3.x剔除了tiller)。Helm 客户端是一个CLI,而Tiller是以deployment模式部署在Kubernetes平台的kube-system namespace下。 其中Helm承受来自于用户对于Helm Charts 所生成的Release的增(helm install)、删(helm delete)、改(helm upgrade)、查(helm ls);Tiller次要用来与Kubernetes API server进行交互(因为对于Kubernetes来说,所有申请的入口都是API server),从而实现对于Kubernetes资源的增、删、改、查,另外Tiller还能够对于曾经创立好的Release进行存储与治理。 当用户须要用某一个chart来通过install形式生成一个Release的时候,Helm客户端承受这个install申请,并将申请发个Tiller服务端,Tiller服务端会将chart中的相干文件依据values.yaml中定义的值或者来自于--set前面指定的参数来进行渲染,而后将渲染好的文件发给Kubernetes API server生成相应的资源,最终实现一个Release的创立。 Helm 装置因为Helm有客户端与服务端两局部组成,所以装置分两步走。 第一步:Helm 客户端的装置Helm客户端有源码和二进制码两种装置形式,本文采纳二进制进行装置(二进制装置比拟不便,所以集体举荐用二进制进行装置)。首先在Helm 客户端Release的github页面中,找到与本人OS想匹配的版本进行下载,将下载文件进行解压并将解压之后的二进制文件helm拷贝至指标门路(比方/usr/local/bin/helm),能够用helm help命令来验证helm 客户端是否装置胜利。 第二步:创立Service Account因为在Kubernetes中,对于资源的管制权限是通过RBAC(Role-Based Access Control)来实现的, 而Tiller是在kube-system namespace下的,然而由Tiller治理的Release 是在别的namespace上面的,这种状况下须要给Tiller创立一个相应权限的Service Account,这个Service Account和cluster-admin这个ClusterRole进行绑定,这样确保Tiller可能对于整个cluster各个namespace上面的资源进行list,delete,update等操作。 apiVersion: v1kind: ServiceAccountmetadata: name: tiller namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: tillerroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects: - kind: ServiceAccount name: tiller namespace: kube-system创立完service account,能够在kube-system ns上面查看service account的具体信息 ...

July 14, 2021 · 4 min · jiezi

关于kubernetes:Kubernetes上应用部署之三步曲-IDCF

Kubernetes 演进史 Kubernetes简称K8S(除去结尾的K和结尾的S,两头正好有八个字符,故号称K8S)是谷歌开源的一个全新的基于容器技术的分布式架构计划,同时也是一个全新的容器编排工具。 Kubernetes的前身是谷歌的Borg零碎,始于2003年,它是在谷歌外部应用的一个容器管理系统,它治理着来自数千个不同应用程序的数十万个作业,逾越许多集群,而每个集群领有多达数万台计算机。 2013年,另外一个Omega零碎在谷歌外部利用,Omega能够看作是Borg的延长,在大规模集群治理以及性能方面优于Borg。然而Borg和Omega都是谷歌外部应用的零碎,也就是所谓的闭源零碎。直到2014年,谷歌以开源的模式推出了Kubernetes零碎,同年6月7号在github上实现了第一次提交,随后的7月10号,微软,IBM,Redhat,Docker退出了Kubernetes社区。 在2015年7月Kubernetes正式公布了v1.0版本,直到往年6月19号公布了v1.15版本,而且1.16版本正在缓和开发之中。能够看出短短四年曾经公布了十六个版本,而且速度越来越快。 其实在容器编排畛域除了有Kubernetes,还有Docker Swarm和Mesos,在初期,这三者呈三足鼎立之势,然而当初Kubernetes却一枝独秀,Kubernetes曾经倒退成为一个Kubernetes生态圈,而且以Kubernetes为外围倒退起来的的CloudNative的发展势头也很迅猛。 Kubernetes上部署利用拜访位于Kubernetes平台上的应用程序,用户申请达到Ingress资源,Ingress会依据配置的策略,找到相应的service,因为service和pod是通过labelSelector来实现映射的,所以申请到了service,自然而然就能找到相应的pod,从而申请就到了最终的目的地:运行应用程序的容器。流程简图如下 Kubernetes平台上"所有皆资源",所以如果要部署一个可对外拜访的应用程序,依据上图所示能够跟着上面的三步曲(deployment(Pod)---> Service---> Ingress)创立出deployment,service,ingress三种资源就能够。 第一步:Deployment(Pod)的创立Pod是Kubernetes最根本也最重要的概念,它是Kubernetes平台上资源调度的最小也是最根本单元。利用程序运行在容器内,pod治理着容器,而pod是被调度到node下面的,node能够是一个物理机或者虚拟机。容器,pod,node的关系犹如豌豆株,豌豆荚,豌豆的关系。如下图所示。 一个pod外面能够有多个容器,同一个pod内的多个容器共享pod的资源,比方共享卷,网络等。就像一个豌豆荚外面能够有多个豌豆,同一个豌豆荚外面的几个豌豆共用一个豌豆蒂来排汇养分。pod是运行在Kubernetes node节点上的,一个node下面能够运行多个pod,就像一株豌豆下面有多个豌豆荚。一个Kubernetes cluster个别蕴含多个node,就像一亩地外面个别有多株豌豆。 筹备工作Kubernetes平台上利用程序运行在容器内,容器是用镜像生成的,所以在部署pod之前,咱们先将一个输入 HelloDevOps 的应用程序打包成容器镜像。应用程序的代码如下 package mainimport( "fmt" "log" "net/http" "os")func get_hostname() string{ hostname, _ := os.Hostname() return hostname}func get_env_var() string { version := os.Getenv("VERSION") return version}func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello DevOps, pod name is %s, version is %s",get_hostname(), get_env_var())}func main() { http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe(":9999", nil))}接下来编写Dockerfile FROM golang:1.12.7-alpine3.9MAINTAINER devops008@sina.comWORKDIR /usr/src/appCOPY main.go /usr/src/appEXPOSE 8888CMD ["go","run","main.go"]而后用命令 docker build-t dllhb/go_demo:v1.0&&docker push dllhb/go_demo:v1.0 将镜像push到dockerhub下面,上面能够用此镜像创立一个pod。 ...

July 9, 2021 · 2 min · jiezi

关于kubernetes:TKE1206初探

背景:前几天刚刚测试了一把tke1.18.4:腾讯云TKE1.18初体验 ,明天一看后盾有了1.20.6的版本了。满怀欣慰的想降级一下tke集群的。然而认真一看不反对降级。问了一下tke的小伙伴,要下个月能力反对版本升级。这点让人体验狠不好。新版本收回了。老版本缺不能降级?让老用户感觉到很是被摈弃的感觉。不晓得其余用户是怎么感觉的,反正我是有这样感觉的。闲话少说,搭建一个新的tke1.20.6的版本体验下有那些不同吧! 创立tke1.20.6集群1. 创立集群仍旧同1.18.4一样,当然了还是特别强调下容器的网络CIDR肯定不要与其余集群或者vpc网络重合,当然了 vpc-cni有工夫我也想体验一下零碎仍然抉择了ubuntu1.18.4,高级设置kube-proxy抉择了ipvs的代理形式 2. 节点命名个性化下一步抉择master 节点我抉择了现有的三台服务器,work节点没有先退出抉择了临时不增加服务器的配置发现了一个陈腐的不一样,不晓得是过来就有没有留神还是新增加的了,居然能够自定义主机名了?过来的tke集群都是以ip形式显示的看着很不喜爱参照文档:https://cloud.tencent.com/document/product/457/32189,主机名居然能够自定义了?很是开心我将主机名自定义为ap-shanghai-k8s-master-{R:01}(其实我想要个0结尾的 01 02 03这样的) 3. 平安组的报错组件配置我就没有抉择貌似就只有默认的cbs组件了,而后点实现的时候就呈现了上面的报错:security group quota exceeded 狐疑是平安组的问题,我就把3台master &etcd的节点退出到了tke1.18的集群(其实这样也不残缺,认真看了一眼那个平安组是172.19.0.0/16的放行,我这个cidr应该是172.22.0.0/16)。仍然不行....为了下tke的小伙伴:嗯 我的平安组满了,看了一眼我的平安组规定有70条,貌似满了?不论了先删掉了几条无用的平安组。从新点实现 OK了。发现原来tke是本人会创立平安组的!期待master初始化实现如下:看着难受多了总算不是再以ip为命名规定了!。然而我还是想加01 02的命名规定哎,怎能够搞一下呢? 4. 增加work节点再退出三台work工作节点:也批改了一下主机名自定义了一下:ap-shanghai-k8s-node-{R:01}.期待实现难受多了 master的总算能够在前了看着难受多了看了一眼这初始服务可真多啊,有点烦...... 5. 装置几个插件:这两个貌似是2选一的,要害插件装置都只能同时装置一个最终装置了如下: 谈一下体验感触:节点名称能够自定义了对tke的用户体验来说是一个提高。当然了还有我想命名形式为01 02 03的这种命名形式可不可以反对呢?我就想占位。tke与腾讯云其余产品间的联合还是不晦涩,如我碰到的平安组问题。可不可以在用户创立集群过程中让用户看到平安组的配置?让我主动或者抉择主动生成?让用户晓得有那么一个步骤呢?插件的装置也很诡异:为什么我不能同时进行多个工作?我想同时装置多个插件。每次点一个确认期待。来回切页面很是麻烦。当然了最让老用户悲观的是你开明了1.20.6版本。为什么不同时上线1.18.4版本的降级呢?这对老用户是一种冷清,对于我来说这是最不称心的中央。心愿能将更新版本和公布新版本同时上线。用户能够抉择不更新,然而能够更新是对老用户的器重。当然了 还有我从1.18开始就关怀的:独立部署集群master节点的增加删除性能。筹备迁徙一下elastic on kubernetes集群跑一下看看。当然了还有其余服务。(然而这个版本升级滞后于新版本公布,还有master节点减少删除不让我本人能管制,让我还是不想迁徙)

July 8, 2021 · 1 min · jiezi

关于kubernetes:技术分享-kubernetes-operator-简介

作者:沈亚军 爱可生研发团队成员,负责公司 DMP 产品的后端开发,喜好太广,三天三夜都说不完,低调低调... 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 k8s operator 介绍k8s Operator 是一种用于特定利用的控制器,可扩大 Kubernetes API 的性能,来代表 k8s 用户创立、配置和治理简单利用的实例,它基于根本 k8s 资源和控制器概念构建,但又涵盖了特定畛域或利用的常识,用于实现其所治理的利用生命周期的自动化,常见的有 etcd-operator、prometheus-operator 等,以下是 k8s operator 执行的一些最常见性能的列表: 部署指定配置和数量的利用对利用进行扩缩容启动降级、主动备份和故障复原执行任何其余能够作为代码出现的治理利用的工作operator 工作原理k8s operator 是应用自定义资源(CR)治理利用及其组件的自定义 k8s 控制器,自定义资源是 k8s 中的 API 扩大机制。自定义资源定义(CRD)会申明 CR 并列出 Operator 用户可用的所有配置 当 operator 被部署到 k8s 集群中会通过连贯 master 节点的 API server 监听特定资源类型的事件并基于用户在 CR 中提供的配置和嵌入在 operator 解决逻辑采取对应的操作,进行循环解决确保以后该资源的状态与现实状态相符 编写一个简略的 operatoroperator SDK 是 CoreOS 公司开发和保护的用于疾速创立 operator 的工具,能够ß助咱们疾速构建 operator 利用,相似的工具还有: KUDO (Kubernetes 通用申明式 Operator)kubebuilder,kubernetes SIG 在保护的一个我的项目Metacontroller,可与 Webhook 联合应用,以实现本人的性能接下来会应用 operator-sdk 构建一个简略的 operator 我的项目 ...

July 7, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes集群添加运行containerd-runtime的-work节点

背景:kuberadm搭建的1.15的初始集群,参见:2020-07-22-腾讯云-slb-kubeadm高可用集群搭建,嗯前面进行了继续的降级:2019-09-23-k8s-1.15.3-update1.16.0,1.16版本最初继续小版本升级到了1.16.15(小版本升级唯写降级过程)。最初降级版本到了1.17.17:Kubernetes 1.16.15降级到1.17.17。打算前面还是会继续降级到最新的1.21的。只不过最近线上有我的项目在测试。降级局部先暂停,近期筹备先扩容一下集群。因为搭建1.20.5集群测试的时候应用了containerd跑了下也还好。就想增加一个containerd的 work节点了。前面有工夫逐渐替换环境内的模块。当然了节点替换次要是晚期的work节点都采纳了8外围16G内存的腾讯云cvm。开始的时候资源还是能满足的,到了当初了pod的资源通过压测和各种测试都逐渐调高了资源的request 和 limit。相应的,资源的调度优化方面节点就有些超卖oom的问题了,就筹备增加下16外围32G内存的cvm节点!当然了master节点和其余work节点的docker runtime节点还没有进行替换! work节点根本信息:零碎ip内核centos8.210.0.4.484.181. work节点初始化:根本参照:centos8+kubeadm1.20.5+cilium+hubble环境搭建实现零碎的初始化。 1. 更改主机名:hostnamectl set-hostname sh02-node-01先说一下本人的集群和命名:各种环境位于腾讯云上海区。线上kubernetes环境位于私网下上海3区,命名规定是k8s-node-0x。这次的10.0.4.48位于上海2区。辨别下区域命名吧....就sh02-node-0x命名吧。当前不同区域的就间接sh0x去辨别吧。还是有必要辨别下区域的(过来太集中与上海3区了,当初也必要打乱下区域,减少一些容灾的可能性....然而腾讯云的网络貌似没有什么用,之前出问题也根本都出问题了...当前如果能业务量上来还是搞一下啊多地区或者多云的环境)。 2. 敞开swap替换分区swapoff -ased -i 's/.*swap.*/#&/' /etc/fstab3. 敞开selinuxsetenforce 0 sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config4. 敞开防火墙systemctl disable --now firewalldchkconfig firewalld off5. 调整文件关上数等配置cat> /etc/security/limits.conf <<EOF* soft nproc 1000000* hard nproc 1000000* soft nofile 1000000* hard nofile 1000000* soft memlock unlimited* hard memlock unlimitedEOF6. yum updateyum updateyum -y install gcc bc gcc-c++ ncurses ncurses-devel cmake elfutils-libelf-devel openssl-devel flex* bison* autoconf automake zlib* fiex* libxml* ncurses-devel libmcrypt* libtool-ltdl-devel* make cmake pcre pcre-devel openssl openssl-devel jemalloc-devel tlc libtool vim unzip wget lrzsz bash-comp* ipvsadm ipset jq sysstat conntrack libseccomp conntrack-tools socat curl wget git conntrack-tools psmisc nfs-utils tree bash-completion conntrack libseccomp net-tools crontabs sysstat iftop nload strace bind-utils tcpdump htop telnet lsof7. ipvs增加(centos8内核默认4.18.内核4.19不包含4.19的是用这个):> /etc/modules-load.d/ipvs.confmodule=(ip_vsip_vs_rrip_vs_wrrip_vs_shbr_netfilter )for kernel_module in ${module[@]};do /sbin/modinfo -F filename $kernel_module |& grep -qv ERROR && echo $kernel_module >> /etc/modules-load.d/ipvs.conf || :done内核大于等于4.19的 ...

July 7, 2021 · 3 min · jiezi

关于kubernetes:Kubernetes中域名解析的异常问题分析

背景:自建kubernetes1.16集群,服务利用晚期多为php利用。docker封装nginx+php-fpm根底镜像,将代码打包成image jenkins进行ci/cd构建。php利用中呈现大佬域名解析失败的报错.....what?开始狐疑过kubernets版本问题,也狐疑过网络组件。然而未能找到起因。明天正好百度搜寻材料时候偶尔看到:https://www.it1352.com/589254.html,看到他下面解决的curl调取破费工夫过长的时候curl指定了CURL_IPRESOLVE_V4。就顺便想了下...是了。我的集群没有禁用ipv6!划重点了: 如果开启了IPv6,curl默认会优先解析 IPv6,在对应域名没有 IPv6 的状况下,会期待 IPv6 dns解析失败 timeout 之后才按以前的失常流程去找 IPv4 对于解决方案:本人简略想一想也有两种解决形式: work节点禁用ipv6.php代码指定CURL_IPRESOLVE_V4。 动手解决:1.对于work节点禁用ipv6参照:https://blog.csdn.net/wh211212/article/details/80996364我是间接sysctl设置禁用IPv6的形式了,不想重启集群节点! 在/etc/sysctl.conf中增加以下行net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1# 或者执行sed -i '$ a\net.ipv6.conf.all.disable_ipv6 = 1\nnet.ipv6.conf.default.disable_ipv6 = 1' /etc/sysctl.conf要使设置失效,请执行sysctl -p2. 对于php代码的批改参照:https://www.jb51.net/article/39788.htm,间接扔给php小伙伴了....毕竟我也不会php。 其余能够参考的:1. k8s – coredns禁用ipv6解析2. 容器中应用nscd缓存优化 DNS 解析[](https://my.oschina.net/u/2322...

July 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-11615升级到11717

背景:线上kubernetes环境应用kubeadm搭建.过后应该是1.15的kubeadm搭建的。稳固运行了近两年的工夫。其中降级了一次大版本从1.15降级到1.16。进行过屡次小版本升级。当初的版本为1.16.15。两头也曾想降级过版本到更高的版本,然而降级master的时候出现异常了,还好是三节点的master集群,就复原到了1.16的版本。始终没有进行更高版本的降级。昨天总算是对集群下手降级了...... 集群配置主机名零碎ipk8s-vipslb10.0.0.37k8s-master-01centos710.0.0.41k8s-master-02centos710.0.0.34k8s-master-03centos710.0.0.26k8s-node-01centos710.0.0.36k8s-node-02centos710.0.0.83k8s-node-03centos710.0.0.40k8s-node-04centos710.0.0.49k8s-node-05centos710.0.0.45k8s-node-06centos710.0.0.18Kubernetes降级过程1. 参考官网文档参照:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/https://v1-17.docs.kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/kubeadm 创立的 Kubernetes 集群从 1.16.x 版本升级到 1.17.x 版本,以及从版本 1.17.x 降级到 1.17.y ,其中 y > x 2. 确认可降级版本与降级计划yum list --showduplicates kubeadm --disableexcludes=kubernetes因为我的kubeadm版本是1.16.15 那我只能先降级到1.17.15 而后从1.17.15降级到1.17.17(先不思考降级更高版本)。master节点有k8s-master-01 k8s-master-02 k8s-master-03三个节点,集体习惯个别不喜爱先动第一个,就间接从第三个节(sh-master-03)点动手了...... 3. 降级k8s-master-03节点管制立体yum install kubeadm-1.17.15-0 --disableexcludes=kubernetes sudo kubeadm upgrade plan嗯 能够降级到1.17.17?试一下 kubeadm upgrade apply v1.17.17不能降级到1.17.17 然而能够到1.17.16?然而要先降级kubeadm。怎么会是这样呢?如下是能够1.y到1.y+1版本的。 kubeadm upgrade apply v1.17.15 yum install -y kubelet-1.17.15-0 kubectl-1.17.15-0 --disableexcludes=kubernetes systemctl daemon-reloadsudo systemctl restart kubelet嗯还是没有搞明确怎么就还是到1.17.16版本了,无伤大雅了。就先这样了!注:当然了为了防止出现问题,应该是先把 /etc/kubernetes文件门路下配置文件备份一下! 4. 降级其余管制立体(k8s-master-02 k8s-master-03)其余两个master节点都执行一下命令: yum install -y kubeadm-1.17.15-0 --disableexcludes=kuberneteskubeadm upgrade nodeyum install -y kubelet-1.17.15-0 kubectl-1.17.15-0 --disableexcludes=kubernetessystemctl daemon-reloadsudo systemctl restart kubelet登陆任意一台master节点: ...

July 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-运行java程序无法使用jmapjstack的解决方案

背景:根底环境centos8+kubeadm1.20.5+cilium+hubble环境搭建,线上次要跑的php nodejs java的环境。java的pod昨天频繁呈现了cpu 90%的占用率告警:尽管cpu是可压缩资源(compressible resources ),利用只会饥饿,不会像是内存爆了一样OOM.然而也须要进行一下性能剖析,看一眼是代码逻辑有问题,还是资源分配的大小不合理。 就想传统的形式进入容器查看pid,运行jstack命令进行剖析了: kubectl exec -it xxx-xxxx-8556c7f98b-9nh28 sh -n official/ # psPID USER TIME COMMAND 1 root 2h38 java -Djava.security.egd=file:/dev/./urandom -jar /xxx-1.0-SNAPSHOT.jar 4178 root 0:00 sh 4193 root 0:00 ps/ # jstack 11: Unable to get pid of LinuxThreads manager threadwhat jstack命令无奈剖析利用...... 解决过程:百度搜寻了一下,参见:https://blog.csdn.net/qq_16887777/article/details/107417059 1. 对于pid1发现服务的pid=1,网上查问得悉pid1-5为Linux的非凡过程。pid=1 :init过程,系统启动的第一个用户级过程,是所有其它过程的父过程,疏导用户空间服务。 pid=2 :kthreadd:用于内核线程治理。 pid=3 :migration,用于过程在不同的CPU间迁徙。 pid=4 :ksoftirqd,内核里的软中断守护线程,用于在零碎闲暇时定时解决软中断事务。 pid=5 :watchdog,此过程是看门狗过程,用于监听内核异样。当零碎呈现宕机,能够利用watchdog过程将宕机时的一些堆栈信息写入指定文件,用于预先剖析宕机的起因。依据排除法最简略的形式就是让java启动的过程pid不是1-5就能够了?嗯启动命令不是第一个。 2. 批改Dcokerfile java启动形式高低我的Dockerfile FROM openjdk:8-jdk-alpineVOLUME /tmpENV TZ=Asia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneADD target/diversion-0.0.1-SNAPSHOT.jar diversion-0.0.1-SNAPSHOT.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/xxxx-0.0.1-SNAPSHOT.jar"]嗯集体认为能够将 java 启动文件写入脚本?而后ENTRYPOINT sh脚本?偶尔看到一个tini的办法:docker运行java程序 应用jmap,jstack命令 tini运行的程序获取过程.批改Dockerfile如下: ...

July 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-traefik-tls证书到期替换

背景:ssl证书都是一年签发的。到了六月份了一年一度的证书替换的日子到了.......。过来的办法始终都是先delete secret,而后持续创立一个新的。这次就突发奇想的,还有其余办法吗......百度了一下还真的搜寻到了:https://blog.csdn.net/cyxinda/article/details/107854881我的证书是在腾讯云下面购买的 TrustAsia 域名型(DV)通配符(1 年)的 ssl证书。思考到老本毕竟申请的dv的泛域名证书。对于dv ov证书的区别: 此图片来源于网络 对于secret tls的创立形式对于secret能够参照https://kubernetes.io/zh/docs/concepts/configuration/secret/。kubernetes官网文档。这里就间接创立一下tls secret 了在腾讯云平台ssl治理页面https://console.cloud.tencent.com/ssl找到相干证书并点击下载将证书下载到本地。将证书上传到服务器,并解压zip文件。解压后的文件列表如下我是间接进入Nginx文件夹,文件列表如下:当然了 其余平台申请的证书可能不是这样的(记得阿里云的不是这样的来,能够openssl 转一下吧?) kubectl create secret tls all-xxx-com --key=2_xxx.com.key --cert=1_xxx.com_bundle.crt -n mastertraefik中利用应用证书能够参照:traefik2 装置实现 http https,2019-12-27-traefik.上面进入正题切换批改到期证书...注:以下参考了https://blog.csdn.net/cyxinda/article/details/107854881 几种更换kubernetes中tls证书的形式:1.删除再重建这应该是最常见的...反正我过来是常常用 kubectl delete secret all-xxx.com -n masterkubectl create secret tls all-xxx-com --key=2_xxx.com.key --cert=1_xxx.com_bundle.crt -n master2. 通过--dry-run参数预览,而后applykubectl create secret tls all-xxx-com --key=2_xxx.com.key --cert=1_xxx.com_bundle.crt -n master --dry-run -o yaml |kubectl apply -f -算是温习了一下--dry-run的命令。也比拟优雅。通过apply更新 secret。 3. 我可不可以edit 批改一下 secret中秘钥的内容kubectl edit secret all-xxxcom -n master ...

July 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes中资源的管理与调度

背景:不晓得有没有小伙伴跟我一样在集群创立利用的时候没有具体计算过本人的资源配比。而后我是看到kubectl top node 一看每个节点还有很多的资源,就间接创立了几个资源配比拟高的利用,而且这几个利用是高负载运行的....而后的后果就是集群中好多利用开始解体了...... 为什么要限度资源?1. 对pod进行资源限度,能够避免因为某一个pod利用过多占用资源,造成其余利用异样。2. 资源的无效隔离。3. pod调度的优先级。4. 资源的高效正当利用。Kubernets中的资源分类Kubernetes依据资源是否伸缩进行分类,划分为可压缩资源和不能够压缩资源2种: 1. 可压缩资源(compressible resources )当可压缩资源有余时,Pod 只会“饥饿”,但不会退出。例如 CPU(GPU也是吧?只不过没有搞gpu利用疏忽)2. 不可压缩资源(incompressible resources)当不可压缩资源有余时,Pod 就会因为 OOM(Out-Of-Memory)被内核杀掉。例如:Memory(内存) Disk(硬盘)。注:参见极客工夫磊神的专栏:https://time.geekbang.org/column/article/69678 资源配额治理-LimitRange ResourceQuotaResourceQuotaResourceQuota 用来限度 namespace 中所有的 Pod 占用的总的资源 request 和 limit能够参照:https://kubernetes.io/zh/docs/concepts/policy/resource-quotas/ 1. 计算资源配额(Compute Resource Quata)能够参照:https://kubernetes.io/zh/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/。然而依据磊神:https://time.geekbang.org/column/article/69678中倡议的还是将配置文件写成一下外部通用格局了: cat > ResourceQuota.yaml << EOFapiVersion: v1kind: ResourceQuotametadata: name: cpu-mem namespace: quotaspec: hard: requests.cpu: 1000m requests.memory: 1000Mi limits.cpu: 2000m limits.memory: 2000MiEOF[root@sh-master-01 quota]# kubectl create ns quotanamespace/quota created[root@sh-master-01 quota]# kubectl apply -f ResourceQuota.yaml resourcequota/cpu-mem createdkubectl get resourcequota cpu-mem -n quotakubectl get resourcequota cpu-mem--namespace=quota --output=yaml用官网文档实例创立一个pod测试一下: ...

July 7, 2021 · 9 min · jiezi

关于kubernetes:Kubernetes部署php-应用时候memorylimit的修改

背景:根底环境:centos8+kubeadm1.20.5+cilium+hubble环境搭建,traefik提供对外服务:Kubernetes 1.20.5 装置traefik在腾讯云下的实际。跑了几个根底的php服务。根底镜像是参考的https://github.com/richarvey/nginx-php-fpm搭建。而后php报错:Allowed memory size of 134217728 bytes exhausted (tried to allocate 6291488 bytes)长期须要调整个参数。不想从新打镜像啊。咋整? 1. 问题复查与解决:1. 找出引发报错的配置项首先剖析一下报错:Allowed memory size of 134217728 bytes exhausted (tried to allocate 6291488 bytes)认真看了一眼下面的数字嗯。限度应该是128M。php运行的脚本须要应用134M的资源超了?先进入容器瞄一眼,看看这可能是哪个参数: php -i 初步来看是memory_limit 这个参数限度了128M 2.深刻理解配置项参数设置与含意认真解读了一下memory_limit这个参数:一个PHP工作过程即php-fpm所可能应用的最大内存?而后:两个感觉说的都不是一会事件啊?参照:https://docs.rackspace.com/support/how-to/php-memory-limit/先不去纠结它了。反正就先这样了解了: 避免写得不好的脚本吃掉服务器上所有可用的内存 3. 如何批改参数并验证其是否失效 开始memory_limit这个参数设置的是128M既然不够了,那就先扩一下?查看了下dockerfile这个参数是在start.sh启动脚本中将参数设置为128M的:那我当初要么把start.sh脚本进行批改?or 我可不可以设置一下环境变量?尝试了一下批改yaml文件并重新部署服务,验证如下:ok失效了。环境变量的优先级是大于启动脚本中的变量的? 我是否能够这样了解? 复盘:memory_limit这个参数如何设置适合的范畴?我感觉我设置为256M这个参数略大。这个参数设置大后我的并发线程怎么管制....。我的这些资源会不会不够?引起各种的解体?先把 我容器的内存先扩充一下呢。 其实还是感觉是php脚本写的太烂吃掉了内存......就绝对比较简单的服务。能吃掉那么多内存也是神了。只能让他们找下问题,优化一下脚本。次要是感觉活学活用还的。能用变量的尽量去用变量去做各种配置。防止反复构建根底镜像。

July 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-中部署-Maven-私有仓库-Sonatype-Nexus3

背景:java程序员们想弄一个公有maven仓库,嗯 失常的是用nexus or artfactory? artfactory是两三年前听jfrog的讲座晓得的,程序说他原来用的nexus。那就搞一个nexus了。根底环境参照:https://cloud.tencent.com/developer/article/1806089--kubernetes集群1.20.5版本(当然了进行了小版本升级1.21了,系列笔记中有提)https://cloud.tencent.com/developer/article/1806896--网关层的代理traefikhttps://cloud.tencent.com/developer/article/1806549--存储块腾讯云cbsall on kubernetes 是集体的准则。就在kubernetes的环境上搭建一个公有maven仓库了。 1. nexus3 on kubernetes注: 不做非凡阐明,工具类软件我都装置在kube-ops namespace命名空间下 1. 创立pv,pvc嗯 存储用的都是腾讯云的cbs存储 [root@sh-master-01 ~]# kubectl get storageclassNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEcbs-csi com.tencent.cloud.csi.cbs Delete Immediate false 70dcat pvc.yaml apiVersion: v1kind: PersistentVolumeClaimmetadata: namespace: kube-ops name: sonatype-nexus labels: app: sonatype-nexus spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi storageClassName: cbs-csi selector: matchLabels: app: sonatype-nexuskubectl apply -f pvc.yaml嗯 好吧cbs-csi 不反对selector的标签....将就的用吧...腾讯始终讲本人往年的开源我的项目是最多的,然而如kubernetes-csi-tencentcloud这样的我的项目,三年了吧 提交了issue也没有敞开呢也没有人回复。所以能用就行了...还是适应它吧...... kubectl delete -f pvc.yaml cat pvc.yaml ...

July 7, 2021 · 3 min · jiezi

关于kubernetes:kubernetes部署springboot项目使用configmap尝试

背景:我的根底环境all in kubernetes,参见:https://cloud.tencent.com/developer/article/1806089,https://cloud.tencent.com/developer/article/1811859后端大佬们玩springboot cloud我的项目.故要讲springboot cloud我的项目部署在kubernetes集群中。其实应用springboot cloud价格我还是有所拥护的。看过一些文章如:https://www.cnblogs.com/lakeslove/p/10997011.html。springboot与我的kubernetes有很多的重合性能了。原本就是差不多同时衰亡的我的项目....如果用新的货色 我还是比拟想上服务网格:istio这样的。既然决定springboot cloud on kubernets了 那就先这样玩了......对于打包 都是maven的原本能够间接接手的。然而程序喜爱本人打,我就只在我的项目外面放Dockerfile.只负责镜像层面了:根本就是这个样子,当然了公布环境的时候我原本想写configmap的形式间接让程序去读我的环境变量的......然而程序找我要数据库 redis的连贯地址 账号密码 说要写在 配置文件application.yml中,无果。随他去了。本人拉了一下t我的项目试一下是否能够在springboot中应用configmap的形式。 1. kubernetes部署springboot我的项目应用configmap百度顺手搜了一下啊关键词 springboot kubernetes configmap一堆:比方图上这个,然而都感觉不是我想要的,我就想简略的整下我的变量。而后无意间看到了:https://capgemini.github.io/engineering/externalising-spring-boot-config-with-kubernetes/就依照这个形式来搞一下了:注: 因为就是简略测试下我不想让他们写死文件,其余过程就省了了 我就间接打个包测试下了 1. 将用到的参数变量化参照原配置文件:批改后的:变量名都是本人顺手写的 次要测试成果是否实现。当然了理论的须要和程序对立的还是规范化参数要好的,${}的格局都是。嗯提取了8个参数将其变量化。 2. 生成jar包并构建docker imagedocker打包没有集成在我的jenkins pipeline外面(程序的库,我就不做过多参加了),生成jar包将jar包上传到我一台有docker环境的服务器下面打包成docker image:cat Dockerfile FROM openjdk:8-jdk-alpineVOLUME /tmpADD target/game-1.0-SNAPSHOT.jar game-1.0-SNAPSHOT.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/game-1.0-SNAPSHOT.jar"] docker build -t ccr.ccs.tencentyun.com/xxxx/xxxx:0.2 .docker push ccr.ccs.tencentyun.com/xxxx/xxxx:0.2 3. 生成configmap文件cat spring-boot.yaml apiVersion: v1kind: ConfigMapmetadata: name: spring-configdata: dev-config.json: '{ "redis.database.host": "xxxx", "redis.database.port": "xxxx", "redis.database.password": "xxxx", "mysql.database.url": "jdbc:mysql://xxxx:3306/xxxx", "mysql.database.username": "xxxx", "mysql.database.password": "xxxxx", "cloud.nacos.server-addr": "http://xxxx:8848", "cloud.nacos.discovery.server-addr": "http://xxxx:8848" }'apply部署configmap文件: ...

July 7, 2021 · 2 min · jiezi

关于kubernetes:Kubernetes-1205-upgrade1210后遗症

前因后果:1. 降级后的报警Kubernetes 1.20.5 upgrade 1.21.0,降级实现忽然发现Prometheus discover中两个服务down了,收到微信报警登陆Prometheus控制台一看controller-manager kube-scheduler服务的确是down: 2. 查看服务状态确认相干服务是失常状态登陆集群查看kubectl get pods -n kube-system服务都是失常的。当然了也能够kubectl logs -f $podname -n kube-system去查看一下相干pod的log日志进行确认一下。 3. 定位起因认真一想是不是降级的时候controller-manager kube-scheduler服务的配置文件给降级了呢...记得在搭建Prometheus-oprator的时候手动批改过两个服务的配置文件what认真一想也对...upgrade的时候 它难道把两个配置文件改了? 4. 批改kube-controller-manage kube-scheduler配置文件持续参照:Kubernetes 1.20.5 装置Prometheus-Oprator中1.5 查看controller-manager kube-scheduler服务的配置:注:配置文件门路为:/etc/kubernetes/manifestscat cat kube-controller-manager.yaml 发现--bind-address=127.0.0.1了 复原了初始的设置,在装置Prometheus-oprator的时候将其批改为0.0.0.0的同理批改。批改scheduler配置文件--bind-address=0.0.0.0注: 批改配置文件是针对所有master节点配置文件的。 5. 重启kubelet服务重启 三个master节点kubelet服务:注:我记得应该批改了相干的配置服务 管制立体的相干pods是会重启的吧?重启kubelet只是集体确保一下啊失常...... systemctl restart kubelet期待服务跑起来running...... 6. 确认Prometheus控制台status状态up登陆Prometheus web控制台确认监控恢复正常状态: 问题复盘:必须认同降级是必然的过程。保障集群的衰弱装置须要保障集群的一直updata,当然并不一定是最新的。相干服务的装置批改须要纯熟牢记。就像Prometheus-oprator中controller-manager kube-scheduler服务一样,起码能明确记得批改过两个相干配置文件。确认服务失常后,能够去很明确的查看定位配置文件的批改。监控还是很有必要的,不论你是鄙视还是器重。很大水平下面能够防止更多的失误,作为一个掂量指标

July 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-1205-实现一个服务注册与发现到Nacos

背景:参照 Kubernetes 1.20.5搭建nacos,在kubernetes集群中集成了nacos服务。想体验下服务的注册与发现性能。当然了 也想体验下sentinel各种的集成,反正就是spring cloud alibaba全家桶的残缺体验啊......一步一步来吧哈哈哈。先来一下服务的注册与发现。特地鸣谢https://blog.didispace.com/spring-cloud-alibaba-1/,程序猿DD的系列文章昨天无意间看到的,很不错,曾经珍藏。 一. maven打包构建利用IMAGE镜像留神:以下maven打包构建流程根本copy自https://blog.didispace.com/spring-cloud-alibaba-1/。所以就不做代码的搬运工了。我的项目演示的代码都能够去程序猿DD大佬的github去下载。 关 于服务提供者与服务消费者alibaba-nacos-discovery-server为服务提供者 alibaba-nacos-discovery-client-common为服务消费者强调一下。 1. 构建alibaba-nacos-discovery-server image嗯 还的强调一下服务提供者!这个是...... 因为我集体打包测试是要在kubernets集群中应用,并且跟nacos服务在同一命名空间。连贯nacos这里我就应用了外部服务名。package 打包 target目录下生成alibaba-nacos-discovery-server-0.0.1-SNAPSHOT.jar jar包。上传包到服务器改名app.jar ,复用Dockerfile FROM openjdk:8-jdk-alpineVOLUME /tmpADD app.jar app.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]打包镜像,将镜像上传到镜像仓库(集体应用了腾讯云的公有仓库,当然了也能够本人装置harbor做仓库)。 mv alibaba-nacos-discovery-server-0.0.1-SNAPSHOT.jar app.jardocker build -t ccr.ccs.tencentyun.com/XXXX/alibaba-nacos-discovery-server:0.1 .docker push ccr.ccs.tencentyun.com/XXXX/alibaba-nacos-discovery-server:0.1 2 . 构建libaba-nacos-discovery-client-common image根本步骤与上一步一样: 二. Kubernetes集群部署服务1. 部署alibaba-nacos-discovery-servercat alibaba-nacos-discovery-server.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: alibaba-nacos-discovery-serverspec: replicas: 1 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 selector: matchLabels: app: alibaba-nacos-discovery-server template: metadata: labels: app: alibaba-nacos-discovery-server spec: containers: - name: talibaba-nacos-discovery-server image: ccr.ccs.tencentyun.com/XXXX/alibaba-nacos-discovery-server:0.1 ports: - containerPort: 8001 resources: requests: memory: "256M" cpu: "250m" limits: memory: "512M" cpu: "500m" imagePullSecrets: - name: tencent---apiVersion: v1kind: Servicemetadata: name: alibaba-nacos-discovery-server labels: app: alibaba-nacos-discovery-serverspec: ports: - port: 8001 protocol: TCP targetPort: 8001 selector: app: alibaba-nacos-discovery-serverkubectl apply -f alibaba-nacos-discovery-server.yaml -n nacoskubectl get pods -n nacos登陆nacos治理地址能够发现服务治理-服务列表有alibaba-nacos-discovery-server注册 ...

July 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-1205-Sentinel之alibabasentinelratelimiting服务测试

背景:参照上文 Kubernetes 1.20.5搭建sentinel 。想搭建一个服务去测试下sentinel服务的表现形式。当然了其余服务还没有集成 就找了一个demo,参照:https://blog.csdn.net/liuhuiteng/article/details/107399979。 一. Sentinel之alibaba-sentinel-rate-limiting服务测试1.maven构建测试jar包参照https://gitee.com/didispace/SpringCloud-Learning/tree/master/4-Finchley/alibaba-sentinel-rate-limiting就批改了连贯setinel dashboard的连贯批改为kubernetes集群中setinel服务的service ip与8858端口。maven打包jar包。 2. 构建image镜像其实 idea能够间接打进去image镜像的。当前钻研吧。复用了一下原来做其余springboot的Dockerfile。cat Dockerfile FROM openjdk:8-jdk-alpineVOLUME /tmpADD app.jar app.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]注:我mv了下把打进去的jar包改名为app.jar了...也能够在pom.xml文件中自定义的批改了...... docker build -t ccr.ccs.tencentyun.com/XXXX/testjava:0.3 .docker push ccr.ccs.tencentyun.com/XXXXX/testjava:0.3 3. 部署测试服务cat alibaba-sentinel-rate-limiting.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: testspec: replicas: 1 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: containers: - name: test image: ccr.ccs.tencentyun.com/XXXX/testjava:0.3 ports: - containerPort: 8001 resources: requests: memory: "256M" cpu: "250m" limits: memory: "512M" cpu: "500m" imagePullSecrets: - name: tencent---apiVersion: v1kind: Servicemetadata: name: test labels: app: testspec: ports: - port: 8001 protocol: TCP targetPort: 8001 selector: app: test留神:服务就命名为test了 ...... ...

July 7, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-1205搭建sentinel

背景:后端程序团队筹备一波流springcloud架构,配置核心用了阿里开源的nacos。不出意外的要高一个sentinel做测试了.....。做一个demo开始搞一下吧。kubernetes下面搭建sentinel的案例较少。看下眼还是springcloud全家桶的多点。阿里开源的这一套还是少点。百度或者Google搜寻 sentinel根本进去的都是redis哨兵模式...有点难过。注:搭建形式能够参照:https://blog.csdn.net/fenglailea/article/details/92436337?utm_term=k8s%E9%83%A8%E7%BD%B2Sentinel&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-0-92436337&spm=3001.4430。 一. 搭建sentinel-dashboard:1.自定义创立sentinel-dashboard image镜像嗯 很天经地义了不喜爱用docker镜像这名词了。还是用image吧。下面援用的博客中1.6.1的版本吧 ?搭建跑了下犯了强迫症,最新的版本是1.8.1依据foxiswho大佬的配置文件进行批改下镜像。vim Dockerfile FROM openjdk:11.0.3-jdk-stretchMAINTAINER foxiswho@gmail.comARG versionARG port# sentinel versionENV SENTINEL_VERSION ${version:-1.8.1}#PORTENV PORT ${port:-8858}ENV JAVA_OPT=""#ENV PROJECT_NAME sentinel-dashboardENV SERVER_HOST localhostENV SERVER_PORT 8858ENV USERNAME sentinelENV PASSWORD sentinel# sentinel homeENV SENTINEL_HOME /opt/ENV SENTINEL_LOGS /opt/logs#tme zoneRUN rm -rf /etc/localtime \&& ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime# create logsRUN mkdir -p ${SENTINEL_LOGS}# get the version#RUN cd / \# && wget https://github.com/alibaba/Sentinel/releases/download/${SENTINEL_VERSION}/sentinel-dashboard-${SENTINEL_VERSION}.jar -O sentinel-dashboard.jar \# && mv sentinel-dashboard.jar ${SENTINEL_HOME} \# && chmod -R +x ${SENTINEL_HOME}/*jar# test fileCOPY sentinel-dashboard.jar ${SENTINEL_HOME}# add scriptsCOPY scripts/* /usr/local/bin/RUN chmod +x /usr/local/bin/docker-entrypoint.sh \&& ln -s /usr/local/bin/docker-entrypoint.sh /opt/docker-entrypoint.sh#RUN chmod -R +x ${SENTINEL_HOME}/*jarVOLUME ${SENTINEL_LOGS}WORKDIR ${SENTINEL_HOME}EXPOSE ${PORT} 8719CMD java ${JAVA_OPT} -jar sentinel-dashboard.jarENTRYPOINT ["docker-entrypoint.sh"]注: 大佬的Dockerfile中 裸露的端口是8200,因为看sentinel对外裸露端口都是8518我就把dockerfile批改了。而后把https://github.com/alibaba/Sentinel/releases下载了1.8.1版本的jar包改名为sentinel-dashboard.jar 放在当前目录dc目录能够疏忽,原我的项目copy自https://github.com/foxiswho/docker-sentinelcat scripts/docker-entrypoint.sh ...

July 7, 2021 · 4 min · jiezi

关于kubernetes:Kubernetes-1205搭建nacos

前言: 后端小伙伴们筹备搞pvp对战服务。配置核心选型抉择了阿里云的nacos服务。参照https://nacos.io/zh-cn/docs。因为业务布局都在kubernetes集群上,就简略参照https://nacos.io/zh-cn/docs/use-nacos-with-kubernetes.html做了一个demo让他们先玩一下。对于nacos:参照:https://nacos.io/zh-cn/docs/what-is-nacos.html 服务发现和衰弱监测: 反对基于 DNS 和基于 RPC 的服务发现。服务提供者应用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者能够应用DNS TODO 或HTTP&API查找和发现服务。提供对服务的实时的健康检查,阻止向不衰弱的主机或服务实例发送申请动静配置服务: Nacos 提供配置对立治理性能,可能帮忙咱们将配置以中心化、内部化和动态化的形式治理所有环境的利用配置和服务配置。动静 DNS 服务: Nacos 反对动静 DNS 服务权重路由,可能让咱们很容易地实现中间层负载平衡、更灵便的路由策略、流量管制以及数据中心内网的简略 DNS 解析服务。服务及其元数据管理: Nacos 反对从微服务平台建设的视角治理数据中心的所有服务及元数据,包含治理服务的形容、生命周期、服务的动态依赖剖析、服务的衰弱状态、服务的流量治理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。嗯 还有更多的个性列表...... 一. nacos on kubernetes根本的装置过程参照:https://github.com/nacos-group/nacos-k8s/blob/master/README-CN.md 1. 创立命名空间嗯当然了第一步还是先创立一个搭建nacos服务的namespace了: kubectl create ns nacos2. git clone 仓库 git clone https://github.com/nacos-group/nacos-k8s.git根本都会因为网络起因无奈clone,我是间接下载包到本地 而后上传到服务器了。 3. 部署初始化mysql服务器生产的话必定是用云商的云数据库了,比方腾讯云的rds服务。因为只是给程序整一个demo让他们玩一下,就讲mysql 整合在kubernetes中了。集体存储storageclass都是应用默认的腾讯云的cbs-csi。cd /nacos-k8s/mysql(当然了我是上传的目录门路是/root/nacos/nacos-k8s-master/deploy/mysql) 1. 部署mysql服务cat pvc.yaml apiVersion: v1kind: PersistentVolumeClaimmetadata:name: nacos-mysql-pvcnamespace: nacosspec:accessModes:- ReadWriteOnceresources: requests: storage: 10GistorageClassName: cbs-csimysql的部署文件间接复制了mysql-ceph.yaml的批改了一下:cat mysql.yaml apiVersion: v1kind: PersistentVolumeClaimmetadata:name: nacos-mysql-pvcnamespace: nacosspec:accessModes:- ReadWriteOnceresources: requests: storage: 10GistorageClassName: cbs-csi[root@sh-master-01 mysql]# cat mysql.yaml apiVersion: v1kind: ReplicationControllermetadata:name: mysqllabels: name: mysqlspec:replicas: 1selector: name: mysqltemplate: metadata: labels: name: mysql spec: containers: - name: mysql image: nacos/nacos-mysql:5.7 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "root" - name: MYSQL_DATABASE value: "nacos_devtest" - name: MYSQL_USER value: "nacos" - name: MYSQL_PASSWORD value: "nacos" volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql subPath: mysql readOnly: false volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: nacos-mysql-pvc---apiVersion: v1kind: Servicemetadata:name: mysqllabels: name: mysqlspec:ports:- port: 3306 targetPort: 3306selector: name: mysqlkubectl apply -f pvc.yamlkubectl apply -f mysql.yaml -n nacoskubectl get pods -n nacos期待mysql pods running ...

July 6, 2021 · 3 min · jiezi

关于kubernetes:Kubernetes-1205-安装gitlab

前言:参照https://www.yuque.com/duiniwukenaihe/ehb02i内https://www.yuque.com/duiniwukenaihe/ehb02i/qz49ev之前文章。要实现kubernetes devops工作流的实现。后面曾经搭建了jenkins。gitlab代码仓库也是必不可缺少的。当初搞一下gitlab,对于helm后面也做了具体的讲述,这里略过了。另外之前gitlab版本没有中文版本可参照https://hub.docker.com/r/twang2218/gitlab-ce-zh/ twang2218的汉化版本。当初的gitlab曾经反对多语言了,能够略过。上面就开始装置gitlab。看了一眼helm的装置形式...文章较少。还是决定老老实实yaml形式装置了 1. 创立gitlab搭建过程中所须要的pvc初步布局:存储storageclass是用的腾讯云开源的cbs-csi插件,因为最小值只能是10G,redis postgresql就设置为10G了。特意强调下 pvc指定namespace。昨天手贱装置kubesphere玩下了,后果发现他自带的Prometheus把我的pv,pvc抢占了....不晓得这是cbs的坑还是本人搭建形式有问题。最初用户名明码始终谬误。卸载了,不玩了...... cat gitlab-pvc.yaml apiVersion: v1kind: PersistentVolumeClaimmetadata: name: gitlab-pvc namespace: kube-opsspec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: cbs-csicat gitlab-redis-pvc.yaml apiVersion: v1kind: PersistentVolumeClaimmetadata: name: gitlab-redis-pvc namespace: kube-ops spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: cbs-csicat gitlab-pg-pvc.yaml apiVersion: v1kind: PersistentVolumeClaimmetadata: name: gitlab-pg-pvc namespace: kube-ops spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: cbs-csiapiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: namespace: kube-ops name: gitlab-httpspec: entryPoints: - web routes: - match: Host(`gitlab.saynaihe.com`) kind: Rule services: - name: gitlab port: 80在当前目录下执行 ...

July 6, 2021 · 4 min · jiezi

关于kubernetes:Kubernetes-1205-helm-安装jenkins

初始环境kubeadm 搭建kubenretes 1.20.5 集群如下后面https://www.yuque.com/duiniwukenaihe/ehb02i/dkwh3p的时候装置了cilium hubble的时候装置了helm3.存储集成了腾讯云的cbs块存储网络? traefik代理(纯http,证书都交给腾讯云负载平衡clb了) 筹备集成布局一下cicd还是走一遍传统的jenkins github spinnaker这几样的集成了。先搭建下根底的环境。就从jenkins开始了 1. 再次反复一下helm3的装置1. 下载helm应用程序 https://github.com/helm/helm/releases当初最新版本 3.5.3吧? 找到对应零碎平台的包下载 2. 装置helm上传tar.gz包到服务器(我是master节点随机了都能够的) tar zxvf helm-v3.5.3-linux-amd64.tar.gz mv linux-amd64/helm /usr/bin/helmok helm 装置胜利 2. jenkins的配置与装置2.1. helm 增加jenkins仓库。并pull 下jenkins版本包helm repo add jenkins https://charts.jenkins.iohelm pull jenkins/jenkins#我的版本还是3.3.0其余版本也是同理tar zxvf jenkins-3.3.0.tgz2.2. 依据集体需要更改value.yamlcd jenkins目录,将values.yaml装置集体需要改一下集体就批改了clusterZone和默认存储应用了腾讯云的cbs. 3. helm装置jenkins到指定namespace3.1. 失常的装置过程kubectl create ns kube-opshelm install -f values.yaml jenkins jenkins/jenkins -n kube-ops 3.2. 装置中int 下载插件等待时间过长的坑下载插件很坑,等不了工夫能够把value.yaml文件中装置插件的过程正文掉。正文掉install的插件前面手动装置吧 我是间接正文掉而后删除helm部署程序从新来了一次。 helm delete jenkins -n kube-opshelm install -f values.yaml jenkins jenkins/jenkins -n kube-ops果然正文掉间接就启动了 ...

July 6, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-1205-安装PrometheusOprator

背景线上kubernetes集群为1.16版本 Prometheus oprator 分支为0.4对于Prometheus oprator与kubernetes版本对应关系如下图。可见https://github.com/prometheus-operator/kube-prometheus.注: Prometheus operator? kube-prometheus? kube-prometheus 就是 Prometheus的一种operator的部署形式....Prometheus-operator 曾经改名为 Kube-promethues。对于部署过程能够参考超级小豆丁大佬的笔记:http://www.mydlq.club/article/10/。Prometheus这种架构图,在各位大佬的文章中都能够看到的....... 先简略部署一下Prometheus oprator(or或者叫kube-promethus)。实现微信报警的集成,其余的缓缓在生成环境中钻研。根本过程就是Prometheus oprator 增加存储,减少微信报警,内部traefik代理利用。 1. prometheus环境的搭建1. 克隆prometheus-operator仓库git clone https://github.com/prometheus-operator/kube-prometheus.git网络起因,常常会搞不下来的,还是间接下载zip包吧,其实装置版本的反对列表kubernetes1.20的版本能够应用kube-prometheus的0.6 or 0.7 还有HEAD分支的任一分支。偷个懒间接用HEAD了。记录一下tag,当前有批改了也好能疾速批改了 让版本升级跟得上.....上传zip包解压缩 unzip kube-prometheus-main.zip 2. 依照快捷方式来一遍cd kube-prometheus-main/kubectl create -f manifests/setupuntil kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; donekubectl create -f manifests/kubectl get pods -n monitoring 3. imagepullbackoff因为网络起因会呈现有些镜像下载不下来的问题,可墙外服务器下载镜像批改tag上传到harbor,批改yaml文件中镜像为对应公有镜像仓库的标签tag解决(因为我的公有仓库用的腾讯云的仓库,当初跨地区上传镜像应该个人版的不能够了,所以我应用了docker save导出镜像的形式): kubectl describe pods kube-state-metrics-56f988c7b6-qxqjn -n monitoring 1. 应用国外服务器下载镜像,并打包为tar包下载到本地。docker pull k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.0.0-rc.0docker save k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.0.0-rc.0 -o kube-state-metrics.tar 2. ctr导入镜像ctr -n k8s.io i import kube-state-metrics.tar导入的只是一个工作节点这样,然而kubernetes原本就是保障高可用用性,如果这个pod漂移调度到其余节点呢?难道要加上节点亲和性?这个节点如果就解体了呢?每个节点都导入此镜像?新退出的节点呢?还是老老实实的上传到镜像仓库吧!失常的流程应该是这样吧? ...

July 6, 2021 · 6 min · jiezi

关于kubernetes:Kubernetes-1205-安装traefik在腾讯云下的实践

背景集体应用traefik有差不多1-2年工夫,kubernetes ingress controller 代理有很多种形式 例如 ingress-nginx kong istio 等等。集体比拟习惯traefik。从19年就开始应用。最早应用traefik 不间接应用腾讯云私有云的slb是因为过后slb不能挂载多个证书,而我kubernetes的自建集群切实不想挂载多个slb.就偷懒用了slb udp绑定运行traefik节点的 80 443端口。证书tls的secret 间接挂载在traefik代理层下面。hsts http跳转https的个性都配置在了traefik代理层下面。利用比拟少。qps也没有那么高,这样的简略利用就满足了我的需要了 对于traefik的结缘最早接触traefik是Google下面看ingress controller 找到的 而后再阳明大佬的博客看到了traefik的实际https://www.qikqiak.com/post/traefik2-ga/,还有超级小豆丁的博客http://www.mydlq.club/article/41 。两位大佬的博客是kubernetes初学者的宝藏博客值得珍藏拜读。顺便吐个糟,用的traefik2.4版本... 抄的豆丁大佬的..http://www.mydlq.club/article/107/哈哈哈 ingress controller比照:参照https://zhuanlan.zhihu.com/p/109458069。 1. Kubernetes Gateway API v2.4版本的扭转(在 Traefik v2.4 版本中减少了对 Kubernetes Gateway API 的反对)一下局部抄自豆丁大佬与官网文档https://gateway-api.sigs.k8s.io/。 1、Gateway API 是什么Gateway API是由SIG-NETWORK 社区治理的一个开源我的项目。它是在Kubernetes中对服务网络建模的资源的汇合。这些资源- ,GatewayClass,Gateway,HTTPRoute, TCPRoute,Service等-旨在通过表现力,可扩大和面向角色由很多供应商实现的,并具备宽泛的行业反对接口演进Kubernetes服务网络。留神:此我的项目以前被称为“服务API”,直到2021年2月被重命名为“_Gateway API _”。 2、Gateway API 的指标Gateway API 旨在通过提供可表白的,可扩大的,面向角色的接口来改善服务网络,这些接口已由许多供应商施行并取得了宽泛的行业反对。网关 API 是 API 资源(服务、网关类、网关、HTTPRoute、TCPRoute等)的汇合。这些资源独特为各种网络用例建模。Gateway API 如何依据 Ingress 等以后规范进行改良? 以下设计指标驱动了Gateway API的概念。这些证实了Gateway如何旨在改良Ingress等以后规范。面向角色-网关由API资源组成,这些API资源对应用和配置Kubernetes服务网络的组织角色进行建模。便携式-这不是改良,而是应该放弃不变。就像Ingress是具备许多实现的通用标准一样 ,Gateway API也被设计为受许多实现反对的可移植标准。富裕表现力-网关API资源反对外围性能,例如基于标头的匹配,流量加权以及其余只能通过自定义批注在Ingress中实现的性能。可扩大-网关API容许在API的各个层上链接自定义资源。这样就能够在API构造内的适当地位进行精密的自定义。其余一些值得注意的性能包含: GatewayClasses -GatewayClasses形式化负载平衡实现的类型。这些类使用户能够轻松,明确地理解通过Kubernetes资源模型能够应用的性能。共享网关和跨命名空间反对-通过容许独立的Route资源绑定到同一网关,它们能够共享负载平衡器和VIP。这容许团队(甚至跨命名空间)在没有间接协调的状况下平安地共享根底构造。类型化路由和类型化后端-网关API反对类型化路由资源以及不同类型的后端。这使API能够灵便地反对各种协定(例如HTTP和gRPC)和各种后端指标(例如Kubernetes Services,存储桶或函数)。如果想理解更多内容,能够拜访 Kubernetes Gateway API 文档 。 2. traefik on kubernetes实际部署玩Traefik 利用后,创立内部拜访 Kubernetes 外部利用的路由规定,能力从内部拜访kubernetes外部利用。Traefik 目前反对三种形式创立路由规定形式,一种是创立 Traefik 自定义 Kubernetes CRD 资源,另一种是创立 Kubernetes Ingress 资源,还有就是 v2.4 版本对 Kubernetes 扩大 API Kubernetes Gateway API 适配的一种形式,创立 GatewayClass、Gateway 与 HTTPRoute 资源留神:这里 Traefik 是部署在 kube-system namespace 下,如果不想部署到配置的 namespace,须要批改上面部署文件中的 namespace 参数。当然了也能够新建一个独自的namespace去部署traefik ...

July 6, 2021 · 5 min · jiezi

关于kubernetes:Kuberentes-1205搭建eck

前言:kubernetes1.16版本的时候装置了elastic on kubernetes(ECK)1.0版本。存储用了local disk文档跑了一年多了。elasticsearch对应版本是7.6.2。当初已实现了kubernetes 1.20.5 containerd cilium hubble 环境的搭建(https://blog.csdn.net/saynaihe/article/details/115187298)并且集成了cbs腾讯云块存储(https://blog.csdn.net/saynaihe/article/details/115212770)。eck也更新到了1.5版本(我能说我前天装置的时候还是1.4.0吗.....还好我只是简略利用没有太简单的变动无非版本变了....那就再来一遍吧)最早部署的kubernetes1.16版本的eck装置形式https://duiniwukenaihe.github.io/2019/10/21/k8s-efk/多年前搭建的eck1.0版本。 对于eckelastic cloud on kubernetes是一种operator的装置形式,很大水平上简化了利用的部署。同样的还有promtheus-operator。可参照https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-eck.html官网文档的部署形式。 1. 在kubernete集群中部署ECK1. 装置自定义资源定义和操作员及其RBAC规定:kubectl apply -f https://download.elastic.co/d... 2. 监督操作日志:kubectl -n elastic-system logs -f statefulset.apps/elastic-operator**-----------------------分隔符-----------------我是间接把yaml下载到本地了。 ###至于all-in-one.yaml.1前面的1能够疏忽了哈哈,第二次加载文件加后缀了。kubectl apply -f all-in-one.yamlkubectl -n elastic-system logs -f statefulset.apps/elastic-operator 2. 部署elasticsearch集群1. 定制化elasticsearch 镜像减少s3插件,批改时区东八区,并增加腾讯云cos的秘钥,并从新打包elasticsearch镜像. 1. DockerFile如下FROM docker.elastic.co/elasticsearch/elasticsearch:7.12.0ARG ACCESS_KEY=XXXXXXXXXARG SECRET_KEY=XXXXXXXARG ENDPOINT=cos.ap-shanghai.myqcloud.comARG ES_VERSION=7.12.0ARG PACKAGES="net-tools lsof"ENV allow_insecure_settings 'true'RUN rm -rf /etc/localtime && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo 'Asia/Shanghai' > /etc/timezoneRUN if [ -n "${PACKAGES}" ]; then yum install -y $PACKAGES && yum clean all && rm -rf /var/cache/yum; fiRUN \ /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch repository-s3 && \ /usr/share/elasticsearch/bin/elasticsearch-keystore create && \ echo "XXXXXX" | /usr/share/elasticsearch/bin/elasticsearch-keystore add --stdin s3.client.default.access_key && \ echo "XXXXXX" | /usr/share/elasticsearch/bin/elasticsearch-keystore add --stdin s3.client.default.secret_key2. 打包镜像并上传到腾讯云镜像仓库,也能够是其余公有仓库 docker build -t ccr.ccs.tencentyun.com/xxxx/elasticsearch:7.12.0 . docker push ccr.ccs.tencentyun.com/xxxx/elasticsearch:7.12.0 ...

July 6, 2021 · 2 min · jiezi

关于kubernetes:Kuberentes集群添加腾讯云CBS为默认存储

前言接上文https://blog.csdn.net/saynaihe/article/details/115187298 kubeadm 搭建高可用ha集群,接下来思考的度量有存储,对外裸露服务。日志收集,监控报警几项。集体习惯就先将存储优先来探讨了。对于存储storageclass如https://kubernetes.io/zh/docs/concepts/storage/storage-classes所示,常见的有很多类型,如下:因为我的集群建在私有云下面 腾讯云有开源的cbs 的 csi组件。在kubernetes1.16-1.18 环境应用docker 做runtime的环境中应用过腾讯云的开源组件。这就又拿来用了。不便集成。 初始环境加入:https://editor.csdn.net/md/?articleId=115187298 主机名ip零碎内核sh-master-0110.3.2.5 centos84.18.0-240.15.1.el8_3.x86_64sh-master-0210.3.2.13centos84.18.0-240.15.1.el8_3.x86_64sh-master-0310.3.2.16centos84.18.0-240.15.1.el8_3.x86_64sh-work-0110.3.2.2centos84.18.0-240.15.1.el8_3.x86_64sh-work-0210.3.2.2centos84.18.0-240.15.1.el8_3.x86_64sh-work-0310.3.2.4centos84.18.0-240.15.1.el8_3.x86_64集成腾讯云 CBS CSI1. clone 仓库注: kubernetes-csi-tencentcloud中包含 CBS CSI, CFS CSI 与 COSFS CSI。这里我就只用CBS块存储了。其余两个也用过,感觉用起来还是不太适宜。 git clone https://github.com/TencentCloud/kubernetes-csi-tencentcloud.git各种名词能够参照:https://github.com/TencentCloud/kubernetes-csi-tencentcloud/blob/master/docs/README_CBS_zhCN.md。 2.参照文档前置要求实现kubernetes集群的配置批改1. master节点参照https://github.com/TencentCloud/kubernetes-csi-tencentcloud/blob/master/docs/README_CBS_zhCN.md。参照一下图片前置要求对三台master节点批改 kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml。减少如下配置(查看对应版本对应需要) - --feature-gates=VolumeSnapshotDataSource=true 2. 批改所有节点的kubelet配置kubelet减少--feature-gates=VolumeSnapshotDataSource=true的反对 3.部署CBS CSI插件1. 应用腾讯云 API Credential 创立 kubernetes secret:1. 前提:首先的在腾讯云后盾https://console.cloud.tencent.com/cam创立一个用户,拜访形式我是只开明了编程拜访,至于用户权限则须要开明CBS相干权限。我是间接绑定了CSB两个默认相干的权限,还有财务付款权限,记得肯定的反对付款,否则硬盘创立不了......。玩的好的能够自定义创立下权限,否则集体感觉财务权限貌似有点大...... 2. 依据文档提醒将SecretId SecretKey base64转换生成kubernetes secretecho -n "XXXXXXXXXXX" |base6 echo -n "XXXXXXXXXX" |base64将base64写入secret.yaml文件 cd /root/kubernetes-csi-tencentcloud-master/deploy/cbs/kuberneteskubectl apply -f secret.yaml注:我的项目是在root目录git clone的,故cd /root/kubernetes-csi-tencentcloud-master/deploy/cbs/kubernetes.包含一下没有特别强调目录的,都是在此目录下执行的 2. 创立rbac创立attacher,provisioner,plugin须要的rbac: kubectl apply -f csi-controller-rbac.yamlkubectl apply -f csi-node-rbac.yaml3.创立controller,node和plugin创立controller plugin和node plugin ...

July 6, 2021 · 1 min · jiezi

关于kubernetes:容器在分布式集群中应该如何优雅的组合

最近有幸拜读了Google在 2016年 发表的一篇论文,《Design patterns for container-based distributed systems》,这篇文章中描述了几种在容器编排零碎中应用容器的形式,即如何将不同服务的容器进行有机组合,并使得这些模式成为最佳实际形式,让整个分布式系统更加牢靠和可保护,尽管曾经过来5年之久,但文章中的思维依然影响着对容器技术和分布式系统的倒退。 文章中将设计模式分成了三个大类: 用于容器治理的单个容器应该如何实现单个节点中,多个容器怎么单干共存多个节点情境下的分布式算法有趣味的话欢送来我的公众号交换:packy的技术杂货铺单容器管理模式其实这种模式只是阐明繁多的容器应该怎么与上下游进行交互,边界应该如何定义。文章中不止一次将容器比作面向对象思维中的对象。阐明咱们应该依照面向对象的思路来对待这个问题,一个容器应该与一个对象一样有一个边界。对下层要提供接口来裸露利用信息,比方监控的metrics(QPS,衰弱信息等);对上层应该定义一个原生的生命周期,从而管理系统更容易对容器进行管制,同时易开发一些相干组件。 对下层的对立接口这个比拟好了解,就像 K8s 中曾经应用就绪探针(readness probe)和存活探针(liveness probe)监测服务。对上层的生命周期呢,文章举了一个例子:集群中有多个工作在执行,这些工作都领有不同的优先级,有的优先级高,有的优先级低。当集群资源缓和时,就须要让优先级高的工作先执行,然而优先级低的工作曾经在执行了,零碎该怎么办呢,总不能间接把优先级低的工作 kill -9 吧。这个时候就须要生命周期来规定容器如何进行。也就是说生命周期能够让编排零碎更容易不出错的治理容器,生命周期就是开发者、管理系统以及容器的一纸契约。上述例子中,K8s 中通过 graceful deletion 来敞开和驱赶低优先级的工作,K8s 先向容器发送一个 SIGTERM 信号,示意你要马上进行运行,该保留的货色保留,文件该敞开的敞开,通过肯定工夫后才发送SIGKILL信号来终结工作。 单节点,多容器利用模式对于多容器利用,即多个容器须要独特合作实现对外的服务,因而多个容器是被视为一个整体调度到一个节点上的,在 K8s 中通过 Pod 的机制来应答这种场景,即多个容器运行在同一个pod中,有一个主容器提供业务服务,其余容器帮助。这种场景下,文章中又总结出三种设计模式:sidecar(边车模式)、Ambassador(大使/代理模式)、Adapter(适配器模式)。 Sidecar 模式理解过 istio 的童鞋对这个词必定不生疏,然而此处的 sidecar 非 istio中的sidecar 概念。这里的 sidecar 只是扩大并加强主容器。sidecar 能够与主容器共享磁盘空间,因而把日志收集性能作为sidecar容器就是一个很好的抉择(例如阿里开源的 log-pilot)。 把加强性能和主业务性能通过容器拆散,有以下几个劣势: 容器作为资源分配的单元,能够更好的预估/划分所占用资源,不同容器能够由不同团队独立保护,划分开发责任。sidecar 容器容易被复用容器提供了一个故障遏制边界,即便sidecar容器呈现问题,也不会影响主容器的业务服务能够独立的保护,包含降级、回滚操作。Ambassador 模式这种模式其实是 istio的根底,劫持代理内部与主容器的交互流量。如图 这样做的益处不言而喻,主容器无需关注外界的环境是简单还是简略,只须要晓得要服务提供方的标识即可,具体如何连贯;服务提供方是集群还是单点;甚至应用什么协定连贯都不须要关注,这些都由 ambassador 容器来实现。istio 中应用 envoy 来代理流量时,提供更简单的操作来帮忙 istio 形成整个管制面,包含路由、熔断、服务注册发现等。 Adapter 模式适配器模式与 Ambassador 模式正相反,Ambassador 简化了主容器对外部环境的认知,而适配器模式则是简化了利用对外的出现模式。举个例子,当初服务的监控是一个必选项,然而不同的服务利用应用的监控计划则是形形色色,有用 Prometheus 的,有 JMX 的。如果咱们须要构建一个对立的监控平台,面对这么多不同技术栈的 metrics 着实头疼。这个时候就须要一个容器,将主容器的 metrics 依照对立的规范进行翻译,监控平台就只须要对接一种规范即可。 ...

July 5, 2021 · 1 min · jiezi

关于kubernetes:Apache-Dubbo-300-正式发布-全面拥抱云原生

简介:一个新的里程碑!一、背景自从 Apache Dubbo 在 2011 年开源以来,在一众大规模互联网、IT公司的实际中积攒了大量教训后,Dubbo 凭借对 Java 用户敌对、功能丰富、治理能力强等长处在过来获得了很大的胜利,成为国内外热门支流的 RPC 框架之一。 但随着云原生时代的到来,以 Apache Dubbo、Spring Cloud 等为代表的 Java 微服务治理体系面临了许多新的需要,包含冀望利用能够更快的启动、利用通信的协定穿透性能够更高、可能对多语言的反对更加敌对等。例如Spring 也在往年推出了其基于 GraalVM 的 Spring Native Beta 解决方案,领有毫秒级启动的能力、更高的解决性能等优化晋升。 这样的背景对下一代 Apache Dubbo 提出了两大要求:一是要保留已有的开箱即用和落地实际背景下积攒的长处,这也是泛滥开发者所冀望的;二是尽可能地遵循云原生思维,能更好的复用底层云原生基础设施并且更贴合云原生的微服务架构。 二、拥抱云原生在现在的大背景下,Apache Dubbo 3 抉择全面拥抱云原生,将 Dubbo 的架构降级,提出了全新的服务发现模型、下一代 RPC 协定和云原生基础设施适配等优化计划。 1、全新服务发现模型(利用级服务发现) 利用级注册模型 以 Dubbo 原有的设计,存储在注册核心中的数据会在很大水平上存在反复的内容,这其实节约了一部分的存储。而当整个集群的规模足够大的时候,因为服务注册发现是服务维度的,注册核心的数据量就会爆发式地增长。 以后同样是微服务治理工具的 Spring Cloud 和 gRPC 都是基于利用级的服务发现,如果仍应用接口级别的注册形式,Dubbo 就很难和他们进行互通。但如果 Dubbo 也能够像 Spring Cloud 一样以服务级注册,那么在异构体系下将能够很轻松地工作起来。 异构下部署计划 利用级服务发现机制是 Apache Dubbo 面向云原生走出的重要一步,它帮 Apache Dubbo 买通了与其余微服务体系之间在地址发现层面的鸿沟,也成为 Apache Dubbo 适配 Kubernetes Native Service 等基础设施的根底。 ...

July 2, 2021 · 2 min · jiezi

关于kubernetes:优雅的在K8S中Debug容器和主机

曾几何时,咱们将本人的利用运行在Kubernetes上,每当呈现容器异样解体时,咱们往往都是一边重启容器,一边面对解体的容器无从下手。通常在业务研发本人build的镜像内蕴含了shell,咱们还能通过在command中嵌入一个["sleep", "3600"]命令来阻塞容器内服务启动,不过也有时候会呈现不晓得从哪里冒出来一个distroless镜像,这时可能最先解体的就是运维了。那是一种运维这个职业自诞生以来,第一次感触到不知所措并脱离掌控的无助感。于是在k8s环境下无奈debug容器的梗开始在坊间广为吐槽。 第一个突破魔咒的是kubectl-debug,它蕴含了agent和debug-tools两个局部。也是目前全网内搜到文档最全的解决方案。不过目前它的开发仿佛曾经进行,上一次提交还是在8个月之前,而最近一次Release版本也停留在两年前。更难以承受的是,以后它无奈被集成在容器运行时为Containerd的k8s集群。 只管kubectl-debug已经的确是一款十分好用的容器调试工具,但现在Kubernetes曾经有了更好的容器调试解决方案,Ephemeral Containers。 Ephemeral ContainersEphemeral Containers字如其名,它就是一个长期容器。这是一个自Kubernetes v1.16中作为alpha引入的新性能,尽管以后它还没有GA,不过自从在Kubernetes v1.18之后,在kubectl内曾经集成了debug客户端,咱们简直能够残缺的应用并体验它的新个性。 长期容器的指标是为Kubernetes用户提供一个故障诊断工具,同时具备满足以下需要: 作为一个开箱即用的平台化工具不依赖于曾经蕴含在容器镜像中的工具不须要间接登陆计算节点(能够通过Kubernetes API的治理拜访Node)不过也有货色是长期容器不打算反对的,比方对windows上启用长期容器就不太敌对。 启用长期容器的个性也非常简单,在kubernetes v1.16之后的版本中将启动参数--feature-gates=EphemeralContainers=true配置到kube-api和kubelet服务上重启即可。 在1.20之前,kubectl debug工具被放在alpha中,留神不同版本的命令操作差异这里举荐应用客户端为1.20+的版本体验会更好那么咱们有了Ephemeral Containers能做哪些事件呢? 1. POD Troubleshooting如上文所说,咱们能够间接通过kubectl debug命令进行容器调试。最间接简略的对一个pod进行调试命令如下: kubectl debug mypod -it --image=busybox默认状况下用户不指定长期容器名称的话,debug容器名称就由kubectl主动生成一个惟一id的名称。如果用户须要本人指定容器名称则应用 kubectl debug mypod -c debugger --image=busybox有了长期容器除了日常debug性能外,咱们能够扩大出很多新花样的玩法。比方批量跑某个命名空间下的平安扫描的脚本而不必烦扰原容器。 for pod in $(kubectl get -o name pod); do kubectl debug --image security/pod_scanner -p $pod /sanner.shdone2. POD Troubleshooting by Copy对于没有开启Ephemeral Containers个性的集群,咱们就只能通过复制模式来调试容器。它的原理是复制一个指定pod的新容器,并将debug作为sidecar追随新容器一起启动。通过这种形式也能达到曲线救国的目标。此种形式的几个参数还是挺有意思: --copy-to 指定新pod的名称--replace=true 是否删除原容器--same-node=true 是否调度到和原容器一样的node上--share-processes=true 是否共享容器pid空间例如咱们就能够启动一个跟须要调试pod一样配置的debug容器如下: kubectl debug mypod -it \--container=debug \--image=busybox \--copy-to=my-debugger \--same-node=true \--share-processes=true 3. Node Troubleshooting对!你没看错!利用Ephemeral Containers还能对Worker节点进行调试。当以节点为指标调用时,kubectl debug 将创立一个带有node名称的pod,并且调度到该节点。同时该容器还具备了hostIPC、hostNetwork和hostPID这些特权模式。不堪设想的是Worker节点的根文件系统还被mount到了debug容器下的/host目录下。 ...

July 1, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes-Spring-Cloud-集成链路追踪-SkyWalking

一、概述1、什么是 SkyWalking ?分布式系统的应用程序性能监督工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。提供分布式追踪、服务网格遥测剖析、度量聚合和可视化一体化解决方案。 官网地址:http://skywalking.apache.org/ 2、SkyWalking 个性多种监控伎俩,语言探针和 Service Mesh多语言主动探针,Java,.NET Core和Node.JS轻量高效,不须要大数据模块化,UI、存储、集群治理多种机制可选反对告警优良的可视化计划3、整体构造整个架构,分成上、下、左、右四局部: 思考到让形容更简略,咱们舍弃掉 Metric 指标相干,而着重在 Tracing 链路相干性能。 上局部 Agent :负责从利用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前反对 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而咱们目前采纳的是,SkyWalking Agent 收集 SkyWalking Tracing数据,传递给服务器。下局部 SkyWalking OAP :负责接管 Agent 发送的 Tracing 数据信息,而后进行剖析(Analysis Core) ,存储到内部存储器( Storage ),最终提供查问( Query)性能。 右局部 Storage :Tracing 数据存储。目前反对 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而咱们目前采纳的是 ES ,次要思考是 SkyWalking 开发团队本人的生产 左局部 SkyWalking UI :负责提供控台,查看链路等等简略详情原理为下图:![上传中...]() 二、搭建 skywalking1、环境筹备Mkubernetes 版本:1.18.5Nginx Ingress 版本:2.2.8Helm 版本:3.2.4长久化存储驱动:NFS2、应用 chart 部署本文次要讲述的是如何应用 Helm Charts 将 SkyWalking 部署到 Kubernetes 集群中,相干文档能够参考skywalking-kubernetes ...

June 30, 2021 · 3 min · jiezi

关于kubernetes:SuperEdge-v040-发布大幅提升使用和运维效率

对于 SuperEdgeSuperEdge 提供了一套基于原生 Kubernetes 的边缘容器管理系统,该开源我的项目是由腾讯云联结英特尔、VMware威睿、虎牙、寒武纪、美团、首都在线,多家公司独特公布。SuperEdge 把云原生能力扩大到边缘侧,不仅很好的实现了云端对边缘端资源和业务的治理和管制,而且提供了边缘利用治理能力,反对多区域利用部署、区域自治、灰度公布等一系列能力,为利用实现边缘原生化提供了强有力的反对。 SuperEdge v0.4.0 公布SuperEdge 在 2021-06-18 公布了 v0.4.0 版本 通过社区技术探讨,本次更新次要聚焦于晋升从云端批量将边缘节点增加到集群、从云端ssh登录到边缘节点进行运维、将ServiceGroup多地区利用分能力进一步扩大到反对跨集群多地区场景,详情如下: 反对从云端批量将边缘节点增加到集群中版本引入了一种名为 NodeTask 的 CRD,用户只需提交 NodeTask 资源即可实现批量增加和重装边缘节点的成果,SuperEdge 以一种云原生的应用形式大幅晋升增加和重装边缘节点效率该性能具备内网穿透能力,不要求被增加的节点能够被 master 节点或者内部拜访,有针对性地应答边缘场景下 node 节点只能单向连贯 master 的情景理解该性能的 应用文档反对从云端 ssh 登录到边缘节点进行运维版本升级了 tunnel 组件,云端的 tunnel-cloud 反对代理 ssh 协定,用户能够间接在云端甚至本地应用 ssh-client 借助 SuperEdge 的 tunnel 登录到指定边缘节点成果该性能有针对性地应答边缘场景下 node 节点只能单向连贯 master,用户不不便从云端间接登录边缘节点运维的情景理解该性能的 应用文档将 ServiceGroup 边缘利用散发能力扩大到跨集群多地区散发v0.4.0 版本之前,ServiceGroup 的利用散发能力是针对单个集群无效,之后能够反对同时治理多个集群下多个地区的利用该性能须要配合另一个我的项目 clusternet 一起应用扫码理解该性能的 应用文档反对以Addon形式在原生Kubernetes集群中治理边缘利用和边缘节点v0.4.0版本升级了edgeadm工具,用户能够在已有的核心Kubernetes集群中Join边缘节点,实现在一个集群中即能够治理云端节点和利用又能治理边缘节点和利用该性能的 应用文档携手社区扫描上面的二维码退出咱们的交换群,独特探讨SuperEdge、钻研边缘容器技术。 <img src="https://main.qcloudimg.com/raw/9c3ce5895882b1f7baebdcdfa14b59b4.png" style="zoom:67%;" /> 参考资料我的项目链接:【https://github.com/superedge/...】 Release 链接:【https://github.com/superedge/...】 变更记录:【https://github.com/superedge/...】 我的项目文档:【https://github.com/superedge/...】

June 30, 2021 · 1 min · jiezi

关于kubernetes:什么是ReadWriteMany

在Kubenetes体系内,针对每一个长久化存储卷,都有三种拜访形式: ReadWriteOnce(RWO), ReadOnlyMany(ROX), ReadWriteMany(RWX)。在以后的定义中,这三种形式都是针对节点级别的,也就是说,对于一个Persistent Volume, 如果是RWO, 那么只能被挂载在某一个Kubernetes的工作节点(以下简称节点)上,当再次尝试在其余节点挂载的时候,零碎会报Multi-Attach的谬误(当然,在只有一台可调度节点的状况,即便RWO也是可能被多个Pod同时应用的,但除了开发测试,有谁会这么用呢?); 如果是RMX, 那么能够同时在多个节点上挂载并被不同的Pod应用。举例如下: 在官网文档中(https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes),咱们能够理解到目前存储反对ReadWriteMany的状况如下: 从列表中咱们能够看到,只有文件类的存储可能反对ReadWriteMany, 而所有的块存储,无论是私有云,还是Ceph, iSCSI,都无奈反对RWX。 那么RWX到底意味着什么? 对于用户的利用来说有什么影响呢? 咱们以理论的一个利用WordPress为例,典型的拓扑构造如下: 多个WordPress实例之间须要一个共享的卷作为Uploads目录, 同时还须要一个MySQL服务。这个共享卷就是一个很典型的ReadWriteMany的需要,当WordPress实例须要疾速横向扩大的时候,新扩大的实例能够间接拜访到原有的用户上传的数据,不须要复制等操作,因为大家共享的是一份数据,这种需要对于不反对ReadWriteMany的块存储来说,就十分难堪了。 咱们会发现在真实世界中,不乏各种困惑的声音,例如下图中的这个理论例子(https://www.digitalocean.com/community/questions/kubernetes-readwritemany-or-the-same-effect),来个摘要,这位小哥正在寻找一个容器平台上运行WordPress的计划,须要在多个Pod上同时拜访同一份数据(Master上可读可写,其它节点只读)。 人民的力量是微小的,也不是没有解决方案,见下图(https://blog.openebs.io/setting-up-persistent-volumes-in-rwx-mode-using-openebs-142632244cb2?gi=1a701ed8e4bd), 咱们看到它是利用相似于Re-Export的形式,将块存储暴露出NFS的接口来实现了。但它真的好吗? 暂且不说性能如何,这里存在着单点啊,因为图中的RWO卷只能挂载给一个NFS。 焱融YRCloudFile是一款专门针对容器场景开发的高性能分布式文件存储,天生的反对ReadWriteMany的读写形式,通过如下的拓扑构造,完满的解决了有状态利用WordPress的高可用构造,无论是共享的目录,还是MySQL数据库须要的存储目录,对立治理,高性能反对。 在下一篇文章中,作者将联合上图,以高牢靠、高可扩大的WordPress架构为例,理论地演示如何联合焱融容器存储,部署基于ReadWriteMany读写模式的利用。

June 28, 2021 · 1 min · jiezi

关于kubernetes:K8S-生态周报-Kubernetes-v1220beta0-发布

「K8S 生态周报」内容次要蕴含我所接触到的 K8S 生态相干的每周值得举荐的一些信息。欢送订阅知乎专栏「k8s生态」。runc v1.0 正式公布从 2016 年 6 月公布 v1.0-rc1 版本开始,至今已整整 5 年工夫,runc 历经多个 rc 版本终于公布了 v1.0 版本。整个过程及其思考请参考我之前的文章 《开源我的项目的 5 年短跑,runc v1.0 终于正式公布!》 。这里咱们来看看 v1.0 新版本中带来了哪些值得注意的变更。 破化性变更#2999 删除了 libcontainer/configs.Device* 标识,请应用 libcontainer/devices.* 来代替(是自 v1.0-rc94 开始废除的);#2999 删除了 libcontainer/system.RunningInUserNS 函数,请应用 libcontainer/userns.RunningInUserNS 函数代替(同样是自 v1.0-rc94 开始废除的);改良#2994 在 runc update 的时候设置了 SkipDevices ,所以在此期间咱们就不会更新 cgroups 了;#3010 cgroup1 相干的 blkio 反对 BFQ weight 了,这里须要留神的是 2018 年 CFQ 曾经从 Linux 删除,22019 年公布的 RHEL 8.0 和 Ubuntu 19.01 等发行版中也均应用 BFQ 代替了 CFQ 。对于 Linux 内核的 BFQ 和 CFQ 这里就不再开展了,只须要晓得 BFQ 相比 CFQ 做到了低提早和吞吐即可;更多对于此版本的变更,请参考其 ReleaseNote ,当初 Docker/containerd 等我的项目已将 runc 依赖降级到了 v1.0 ,K8S 我的项目尚未合并。 ...

June 28, 2021 · 2 min · jiezi

关于kubernetes:简述Kubernetes容器日志收集原理

概述对于容器日志 Docker的日志分为两类,一类是Docker引擎日志;另一类是容器日志。引擎日志个别都交给了系统日志,不同的操作系统会放在不同的地位。本文次要介绍容器日志,容器日志能够了解是运行在容器外部的利用输入的日志,默认状况下,docker logs显示以后运行的容器的日志信息,内容蕴含 STOUT(规范输入)和STDERR(规范谬误输入)。日志都会以json-file的格局存储于 /var/lib/docker/containers/<容器id>/<容器id>-json.log,不过这种形式并不适宜放到生产环境中。 默认形式下容器日志并不会限度日志文件的大小,容器会始终写日志,导致磁盘爆满,影响零碎利用。(docker log-driver反对log文件的rotate)Docker Daemon收集容器的规范输入,当日志量过大时会导致Docker Daemon成为日志收集的瓶颈,日志的收集速度受限。日志文件量过大时,利用docker logs -f查看时会间接将Docker Daemon阻塞住,造成docker ps等命令也不响应。Docker提供了logging drivers配置,用户能够依据本人的需要去配置不同的log-driver,可参考官网Configure logging drivers[1]。然而上述配置的日志收集也是通过Docker Daemon收集,收集日志的速度仍然是瓶颈。 log-driver 日志收集速度syslog 14.9 MB/sjson-file 37.9 MB/s能不能找到不通过Docker Daemon收集日志间接将日志内容重定向到文件并主动rotate的工具呢?答案是必定的采纳S6[2]基底镜像。 S6-log将CMD的规范输入重定向到/.../default/current,而不是发送到 Docker Daemon,这样就防止了Docker Daemon收集日志的性能瓶颈。本文就是采纳S6基底镜像构建利用镜像造成对立日志收集计划。 对于Kubernetes日志 Kubernetes日志收集计划分成三个级别: 利用(Pod)级别 Pod级别的日志,默认是输入到规范输入和标记输出,实际上跟Docker容器的统一。应用kubectl logs pod-name -n namespace查看,具体参考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs。 节点级别 Node级别的日志 , 通过配置容器的log-driver来进行治理,这种须要配合logrotare来进行,日志超过最大限度,主动进行rotate操作。 集群级别 集群级别的日志收集,有三种。 节点代理形式,在Node级别进行日志收集。个别应用DaemonSet部署在每个Node中。这种形式长处是消耗资源少,因为只需部署在节点,且对利用无侵入。毛病是只适宜容器内利用日志必须都是规范输入。 应用sidecar container作为容器日志代理,也就是在Pod中追随利用容器起一个日志解决容器,有两种模式: 一种是间接将利用容器的日志收集并输入到规范输入(叫做Streaming sidecar container),但须要留神的是,这时候,宿主机上实际上会存在两份雷同的日志文件:一份是利用本人写入的;另一份则是sidecar的stdout和stderr对应的JSON文件。这对磁盘是很大的节约,所以说,除非万不得已或者利用容器齐全不可能被批改。 另一种是每一个Pod中都起一个日志收集agent(比方Logstash或Fluebtd)也就是相当于把计划一里的logging agent放在了Pod里。然而这种计划资源耗费(CPU,内存)较大,并且日志不会输入到规范输入,kubectl logs会看不到日志内容。 利用容器中间接将日志推到存储后端,这种形式就比较简单了,间接在利用外面将日志内容发送到日志收集服务后端。 日志架构通过上文对Kubernetes日志收集计划的介绍,要想设计一个对立的日志收集零碎,能够采纳节点代理形式收集每个节点上容器的日志,日志的整体架构如图所示: 解释如下: 所有利用容器都是基于S6基底镜像的,容器利用日志都会重定向到宿主机的某个目录文件下比方/data/logs/namespace/appname/podname/log/xxxx.loglog-agent外部蕴含Filebeat,Logrotate等工具,其中Filebeat是作为日志文件收集的agent通过Filebeat将收集的日志发送到KafkaKafka在讲日志发送的ES日志存储/kibana检索层Logstash作为两头工具次要用来在ES中创立index和生产Kafka的音讯整个流程很好了解,然而须要解决的是: 用户部署的新利用,如何动静更新Filebeat配置如何保障每个日志文件都被失常的rotate如果须要更多的性能则须要二次开发Filebeat,使Filebeat反对更多的自定义配置付诸实践解决上述问题,就须要开发一个log-agent利用以DaemonSet模式运行在Kubernetes集群的每个节点上,利用外部蕴含Filebeat,Logrotate和须要开发的性能组件。 第一个问题,如何动静更新Filebeat配置,能够利用http://github.com/fsnotify/fsnotify工具包监听日志目录变动create、delete事件,利用模板渲染的办法更新Filebeat配置文件。 第二个问题,利用http://github.com/robfig/cron工具包创立CronJob,定期rotate日志文件,留神利用日志文件所属用户,如果不是root用户所属,能够在配置中设置切换用户。 /var/log/xxxx/xxxxx.log { su www-data www-data missingok notifempty size 1G copytruncate} 第三个问题,对于二次开发filebeat,能够参考博文:https://www.jianshu.com/p/fe3ac68f4a7a ...

June 25, 2021 · 1 min · jiezi

关于kubernetes:Kubernetes客户端clientgo简介

介绍Kubernetes 官网从 2016 年 8 月份开始,将 Kubernetes 资源操作相干的外围源码抽取进去,独立进去一个我的项目 client-go,Kubernetes中应用client-go作为Go语言的官网编程式交互客户端库,提供对api server服务的交互拜访。对于k8s的二次开发,熟练掌握client-go是十分必要的。 源码地址:https://hub.fastgit.org/kubernetes/client-go.git 我的项目目录解析.├── applyconfigurations├── CHANGELOG.md├── code-of-conduct.md├── CONTRIBUTING.md├── discovery # 通过Kubernetes API进行服务发现├── dynamic # 对Kubernetes对象执行通用操作的动静client├── examples├── go.mod├── go.sum├── informers # 一个十分牛逼的交互方式,通过reflector watch资源的事件放入队列(DeltaFIFO)中,通过sharedProcessor的pendingNotifications(buffer.RingGrowing)来散发事件到具体的ResourceEventHandler中的OnAdd/OnUpdate/OnDelete进行解决.这个各informers前面具体介绍├── INSTALL.md├── kubernetes # 提供 ClientSet 客户端├── kubernetes_test├── LICENSE├── listers # 为每一个 K8S 资源提供 Lister 性能,该性能对 Get 和 List 申请提供只读的缓存数据├── metadata├── OWNERS├── pkg├── plugin # 提供 OpenStack,GCP 和 Azure 等云服务商受权插件├── README.md├── rest # 提供 RESTClient 客户端,对 K8S API Server 执行 RESTful 操作├── restmapper├── scale # 提供 ScaleClient 客户端,用于扩容或缩容 Deployment, Replicaset, Replication Controller 等资源对象├── SECURITY_CONTACTS├── testing├── third_party├── tools # 上面的/clientcmd提供了创立客户端的一些根底的工具├── transport # 提供平安的 TCP 连贯,反对 HTTP Stream,某些操作须要在客户端和容器之间传输二进制流,例如 exec,attach 等操作└── util # 提供罕用办法。例如 WorkQueue 工作队列,Certificate 证书治理等19 directories, 10 filesClient类型RESTClient:RESTClient 是最根底的,相当于的底层根底构造,能够间接通过 RESTClient 提供的 RESTful 办法如 Get(),Put(),Post(),Delete() 进行交互 ...

June 25, 2021 · 2 min · jiezi

关于kubernetes:更优雅的-Kubernetes-集群事件度量方案

大家好,我是张晋涛。 群里有个小伙伴问了我上图中这个问题,如何度量滚动降级这个过程的工夫。 这个问题能够形象为一种通用需要,实用于多种场景。 比方你是 Kubernetes 集群的管理员,你想度量这个过程中的耗时,以便发现优化点;比方你是在做 CI/CD ,你想通过度量这个过程的耗时,来给出 CI/CD 过程的耗时;现有计划Kubernetes 曾经提供了很不便的方法来解决此问题,也就是我回复中谈到的,通过 event 来度量即可。 比方,咱们在 K8S 中,创立一个 deployment,看看这个过程中的 event 信息: ➜ ~ kubectl create ns moelovenamespace/moelove created➜ ~ kubectl -n moelove create deployment redis --image=ghcr.io/moelove/redis:alpinedeployment.apps/redis created➜ ~ kubectl -n moelove get deployNAME READY UP-TO-DATE AVAILABLE AGEredis 1/1 1 1 16s➜ ~ kubectl -n moelove get eventsLAST SEEN TYPE REASON OBJECT MESSAGE27s Normal Scheduled pod/redis-687967dbc5-gsz5n Successfully assigned moelove/redis-687967dbc5-gsz5n to kind-control-plane27s Normal Pulled pod/redis-687967dbc5-gsz5n Container image "ghcr.io/moelove/redis:alpine" already present on machine27s Normal Created pod/redis-687967dbc5-gsz5n Created container redis27s Normal Started pod/redis-687967dbc5-gsz5n Started container redis27s Normal SuccessfulCreate replicaset/redis-687967dbc5 Created pod: redis-687967dbc5-gsz5n27s Normal ScalingReplicaSet deployment/redis Scaled up replica set redis-687967dbc5 to 1能够看到咱们次要关注的一些事件均曾经有记录了。然而总不能每次都通过 kubectl 这么来看吧,有点浪费时间。 ...

June 25, 2021 · 2 min · jiezi

关于kubernetes:应用管理与交付为什么会成为云原生新的价值聚焦点

简介: 为什么“云原生利用治理与交付”会成为 Kubernetes 之上重要的价值聚焦点?CNCF App Delivery SIG 在推动 Kubernetes 之上应用层技术疾速演进的过程中将表演什么角色?这个畛域又将产生哪些值得大家期待的翻新?让咱们一起理解 App Delivery SIG 新任 Co-chairs 邓洪超有什么认识。 作者|邓洪超 近日,寰球顶级开源社区云原生计算基金会( Cloud Native Computing Foundation,以下简称 CNCF ) 发表“云原生交付畛域小组( Application Delivery SIG )”换届后果,来自阿里云的高级技术专家、Kubernetes Operator 机制初创作者之一邓洪超将与 VMware 高级研发专家 Jennifer Strejevitch 独特负责新一任小组 Co-chairs 。 对于 CNCF App Delivery SIG据官网介绍,CNCF 畛域小组的作用是“帮忙整个生态深刻了解这些技术畛域里的最佳实际,并同 CNCF TOC(技术监督委员会)严密合作以甄别可继续的开源我的项目,或者帮忙它们补救有余”。CNCF 目前下辖三个畛域小组,App Delivery SIG 是 CNCF 基金会官网成立的第一个以“利用”为核心的畛域小组。在云计算生态外围关注点迅速聚焦到“云原生利用”的明天,该小组被社区誉为是 “ CNCF 最具价值的畛域小组”。随着越来越多的企业和开发者开始将业务与技术向云原生演进,以 Kubernetes 为代表的容器技术曾经成为云计算的新界面。从阿里云与微软联结开源的 OAM + OpenKruise 组合露头角,再到阿里云进一步使能平台构建者的开源框架 KubeVela 迅速走红,为什么“云原生利用治理与交付”会成为 Kubernetes 之上重要的价值聚焦点?CNCF App Delivery SIG 在推动 Kubernetes 之上应用层技术疾速演进的过程中将表演什么角色?这个畛域又将产生哪些值得大家期待的翻新?让咱们一起理解 App Delivery SIG 新任 Co-chairs 邓洪超有什么认识。 ...

June 24, 2021 · 2 min · jiezi

关于kubernetes:KubeEdgeKubeEdge部署小指南Edge节点接入避坑

试验环境阐明云端环境: OS: Ubuntu Server 20.04.1 LTS 64bitKubernetes: v1.19.8网络插件:calico v3.16.3Cloudcore: kubeedge/cloudcore:v1.6.1边缘环境: OS: Ubuntu Server 18.04.5 LTS 64bitEdgeCore: v1.19.3-kubeedge-v1.6.1docker: version: 20.10.7cgroupDriver: systemd边缘端注册QuikStart:参考资料:https://docs.kubeedge.io/en/d...https://docs.kubeedge.io/en/d...从cloudcore获取token kubectl get secret -nkubeedge tokensecret -o=jsonpath='{.data.tokendata}' | base64 -d配置edgecore如果应用二进制装置,须要先获取初始的最小化edgecore配置文件: edgecore --minconfig > edgecore.yaml该配置文件适宜刚开始应用KubeEdge的同学,算是最精简的配置。批改其中要害配置(这里仅列出要害配置): ……modules: edgeHub: …… httpServer: https://cloudcore侧HttpServer监听地址:端口(默认为10002) token: 第一步中获取的token字符串 websocket: …… server: cloudcore侧监听地址:端口(默认为10000) …… edged: cgroupDriver: systemd //和docker所用native.cgroupdriver保持一致 …… hostnameOverride: edge01 //设置该节点注册到cloudcore的名称 nodeIP: 指定该节点IP地址 //默认会取为本机IP地址,多网卡留神查看 …… eventBus: mqttMode: 0 //应用internal的mqtt服务 ……如果应用keadm装置部署,执行: keadm join --cloudcore-ipport=cloudcore监听的IP地址:端口(默认为10002) --token=获取到的token字符串执行后,edgecore节点会自行应用systemctl进行治理,并退出开机启动项,同时启动edgecore节点,此时edgecore节点的运行状态不肯定失常。同样,批改并查看配置文件,配置文件主动生成于/etc/kubeedge/config/edgecore.yaml 启动edgecore服务如采纳二进制装置,则: nohup ./edgecore --config edgecore.yaml 2>&1 > edgecore.log &如采纳keadm装置,则: ...

June 23, 2021 · 3 min · jiezi

关于kubernetes:为什么我们需要一个容器镜像的包管理器

TL;DR咱们须要对 container 供应链进行更好的元数据管理,以便更好地进行剖析;OCI 标准目前没有方法打包容器镜像工件或一组容器镜像。但他们会缓缓做到这一点;同时,咱们须要一个用于容器镜像的包管理器;一些背景我保护着一个叫做 Tern 的开源我的项目,这个我的项目是为容器镜像生成一个软件资料清单(SBOM)。很多装置在容器镜像中的组件都是独立装置的,而非通过包管理器。这使得咱们很难弄清楚创立这个容器镜像的作者的用意。它也没有提供更多对于容器镜像贡献者的信息。大多数容器镜像都是基于之前已有的容器镜像,通过客户端工具或者镜像仓库都很难看到这些信息。 我想如果有一个“容器镜像”的包管理器,应该能解决这个问题。因而,我早在 KubeCon 2018 的时候就提出了 "打包" 的想法,我问容器镜像的 manifest 是否能够保留这些信息,以便工具能够依据容器镜像的供应链来进行剖析。 事实证明,社区曾经在思考如何治理 helm chart、OPA 策略、文件系统和签名等事件了。这就是我参加 凋谢容器打算(OCI)组织 的起因(我还欠 @vbatts 一个介绍我的人情)。过后的了解是,容器镜像除了须要通过摘要来进行辨认外,不须要进行其余治理。也不须要治理依赖,因为所有的依赖都被打包进了容器镜像中。通过再次重建容器和放弃一个上游消费者能够 pull 的滚动标签来解决更新。 然而,容器生态除了可移植性外,并没有提供太多货色。和容器镜像一起治理容器元数据能够为使用者和贡献者提供更多对于供应链的贵重信息。通过了两年工夫和几次供应链攻打之后,咱们依然在探讨,如何最好的做到这一点。在这里,我试图将一些提议的概念归纳起来,看看它们如何满足咱们对元数据管理的要求。 回到终点咱们写一个包管理器次要有以下三个起因: 标识 - 为你的新文件或者包提供一个名字和其余惟一可辨认的特色;上下文 - 理解你的包和其余包的关系(即,依赖性治理);新鲜度 - 确保你的包在其生态系统中可保护并放弃更新;实际上还有第4个起因,“构建的可重复性” - 我认为它属于“上下文”,但在这里,它的确值得一提,因为理解你的包在特定工夫的状态是很必要的。这样你能力剖析出过来的“好”状态,和当初“不那么好”的状态,即:应用二等分的办法剖析构建。 因为一些(善意的)假如,容器镜像生态并没有这些性能。一个容器能够通过它的摘要(digest)被标识。你不须要治理生态,因为整个生态曾经存在于一个单元中了。你不须要更新容器 - 只须要构建一个新的镜像,所有须要更新的内容都将被更新。只有你的应用程序没问题,那它便能够失常工作。然而,如果你打算长期保护你的应用程序,你必须筹备好解决堆栈更新和重大版本。咱们以后除了“下载最新版本”外没有其余好的方法来治理堆栈更新(一个值得注意的例外是 Cloud Native Buildpacks ,但咱们此处将专一于通用案例)。堆栈的破坏性变更可能会阻塞你从新构建镜像,这迫使你须要保留一个旧版本的镜像,因为你曾经晓得这个镜像能够工作。你能够设想到,保护一组容器镜像将变得更加费劲。如果保护一组容器镜像所需的信息是内置的,并在须要时可用,那就真的太好了。 用于治理元数据的镜像仓库咱们能够建设一个独自的元数据存储解决方案,但当初咱们曾经有镜像仓库了。通过一些改良,它们能够被用来和容器镜像一起存储补充元数据。组织曾经对蕴含源 tarball 的源镜像和签名 payload(正如 cosign 所做的那样) 执行此操作。 应用镜像仓库的益处在于元数据能够和指标镜像一起存储。对 OCI 标准的倡议次要波及结构化和援用这些数据。这基本上是服务端的包治理,让这些倡议被合并是很艰难的,因为目前存在的客户端-服务端关系是很严密的,对服务端的任何扭转都会影响到客户端,对客户端打包机制的任何变更也都会影响到服务端。因而,目前的 OCI 标准除了扩大与以后 Docker 客户端和 Docker registry 工作形式放弃同步的标准外,还不能包含加强性能。 这篇文章并不是要批评以后的生态,而是想要把对话引到一个社区能够更可继续的保护它们的容器镜像的地位。就我集体而言,我也想证实在容器镜像畛域是须要一个包管理器的,只管镜像仓库能够反对相干 artifacts 和容器镜像的链接,也能够反对在容器镜像之间进行链接。 其余生态系统中的包管理器也有客户端和服务端的关系,所以在客户端和服务端之间摊派压力的架构并不陈腐。只不过在以后场景下,这种关系略有不同。 Identification (辨认)容器镜像的工作形式有点像 Merkle Tree 有一个镜像配置的数据块,以及代表容器文件系统的一个或多个数据块。每个数据块都通过了哈希解决,并且放在了通过哈希解决过的 Image Manifest 中。 ...

June 22, 2021 · 1 min · jiezi

关于kubernetes:如何专业化监控一个Kubernetes集群

简介:本文会介绍 Kubernetes 可观测性零碎的构建,以及基于阿里云云产品实现 Kubernetes 可观测零碎构建的最佳实际。 作者:佳旭 阿里云容器服务技术专家 引言Kubernetes 在生产环境利用的遍及度越来越广、复杂度越来越高,随之而来的稳定性保障挑战也越来越大。 如何构建全面深刻的可观测性架构和体系,是晋升零碎稳定性的要害之因素一。ACK将可观测性最佳实际进行积淀,以阿里云产品性能的能力对用户透出,可观测性工具和服务成为基础设施,赋能并帮忙用户应用产品性能,晋升用户 Kubernetes 集群的稳定性保障和应用体验。 本文会介绍 Kubernetes 可观测性零碎的构建,以及基于阿里云云产品实现 Kubernetes 可观测零碎构建的最佳实际。 Kubernetes 零碎的可观测性架构Kubernetes 零碎对于可观测性方面的挑战包含: • K8s 零碎架构的复杂性。零碎包含管制面和数据面,各自蕴含多个互相通信的组件,管制面和数据间之间通过 kube-apiserver 进行桥接聚合。• 动态性。Pod、Service 等资源动态创建以及调配 IP,Pod 重建后也会调配新的资源和 IP,这就须要基于动静服务发现来获取监测对象。• 微服务架构。利用依照微服务架构分解成多个组件,每个组件正本数能够依据弹性进行主动或者人工控制。 针对 Kubernetes 零碎可观测性的挑战,尤其在集群规模快速增长的状况下,高效牢靠的 Kubernetes 零碎可观测性能力,是零碎稳定性保障的基石。 那么,如何晋升建设生产环境下的 Kubernetes 零碎可观测性能力呢? Kubernetes 零碎的可观测性计划包含指标、日志、链路追踪、K8s Event 事件、NPD 框架等形式。每种形式能够从不同维度透视 Kubernetes 零碎的状态和数据。在生产环境,咱们通常须要综合应用各种形式,有时候还要使用多种形式联动观测,造成欠缺平面的可观测性体系,进步对各种场景的覆盖度,进而晋升 Kubernetes 零碎的整体稳定性。上面会概述生产环境下对 K8s 零碎的可观测性解决方案。 指标(Metrics)Prometheus 是业界指标类数据采集计划的事实标准,是开源的零碎监测和报警框架,灵感源自 Google 的 Borgmon 监测零碎。2012 年,SoundCloud 的 Google 前员工发明了 Prometheus,并作为社区开源我的项目进行开发。2015 年,该我的项目正式公布。2016 年,Prometheus 退出 CNCF 云原生计算基金会。 Prometheus 具备以下个性: • 多维的数据模型(基于工夫序列的 Key、Value 键值对)• 灵便的查问和聚合语言 PromQL• 提供本地存储和分布式存储• 通过基于 HTTP 的 Pull 模型采集工夫序列数据• 可利用 Pushgateway(Prometheus 的可选中间件)实现 Push 模式• 可通过动静服务发现或动态配置发现指标机器• 反对多种图表和数据大盘 ...

June 22, 2021 · 5 min · jiezi

关于kubernetes:kubernetes部署一个应用程序

文章原文 部署 nginx Deployment如果你曾经实现了Kubernetes的搭建,那我跟我一块来部署第一个应用程序吧。没有实现 Kubernetes 集群搭建的,请参考文档 应用 kubeadm 装置 kubernetes 1.21 创立 YAML 文件创立文件 nginx-deploy.yaml,内容如下: apiVersion: apps/v1 #与k8s集群版本无关,应用 kubectl api-versions 即可查看以后集群反对的版本kind: Deployment #该配置的类型,咱们应用的是 Deploymentmetadata: #译名为元数据,即 Deployment 的一些根本属性和信息 name: nginx-deployment #Deployment 的名称 labels: #标签,能够灵便定位一个或多个资源,其中key和value均可自定义,能够定义多组,目前不须要了解 app: nginx #为该Deployment设置key为app,value为nginx的标签spec: #这是对于该Deployment的形容,能够了解为你期待该Deployment在k8s中如何应用 replicas: 1 #应用该Deployment创立一个应用程序实例 selector: #标签选择器,与下面的标签独特作用,目前不须要了解 matchLabels: #抉择蕴含标签app:nginx的资源 app: nginx template: #这是抉择或创立的Pod的模板 metadata: #Pod的元数据 labels: #Pod的标签,下面的selector即抉择蕴含标签app:nginx的Pod app: nginx spec: #冀望Pod实现的性能(即在pod中部署) containers: #生成container,与docker中的container是同一种 - name: nginx #container的名称 image: nginx:1.7.9 #应用镜像nginx:1.7.9创立container,该container默认80端口可拜访利用 YAML 文件 kubectl apply -f nginx-deploy.yaml查看部署后果 ...

June 21, 2021 · 2 min · jiezi

关于kubernetes:k8s部署应用入门之kubectl-apply

k8s是一个容器利用的根底运行环境,那么对于初学者来说,如何在k8s上部署本人的利用呢?本文介绍几种最简略的,适宜初学者理解部署过程的几种办法: 通过kubectl apply间接部署通过helm部署通过kubectl apply间接部署kubectl 间接部署容器Pod对于如何装置kubectl,以及如果通过kubectl连贯k8s的内容,本章不再赘述,这里假设大家曾经装置了kubectl并可能连贯k8s集群。 kubectl apply是一种申明式的API调用办法,通过将pod的配置编写在一份yml文件中,再调用API,进行pod部署的形式,区别于docker的命令行模式,例如docker run xxx. 申明式API调用的益处是,对于同一份yml申请,在降级过程中,不须要对旧的资源进行操作,apply命令会使得k8s自行对已有资源进行降级操作。 上面是一份部署mysql的实例: apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2kind: Deploymentmetadata: name: mysqlspec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - image: mysql:5.6 name: mysql env: # Use secret in real usage - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 name: mysql通过kubectl命令间接部署:kubectl apply -f mysql.yml, 留神,如果不指定namespace,则默认pod会部署在default命名空间下。 ~ kubectl get podNAME READY STATUS RESTARTS AGEmysql-65c76b9ccb-5wlg2 1/1 Running 0 13m删除pod~ kubectl delete pod mysql-65c76b9ccb-5wlg2pod "mysql-65c76b9ccb-5wlg2" deleted# Deployment调度器会使得pod反复创立,如果要彻底删除资源,须要删除deployment~ kubectl delete deployment mysql拜访podpod的IP地址是变动的,每次部署都会获取到新的IP地址,那么如何拜访pod,在集群外部能够通过service来进行拜访,service是k8s中用来代理一组pod的API对象,代理的形式是通过lable selector。 ...

June 17, 2021 · 1 min · jiezi

关于kubernetes:K8s通过Helm部署入门

k8s是一个容器利用的根底运行环境,那么对于初学者来说,如何在k8s上部署本人的利用呢?本文介绍几种最简略的,适宜初学者理解部署过程的几种办法: 通过kubectl apply间接部署通过helm部署kubectl apply适宜部署单个Pod,如果Pod较多,部署构造比较复杂,就须要应用编排来实现。Helm是当下最适宜做K8s利用部署的编排工具,通过Helm能够申明一组Pod,由一个Helm包部署一整个应用程序。本文不介绍Helm的装置了,大家能够自行搜寻。 通过Helm部署利用创立Helm包~ helm create jflyfoxCreating jflyfoxhelm 包中的目录构造如下:jflyfox/├── .helmignore # Contains patterns to ignore when packaging Helm charts.├── Chart.yaml # Information about your chart├── values.yaml # The default values for your templates├── charts/ # Charts that this chart depends on└── templates/ # The template files └── tests/ # The test files间接删除templates中的所有文件(个别是没用的测试文件或者demo),间接创立本人的template即可。 申明DB~ touch templates/db.yamlapiVersion: v1kind: Servicemetadata: name: mysqlspec: ports: - port: 3306 selector: app: mysql clusterIP: None---apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2kind: Deploymentmetadata: name: mysqlspec: selector: matchLabels: app: mysql replicas: 1 template: metadata: labels: app: mysql spec: containers: - image: mysql:5.6 name: mysql imagePullPolicy: Always env: # Use secret in real usage - name: MYSQL_ROOT_PASSWORD value: password resources: limits: cpu: "1" memory: 512Mi requests: cpu: "1" memory: 512Mi ports: - containerPort: 3306 name: mysql如上所示,该template用来创立一个mysql,并通过service代理。 ...

June 17, 2021 · 2 min · jiezi

关于kubernetes:进击的云原生为开发者提供更多可能性

简介:云原生为开发者提供了三方面便当:利用基础设施零保护、利用架构现代化零阻力、数字与物理世界零边界。背景云原生是云计算倒退的必然产物,而云原生的继续成长也绝非偶尔。 2021年,云原生出现怎么的风貌、又带来了哪些新变动?阿里云容器服务研发总监易立近日在阿里云开发者大会发表了《云原生利用新边界》的演讲,并示意,云原生为开发者提供了三方面便当:利用基础设施“零”保护、利用架构现代化“零”阻力、数字与物理世界“零”边界。 云原生:因云而生云原生是因云而生的技术,它根植于开发者,并提供最大云价值。 在 CNCF 2020 开发者现状报告中,当初寰球有超过 470 万开发者在应用云原生技术,占全副后端开发者的 36%。开发者曾经成为云原生改革最次要的推动力量。 利用基础设施“零”保护容器、Serverless 等云原生技术继续推动计算界面上移,复杂性下沉,让开发者能够关注于业务翻新而非基础设施,这样能够极大晋升研发效率。 阿里云为开发者提供了全国最丰盛的云原生产品,帮忙企业专一于业务翻新、而非基础设施建设。企业能够通过容器服务, 函数计算,服务网格,实现利用架构的互联网化,在此之上,云原生数据库、云原生 AI,云原生大数据等产品更能够帮忙企业减速业务流程的数字化与智能化 利用架构现代化“零”阻力越来越多的企业心愿通过利用现代化革新,比方微服务化、Mesh 化,带来新的的收益,更好地满足业务倒退的需要。不过新技术也会给现有利用架构带来很大的冲击。利用云原生技术,能够循序渐进将现有利用架构平滑降级。 在对现有利用进行现代化革新时, 开发者须要把一个单体应用程序分拆为分布式的微服务架构, Spring Cloud / Dubbo 等微服务架构都是以 SDK 代码库的形式把服务治理逻辑构建在应用程序之中。但这种架构存在几个问题: 侵入性:在微服务框架中,服务治理能力的实现和生命周期与业务逻辑耦合在一起的。服务治理能力的变更和加强须要利用的从新构建和部署,导致降级和保护老本晋升。实现绑定:因为微服务框架代码库通常由特定语言实现,难以反对多语言(polyglot)异构零碎之间的集成为挑战。 因而,社区提出 Service Mesh(服务网格)架构 —— 将利用的业务逻辑与服务治理能力解耦。服务治理的能力运行在一个独立的 Sidecar 过程之中,独立部署。通过网络拦挡来实现对利用通明的服务发现、流量治理、可观测性、平安等能力。 解决了上述侵入性、绑定的问题,具体劣势如下: 复杂性下沉:服务治理实现下沉到基础设施,能够独立演进。使得开发人员能够更加聚焦于业务利用自身。零侵入:无需代码革新既能够实现零信赖平安,可观测性等高阶能力。多语言反对:能够通明反对多种编程语言和编程框架。 那么,微服务与服务网格是否非此即彼,鱼与熊掌不可得兼?在进行服务网格革新的同时,如何与现有微服务架构兼容并存? 随着社区的致力,服务网格和微服务能够很好地联合在一起, 撑持企业微服务架构平滑演进。 阿里云提供的托管服务网格 ASM 反对 Dubbo 通信协议, 通过申明式形式反对灰度公布、金丝雀公布、无损下线等能力。利用阿里开源的 Nacos 服务注册核心,能够对立反对 Mesh 利用和微服务利用的服务注册与发现。Nacos 2.0 性能晋升 10倍, 无效地反对大规模服务网格利用落地。Apache Dubbo 3.0 也在摸索 Proxyless 式,也就是采纳无代理形式反对服务网格; 在Proxyless模式下无需sidecar即可间接通过服务网格的 UDPA 协定实现对 Dubbo 利用的流量治理。这种形式能够进一步网络提早,缩小资源开销。服务网格也增强了对虚拟机利用部署的反对,助力遗留利用的平滑降级。 ...

June 11, 2021 · 1 min · jiezi

关于kubernetes:kubeadm增加master或node节点

kubeadm装置k8s-1.18.18 资源筹备角色主机名ip零碎nodem8s-master01192.168.219.162CentOS 7.9.2009nodem8s-node02192.168.219.165CentOS 7.9.2009一、初始化资源参考:https://segmentfault.com/a/11... 二、增加node节点1、在master上生成新的token[root@k8s-master01 ~]# kubeadm token create --print-join-command --ttl=0阐明:--ttl=0代表工夫永不过期,不加此参数默认24小时过期 输入如下: W0611 03:08:31.246969 63170 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]kubeadm join 192.168.219.160:6443 --token hkpvr9.bsfj9a6i7612vd59 --discovery-token-ca-cert-hash sha256:a8d537ee5d1a17e73ba94996744ccefd0d2f58f3871f29708e9c5642a28157b72、退出node节点node节点操作: [root@k8s-node02 ~]# kubeadm join 192.168.219.160:6443 --token hkpvr9.bsfj9a6i7612vd59 --discovery-token-ca-cert-hash sha256:a8d537ee5d1a17e73ba94996744ccefd0d2f58f3871f29708e9c5642a28157b7输入如下: W0611 03:11:48.274867 3087 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.[preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/[preflight] Reading configuration from the cluster...[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.18" ConfigMap in the kube-system namespace[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"[kubelet-start] Starting the kubelet[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...This node has joined the cluster:* Certificate signing request was sent to apiserver and a response was received.* The Kubelet was informed of the new secure connection details.Run 'kubectl get nodes' on the control-plane to see this node join the cluster.阐明:kubernetes node节点退出容器 [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1 ...

June 11, 2021 · 2 min · jiezi

关于kubernetes:kubeadm增加master节点

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

June 11, 2021 · 1 min · jiezi

关于kubernetes:如何评估Serverless服务能力这份报告给出了40条标准

简介:现在,曾经有评测机构给出了40条规范来对Serverless的服务能力进行评估,这些评估细则既是技术生态凋敝倒退的一种体现,也能够作为新进入者评估Serverless落地功效的一种参考根据。编者按:两年前,咱们还在探讨什么是Serverless,Serverless如何落地。现在,曾经有评测机构给出了40条规范来对Serverless的服务能力进行评估,这些评估细则既是技术生态凋敝倒退的一种体现,也能够作为新进入者评估Serverless落地功效的一种参考根据。  在 Forrester 的这份函数即服务 (FaaS) 平台评估报告中,咱们抉择了阿里巴巴、亚马逊、谷歌、华为、IBM、微软、Nimbella、甲骨文和腾讯这 9 家最具影响力的提供商,并根据 40 条规范对其进行了钻研、剖析和评分。该报告展现了每个提供商在各方面的体现,旨在帮忙从事利用程序开发与交付 (AD&D) 的专业人士找到最合乎本身需要的提供商。  Forrester Wave™:函数即服务 (FaaS) 平台 2021 年第一季度报告FaaS 平台帮忙开发人员疾速创立云原生服务  FaaS 平台的抽象化让开发人员不再须要关注简单的容器或虚拟机集群治理与扩容工作,从而能够疾速创立云原生微服务。将底层基础架构的管理工作交给 FaaS 提供商之后,开发人员就能够在编程环境中,应用 Java、C#、JavaScript 或 Python 等相熟的语言,将微服务编写成简略的小函数。而后,FaaS 提供商会依据服务要求,主动对这些微服务进行扩容或缩容。应用 FaaS 平台的开发人员示意,通过免于基础架构治理,借助抽象化打消与此相关的简单操作后,他们能够迅速将新的想法推入部署阶段,同时能够依据执行微服务的理论资源需要来确定基础架构费用。在筛选 FaaS 提供商时,开发人员应剖析该提供商是否具备以下条件:  反对函数和容器打包。随着开发人员将越来越多类型的工作负载部署到 FaaS 平台,FaaS 平台应容许开发人员简略地将一个函数打包成 ZIP 或 JAR 文件并加以部署,或者将自定义代码打包成合乎凋谢容器规范 (OCI) 的容器,并部署与之对应的框架。FaaS 平台应同时反对这两种选项,能力在开发部署 Web、内容和事件驱动的工作负载方面为开发人员提供最大的灵活性。 提供强壮的平安性能。随着开发人员不断扩大对 FaaS 平台的使用范畴,确保相干人员可能以平安的形式拜访被封装到虚构公有网络,或虚构公有云 (VPC) 中的数据和利用程序接口 (API) 就变得十分重要。另外在函数扩缩容的同时,相干人员还须要可能疾速接入这些资源,而无需期待耗时的“冷启动”。 反对第三方生态系统和凋谢规范。除非您违心齐全依赖一家私有云提供商,否则您就应抉择平台集成更为便当的 FaaS 提供商。您须要关注的性能包含第三方可观测性、事件绑定和音讯协定等。 评估摘要 本次 Forrester Wave™ 评估报告将待评估对象别离纳入“领导者”(Leaders)、“强劲表现者”(Strong Performers)、“竞争者”(Contenders) 和“挑战者”(Challengers) 这几个象限。这是对市场头部厂商的评估,并不代表市场的整体状况。您能够查看咱们对于无服务器架构 (Serverless) 技术的报告,获取无关这个市场的更多信息。咱们心愿这份评估报告只是一个终点,倡议客户应用基于 Excel 的厂商比拟工具来查看产品评估并调整规范权重(请参见图 1 和图 2)。点击 Forrester.com 上网页版报告结尾的链接即可下载上述工具。  图 1 《Forrester Wave™:函数即服务 (FaaS) 平台,2021年第一季度》评估后果   ...

June 11, 2021 · 3 min · jiezi

关于kubernetes:使用kubeadm安装kubernetes-121

文章原文 配置要求至多2台 2核4G 的服务器本文档中,CPU必须为 x86架构CentOS 7.8 或 CentOS Stream 8 装置后的软件版本为Kubernetes v1.21.x calico 3.17.1nginx-ingress 1.9.1Containerd.io 1.4.3 操作系统兼容性CentOS版本本文档是否兼容备注CentOS Stream 8已验证CentOS 7.8已验证CentOS 7.7未验证CentOS 7.6未验证 {{< notice success "Container Runtime" >}} Kubernetes v1.21 开始,默认移除 docker 的依赖,如果宿主机上安装了 docker 和 containerd,将优先应用 docker 作为容器运行引擎,如果宿主机上未装置 docker 只装置了 containerd,将应用 containerd 作为容器运行引擎;本文应用 containerd 作为容器运行引擎;{{< /notice >}}{{< notice success "对于二进制安" >}} kubeadm 是 Kubernetes 官网反对的装置形式,“二进制” 不是。本文档采纳 kubernetes.io 官网举荐的 kubeadm 工具装置 kubernetes 集群。{{< /notice >}} 查看 centos / hostname# 在 master 节点和 worker 节点都要执行cat /etc/redhat-release# 此处 hostname 的输入将会是该机器在 Kubernetes 集群中的节点名字# 不能应用 localhost 作为节点的名字hostname# 请应用 lscpu 命令,核查 CPU 信息# Architecture: x86_64 本装置文档不反对 arm 架构# CPU(s): 2 CPU 内核数量不能低于 2lscpu批改 hostname# 批改 hostnamehostnamectl set-hostname your-new-host-name# 查看批改后果hostnamectl status# 设置 hostname 解析echo "127.0.0.1 $(hostname)" >> /etc/hosts查看网络在所有节点执行命令 ...

June 10, 2021 · 5 min · jiezi

关于kubernetes:centos7安装k8s11818

资源筹备角色主机名ip零碎masterm8s-master01192.168.219.160CentOS 7.9.2009nodem8s-node01192.168.219.164CentOS 7.9.2009nodem8s-node02192.168.219.165CentOS 7.9.2009软件信息软件版本docker19.03.8kubernetes1.18.18以下步骤须要在每台机器上都执行1、批改主机名vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.219.160 k8s-master01192.168.219.164 k8s-node01192.168.219.165 k8s-node02

June 10, 2021 · 1 min · jiezi

关于kubernetes:教你在Kubernetes中快速部署ES集群

摘要:ES集群是进行大数据存储和剖析,疾速检索的利器,本文简述了ES的集群架构,并提供了在Kubernetes中疾速部署ES集群的样例;对ES集群的监控运维工具进行了介绍,并提供了局部问题定位教训,最初总结了罕用ES集群的API调用办法。本文分享自华为云社区《Kubernetes中部署ES集群及运维》,原文作者:minucas。 ES集群架构:ES集群分为单点模式和集群模式,其中单点模式个别在生产环境不举荐应用,举荐应用集群模式部署。其中集群模式又分为Master节点与Data节点由同一个节点承当,以及Master节点与Data节点由不同节点承当的部署模式。Master节点与Data节点离开的部署形式可靠性更强。下图为ES集群的部署架构图: 采纳K8s进行ES集群部署:1、采纳k8s statefulset部署,可疾速的进行扩缩容es节点,本例子采纳 3 Master Node + 12 Data Node 形式部署2、通过k8s service配置了对应的域名和服务发现,确保集群能主动联通和监控 kubectl -s http://ip:port create -f es-master.yamlkubectl -s http://ip:port create -f es-data.yamlkubectl -s http://ip:port create -f es-service.yamles-master.yaml:apiVersion: apps/v1kind: StatefulSetmetadata: labels: addonmanager.kubernetes.io/mode: Reconcile k8s-app: es kubernetes.io/cluster-service: "true" version: v6.2.5 name: es-master namespace: defaultspec: podManagementPolicy: OrderedReady replicas: 3 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: es version: v6.2.5 serviceName: es template: metadata: labels: k8s-app: camp-es kubernetes.io/cluster-service: "true" version: v6.2.5 spec: containers: - env: - name: NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace - name: ELASTICSEARCH_SERVICE_NAME value: es - name: NODE_MASTER value: "true" - name: NODE_DATA value: "false" - name: ES_HEAP_SIZE value: 4g - name: ES_JAVA_OPTS value: -Xmx4g -Xms4g - name: cluster.name value: es image: elasticsearch:v6.2.5 imagePullPolicy: Always name: es ports: - containerPort: 9200 hostPort: 9200 name: db protocol: TCP - containerPort: 9300 hostPort: 9300 name: transport protocol: TCP resources: limits: cpu: "6" memory: 12Gi requests: cpu: "4" memory: 8Gi securityContext: capabilities: add: - IPC_LOCK - SYS_RESOURCE volumeMounts: - mountPath: /data name: es - command: - /bin/elasticsearch_exporter - -es.uri=http://localhost:9200 - -es.all=true image: elasticsearch_exporter:1.0.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3 httpGet: path: /health port: 9108 scheme: HTTP initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 10 name: es-exporter ports: - containerPort: 9108 hostPort: 9108 protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /health port: 9108 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 10 resources: limits: cpu: 100m memory: 128Mi requests: cpu: 25m memory: 64Mi securityContext: capabilities: drop: - SETPCAP - MKNOD - AUDIT_WRITE - CHOWN - NET_RAW - DAC_OVERRIDE - FOWNER - FSETID - KILL - SETGID - SETUID - NET_BIND_SERVICE - SYS_CHROOT - SETFCAP readOnlyRootFilesystem: true dnsPolicy: ClusterFirst initContainers: - command: - /sbin/sysctl - -w - vm.max_map_count=262144 image: alpine:3.6 imagePullPolicy: IfNotPresent name: elasticsearch-logging-init resources: {} securityContext: privileged: true restartPolicy: Always schedulerName: default-scheduler securityContext: {} volumes: - hostPath: path: /Data/es type: DirectoryOrCreate name: eses-data.yamlapiVersion: apps/v1kind: StatefulSetmetadata: labels: addonmanager.kubernetes.io/mode: Reconcile k8s-app: es kubernetes.io/cluster-service: "true" version: v6.2.5 name: es-data namespace: defaultspec: podManagementPolicy: OrderedReady replicas: 12 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: es version: v6.2.5 serviceName: es template: metadata: labels: k8s-app: es kubernetes.io/cluster-service: "true" version: v6.2.5 spec: containers: - env: - name: NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace - name: ELASTICSEARCH_SERVICE_NAME value: es - name: NODE_MASTER value: "false" - name: NODE_DATA value: "true" - name: ES_HEAP_SIZE value: 16g - name: ES_JAVA_OPTS value: -Xmx16g -Xms16g - name: cluster.name value: es image: elasticsearch:v6.2.5 imagePullPolicy: Always name: es ports: - containerPort: 9200 hostPort: 9200 name: db protocol: TCP - containerPort: 9300 hostPort: 9300 name: transport protocol: TCP resources: limits: cpu: "8" memory: 32Gi requests: cpu: "7" memory: 30Gi securityContext: capabilities: add: - IPC_LOCK - SYS_RESOURCE volumeMounts: - mountPath: /data name: es - command: - /bin/elasticsearch_exporter - -es.uri=http://localhost:9200 - -es.all=true image: elasticsearch_exporter:1.0.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3 httpGet: path: /health port: 9108 scheme: HTTP initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 10 name: es-exporter ports: - containerPort: 9108 hostPort: 9108 protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /health port: 9108 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 10 resources: limits: cpu: 100m memory: 128Mi requests: cpu: 25m memory: 64Mi securityContext: capabilities: drop: - SETPCAP - MKNOD - AUDIT_WRITE - CHOWN - NET_RAW - DAC_OVERRIDE - FOWNER - FSETID - KILL - SETGID - SETUID - NET_BIND_SERVICE - SYS_CHROOT - SETFCAP readOnlyRootFilesystem: true dnsPolicy: ClusterFirst initContainers: - command: - /sbin/sysctl - -w - vm.max_map_count=262144 image: alpine:3.6 imagePullPolicy: IfNotPresent name: elasticsearch-logging-init resources: {} securityContext: privileged: true restartPolicy: Always schedulerName: default-scheduler securityContext: {} volumes: - hostPath: path: /Data/es type: DirectoryOrCreate name: eses-service.yamlapiVersion: v1kind: Servicemetadata: labels: addonmanager.kubernetes.io/mode: Reconcile k8s-app: es kubernetes.io/cluster-service: "true" kubernetes.io/name: Elasticsearch name: es namespace: defaultspec: clusterIP: None ports: - name: es port: 9200 protocol: TCP targetPort: 9200 - name: exporter port: 9108 protocol: TCP targetPort: 9108 selector: k8s-app: es sessionAffinity: None type: ClusterIPES集群监控工欲善其事必先利其器,中间件的运维首先要有充沛的监控伎俩,ES集群的监控罕用的三种监控伎俩:exporter、eshead、kopf,因为ES集群是采纳k8s架构部署,很多个性都会联合k8s来发展 ...

June 10, 2021 · 4 min · jiezi

关于kubernetes:国内首篇云厂商-Serverless-论文入选全球顶会突发流量下如何加速容器启动

简介:USENIX ATC (USENIX Annual Technical Conference) 学术会议是计算机系统畛域的顶级会议,入选中国计算机协会(CCF)举荐 A 类国内会议列表;本次会议共投稿 341 篇论文,接管 64 篇,录用率 18.8%。阿里云 Serverless 团队第一个提出在 FaaS 场景下的去中心化疾速镜像散发技术,团队创作的论文被 USENIX ATC’21 录用。 作者 | 王骜 起源 | Serverless 公众号 导读 USENIX ATC (USENIX Annual Technical Conference) 学术会议是计算机系统畛域的顶级会议,入选中国计算机协会(CCF)举荐 A 类国内会议列表;本次会议共投稿 341 篇论文,接管 64 篇,录用率 18.8%。 阿里云 Serverless 团队第一个提出在 FaaS 场景下的去中心化疾速镜像散发技术,团队创作的论文被 USENIX ATC’21 录用。以下是论文核心内容解读,重点在缩短阿里云函数计算产品 Custom Container Runtime 的函数冷启动端到端提早。 USENIX ATC 将于 7.14-7.16 在线上举办,论文信息见: https://www.usenix.org/conference/atc21/presentation/wang-ao 摘要Serverless Computing(FaaS)是一种新的云计算范式,它容许客户只关注本身的代码业务逻辑,零碎底层的虚拟化、资源管理、弹性伸缩等都交给云零碎服务商进行保护。Serverless Computing 上反对容器生态,解锁了多种业务场景,然而因为容器镜像简单,体积较大,FaaS 的 workload 动态性高且难以预测等个性,诸多业界当先的产品和技术并不能很好的利用于 FaaS 平台之上,所以高效的容器散发技术在 FaaS 平台上面临着挑战。 在这篇论文中,咱们设计并提出 FaaSNet。FaaSNet 是一个具备高伸缩性的轻量级零碎中间件,它利用到镜像减速格局进行容器散发,指标作用场景是 FaaS 中突发流量下的大规模容器镜像启动(函数冷启动)。FaaSNet 的外围组件蕴含 Function Tree (FT),是一个去中心化的、自均衡的二叉树状拓扑构造,树状拓扑构造中的所有节点全副等价。 ...

June 9, 2021 · 3 min · jiezi

关于kubernetes:从零开始了解-kubernetes还有谁不会

kubernetes 曾经成为容器编排畛域的王者,它是基于容器的集群编排引擎,具备扩大集群、滚动降级回滚、弹性伸缩、主动治愈、服务发现等多种个性能力。更多关注Kubernetes的介绍请参阅旧文:Kubernetes 前世今生( 附学习导图 ) 本文将带着大家疾速理解 kubernetes ,从零开始学习 kubernetes 技术。 kubernetes 架构 从宏观上来看 kubernetes 的整体架构,包含 Master、Node 以及 Etcd。 Master 即主节点,负责管制整个 kubernetes 集群。它包含 Api Server、Scheduler、Controller 等组成部分。它们都须要和 Etcd 进行交互以存储数据。 Api Server: 次要提供资源操作的对立入口,这样就屏蔽了与 Etcd 的间接交互。性能包含平安、注册与发现等。Scheduler: 负责依照肯定的调度规定将 Pod 调度到 Node 上。Controller: 资源控制中心,确保资源处于预期的工作状态。Node 即工作节点,为整个集群提供计算力,是容器真正运行的中央,包含运行容器、kubelet、kube-proxy。 kubelet: 次要工作包含治理容器的生命周期、联合 cAdvisor 进行监控、健康检查以及定期上报节点状态。kube-proxy: 次要利用 service 提供集群外部的服务发现和负载平衡,同时监听 service/endpoints 变动并刷新负载平衡。从创立 deployment 开始 deployment 是用于编排 pod 的一种控制器资源,咱们会在前面做介绍。这里以 deployment 为例,来看看架构中的各组件在创立 deployment 资源的过程中都干了什么。 首先是 kubectl 发动一个创立 deployment 的申请apiserver 接管到创立 deployment 申请,将相干资源写入 etcd;之后所有组件与 apiserver/etcd 的交互都是相似的deployment controller list/watch 资源变动并发动创立 replicaSet 申请replicaSet controller list/watch 资源变动并发动创立 pod 申请scheduler 检测到未绑定的 pod 资源,通过一系列匹配以及过滤抉择适合的 node 进行绑定kubelet 发现自己 node 上需创立新 pod,负责 pod 的创立及后续生命周期治理kube-proxy 负责初始化 service 相干的资源,包含服务发现、负载平衡等网络规定至此,通过 kubenetes 各组件的分工协调,实现了从创立一个 deployment 申请开始到具体各 pod 失常运行的全过程。 ...

June 8, 2021 · 2 min · jiezi

关于kubernetes:有状态容器应用从入门到实践

无状态 or 有状态容器利用什么是无状态或有状态容器呢?所谓无状态容器利用,意味着容器上利用所应用的历史数据或运行状态不须要进行长久化,从新拉起这个利用时,无需关注这些历史输出。简略来说,例如你要运行一个计算器(而且这个计算器不须要反对历史记录性能),当你从新拉起这个计算器时,之前的数据不须要从新被加载上来,计算器能够认为是一个无状态利用。其它相似的无状态容器利用还包含一些协定转换、申请转发等利用,大体都能够认为是无状态的。 那什么是有状态容器利用呢?有状态容器利用的特色是利用中解决的历史申请或操作,对当初或将来的操作是有影响的,那历史数据就必须被记录下来,这种利用就被称之为有状态容器利用。最典型的有状态利用莫过于数据库了,当数据库从新拉起时,你当然“要求”之前写入数据库的记录必须能被正确无误地加载进去。其实同样地,很多的音讯队列(例如RabbitMQ等),为了不使音讯失落,音讯队列中间件也会将音讯进行长久化。 当然,随着容器利用的边界越发广大,越来越多的有状态利用正在容器化,咱们看到很多的AI、主动驾驶、HPC工作都在进行容器化。 如何应用YRCloudFile反对有状态容器利用YRCloudFile为Kubernetes提供了规范的CSI接口,通过这个接口,用户不须要对Kubernetes进行任何侵入,就能够通过Kubernetes调度和应用YRCloudFile中的存储能力。 在Kubernetes中要应用YRCloudFile只须要简略的几个步骤: 确保Kubernetes的Master节点和计算节点可能拜访YRCloudFile的存储网络在Master节点和计算节点上,导入YRCloudFile CSI插件镜像,应用YRCloudFile提供的yrfs-csi.yaml模板,创立YRCloudFile-CSI Pod 验证创立的YRCloudFile-CSI POD 全副为 “Running” 应用咱们提供的storageclass样例yaml创立YRCloudFile storageclass应用storageClassName: yrcloudfile-sc间接创立PVC,并将PVC关联至须要应用长久化存储的Pod整个过程就实现了。 除此之外,咱们还能够通过YRCloudFile的治理界面增加多个Kubernetes集群,在YRCloudFile界面上实现对PVC、PV等资源的QoS、Quota等属性的设置,对PV进行IO监控以及查看PV中的数据热点散布状况。 AI利用通过容器,应用YRCloudFile的成果在理论的客户环境中,咱们应用三台x86服务器,基于100Gb InfiniBand网络,搭建了YRCloudFile集群,与客户现有的10多台服务器组成的存储集群进行了基于业务的理论测试比照。 语音降噪测试: 在理论测试中,YRCloudFile岂但提供了多种读写模式、不便的接入形式,同时呈现出的性能以及对AI利用效率的晋升,都比原有存储计划有了大幅晋升。 容器存储将来之路将来,容器存储的倒退将不光只是接口层面的撑持,还将要求性能、QoS、Quota、全方位监控、数据冷热生命周期治理等性能,同时,面向大数据分析、数据库的针对性优化、数据的容灾备份等都会显得越来越重要,最终帮忙用户逐渐把大部分业务实现容器化。

June 7, 2021 · 1 min · jiezi