关于kubernetes:利用观测云实现-Kubernetes-多集群可观测

简介观测云的工作空间接入多个 Kubernetes 集群时,是如何辨别不同集群,达到多集群的可观测性? 减少Tag NAMESPACE:DataKit 选举空间,须要设置 ENV_NAMESPACE 环境变量,值为非空字符,不同集群值不能雷同。减少全局Tag(选举类):DataKit 全局 Tag,须要设置 ENV_GLOBAL_ELECTION_TAGS 环境变量,观测云提供了应用全局 Tag 的形式来进行辨别。减少全局 Tag 的形式(非选举类): 观测云提供了在 ENV_GLOBAL_HOST_TAGS 环境变量中减少全局 Tag 的形式。前置条件Kubernetes 1.18+ 版本以上观测云账号申请、工作空间新建操作步骤1.下载 dataKit.yaml 文件登录观测云控制台,抉择「集成」-「DataKit」-「Kubernetes」,依照所提醒的装置步骤下载 datakit.yaml 。 2.配置 DataWay 数据网关地址配置 ENV_DATAWAY 信息示例如下: - name: ENV_DATAWAY value: https://openway.guance.com?token=tkn_xxxxxxxxxxxxx1)在「观测云控制台」-「设置」,复制 Token 信息 2)替换如下 datakit.yaml 的 Token 信息 3.DataKit 配置全局 TAG在 datakit.yaml 下面配置全局 tag 。 1)设置 ENV_NAMESPACE - name: ENV_NAMESPACE value: k8s-test2)设置 ENV_GLOBAL_ELECTION_TAGS - name: ENV_GLOBAL_ELECTION_TAGS value: cluster_name_k8s=k8s-test3)设置 ENV_GLOBAL_TAGS - name: ENV_GLOBAL_HOST_TAGS value: host=__datakit_hostname,host_ip=__datakit_ip,cluster_name_k8s=k8s-test ...

February 29, 2024 · 1 min · jiezi

关于kubernetes:利用观测云实现-Kubernetes-多集群可观测

观测云的工作空间接入多个 Kubernetes 集群时,是如何辨别不同集群,达到多集群的可观测性? 减少Tag NAMESPACE:DataKit 选举空间,须要设置 ENV_NAMESPACE 环境变量,值为非空字符,不同集群值不能雷同。减少全局Tag(选举类):DataKit 全局 Tag,须要设置 ENV_GLOBAL_ELECTION_TAGS 环境变量,观测云提供了应用全局 Tag 的形式来进行辨别。减少全局 Tag 的形式(非选举类): 观测云提供了在 ENV_GLOBAL_HOST_TAGS 环境变量中减少全局 Tag 的形式。前置条件Kubernetes 1.18+ 版本以上观测云账号申请、工作空间新建操作步骤1.下载 dataKit.yaml 文件登录观测云控制台,抉择「集成」-「DataKit」-「Kubernetes」,依照所提醒的装置步骤下载 datakit.yaml 。 2.配置 DataWay 数据网关地址配置 ENV_DATAWAY 信息示例如下: - name: ENV_DATAWAY value: https://openway.guance.com?token=tkn_xxxxxxxxxxxxx1)在「观测云控制台」-「设置」,复制 Token 信息 2)替换如下 datakit.yaml 的 Token 信息 3.DataKit 配置全局 TAG在 datakit.yaml 下面配置全局 tag 。 1)设置 ENV_NAMESPACE - name: ENV_NAMESPACE value: k8s-test2)设置 ENV_GLOBAL_ELECTION_TAGS - name: ENV_GLOBAL_ELECTION_TAGS value: cluster_name_k8s=k8s-test3)设置 ENV_GLOBAL_TAGS - name: ENV_GLOBAL_HOST_TAGS value: host=__datakit_hostname,host_ip=__datakit_ip,cluster_name_k8s=k8s-test ...

February 28, 2024 · 1 min · jiezi

关于kubernetes:Kube-QueueKubernetes-任务排队的利器

批处理作业(Batch Job)常利用于数据处理、仿真计算、科学计算和人工智能等畛域,次要用于执行一次数据处理或模型训练任务。因为这类工作往往须要耗费大量计算资源,因而必须依据工作的优先级和提交者的可用资源状况进行正当排队,能力最大化集群资源的利用效率。 Scheduler 在任务调度畛域水土不服以后 Kubernetes 的调度器提供了欠缺的 Pod 通用调度性能,然而在面对大量工作排队时,仍然暴露出了局限性: 短少自动化的排队机制默认状况下,批处理工作会间接创立作业 Pod,当集群可用资源有余时,大量 Pending Pod 会重大拖慢 Kubernetes 调度器的处理速度,影响在线业务扩容和调度。因而,迫切需要可能主动依据集群资源管制作业启停的自动化排队机制。 短少多样化的排队策略为晋升工作排队效率,须要依据集群资源和工作规模,采取阻塞队列、优先级队列、回填调度等不同的排队策略。然而,Kubernetes 调度器的默认调度策略次要依据优先级和 Pod 创立程序进行排队,难以应答多样化的工作排队需要。 短少多队列能力为隔离不同用户或租户的工作,防止资源被繁多用户的大量工作占满,导致其它用户“饿死”,工作排队零碎须要反对多队列治理,将不同用户提交的任务分配到不同队列中排队。目前,Kubernetes 调度器仅反对繁多队列,无奈无效防止此类问题。 大量工作类型难以对立在机器学习、高性能计算、大数据计算和离线工作流等不同利用场景下,用户会提交不同类型的工作,每类工作对资源和优先级的计算方法都有所不同,将这些计算逻辑都集成到调度器中,必然大幅减少保护复杂性和运维老本。 因而,在解决简单的任务调度场景时,云服务提供商通常不将原生 Kubernetes 调度器作为首选计划。 Queue 在 Kubernetes 中的定位与职责在 Kubernetes 集群中,Queue 与 Scheduler 独特合作以确保工作的高效调度。为了防止“脑裂”等典型的分布式系统问题,必须清晰划分它们的职责。目前,Kubernetes 中的 Queue 能够分为两类: 第一类 Queue 与 Kubernetes 的 Scheduler 属于不同分层。Queue 负责工作的排序和按程序出队,专一于工作的生命周期治理和实现更偏心的用户间出队策略;Scheduler 负责工作 Pod 的正当编排,找到最优的搁置策略,专一于节点亲和性、拓扑感知等方面。这类 Queue 不间接感知底层的物理信息,工作出队后可能会因为节点亲和性、资源碎片化等因素无奈调度,导致队头阻塞。因而,这类队列通常须要引入“工作在无奈调度时从新入队”的机制。本文将介绍的 Kube Queue 和开源社区中的 Kueue 都是这类 Queue 的代表。 第二类 Queue 与 Scheduler 互相耦合,工作只有在确保可能调度的状况下才会出队。这种设计防止了第一类 Queue 的队头阻塞问题,然而仍然存在难以齐全兼容调度器全副调度语法的问题。而且,应用这类 Queue 意味着须要替换默认调度器,对集群而言是较大的变更。这类 Queue 的典型代表有 Volcano 和 YuniKorn。 ...

February 27, 2024 · 2 min · jiezi

关于kubernetes:聊聊springcloudkubernetesclientloadbalancer

序本文次要钻研一下spring-cloud-kubernetes-client-loadbalancer ServiceInstanceListSupplierorg/springframework/cloud/loadbalancer/core/ServiceInstanceListSupplier.java public interface ServiceInstanceListSupplier extends Supplier<Flux<List<ServiceInstance>>> { String getServiceId(); default Flux<List<ServiceInstance>> get(Request request) { return get(); } static ServiceInstanceListSupplierBuilder builder() { return new ServiceInstanceListSupplierBuilder(); }}spring-cloud-loadbalancer定义了ServiceInstanceListSupplier,它继承自Supplier,其泛型为Flux<List<ServiceInstance>>,它定义了getServiceId、get(Request)办法,并提供了builder静态方法Requestorg/springframework/cloud/client/loadbalancer/Request.java public interface Request<C> { // Avoid breaking backward compatibility default C getContext() { return null; } // TODO: define contents}Request提供了getContext办法,默认返回nullDefaultRequestorg/springframework/cloud/client/loadbalancer/DefaultRequest.java public class DefaultRequest<T> implements Request<T> { private T context; public DefaultRequest() { new DefaultRequestContext(); } public DefaultRequest(T context) { this.context = context; } @Override public T getContext() { return context; } public void setContext(T context) { this.context = context; } @Override public String toString() { ToStringCreator to = new ToStringCreator(this); to.append("context", context); return to.toString(); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof DefaultRequest<?> that)) { return false; } return Objects.equals(context, that.context); } @Override public int hashCode() { return Objects.hash(context); }}DefaultRequest实现了Request,其定义的泛型为context的类型ServiceInstanceListSupplierspring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesServicesListSupplier.java ...

February 26, 2024 · 4 min · jiezi

关于kubernetes:聊聊springcloudkubernetesclientdiscovery

序本文次要钻研一下spring-cloud-kubernetes-client-discovery DiscoveryClientorg/springframework/cloud/client/discovery/DiscoveryClient.java public interface DiscoveryClient extends Ordered { /** * Default order of the discovery client. */ int DEFAULT_ORDER = 0; /** * A human-readable description of the implementation, used in HealthIndicator. * @return The description. */ String description(); /** * Gets all ServiceInstances associated with a particular serviceId. * @param serviceId The serviceId to query. * @return A List of ServiceInstance. */ List<ServiceInstance> getInstances(String serviceId); /** * @return All known service IDs. */ List<String> getServices(); /** * Can be used to verify the client is valid and able to make calls. * <p> * A successful invocation with no exception thrown implies the client is able to make * calls. * <p> * The default implementation simply calls {@link #getServices()} - client * implementations can override with a lighter weight operation if they choose to. */ default void probe() { getServices(); } /** * Default implementation for getting order of discovery clients. * @return order */ @Override default int getOrder() { return DEFAULT_ORDER; }}spring-cloud-commons提供了DiscoveryClient接口,它定义了description、getInstances、getServices、probe、getOrder办法KubernetesInformerDiscoveryClientspring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java ...

February 23, 2024 · 3 min · jiezi

关于kubernetes:聊聊如何停止某个pod的流量

序本文次要钻研一下如何进行某个pod的流量 配置# Copyright Istio Authors## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.################################################################################################### Ratings service##################################################################################################apiVersion: v1kind: Servicemetadata: name: ratings labels: app: ratings service: ratingsspec: ports: - port: 8080 name: http selector: app: ratings---apiVersion: apps/v1kind: Deploymentmetadata: name: ratings-v1 labels: app: ratings version: v1spec: replicas: 3 selector: matchLabels: app: ratings version: v1 template: metadata: labels: app: ratings version: v1 spec: containers: - name: ratings image: jvm-tools-demo:v2 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 livenessProbe: httpGet: path: /actuator/health/liveness port: 8080 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 securityContext: runAsUser: 1000 resources: # keep request = limit to keep this container in guaranteed class requests: cpu: 50m memory: 128Mi ---这里咱们配置了livenessProbe及readinessProbereadinessProbeorg/springframework/boot/actuate/availability/ReadinessStateHealthIndicator.java ...

February 18, 2024 · 2 min · jiezi

关于kubernetes:聊聊如何变更pod的流量路由

<article class=“article fmt article-content”><h2>序</h2><p>本文次要钻研一下如何变更pod的流量路由</p><h2>配置</h2><pre><code># Copyright Istio Authors## Licensed under the Apache License, Version 2.0 (the “License”);# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an “AS IS” BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.################################################################################################### Ratings service##################################################################################################apiVersion: v1kind: Servicemetadata: name: ratings labels: app: ratings service: ratingsspec: ports: - port: 8080 name: http selector: app: ratings—apiVersion: apps/v1kind: Deploymentmetadata: name: ratings-v1 labels: app: ratings version: v1spec: replicas: 3 selector: matchLabels: app: ratings version: v1 template: metadata: labels: app: ratings version: v1 spec: containers: - name: ratings image: jvm-tools-demo imagePullPolicy: IfNotPresent ports: - containerPort: 8080 securityContext: runAsUser: 1000 resources: # keep request = limit to keep this container in guaranteed class requests: cpu: 50m memory: 128Mi —</code></pre><blockquote>kind load docker-image jvm-tools-demo<br/>kind create -f ratings.yaml</blockquote><h2>查看</h2><h3>endpoint</h3><pre><code>kubectl get epNAME ENDPOINTS AGEkubernetes 192.168.228.2:6443 43mratings 10.244.0.10:8080,10.244.0.8:8080,10.244.0.9:8080 6m18s</code></pre><h3>svc</h3><pre><code>kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 46mratings ClusterIP 10.96.170.159 <none> 8080/TCP 9m3s</code></pre><h3>pods</h3><pre><code>kubectl get podsNAME READY STATUS RESTARTS AGEratings-v1-676f4d994-8xp7j 1/1 Running 0 9m22sratings-v1-676f4d994-9gbkh 1/1 Running 0 9m22sratings-v1-676f4d994-tg49h 1/1 Running 0 9m22s</code></pre><h2>更新label</h2><pre><code>kubectl label pod ratings-v1-676f4d994-tg49h app=ratings2 –overwrite</code></pre><h3>查看变更</h3><pre><code>kubectl describe pod ratings-v1-676f4d994-tg49hName: ratings-v1-676f4d994-tg49hNamespace: defaultPriority: 0Service Account: defaultNode: kind-control-plane/192.168.228.2Start Time: Tue, 13 Feb 2024 10:27:11 +0800Labels: app=ratings2 pod-template-hash=676f4d994 version=v1Annotations: <none>Status: RunningIP: 10.244.0.8IPs: IP: 10.244.0.8Containers: ratings: Container ID: containerd://fe1d8ddc2d27c557a51181f0b4df8187fb1c06c71d8e564fe9f1ceebb480e156 Image: registry.cn-hangzhou.aliyuncs.com/springcloud-cn/jvm-tools-demo Image ID: docker.io/library/import-2024-02-13@sha256:4ed39c8b931585c67e28def544117913fddf929cff8c3062ae19c3d15fffebe7 Port: 8080/TCP Host Port: 0/TCP State: Running Started: Tue, 13 Feb 2024 10:27:12 +0800 Ready: True Restart Count: 0 Requests: cpu: 50m memory: 128Mi Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-2f9mt (ro)Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled TrueVolumes: kube-api-access-2f9mt: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: trueQoS Class: BurstableNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300sEvents: Type Reason Age From Message —- —— —- —- ——- Normal Scheduled 5m42s default-scheduler Successfully assigned default/ratings-v1-676f4d994-tg49h to kind-control-plane Normal Pulled 5m41s kubelet Container image “registry.cn-hangzhou.aliyuncs.com/springcloud-cn/jvm-tools-demo” already present on machine Normal Created 5m41s kubelet Created container ratings Normal Started 5m41s kubelet Started container ratings</code></pre><blockquote>能够看到label变更了</blockquote><h3>查看ep</h3><pre><code>kubectl get epNAME ENDPOINTS AGEkubernetes 192.168.228.2:6443 50mratings 10.244.0.10:8080,10.244.0.11:8080,10.244.0.9:8080 12m</code></pre><blockquote>能够看到原来10.244.0.8:8080的pod因为label被更新了,所以被移除了,但因为须要放弃3个正本,因此点多生成了一个pod(<code>10.244.0.11:8080</code>)</blockquote><h3>查看pod</h3><pre><code>kubectl get podsNAME READY STATUS RESTARTS AGEratings-v1-676f4d994-8xp7j 1/1 Running 0 13mratings-v1-676f4d994-9gbkh 1/1 Running 0 13mratings-v1-676f4d994-hpfg8 1/1 Running 0 9m6sratings-v1-676f4d994-tg49h 1/1 Running 0 13m</code></pre><blockquote>能够看到因为ratings-v1-676f4d994-tg49h的label被更新了,因此又从新生成了一个pod</blockquote><h2>小结</h2><p>通过更新pod的label能够将该pod从endpoint中移除,从而使得该pod不会被svc的流量路由到。然而因为更新了label,原来app=ratings须要放弃3个正本,因此会从新创立一个pod来补充。</p><h2>doc</h2><ul><li>应用kind在mac本地搭建k8s及istio</li><li>istio流量路由小试牛刀</li><li>Kubernetes之Label</li></ul></article> ...

February 13, 2024 · 2 min · jiezi

关于kubernetes:五分钟k8s入门到实战应用配置

背景在后面三节中曾经讲到如何将咱们的利用部署到 k8s 集群并提供对外拜访的能力,x当初能够满足根本的利用开发需要了。 当初咱们须要更进一步,应用 k8s 提供的一些其余对象来标准化我的利用开发。首先就是 ConfigMap,从它的名字也能够看出这是用于治理配置的对象。 ConfigMap不论咱们之前是做 Java、Go 还是 Python 开发都会应用到配置文件,而 ConfigMap 的作用能够将咱们本来写在配置文件里的内容转存到 k8s 中,而后和咱们的 Container 进行绑定。 存储到环境变量绑定的第一种形式就是将配置间接写入到环境变量,这里我先定义一个 ConfigMap: apiVersion: v1 kind: ConfigMap metadata: name: k8s-combat-configmap data: PG_URL: "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable"重点是 data 局部,存储的是一个 KV 构造的数据,这里存储的是一个数据库连贯。 须要留神,KV 的大小不能超过 1MB接着能够在容器定义中绑定这个 ConfigMap 的所有 KV 到容器的环境变量: # Define all the ConfigMap's data as container environment variables envFrom: - configMapRef: name: k8s-combat-configmap我将 ConfigMap 的定义也放在了同一个 deployment 中,间接 apply: ❯ k apply -f deployment/deployment.yamldeployment.apps/k8s-combat createdconfigmap/k8s-combat-configmap created此时 ConfigMap 也会被创立,咱们能够应用 ...

September 27, 2023 · 2 min · jiezi

关于kubernetes:k8s-服务升级为啥-pod-会部署到我们不期望的节点上看来你还不懂污点和容忍度

做自动化的共事明天竟然问我 k8s 中为什么我部署的 pod 会跑到你们开发的节点上来?我能够去管制它吗? 兄弟,天然是能够管制的,接下来我具体给你说一下对于 k8s 中节点污点,pod 对污点的容忍度,以及 亲缘性和非亲缘性✔✔ 需要场景首先咱们要明确咱们的需要和场景 如果冀望本人的 pod 须要部署到指定的 Node 上,那么能够在 pod 的 yaml 中加上 nodeSelector 节点标签选择器,或者在 pod 中加上节点亲缘性的配置<!----> 如果咱们冀望某一个节点不让别的 pod 的部署上来,只冀望一些特定的 pod 部署到这个 Node 上,那么咱们就能够应用节点的污点,和 pod 对污点的容忍度来进行实现接下来咱们就开始吧,看看什么是 nodeSelector,以及上述提到的各种名词,本次文章内容,须要有一点点 k8s 根底的同学看起来会更加敌对,至多你得晓得 Deployment 资源和 pod 资源的 yaml 清单 ✔nodeSelector 节点标签选择器nodeSelector 节点标签选择器, 用过K8S的咱们都晓得,如果想让 pod 指定部署到某一些节点上,那么咱们能够通过这个字段来进行标识。 例如咱们的 Pod 资源中 nodeSelector 字段标识的是 func=dev ,那么 pod 就会部署到 func=dev 的任意节点上,这是强制指定的 apiVersion: v1kind: Podmetadata: name: test-node-selectorsepc: nodeSelector: fun: "dev" ...通过这里就能够看到节点标签选择器,它的应用局限性还是非常明显的,它只能用于你指定 pod 肯定要部署到某一个指定标签节点上的时候,那如果这个时候没有这种标签的节点时,你这个 pod 就会部署不胜利。 ...

September 26, 2023 · 3 min · jiezi

关于kubernetes:从运维小白成长为运维开发专家的修炼之路

类型技术栈名称和地址 前后端开发gin/gorm/vue3/ts<继续更新>7模块大运维平台开发-go-vue-k8s-cicd-服务树-监控 前后端开发vue2/restfulapik8s治理运维平台实战前端vue后端golang go后端开发 go语言根底go语言根底golang语言根底课程 go运维工具开发dag/pipelinegolang实战开发课程之pipeline流水线工具 go运维平台开发巡检/基线/定时工作golang运维开发实战课程之k8s巡检平台 k8s运维零根底搭建/保护/监控/日志k8s零根底入门运维课程,计算存储网络和常见的集群监控日志等 k8s运维工具开发多集群治理/client-go/guardgo运维开发实战之k8s多集群主动守卫自愈组件k8s-cluster-guard k8s运维工具开发老手开发必备/pod网络探测golang运维开发我的项目之k8s网络探测实战 k8s运维工具开发探针/源码k8s节点宕机pod检测工具和k8s探针代码解读 k8s底层问题开发底层/10开发我的项目k8s运维巨匠课程,k8s运维开发我的项目实战,大厂集群调优教训分享 k8s二次开发crd/operatork8s-operator和crd实战开发 助你成为k8s专家 k8s二次开发scheduler-frameworkk8s二次开发之基于实在负载的调度器 k8s运维开发ingress/apisix/开发ingress k8s流量网关 apisix 高级运维开发课程 k8s集群调优资源/coredns/镜像k8s集群运维实战调优工具分享和并解读局部我的项目源码 k8s源码解读kubelet/apiserver/准入k8s全组件源码解说和底层原理剖析三合一 助力你成为k8s专家 cicdtektonk8s-cicd 组件tekton全流水线实战和pipeline运行原理源码解读 k8s/go面试k8s高频问题/go常见算法k8s和golang面试真题解析 运维开发面试教训分享 linux运维进阶 Prometheus运维零根底alertmanager/grafana/prometheusprometheus零根底入门,grafana根底操作,支流exporter采集配置 Prometheus运维调优高可用/深刻配置prometheus全组件配置调优实战,一线大厂监控高可用计划分享 Prometheus二次开发exporter/queryEngineprometheus源码解说和二次开发

September 26, 2023 · 1 min · jiezi

关于kubernetes:k8s-pod网络暴露

1. k8s pod 和 service 网络裸露借助 iptables 的路由转发性能,买通k8s集群内的pod和service网络,与内部网络联通# 查看集群的 pod 网段和 service 网段kubectl -n kube-system describe cm kubeadm-confignetworking: dnsDomain: cluster.local podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12# 内核模块sysctl -a | grep 'net.ipv4.ip_forward = 1'echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.confsysctl -p# 在k8s节点 192.168.1.79 节点上开启转发 192.168.0.0/16 网段为服务器网段,利用 192.168.0.0/16 网段某个服务器作为路由器iptables -P FORWARD ACCEPTiptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j SNAT --to-source 10.244.0.0/16iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j SNAT --to-source 10.96.0.0/12# 这个不确定是否执行iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE# 测试,在 192.168.0.0/16 网段中找一个非k8s集群的服务器,加上路由,进行测试# 现找个pod ip ping一下是否通不通route add -net 10.244.0.0 netmask 255.255.0.0 gw 192.168.1.79 dev eth0# 加上这个路由之后, 再测试看是否通# 为了能让办公人员的浏览器能够拜访到, 须要再外围交换机上配置规定# 外围交换机route add -net 10.244.0.0 netmask 255.255.0.0 gw 192.168.1.79 dev eth0route add -net 10.96.0.0 netmask 255.240.0.0 gw 192.168.1.79 dev eth0

September 25, 2023 · 1 min · jiezi

关于kubernetes:Nginx-容器中文字符集

一. nginx 镜像中文字符集1. Dockerfile基于 Debian 12 的nginx镜像,默认不反对中文字符集,制作镜像让其中文文件不显示乱码FROM nginx:latestRUN sed -i 's#http://deb.debian.org#https://mirrors.163.com#g' /etc/apt/sources.list && apt-get update && apt-get install locales -y && sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/g' /etc/locale.gen && locale-genENV LC_ALL zh_CN.UTF-8ENV LANG zh_CN.UTF-8docker build . -t harbor.uuf.net.cn/library/nginx:ch-cn2. DeployapiVersion: v1kind: PersistentVolumeClaimmetadata: name: nginx-warehouse namespace: nokfspec: storageClassName: managed-nfs-storage accessModes: - ReadWriteMany resources: requests: storage: 1GiapiVersion: apps/v1kind: Deploymentmetadata: name: nginx-warehouse namespace: nokfspec: replicas: 1 selector: matchLabels: app: nginx-warehouse template: metadata: labels: app: nginx-warehouse spec: containers: - name: nginx-warehouse image: harbor.uuf.net.cn/library/nginx:ch-cn imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /etc/nginx/conf.d/ name: nginx-warehouse - mountPath: /home/nginx-warehouse name: storage volumes: - name: nginx-warehouse configMap: name: nginx-warehouse - name: storage persistentVolumeClaim: claimName: nginx-warehouse---apiVersion: v1kind: Servicemetadata: name: nginx-warehouse namespace: nokfspec: type: ClusterIP ports: - port: 80 selector: app: nginx-warehouse---kind: ConfigMapapiVersion: v1metadata: name: nginx-warehouse namespace: nokfdata: default.conf: |- server { listen 80; location / { autoindex on; charset utf-8; # 必要的 root /home/nginx-warehouse/; } }

September 20, 2023 · 1 min · jiezi

关于kubernetes:KubeVirt-耗时-7-年终将虚拟机带入-Kubernetes-世界

大家好,我是张晋涛。 随着云计算和容器技术的倒退,Kubernetes 曾经成为了业界的规范和领导者,为用户提供了一个弱小,灵便和可扩大的平台,来部署和治理各种类型的利用。 然而,对于一些难以容器化的利用,例如传统的企业应用,遗留的零碎,或者须要非凡硬件反对的利用,虚拟机依然是一个必要和无效的解决方案。如何在 Kubernetes 上运行和治理虚拟机,以及如何实现容器和虚拟机之间的互操作性和一致性,是一个亟待解决的问题。 这就是 KubeVirt 我的项目诞生的背景和指标。 KubeVirt 是一个开源我的项目,它使得虚拟机能够像容器一样被 Kubernetes 部署,生产和治理。它提供了一个对立的平台,让用户能够依据不同的需要,应用容器或者虚拟机来构建云原生利用。KubeVirt 我的项目于 2016 年启动,由 Red Hat, IBM, Google, Intel, SUSE 等多家公司和组织独特推动和奉献。通过 7 年的不懈努力,KubeVirt 于 2023 年 7 月公布了 v1.0.0 版本,标记着它曾经达到了生产就绪的程度,并且有着衰弱的社区。(在此之前,它曾经被很多公司用到了生产环境) 在这篇中,我将回顾 KubeVirt 的倒退历程,介绍 KubeVirt 的外围性能和劣势,以及剖析 KubeVirt 的将来瞻望和挑战。 KubeVirt 的倒退历程KubeVirt 的想法最早能够追溯到 2015 年,在第一届 KubeCon 上 Red Hat 的工程师 Fabian Deutsch 提出了一个问题:是否在 Kubernetes 上运行虚拟机?过后的答复是不确定的,然而这个问题引起了很多人的趣味和探讨。在接下来的一年里,Fabian Deutsch 和他的共事开始了一些原型和实验性的工作,摸索了不同的计划和技术。最终,他们抉择了应用 libvirt 和 QEMU 来实现虚拟机在 Kubernetes 上的运行和治理。 在 2016 年底,KubeVirt 我的项目正式启动,并在 GitHub 上开源。我的项目的次要指标是提供一个 Kubernetes 原生的虚拟化 API 和运行时,让用户能够像应用 Pod 和 Deployment 一样应用 VirtualMachine 和 VirtualMachineInstance 来定义和治理虚拟机。我的项目的次要挑战是如何将虚拟机与 Kubernetes 的资源模型,调度器,网络,存储等组件进行集成和协调。 ...

September 19, 2023 · 2 min · jiezi

关于kubernetes:五分钟k8s入门到实战跨服务调用

背景在做传统业务开发的时候,当咱们的服务提供方有多个实例时,往往咱们须要将对方的服务列表保留在本地,而后采纳肯定的算法进行调用;当服务提供方的列表变动时还得及时告诉调用方。 student: url: - 192.168.1.1:8081 - 192.168.1.2:8081这样天然是对单方都带来不少的累赘,所以后续推出的服务调用框架都会想方法解决这个问题。 以 spring cloud 为例: 服务提供方会向一个服务注册核心注册本人的服务(名称、IP等信息),客户端每次调用的时候会向服务注册核心获取一个节点信息,而后发动调用。 但当咱们切换到 k8s 后,这些基础设施都交给了 k8s 解决了,所以 k8s 天然得有一个组件来解决服务注册和调用的问题。 也就是咱们明天重点介绍的 service。 service在介绍 service 之前我先调整了源码: func main() { http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) { name, _ := os.Hostname() log.Printf("%s ping", name) fmt.Fprint(w, "pong") }) http.HandleFunc("/service", func(w http.ResponseWriter, r *http.Request) { resp, err := http.Get("http://k8s-combat-service:8081/ping") if err != nil { log.Println(err) fmt.Fprint(w, err) return } fmt.Fprint(w, resp.Status) }) http.ListenAndServe(":8081", nil) }新增了一个 /service 的接口,这个接口会通过 service 的形式调用服务提供者的服务,而后从新打包。 ...

September 8, 2023 · 2 min · jiezi

关于kubernetes:从软件工程师角度聊聊-Kubernetes

作为软件工程师,咱们应该相熟 K8s,只管它有点像 DevOps,但它能让咱们更好地理解幕后产生的事件,让咱们与部署工作更密切相关,更有责任感。本文将从软件工程师的角度探讨 Kubernetes (K8s),咱们将介绍其动机、原理和外围组件,助力于开发者们晋升 Kubernetes 的专业知识程度,能更有信念地拥抱这项前沿技术!  背景在议论 Kubernetes 之前,首先让咱们理解一下什么是容器。  当咱们思考一个这样的场景时,容器的概念就会变得很清晰:在开发人员实现满足特定需要的代码编写后,下一步就是将其打包并无缝装置到另一台主机上,确保咱们的客户能够轻松装置并享受其劣势。那如何打包并装置到另一台主机上?通常,咱们有很多依赖项,如二进制代码、依赖库和不同的操作系统,咱们须要将它们全副打成一个包,即所谓的 "容器"。  换句话说,咱们能够将代码与所有依赖项一起装入容器,而后在近程机器上轻松运行,或者用工程术语来说,"部署咱们的服务"。  部署挑战既然咱们晓得咱们的服务是应用容器运输的,那么就会呈现这些次要问题: 如何能力晓得咱们的容器服务不会解体?咱们心愿确保如果一个容器宕机,另一个容器将启动。怎么确保这个容器有足够的资源运行?兴许它占用的资源比理论须要的还要多。如何治理版本部署,这意味着当咱们降级代码时,能够在不停机的状况下实现?咱们心愿确保服务的高可用性。如何让咱们的容器互相对话?当咱们的申请减少或缩小时,如何进行扩大或缩减? 在采纳 K8s 之前,AppsFlyer 曾遇到过这些问题,而作为一家领有弱小平台团队的公司,咱们通过外部施行解决了这些问题。例如,为了治理服务的生命周期,咱们创立了一个名为"Medic"的流程,通过一直向健康检查 API 发送 GET 申请,确保咱们的服务始终失常运行。  另一个例子是,咱们的大多数服务都是通过一个 docker 容器和用于部署与治理服务的外部工具("Santa")部署在一个 ec2 实例上的。这不会与任何其余服务共享,否则就会浪费资源、工夫,更重要的是,还会节约金钱。  K8s 解决方案从上文能够理解到,Kubernetes 的施行是为了解决我提到的挑战。  Kubernetes 的定义是:“这是一个用于自动化部署、扩大和治理容器化应用程序的开源零碎。”换句话说,Kubernetes 为咱们提供了一个容器编排零碎,用于妥善治理咱们的集群,让咱们能够部署、治理资源并扩大利用。K8s 将咱们的容器包裹起来,为咱们掌舵。  以下就是咱们从应用 K8s 和解决上述挑战中取得的一些益处: 解体时容器的自行修复——Kubernetes 提供了一种健康检查机制。这意味着不再须要实现查看 API 来对咱们的服务进行采样。利用容器的主动散发和调度为咱们提供了节点资源的高效利用。通过与多个应用程序共享节点实例,理智、高效地利用资源。 主动推出和回滚,无需停机。服务发现和负载平衡可帮忙容器互相通信。程度扩大可确保开发人员在低负载或高负载的状况下同时应用应用程序,从而进步应用程序的性能。 总之,Kubernetes 是大规模治理容器化应用程序的最佳解决方案。凭借其弱小的组件和自动化性能,Kubernetes 简化了应用程序生命周期的部署、扩大和治理。与间接在一个 EC2 实例上应用 Docker 相比,Kubernetes 能够节省时间和精力,并为治理生产中的应用程序提供基本功能。  最重要的是,Kubernetes 能为公司节俭资金。通过主动治理基础设施,Kubernetes 缩小了对人工干预和外部工具的需要,如上所述,这能够节俭大量经营老本。此外,Kubernetes 还能够帮忙优化资源利用率,使在雷同硬件上运行更多应用程序成为可能,从而节省成本。  每位开发人员都应理解的 K8s 根本组件  Kubernetes 的外围组件分为两大类:管制立体组件和节点。让咱们来看看这些高级组件:  API 服务器API 服务器是管制立体的外围组件,负责公开 Kubernetes API 并解决 API 申请。它是集群中其余组件(如 kubectl 命令行工具或 Kubernetes 面板)与集群交互的次要形式。  ...

September 8, 2023 · 1 min · jiezi

关于kubernetes:k8s-入门到实战部署应用到-k8s

背景最近这这段时间更新了一些 k8s 相干的博客和视频,也收到了一些反馈;大略分为这几类: 公司曾经经验过服务化革新了,但还未接触过云原生。公司局部利用进行了云原生革新,但大部分工作是由基础架构和运维部门推动的,本人只是作为开发并不理解其中的细节,甚至 k8s 也接触不到。还处于比拟传统的以虚拟机部署的传统运维为主。其中以第二种占大多数,尽管公司进行了云原生革新,但仿佛和纯业务研发同学来说没有太大关系,本人工作也没有什么变动。 恰好我之前正好从业务研发的角度转换到了基础架构部门,两个角色我都接触过,也帮忙过一些业务研发理解公司的云原生架构; 为此所以我想系统性的带大家以研发的角度对 k8s 进行实际。 因为 k8s 局部性能其实是偏运维的,对研发来说优先级并不太高;所以我不太会波及一些 k8s 运维的知识点,比方装置、组件等模块;次要以咱们日常开发会应用到的组件讲起。 打算入门部署利用到 k8s跨服务调用集群内部拜访 进阶如何应用配置服务网格实战运维你的利用利用探针滚动更新与回滚优雅采集日志利用可观测性 指标可视化k8s 部署常见中间件helm 一键部署编写 Operator 自动化利用生命周期这里我整顿了一下目录,每个章节都有博客+视频配合观看,大家能够依照爱好抉择。 因为还波及到了视频,所以只能争取一周两更,在两个月内全副更新结束。 依据我本人的教训,以上内容都把握的话对 k8s 的把握会更进一步。 部署利用到 k8s首先从第一章【部署利用到 k8s】开始,我会用 Go 写一个简略的 Web 利用,而后打包为一个 Docker 镜像,之后部署到 k8s 中,并实现其中的接口调用。 编写利用func main() { http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) { log.Println("ping") fmt.Fprint(w, "pong") }) http.ListenAndServe(":8081", nil) }利用非常简单就是提供了一个 ping 接口,而后返回了一个 pong. Dockerfile# 第一阶段:编译 Go 程序 FROM golang:1.19 AS dependencies ENV GOPROXY=https://goproxy.cn,direct WORKDIR /go/src/app COPY go.mod . #COPY ../../go.sum . RUN --mount=type=ssh go mod download # 第二阶段:构建可执行文件 FROM golang:1.19 AS builder WORKDIR /go/src/app COPY . . #COPY --from=dependencies /go/pkg /go/pkg RUN go build # 第三阶段:部署 FROM debian:stable-slim RUN apt-get update && apt-get install -y curl COPY --from=builder /go/src/app/k8s-combat /go/bin/k8s-combat ENV PATH="/go/bin:${PATH}" # 启动 Go 程序 CMD ["k8s-combat"]之后编写了一个 dockerfile 用于构建 docker 镜像。 ...

September 6, 2023 · 2 min · jiezi

关于kubernetes:Nextjs解决axios获取真实ip问题

前言上篇文章中我应用了ip2region获取到了ip归属地,然而我发现我的框架next.js通过k8s公布到生产环境之后发现获取的ip是pod的ip而不是实在的外网ip,上面就来谈谈如何解决! 操作首先我想到的是可能是阿里云ACK本人的问题,于是问了他们客服之前机器人给了上面的解决方案: ACK容器集群利用Pod如何获取客户端实在IPACK容器集群Pod如何获取客户端实在IP?如果您未应用WAF,且集群是通过SLB裸露的业务,请查看Service的YAML文件,确保externaltrafficpolicy为Local模式,该模式下可获取到客户端实在IP。如果集群是通过Ingress裸露的业务,请查看nginx-ingress-lb的externaltrafficpolicy,确保externaltrafficpolicy为Local模式。 如果您应用了WAF,请参见K8s Ingress获取实在IP地址解决。 发现解决不了问题之后,上面是他们客服给的解决方案: 1、查看service中nginx-ingress-lb内部流量策略是不是Local 发现设置的就是Local,所以通过! 2、设置nginx-configuration 执行上面命令: kubectl -n kube-system edit cm nginx-configuration在data中增加上面内容: compute-full-forwarded-for: "true" forwarded-for-header: "X-Forwarded-For" use-forwarded-headers: "true" enable-real-ip: "true"设置好即失效,通过! 3、查看deploy无状态的nginx-ingress-controller日志中展现是不是实在ip 172.22.32.48 - [172.22.32.48] - - [31/Aug/2023:11:49:00 +0800] "GET /api/space/info/urlCategory/zhangwei HTTP/1.1" 200 20188 "-" "axios/1.5.0" 320 0.059 [seaurl-testapi-seaurl-gatewayserver-svc-7777] 172.22.32.57:7777 20188 0.059 200 9c6a2589d7926d266abe56b6e4b38488 testapi.seaurl.com []114.222.247.210 - [114.222.247.210] - - [31/Aug/2023:11:49:01 +0800] "GET /api/space/crud/urlCategory/zhangwei/categoryTreeList HTTP/2.0" 200 20188 "https://test.seaurl.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" 56 0.027 [seaurl-testapi-seaurl-gatewayserver-svc-7777] 172.22.32.57:7777 20188 0.027 200 e165866b16394694c332e82aa47de562 testapi.seaurl.com []通过下面显示,发现每次应用的pod的ip都是axios申请的,实在的都是客户端浏览器申请的,这是为啥呢??? ...

August 31, 2023 · 1 min · jiezi

关于kubernetes:常见的Kubernetes命令之kubectl命令详解

资源查看命令这些命令用于查看 Kubernetes 集群中的资源状态和信息: kubectl get nodes:查看所有节点的状态和信息。例如节点的名称、IP 地址、状态、版本等。kubectl get pods:查看所有 pod 的状态和信息。例如 pod 的名称、所在节点、状态、IP 地址、容器状态等。kubectl get services:查看所有服务的状态和信息。例如服务的名称、类型、IP 地址、端口等。kubectl get deployments:查看所有部署的状态和信息。例如部署的名称、所在命名空间、正本数、可用正本数等。kubectl get replicasets:查看所有正本集的状态和信息。例如正本集的名称、所在命名空间、正本数、可用正本数等。kubectl get persistentvolumes:查看所有长久卷的状态和信息。例如长久卷的名称、类型、容量、状态等。kubectl get persistentvolumeclaims:查看所有长久卷申明的状态和信息。例如长久卷申明的名称、所在命名空间、状态、绑定的长久卷名称等。kubectl get namespaces:查看所有命名空间的状态和信息。例如命名空间的名称、状态、创立工夫等。kubectl get configmaps:查看所有配置地图的状态和信息。例如配置地图的名称、所在命名空间、数据等。kubectl get secrets:查看所有密钥的状态和信息。例如密钥的名称、所在命名空间、类型、数据等。kubectl get events:查看所有事件的状态和信息。例如事件的类型、对象、起因、音讯等。kubectl top nodes:查看节点的资源应用状况。例如 CPU 和内存的使用率、使用量等。kubectl top pods:查看 pod 的资源应用状况。例如 CPU 和内存的使用率、使用量等。资源详细信息命令这些命令用于查看 Kubernetes 集群中特定资源的详细信息: kubectl describe pod <pod-name>:查看特定 pod 的详细信息。例如 pod 的状态、容器状态、事件等。kubectl describe service <service-name>:查看特定服务的详细信息。例如服务的类型、IP 地址、端口、关联的 pod 等。kubectl describe node <node-name>:查看特定节点的详细信息。例如节点的状态、标签、容量、应用状况等。kubectl describe deployment <deployment-name>:查看特定部署的详细信息。例如部署的状态、正本数、可用正本数、关联的 pod 等。kubectl describe replicasets <replicaset-name>:查看特定正本集的详细信息。例如正本集的状态、正本数、可用正本数、关联的 pod 等。kubectl describe persistentvolume <persistentvolume-name>:查看特定长久卷的详细信息。例如长久卷的状态、类型、容量、拜访模式等。kubectl describe persistentvolumeclaims <persistentvolumeclaim-name>:查看特定长久卷申明的详细信息。例如长久卷申明的状态、绑定的长久卷名称、拜访模式等。kubectl describe namespace <namespace-name>:查看特定命名空间的详细信息。例如命名空间的状态、标签、创立工夫等。kubectl describe configmap <configmap-name>:查看特定配置地图的详细信息。例如配置地图的数据、创立工夫等。kubectl describe secret <secret-name>:查看特定密钥的详细信息。例如密钥的类型、数据、创立工夫等。kubectl describe event <event-name>:查看特定事件的详细信息。例如事件的类型、对象、起因、音讯等。 ...

August 28, 2023 · 2 min · jiezi

关于kubernetes:如何基于-Kubernetes-实现优质开发者平台体验

外部开发者平台(或 IDP)是使开发团队可能更快、更轻松、更统一地交付应用程序的基础设施。Kubernetes 自身是一个功能强大的平台,但它引入了太多复杂性和性能,因而不能简略地将其作为 IDP 交给开发团队。若要冀望他们能取得成功,十分重要的一点是要设置一些防护措施,使他们可能无效地应用 K8s,而不会减少与可靠性、老本效益和安全性相干的危险。  尽管 Kubernetes 自身并不适宜作为 IDP,但它是构建 IDP 的坚实基础。Kubernetes 为平台工程师提供了许多工具,例如,它能够为开发人员构建 IDP、提供更简化的构建和运行应用程序的形式。因而须要思考的问题是,如何构建一个既能为开发人员提供良好体验,又不会障碍部署到生产环境的平台。通过应用策略和治理、基于角色的访问控制(RBAC)和默认网络策略利用安全措施,有一些很好的办法能够避免集群中产生谬误。  Kubernetes 平台的形成基于 Kubernetes 的 IDP 不仅包含 Kubernetes,还包含开发人员所需的工具和流程。作为 Kubernetes 的平安限度,IDP 还须要您心愿在 Kubernetes 中建设的策略和治理。这种组合使您可能为开发人员提供一条 "黄金门路",让他们可能更快地部署应用程序。Kubernetes 平台由四个次要局部组成: 插件插件是提供默认“开箱即用”性能所需的工具,可扩大 Kubernetes 的性能,包含 DNS、TLS、Ingress、日志记录、跟踪等。这些工具能够是开源我的项目也能够是来自供应商的软件。  创立治理Kubernetes 治理是创立策略、程序和一组规范策略的过程,用于定义和施行 Kubernetes 平台中的最佳实际,以及资源管理、调度、降级和基于角色的访问控制。  启用部署(CI/CD)这是应用程序从代码进入平台的形式。在 IDP 中,您为开发人员创立了一条 "黄金门路”,让他们能更轻松地将新应用程序和服务部署到平台中,同时放弃高效和平安。  提供反馈IDP 的一个重要组成部分是向开发团队提供及时反馈。平台的这一部分必须包含疾速检测和问题告诉,并与他们曾经应用的工具集成。同时还应在代码审查过程中为开发人员提供倡议的修复选项。  治理和策略:三个阶段当您思考如何在 Kubernetes 中利用治理和策略时,这的确是一个过程。首先,您须要抉择或创立必要的策略。接下来,您须要一种主动的形式来辨认违反政策的行为,而后领导如何修复这些违反策略的行为。最初,须要可能主动阻止这些违规行为进入集群。  团队在开始部署 Kubernetes 的时候往往没有遇到什么初始问题,也就是说在这个阶段开发团队在内容、编码和交付应用程序和服务时没有什么显著的问题。但平台团队起初发现开发团队疏忽了一些重要的安全措施来帮忙保护平安并继续利用最佳实际。因为在开发者平台中,开发人员能够轻松地在须要时部署他们想要的内容。除非团队中有人返回并手动查看所有设置,否则在呈现问题之前可能不会有任何意识。  能够应用开源策略引擎(如 Polaris 或 Open Policy Agent (OPA))在 Kubernetes 中主动利用策略。应用相似的解决方案,您能够确保您的配置与环境中的策略保持一致,帮忙您放弃一切顺利运行。  抉择策略在开始应用策略执行与老本效益、安全性和可靠性相干的 Kubernetes 最佳实际时,开发人员往往不晓得从哪里开始,也不晓得应该关注什么。最好的入门办法是确定什么对您来说最重要,这就是创立策略的办法。如果老本对你来说是最重要的,那么就把重点放在影响老本的策略上,如资源申请和限度。如果平安是你的首要关注点,那就解决以 root 身份运行的容器或生成网络策略。咱们的倡议是从小处着手,筛选一两个能实现目标的策略,而后全面实施这些策略。  辨认、修复和阻止违规行为接下来,须要找出以后集群中违反策略的中央,并开始逐个纠正这些问题。修复要害类别中的问题后,您就能够开始在拜访时执行策略了。当开始执行策略并胜利阻止违反策略的行为之后就能够释怀了,因为这些问题不会再次弹出,你能够对要强制执行的下一组策略反复该过程。随之也就变得更加高效和平安了。  构建弱小的 IDP对于外部开发人员平台而言,利用 Kubernetes 治理和策略使您可能高效地治理资源,帮忙管制老本,确保应用程序获得最佳运行所需的资源。它还能帮忙您通过管制拜访和施行最佳实际来确保安全性和合规性,并通过建设规范、自动化的利用部署和扩大流程来进步可靠性和弹性。持重的 Kubernetes 治理和策略是构建平安、高效、牢靠的外部开发人员平台的要害组成部分,可满足开发人员和整个组织的需要。  ...

August 25, 2023 · 1 min · jiezi

关于kubernetes:K8S集群中使用JDOS-KMS服务对敏感数据安全加密-京东云技术团队

基本概念KMS,Key Management Service,即密钥治理服务,在K8S集群中,以驱动和插件的模式启用对Secret,Configmap进行加密。以爱护敏感数据, 驱动和插件须要使用者依照需要进行定制和实现本人的KMS插件,插件能够是gRPC服务器或者启用一个云服务商提供的KMS插件。 本文中演示应用的KMS 服务是京东云舰中的KMS加密服务。 目前KMS分为V1,V2,本文基于V1进行演示。 架构外部能够利用kms加密实现本人的加密算法,甚至国密算法。 当用户新建secret资源时,kube-apiserver 会通过gRPC调用kms-plugin,而kms-plugin与加密服务器通信,进行数据加密。 此时如果通过间接获取etcd中的原始数据,内容为密文数据。 当用户获取secret资源内容时,kube-apiserver 会通过gRPC调用kms-plugin,而kms-plugin与加密服务器通信,进行数据解密,将明文展现给用户 操作步骤须要一套曾经运行的Kubernetes集群服务,如果是多台master节点,须要同时配置。 新建目录/etc/kubernetes/kms/jdcloud 新建 EncryptionConfiguration该配置是kms根本的加密配置,包含加密资源对象,socket地址等等。 apiVersion: apiserver.config.k8s.io/v1kind: EncryptionConfigurationresources: - resources: - secrets # 这里示意,只加密secret providers: - kms: name: myKmsPlugin endpoint: unix:///var/run/k8s-kms-plugin/kms-plugin.sock # 如果不以pod(jdcloud-kms-plugin.yaml)启动,须要sock文件放到master节点。 cachesize: 100 timeout: 3s - identity: {}以上内容保留在/etc/kubernetes/kms/jdcloud/apiserver-encryption.conf 新建 jdcloud kms plugin 配置 kms server的上联信息配置 { "AccessKey": "xxx", # 部署前,该参数须要事后晓得, "SecretKey": "yyy", # 部署前,该参数须要事后晓得。 "KmsEndpoint": "kms.internal.cn-north-1.jdcloud-api.com", # 部署前,该参数须要事后晓得。 "KmsKeyId": "abcd", # 部署前,该参数须要事后晓得。 "KmsSchema": "http", "GRPCSocketPath": "/var/run/k8s-kms-plugin/kms-plugin.sock"}以上内容保留在/etc/kubernetes/kms/jdcloud/jdcloud-kms-plugin.json ...

August 24, 2023 · 2 min · jiezi

关于kubernetes:从来不懂K8s的人在10分钟内将应用跑在了K8s中

大家可能都据说过 K8s 或者 docker ,可能有容器编排的概念,晓得这会进步运维效率,然而因为上手难度高迟迟没有学习它。 明天我以本人的理论经验教大家将本人的利用在10分钟内部署到k8s中,你不须要懂任何的 docker 命令和 k8s 命令就能治理利用。就是这么酷~ 背景2019年疫情的影响,大学生们纷纷开始在家上网课。然而,他们可能会遇到老师留下的作业问题,而不晓得如何解决。同时,在进行百度搜寻时,常常会遭逢许多广告的烦扰。因而,我打算开发一款专门为大学生提供搜题性能的APP。 起初所有业务都写在一个 jar 包,为了实现低耦合,我消耗大量精力,将其模块化。模块化后可能分为多个模块,比方文档模块,搜题模块,用户模块,网关模块...微服务模块又须要注册核心,为了应答突发流量又引入了sentinel流量管制。越来越多的利用须要部署,而且治理愈发艰难。 为了解决这个问题,这时候我应用了Jenkins 自动化构建与部署,本人手动部署了其余的依赖环境后,jar包的构建运行工作交给 Jenkins 来做。 这时候我发现还有一些不满足需要的中央,我须要寻找一款全自动,可视化的运维工具。最终发现了 Rainbond 这个利用治理平台。 这篇文章次要分享我摸索全自动化运维的路线。 Jenkins 自动化及其遇到的挑战懈怠是我提高的能源,为何不利用节约下来的工夫多享受一会呢? 思考中,我萌发了自动化部署和运行的想法。我本地提交到github,通过配置webhook,jenkins能够主动拉java代码并构建,最初散发到我指定的服务器上并运行。 能够看到这是一连串的操作。的确节俭很多工夫,然而其中某个步骤出问题都会导致散发失败。 我在想尽管构建运行自动化了,然而如果我的利用忽然宕机了,那么我本人也不晓得啊,只有用户来反馈的时候,我能力晓得我网站原来进不去了。 这时候我在想:是不是有一种工具能够检测利用是否在线呢? 找到了很多能够检测利用是否在线的开源工具,利用宕机主动告诉,然而,告诉我有什么用呢?我在外游览,我又无奈去从新运行它。 这时候我意识到,事件没有我想的那么简略! 总结下能够分为以下几点: 利用宕机,本人不晓得,须要客户反馈?宕机后需手动重启?更新代码从新运行的时候有些利用启动工夫比拟长,造成服务中断,怎么样让新利用起来之后再敞开旧利用呢?查看日志的时候 不想登陆服务器执行 tail xxx。有没有反对点击查看利用日志的呢?流量太大,须要启动多个利用负载平衡?对于非java利用反对可能不敌对。于是我开启了新的摸索之路。 追寻一款自动化运维工具Kubernetes(简称 K8s)名声在外,大家是否据说过? 起初,我感觉 K8s 的确能够解决我以后的所有问题。然而,K8s的装置与学习老本十分高。 可能我本人对它的概念不够分明,但定位上我大抵晓得是不便运维的。因而为了能加重我本人运维的累赘,我开始百度,疯狂寻找 K8s 可视化工具,挺多的,然而很多都不保护了,这样子出了 bug 也没人能解决啊! Rainbond的诞生无意间发现了 Rainbond 平台,看其介绍发现不必懂 K8s 也能够把利用部署到 K8s 中, 并且实现可视化运维治理。 而且其设计理念是:不须要懂 K8s 也能轻松治理容器化利用,平滑无缝过渡到 K8s。正好解决我的需要。 K8s 运行的利用可能须要打 docker 镜像后编写简单 yaml 文件,过程枯燥无味,并且新手上手难度高。 而 Rainbond 为咱们做了这件事,从源码到运行,全权负责,你只须要提供源码,Rainbond主动帮你运行起来。而且运行在本人的服务器,数据安全有保障。 要害:它还是开源的!Github 地址:https://github.com/goodrain/rainbond 装置Rainbond装置的时候,出其不意之外的简略,只须要一句命令。而且 5 分钟就能够把平台全副运行起来,包含 K8s。这让我难以置信!! ...

August 21, 2023 · 1 min · jiezi

关于kubernetes:k8s-常见面试题

前段时间在这个视频中分享了 https://github.com/bregman-arie/devops-exercises 这个常识仓库。 <iframe src="//player.bilibili.com/player.html?aid=532004472&bvid=BV1Wu411n7U7&cid=1227759877&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe> 这次持续分享外面的内容,本次次要以 k8s 相干的问题为主。 k8s 是什么,为什么企业抉择应用它k8s 是一个开源利用,给用户提供了治理、部署、扩大容器的能力,以下几个例子更容易了解: 你能够将容器运行在不同的机器或节点中,并且能够将一些变动同步给这些容器,简略来说咱们只须要编写 yaml 文件,通知 k8s 我的预期是什么,其中同步变动的过程全副都交给 k8s 去实现。 其实就是咱们常说的申明式 API第二个特点方才曾经提到了,它能够帮咱们一键治理多个容器,同步所有的变更。能够依据以后的负载调整利用的正本数,负载高就新创建几个利用实例,低就升高几个,这个能够手动或主动实现。什么时候应用或者不应用 k8s如果次要还是应用物理机这种低级别的基础设施的话,不太倡议应用 k8s,这种状况通常是比拟传统的业务,没有必要应用 k8s。第二种状况是如果是小团队,或者容器规模较小时也不倡议应用,除非你想应用 k8s 的滚动公布和自扩容能力, 不过这些性能运维本人写工具也能实现。k8s 有哪些个性是自我修复,k8s 对容器有着衰弱检测,比方应用启动探针、存活探针等,或者是容器 OOM 后也会重启利用尝试修复。自带负载平衡,应用 service 能够将流量主动负载到后续 Pod 中,如果 Pod 提供的是 http 服务这个够用了,但如果是 grpc 这样的长链接,就须要应用 istio 这类服务网格,他能够辨认出协定类型,从而做到申请级别的负载平衡。Operator 主动运维能力:k8s 能够依据利用的运行状况主动调整以后集群的 Pod 数量、存储等,拿 Pulsar 举例,当流量激增后主动新增 broker,磁盘有余时主动扩容等。滚动更新能力:当咱们发版或者是回滚版本的时候,k8s 会期待新的容器启动之后才会将流量切回来,同时逐渐进行老的实例。程度扩大能力:能够灵便的新增或者是缩小正本的数量,当然也能够自动控制。数据加密:应用 secret 能够保留一些敏感的配置或者文件。k8s 有着哪些对象这个就是考查咱们对 k8s 是否是相熟了,罕用的有: PodServiceReplicationControllerDaemonSetnamespaceConfigMap这个其实晓得没有太多作用,次要还是得晓得在不同场景如何应用不同的组件。哪些字段是必须的这个问题我也感觉意义不大,只有写过 yaml 就会晓得了,metadata, kind, apiVersion apiVersion: apps/v1 kind: Deployment metadata: labels: app: app name: appkubectl 是什么其实就是一个 k8s 的 命令行客户端。 ...

August 18, 2023 · 1 min · jiezi

关于kubernetes:k8s-认证和权限控制

k8s 的认证机制是啥?说到 k8s 的认证机制,其实之前咋那么也有提到过 ServiceAccouont ,以及相应的 token ,证书 crt,和基于 HTTP 的认证等等 k8s 会应用如上几种形式来获取客户端身份信息,不限于下面几种 后面有说到 ApiServer 收到申请后,会去校验客户端是否有权限拜访,ApiServer 会去本身的认证插件中进行解决认证,进而到受权插件中进行受权,例如这样的: ServiceAccount 相当重要,之前咱们说到过拜访 pod 元数据的时候,就提到过 ServiceAccount,以及相应的挂载文件: /var/run/secrets/kubernetes.io/serviceaccount/token/var/run/secrets/kubernetes.io/serviceaccount/namespace/var/run/secrets/kubernetes.io/serviceaccount/ca.crt pod 就是通过发送上述的 token 文件来进行身份认证的,这是代表了运行的 pod 中的应用程序的身份证明,每一个 pod 都是会有一个 ServiceAccoount 与之关联的 咱们能够了解 ServiceAccoount 不是什么也别的货色,也是 k8s 的其中一种资源而已,咱们能够写 yaml 创立该 资源,当然也是能够通过命令来创立 sa 资源的, sa 是 ServiceAccoount 的缩写 例如,咱们能够通过命令 kubectl get sa 来查看 ServiceAccoount 一个 pod 只会对应一个 SA,然而 一个 SA 是能够和多个 pod 关联的,并且,咱们须要分明,这些都是得再同一个命名空间下的,例如画一个简图来是示意一下 咱们能够看到,同一个命名空间中 一个 SA 能够对应多个 pod一个 ns (namespace) 中能够有多个 ServiceAccount一个 pod 只能关联 一个 ServiceAccount再来看看这个: ...

August 17, 2023 · 1 min · jiezi

关于kubernetes:k8s-自身原理之高可用

说到高可用,咱们在应用主机环境的时候(非 k8s),咱做高可用有应用过这样的形式: 服务器做主备部署,当主节点和备节点同时存活的时候,只有主节点对外提供服务,备节点就等着主节点挂了之后,立即补位另外为了提供服务的可用性,做了异地多活,减少服务的接入节点,对流量进行分流等对于数据库同样也是做备份,定期同步,热备或者冷备那么后面分享了那么多的对于 k8s 本身组件的原理,咱们能够回过来头看,咱们为什么要抉择 k8s ? 简略来说还是因为 k8s 本身的个性: 本身满足负载平衡服务自愈治理的服务还可横向扩容降级的时候,可能滚动降级,平滑过渡,整个降级过程可能做到十分的丝滑,若两头呈现降级异样,还能够一键回滚,在回滚过程中,亦不影响原有服务这所有的所有,咱们在主机环境都是须要消耗很大的人力老本去做的事件,因此,最终才会抉择服务部署在 k8s 下面,能够极大的缩小开发和运维的心智累赘和运维老本 那么上述说的这么好, k8s 是如何保障高可用的呢?高可用咱们能够从哪些方面思考呢? 从 pod 来看从 pod 来看高可用的话,后面咱们有说到 pod 能够通过应用高级资源 Deployment 来进行治理,创立,更新,删除 pod ,应用 Deployment 都能够进行平滑的降级和回滚 当然默认说的这种形式是无状态的 pod 如果咱们是的服务是有状态的,运行在 pod 中,咱们依然能够应用 Deployment ,然而只能有 1 个正本,否则会有影响 如果带有数据卷的时候,咱们也能够应用 StatefulSet 资源来进行治理 然而若咱们的 pod 挂掉,咱们在 pod 重启到能够对外提供服务的过程中,服务会中断一段时间 有状态服务,无奈程度扩大的高可用形式有状态的服务,无奈程度扩大,咱们也能够像最开始我说到的应用主备的这种做法来进行解决 相似的,咱们能够应用领导选举机制,来将多个同样的有状态服务中选举一个服务来对外解决申请 直到这个服务出现异常而宕机之后,应用同样的形式,来在剩下的服务中选举出一个无效的服务,来解决外来申请 具体的算法和 k8s 中的实现形式,我会在前面的文章中进行分享 从 etcd 来看etcd ,咱们是应用主机环境的时候也有应用过 etcd 次要是用来寄存服务配置,和用来做服务发现的,key 值是服务的目录或者带有 / 的字符串, value 的话,则是服务的 ip 和 端口 etcd 自身就被设计成一个分布式的零碎,自身就能够运行多个 etcd 实例,天生做高可用就是很容易的事件 ...

August 16, 2023 · 1 min · jiezi

关于kubernetes:k8s-自身原理之-Service

好不容易,终于来到 k8s 本身的原理之 对于 Service 的一部分了 后面咱们用 2 个简图展现了 pod 之间和 pod 与 node 之间是如何通信息的,且通信的数据包是不会通过 NAT 网络地址转换的 那么 Service 又是如何实现呢?Service 咱们晓得是用来对外裸露服务的 ip 和 端口的,好让内部的客户端能够拜访到咱们外部 pod 提供的服务 另外 Service 治理的 pod ,理论的 ip 和 端口 列表,都是寄存在对应的 endpoints 外面的 目前为止,咱们也仅仅是停留在会应用 Service 了,那么 Service 本身的原理又是如何呢?咱们一起来瞅瞅看 对于 Service 的服务 ip 地址,也是一个虚构的,同时也是对外裸露了 1 个或者多个端口,既然是虚构的,咱们必定是 ping 不通的,例如我的 minikube 环境 当然,咱们看了之前的分享之后,发现 k8s 中对于资源的变动,基本上都是应用的监听机制,那么对于 Service 的行为 和 endpoints 的行为,是不是同样是被不同的要害组件所监听呢? 咱们能够用一个简图来理解一下: 图中,咱们能够看到 一个 Service 管控的是 2 个 pod,具体的 ip 和 端口 列表 都是寄存在 endpoints 中kube-proxy 会监控 ApiServer 中 Endpoints 对象的变动,若 endpoints 这中 list 有变动,kube-proxy 监听到之后,就会告诉 iptables 去配置新的规定例如环境中的 一个 pod 3 发申请给到咱们这个 Service,收回来的 目标地址是 Service 的地址和端口然而通过 iptables 设定的规定进行转换,目标地址和端口就变成了 Service 管控的 pod 本人的 ip 和端口了就看这个流程,如同也不简单嘛,那么理论生产环境中也会是这样的吗?咱们能够思考一下 ...

August 15, 2023 · 1 min · jiezi

关于kubernetes:Kubernetes-Service-工作原理

本文介绍了 Kubernetes Service 的概念、原理和具体应用。 作者:沈亚军 爱可生研发团队成员,负责公司 DMP 产品的后端开发,喜好太广,三天三夜都说不完,低调低调… 本文起源:原创投稿 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。Service 是什么?Service 是 Kubernetes 一种资源,用于实现恒定的入口拜访一组提供雷同服务的 Pod。每个 Service 在其生命周期内领有固定的 IP 和 Port,客户端能够通过拜访该 IP 和端口拜访到和其关联的所有 Pod。这样服务的客户端不须要晓得提供服务的各个 Pod 的地位,从而容许这些 Pod 在集群中挪动。 首先咱们应用 Deployment 创立标签为 app=nginx 的三个 Pod apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment labels: app: nginxspec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80如下应用 Deployment 创立了三个 Pod。 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-6b474476c4-hc6k4 1/1 Running 0 7d2h 10.42.1.3 node8 <none> <none>nginx-deployment-6b474476c4-mp8vw 1/1 Running 0 7d2h 10.42.0.7 node10 <none> <none>nginx-deployment-6b474476c4-wh8xd 1/1 Running 0 7d2h 10.42.1.4 node8 <none> <none>接下来咱们定义一个名为 my-service 的 Service 资源并指定选择器为 app=nginx,其中 selector 定义了能够通过 Label selector 拜访的 Pod 组。 ...

August 15, 2023 · 3 min · jiezi

关于kubernetes:从0到1AWS-DevOps实践二

创立EKS集群具体步骤过于繁琐,这里用思维导图简化一下,具体操作请参照AWS官网文档 创立EKS ClusterRole和 NodeRole 在AWS EKS界面创立集群 小结 参考文档https://docs.aws.amazon.com/eks/latest/userguide/create-clust...https://zhuanlan.zhihu.com/p/456250503

July 13, 2023 · 1 min · jiezi

关于kubernetes:从0到1AWS-DevOps实践一

总览这里展现了如何在AWS上从0到1的一个DevOps实际案例,应用的AWS产品包含: EC2,EKS,S3等相干服务,CICD流水线是github actions + argoCD,监控日志零碎应用的是开源计划:Prometheus + Grafana + Loki, 其余的计划细节后续补充。 后期的一些筹备工作 AWS eks容器化部署架构图 CICD流程图gitops

July 13, 2023 · 1 min · jiezi

关于kubernetes:浅谈kubernetes存储glusterfs故障排查

01 glusterfs部署架构 sc Storage Classkubectl get sc | grep gluster查问Storage Class Namekubectl get sc default -o yaml查问Storage Class Content heketi cluster_id、server port确认 cluster idheketi-cli --user admin --secret admin@123 cluster list确认 server port (个别不会错)cat /etc/heketi/heketi.json | grep port heketi setup glusterdcat /etc/heketi/topology.json | grep devices -A1(指定存储盘)cat /etc/heketi/topology.json | grep hostnames -A 5(确认glusterfs主机的IP) glusterd clutser alivegluster pool list确认各节点的glusterd过程存活 heketi reloadcat /etc/heketi/heketi.json | grep _loglevel -A 5(设置 heketi 日志等级)journalctl -eu heketi --since now -f(监控 heketi 日志)重载 /etc/heketi/heketi.jsonsystemctl daemon-reload && systemctl restart heketi重载 /etc/heketi/topology.jsonheketi-cli --user admin --secret admin@123 topology load --json=/etc/heketi/topology.json ...

July 12, 2023 · 1 min · jiezi

关于kubernetes:应对突发流量如何快速为自建-K8s-添加云上弹性能力

以 Kubernetes 为代表的容器技术带来的是一种利用交付模式的改革,其正迅速成为全世界数据中心的对立 API。 为了保障业务继续稳固、用户拜访不中断,高可用、高弹性等能力是利用架构设计不变的谋求,多集群架构人造具备这样的能力。而只有在 Kubernetes 这层对立且规范的 API 之下,多集群和混合云的能力才开始真正体现价值。 在前一篇文章《选对办法,K8s 多集群治理没那么难》中,咱们着重介绍了阿里云分布式云容器平台 ACK One 注册集群的利用场景、架构实现、平安加固,以及在他云 K8s 集群和 IDC 自建 K8s 集群中应用阿里云容器服务 ACK 的弱小可观测性能力,实现云上云下 K8s 集群的对立运维治理。 本文中,咱们重点介绍 ACK One 注册集群的另一个重要应用场景--云上弹性。 云上弹性能力典型利用场景和劣势ACK One 注册集群的云上弹性能力针对的场景: 业务快速增长:在本地 IDC 中部署的 K8s 集群,往往受到 IDC 计算资源的限度无奈及时扩容,计算资源的洽购部署上线往往周期较长,无奈承当业务流量的快速增长。业务周期性增长或突发增长:本地 IDC 中的计算资源数量绝对固定,无奈应答业务周期性顶峰,或者突发业务流量的增长。解决以上场景的基本是计算资源弹性能力,能够追随业务流量的变动,弹性扩充或者放大计算资源,满足业务需要的同时也保障了老本的均衡。 ACK One 注册集群云上弹性架构如下图所示: 通过 ACK One 注册集群,本地 IDC 中的 K8s 集群能够弹性扩容阿里云 ECS 节点池,利用阿里云容器服务的极致弹性能力,扩容应答业务流量增长,缩容实现老本节约。尤其针对 AI 场景,通过 ACK One 注册集群,能够将云上 GPU 机器接入 IDC 中的 K8s 集群。 为本地 IDC K8s 集群增加阿里云 GPU 算力的最佳实际1.创立 ACK One 注册集群拜访 ACK One 控制台注册集群用页面,咱们曾经创立了注册集群 “ACKOneRegisterCluster1” 并接入了本地 IDC 中的 K8s 集群。参见:《选对办法,K8s 多集群治理没那么难》 ...

July 11, 2023 · 3 min · jiezi

关于kubernetes:在-Kubernetes-上体验-EMQX-50-的-MQTT-over-QUIC-特性

引言作为寰球当先的开源分布式 MQTT Broker,EMQX 在 5.0 版本中引入了 MQTT over QUIC,将 MQTT 协定的劣势与 QUIC 的个性相结合。通过充分利用 QUIC 协定低连贯开销和多路复用的特点,MQTT over QUIC 为弱网络环境和不规则网络中的用户提供了一种十分有前景的解决方案。它可能应答诸如在山区或隧道等顽劣环境中运行的网联车辆等物联网场景中的连贯中断和连贯建设迟缓等问题。云原生技术的倒退,让越来越多的用户抉择在 Kubernetes 上部署 EMQX 集群,享受疾速创立和便捷治理的劣势。本文将介绍如何在 Kubernetes 上部署 EMQX 集群并开启 MQTT over QUIC 性能。 裸露 EMQX 服务在 Kubernetes 上部署 EMQX 时,您能够应用 LoadBalancer 或 NodePort 将 EMQX 服务对集群外的客户端裸露。 LoadBalancer 形式依赖云服务商提供的负载均衡器来提供服务。目前,云服务商的负载均衡器不反对 QUIC 的地址迁徙个性。NodePort 形式依赖于 Kubernetes 的 kube-proxy 组件来转发内部申请,它能够无缝连贯到 EMQX 服务,并反对 QUIC 地址迁徙个性。在车联网场景中,车端的地址可能会频繁变动,QUIC 的地址迁徙个性就显得十分重要。因而,在 Kubernetes 上部署具备 MQTT over QUIC 性能的 EMQX 5.0 时,咱们倡议抉择以 NodePort 形式对外裸露服务。 上面,咱们将介绍在 Kubernetes 上部署 EMQX 5.0 并启用 MQTT over QUIC 的具体步骤。同时,咱们将以 NodePort 形式对外裸露服务并验证 QUIC 的地址迁徙性能。 ...

July 10, 2023 · 3 min · jiezi

关于kubernetes:Kubeadm搭建高可用集群03集群安装

集群初始化官网初始化文档 留神:1.如果不是高可用集群,192.168.2.236:16443改为master01的地址,16443改为apiserver的端口,默认是64432.留神更改kubernetesVersion的值和本人服务器kubeadm的版本统一 kubectl versionkubeadm versionMaster01节点创立配置文件:vim kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta3bootstrapTokens:- groups: - system:bootstrappers:kubeadm:default-node-token token: 7t2weq.bjbawausm0jaxury ttl: 24h0m0s usages: - signing - authenticationkind: InitConfigurationlocalAPIEndpoint: advertiseAddress: 192.168.2.201 bindPort: 6443nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock name: k8s-master01 taints: - effect: NoSchedule key: node-role.kubernetes.io/control-plane---apiServer: certSANs: - 192.168.2.236 timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta3certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrolPlaneEndpoint: 192.168.2.236:16443controllerManager: {}etcd: local: dataDir: /var/lib/etcdimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containerskind: ClusterConfigurationkubernetesVersion: v1.27.3 # 更改此处的版本号和kubeadm version统一networking: dnsDomain: cluster.local podSubnet: 172.16.0.0/16 serviceSubnet: 10.96.0.0/16scheduler: {}留神:宿主机网段、podSubnet网段、serviceSubnet网段不能反复 更新kubeadm文件 kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml将new.yaml文件复制到其余master节点 ...

July 5, 2023 · 2 min · jiezi

关于kubernetes:选对方法K8s-多集群管理没那么难

Kubernetes 作为一项核心技术已成为古代应用程序架构的根底,将 Kubernetes 作为容器编排零碎已倒退为越来越多企业的必然选择。 随着对云计算接受程度一直进步,以及企业规模和业务继续倒退的独特驱动下,越来越多的企业在思考或曾经采纳多云和混合云计划,以晋升架构的灵活性和健壮性。 Kubernetes 多集群需要的演进及运维挑战企业可能会将集群部署在不同云厂商的私有云 K8s 集群中、本地 IDC 中的 K8s 集群、开源自建集群等等。在帮忙企业可能更好地利用混合环境资源的同时,这些散布在不同状态、地区、基础设施和网络环境的集群,给运维治理带来了极大的挑战,比方要应答不同的拜访控制台、不同的权限管理策略、不同的日志监控工具、不同的平安工具等等。 如果您也正面临着相似的需要和挑战,能够思考应用本文分享的阿里云 ACK One 注册集群,使云上云下 K8s 集群对立治理变得轻松简略。 如何应用 ACK One 简化混合星散群搭建与治理ACK One 是阿里云面向混合云、多集群、分布式计算等场景推出的分布式云容器平台,可能对立治理阿里云上、边缘、部署在客户数据中心以及其余云上的 Kubernetes 集群。 通过 ACK One 注册集群,您能够将来自不同提供商和不同地位的 K8s 集群对立接入到阿里云容器服务 ACK 控制台,提供对立的集群管制面,实现多集群对立的利用散发、流量治理、运维治理、平安治理等。 1.注册集群外围性能ACK One 注册集群能够帮忙企业应答的 K8s 集群对立治理需要包含: 统一的运维体验K8s 集群对立运维治理,提供与 ACK 统一的运维体验。他云 K8s 集群或者本地 IDC 集群接入 ACK One 注册集群后,能够应用 ACK 控制台对立治理,包含:权限,日志,监控,事件,告警,老本剖析,平安巡检,安全策略。 K8s 集群中的微服务治理微服务引擎 MSE,服务网格 ASM。 云上弹性本地 IDC 中的 K8s 集群弹性扩容阿里云 ECS 节点池,扩容 Virutal Kubelet ECI 弹性容器实例,应答 IDC 资源有余和突发业务流量。 ...

July 5, 2023 · 2 min · jiezi

关于kubernetes:为数据弹性而生阿里云云原生存储再提速

企业在 Kubernetes 上运行 AI、大数据利用已成支流,资源弹性和开发运维效率失去显著晋升的同时,计算存储拆散架构也带来了挑战:网络提早高、网络费用贵、存储服务带宽有余等。 以 AI 训练、基因计算、工业仿真等高性能计算场景为例,须要在短时间内并发执行海量计算,多计算实例共享拜访文件系统的同一数据源。很多企业应用阿里云文件存储 NAS 或 CPFS 服务,挂载到阿里云容器服务 ACK 运行的计算工作上,实现数千台计算节点的高性能共享拜访。 然而,随着算力规模和性能晋升、以及模型规模和工作负载复杂度的减少,在云原生的机器学习和大数据场景下,高性能计算对并行文件系统的数据拜访性能和灵活性要求也越来越高。 残缺内容请点击下方链接查看: https://developer.aliyun.com/article/1246768?utm_content=g_10... 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

July 4, 2023 · 1 min · jiezi

关于kubernetes:K8S-容器和Pod组件

比照软件装置和运行;一、场景作为研发人员,通常本人电脑的零碎环境都是非常复杂,在集体的习惯上,是依照下图的模块治理电脑的零碎环境; 对于「基础设施」、「主机操作系统」、「系统软件」来说,通常只做配置批改; 对于自行装置的软件环境来说,集体通常这样分类:「应用软件」、「研发软件」、「继续集成」、「虚拟机环境」; 应用软件:次要指罕用的办公软件,比方文档编写,画图设计,通信产品等;研发软件:比方根底开发环境,各种中间件环境,数据存储查问等;继续集成:支流的就是Jenkins、Docker、Kubernetes等组件,整体比较复杂,不好治理;虚拟机环境:研发必备的Linux操作系统,用来部署一些规范的组件集群;不论是这些软件环境还是虚拟机零碎的搭建,根本都是通过下载软件安装包,而后在本地部署和定期更新以及运行,基于这个场景再去了解容器和Pod组件,会轻松许多; 二、容器1、容器镜像参考下面零碎环境的治理,软件包和装置部署的原理; Docker容器镜像是一个轻量级的、独立的、可执行的软件包,它蕴含了运行应用程序所需的所有:代码、运行时、零碎工具、零碎库和设置,带有创立Docker容器的阐明; 能够通过Dockerfile脚本自定义镜像,也能够应用云端仓库中其他人公开公布的,生产环境通常采纳公有仓库治理镜像; 容器镜像所承载的是封装了应用程序及其所有软件依赖的二进制数据,容器镜像是可执行的软件包,能够独自运行;通常会创立利用的容器镜像并将其推送到某仓库,而后在Pod中援用它; 2、容器容器将应用程序从底层的主机设施中解耦,这使得在不同的云或OS环境中部署更加容易; 容器的实质就是一个视图隔离、可限度资源、独立文件系统的过程汇合; 以常见的Linux研发环境来剖析,能够限度容器的资源分配,比方内存大小、CPU应用,隔离过程之间的通信,设置独立的文件系统等; Kubernetes集群中的每个节点都会运行容器,这些容器形成调配给该节点的Pod,单个Pod中的容器会在独特调度下,于同一地位运行在雷同的节点上; 从整体上能够把K8S了解为「操作系统」,镜像了解为「软件安装包」,容器了解为「利用过程」; 3、实际案例制作镜像,首先将代码工程auto-client和auto-serve打包,而后构建镜像文件,放在本地环境中; 制作【auto-client】镜像构建命令 docker build -t auto-client:latest .Dockerfile脚本 # 根底镜像FROM openjdk:8# 维护者MAINTAINER cicadasmile# 长久化目录VOLUME /data/docker/logs# 增加应用服务JAR包ADD auto-client.jar application.jar# 配置参数ENTRYPOINT ["java","-Dspring.profiles.active=dev","-Djava.security.egd=file:/dev/./urandom","-jar","/application.jar"]制作【auto-serve】镜像构建命令 docker build -t auto-serve:latest .Dockerfile脚本 # 根底镜像FROM openjdk:8# 维护者MAINTAINER cicadasmile# 长久化目录VOLUME /data/docker/logs# 增加应用服务JAR包ADD auto-serve.jar application.jar# 配置参数ENTRYPOINT ["java","-Dspring.profiles.active=dev","-Djava.security.egd=file:/dev/./urandom","-jar","/application.jar"] 三、Pod组件1、基本概念Pod是能够在K8S中创立和治理的、最小的可部署的计算单元; Pod是一组(一个或多个)容器,这些容器共享存储、网络、以及怎么运行这些容器的申明,Pod中的内容总是并置的并且一起调度,在共享的上下文中运行; 2、Pod治理【Pod创立】 通常不会间接创立Pod,而是应用诸如Deployment或Job这类工作负载资源来创立Pod;是绝对临时性的、用后即抛的一次性实体; 【单容器Pod】 每个Pod都意在运行给定应用程序的单个实例,能够应用多个Pod对应用程序横向扩大,即一个实例一个Pod对应,Pod看作单个容器的包装器由K8S间接治理,是常见的部署形式; 【多容器Pod】 分布式系统中可能存在由多个严密耦合且须要共享资源的共处容器组成的应用程序,比拟典型的是「生产生产」场景,Pod将这些容器和存储资源打包为一个可治理的实体; Pod中的容器被主动安顿到集群中的同一物理机或虚拟机上,并能够一起进行调度,容器之间能够共享网络和存储资源和依赖、彼此通信、协调何时以及何种形式终止本身; 容器之间本来是被隔离开的,而Pod在设计上能够冲破这种隔离,进而实现资源共享; 存储共享在Pod层面设置共享的Volume,该Pod中所有容器都能够拜访该共享Volume,这也是Pod组件的存储形式,Volume还容许Pod中持久数据保留下来,即便其中的容器须要重新启动; 网络共享同一个Pod内,所有容器共享一个IP地址和端口空间,并且能够通过localhost发现对方; 3、实际案例3.1 Pod脚本在此前的案例中,都是单容器Pod,这里演示多容器Pod,将【auto-client】和【auto-serve】放在同一个「auto-pod」中运行; 并且这里为两个容器调配CPU和内存资源,requests是要为容器指定资源需要,limits是要为容器指定资源限度; apiVersion: v1kind: Podmetadata: name: auto-podspec: containers: - name: auto-client image: auto-client imagePullPolicy: Never ports: - containerPort: 8079 resources: requests: cpu: "250m" memory: "64Mi" limits: cpu: "500m" memory: "128Mi" - name: auto-serve image: auto-serve imagePullPolicy: Never ports: - containerPort: 8082 resources: requests: cpu: "250m" memory: "64Mi" limits: cpu: "500m" memory: "128Mi"3.2 Pod命令创立Podkubectl create -f pod.yaml查看指定Podkubectl get pod/auto-pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESauto-pod 2/2 Running 0 9m2s 10.1.0.123 docker-desktop <none> <none>查看指定Pod形容kubectl describe pod/auto-pod# 此处只展现局部信息Name: auto-podNamespace: defaultNode: docker-desktop/192.168.65.11Status: RunningIP: 10.1.0.123Containers: auto-client: Container ID: docker://Container-ID Image: auto-client Image ID: docker://sha256:Image-ID Port: 8079/TCP Limits: cpu: 500m memory: 128Mi Requests: cpu: 250m memory: 64Mi auto-serve: Container ID: docker://Container-ID Image: auto-serve Image ID: docker://sha256:Image-ID Port: 8082/TCP Limits: cpu: 500m memory: 128Mi Requests: cpu: 250m memory: 64MiEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 38s default-scheduler Successfully assigned default/auto-pod to docker-desktop Normal Pulled 37s kubelet Container image "auto-client" already present on machine Normal Created 37s kubelet Created container auto-client Normal Started 37s kubelet Started container auto-client Normal Pulled 37s kubelet Container image "auto-serve" already present on machine Normal Created 37s kubelet Created container auto-serve Normal Started 37s kubelet Started container auto-serve删除Podkubectl delete -f pod.yaml3.3 服务日志在「auto-client」服务中,提供一个简略的定时工作,每10秒拜访一次「auto-serve」的接口,打印申请的响应后果; ...

July 3, 2023 · 2 min · jiezi

关于kubernetes:DeepSpeed-Kubernetes-如何轻松落地大规模分布式训练

背景现状随着 ChatGPT 的广泛应用,各种大规模语言模型层出不穷,其中包含 EleutherAI 推出的 200 亿参数的 GPT-NeoX-20B 和 BigScience 公布的 1760 亿参数的 Bloom 模型。 因为模型越来越大,单张 GPU 已无奈加载整个模型,分布式模型训练成为了一种必然的趋势。在 GPT-NeoX 和 Bloom 的背地,DeepSpeed 框架是实现分布式模型训练的要害。 DeepSpeed 是一个开源的深度学习训练优化库,提供了多种优化策略,如混合精度训练、数据并行、模型并行、流水线并行等,这些策略可用于减速大规模模型的训练。此外,DeepSpeed 还提供了高性能的分布式训练框架,反对多种支流的深度学习框架,并且能够在不同的硬件和云平台上进行训练。借助 DeepSpeed,算法工程师能够更加疾速地训练大规模深度学习模型,从而进步模型的准确性和效率。以后,越来越多企业在云上基于容器和 Kubernetes 进行大规模的分布式深度学习训练,充分利用弹性、扩展性、自动化、高可用等劣势,大幅提高分布式训练的效率和可靠性,同时升高治理老本和复杂性。 然而,随着模型规模扩充以及企业对生产效率的一直谋求,将 DeepSpeed 分布式训练任务在 Kubernetes 中搭建和运行依然存在着很多挑战和难点。例如,GPU资源利用率低,分布式训练扩展性差,以及难以不便地获取实时日志和监控等。 计划介绍目前,阿里云容器服务 ACK 云原生 AI 套件曾经反对 DeepSpeed 分布式训练,为您提供高效便捷的解决方案。 您只需筹备好训练代码和数据,就能够利用命令行工具 Arena 疾速在 ACK 集群中部署基于 DeepSpeed 的分布式训练任务。此外,能够通过 TensorBoard 可视化工具不便地查看训练作业的状态和后果,从而使 DeepSpeed 分布式训练变得更加容易和高效。 外围劣势基于阿里云容器服务 ACK 云原生 AI 套件搭建和运行 DeepSpeed 分布式训练任务具备以下劣势: 1.大规模异构资源管理 应用容器服务 ACK,您能够轻松治理大规模异构资源,疾速搭建基于 CPU、GPU、FPGA 等不同类型计算资源的规范 Kubernetes 集群,实现对各类异构资源进行对立、灵便的治理、调度和运维。云原生 AI 套件还反对多种 GPU 调度策略(共享+隔离、优先级、拓扑感知等)和丰盛的 GPU 监控告警等能力,帮您进一步优化资源利用率。 ...

July 3, 2023 · 3 min · jiezi

关于kubernetes:Rainbond助力信创应用迁移上云

Rainbond v5.14.2 版本,又称信创版本。从这个版本开始,开源用户也能够利用 Rainbond 治理合乎信创要求的硬件计算资源。在这个版本中,产品团队将此前只在企业版产品中存在的信创相干性能拆分进去,融入到了开源产品路线之中。本文围绕如何在信创环境中将利用迁徙上云这一主题,联合 Rainbond 信创版本的能力,给出可行的落地计划。 向信创环境迁徙利用的必要性信创产业即信息技术利用翻新产业,是我国数字化转型的重要组成部分,也是要害基础设施的重要撑持。其外围在于通过行业利用拉动构建国产化信息技术软硬件底层架构体系和全周期生态体系,解决核心技术关键环节卡脖子的问题,为中国倒退奠定松软的数字根底。 对个别的软件供应商而言,在面向党政军企售卖软件时,合乎国产化信创要求曾经逐步成为无奈绕过的硬性规范。即便是曾经交付实现的软件,在前期的建设打算中,处于信创转型期间的党政军企也会提出向国产化信创环境中迁徙的硬性要求。需要的背地总是暗藏着商机,把握国产化信创背景下的利用迁徙能力,将软件产品转化为信创利用是当下所有 ToB/ToG 信创利用供应商必须把握的能力。Rainbond 信创版本在这样的场景中能够施展极大的作用。 信创硬件生态信创利用必须运行在国产化硬件和操作系统之上。国产化硬件生态中最重要的是 CPU 芯片,CPU 芯片的架构间接影响信创利用是否能够在国产化硬件上运行。目前支流的国产化 CPU 厂商包含飞腾、华为、龙芯、海光、兆芯等,其指令集集中在 X86 、Arm 以及自主性极高的 LoongArch (MIPS 指令集的后继者) 之中。而指令集的不同,间接影响到信创利用是否须要从新编译来进行适配。 不难看出,国产化 CPU 芯片的生态有这么几个特点: LoongArch自主水平最强,然而其生态受限重大,短时间内无奈很好的面向市场推广。海光、兆芯手持生态最为枯萎的 X86 指令集受权,然而自主化水平最弱。X86 过于成熟稳固,前人大厦已成,很难在此基础上做出翻新。华为、飞腾领有 Arm 指令集受权,自主化水平适中,而且 Arm 生态正处于蓬勃发展中,能够和 X86 生态掰一掰手段。市场的反馈十分感性,在以后国内的 CPU 芯片市场中,飞腾在党政畛域PC市占带领先,海光与鲲鹏占据运营商服务器次要份额。回到信创利用供应商的视角,如何打好 Arm 这张牌,将会是闯入国产化信创赛道的关键点。Rainbond 信创版本通过一云多芯能力,不便的纳管包含 Arm 在内的多架构集群。 “一云多芯”统管Arm & x86集群顾名思义,一云多芯的异构集群,指的是在同一个集群中的计算节点中,其 CPU 芯片架构不惟一。 个别状况下,CPU 芯片的架构都是基于 Intel 公司推出的 X86 指令集,作为后起之秀的 AMD 也推出齐全兼容 X86 的 amd64 指令集,二者能够视为等同。而在国产化信创场景中,很多国产 CPU 架构都是基于 Arm 指令集开发,常见的鲲鹏920、飞腾芯片等都属于该架构类型。为了可能融入国产化信创 IT 生态,Rainbond 自信创版本开始,全面兼容了 Arm 架构。 ...

June 30, 2023 · 1 min · jiezi

关于kubernetes:volume-namespace

顺带说一下 volume 和 namespace ,咱们就开始分享一下 service 是什么 volume 是什么还记得 docker 的 volume 吗,是一个数据卷 在 K8S 中,volume 是 pod 中可能被多个容器拜访的共享目录 ,实际上和 docker 是一样的 volume 是被定义在 pod 下面的,因而,volume 的生命周期和 pod 是雷同的 volume 会被该 pod 中的多个容器挂载到具体的文件目录上面,若某个容器挂掉了,是不会影响 volume 的,也就是说 volume 中的数据是不会失落的 咱们能够应用 volume: 在 pod 中指定 volume 的类型 和内容,能够应用 spec.volumes 字段须要将 volume 映射到容器中,咱们能够应用 spec.containers.volumeMounts 字段下面有说到 volume 的类型,这就可多了 , K8S 中反对的 volume 类型有: awsElasticBlockStoreazureFilecephfsemptyDirhostPathconfigMapfc (光纤通道)。。 。 等等能够查看这下面的文档,每一种 卷类型都有解释到 点我开始卷一下 简略看一下 emptyDir 卷类型emptyDir 见名知意,emptyDir 在创立 pod 的时候就会被创立,而且是个空的 , 只有 pod 在运行,这个卷就会始终存在 ...

June 29, 2023 · 1 min · jiezi

关于kubernetes:看完这篇你就了解了K8S的CKA认证考试的内容占比和具体考纲

如果你正好想要理解对于 Kubernetes (K8S) 的 CKA 认证考试的内容占比和具体考纲,那么你来对中央了!本篇文章将具体解析 CKA 认证考试的内容占比以及具体考纲,让你对考试有一个清晰的理解。 CKA(Certified Kubernetes Administrator)认证是云原生计算基金会(CNCF)推出的一项权威认证,目标是验证候选人在应用 Kubernetes 进行利用部署、调度、保护和治理方面的技能程度。内容占比集群架构,装置和配置:25%工作负载和调度:15%服务和网络:20%存储:10%故障排除:30%具体考纲CKA 考试的内容占比次要涵盖以下几个方面,每个方面的重要性不同: 集群架构,装置和配置治理基于角色的访问控制(RBAC)应用Kubeadm装置根本集群治理高可用性的Kubernetes集群设置基础架构以部署Kubernetes集群应用Kubeadm在Kubernetes集群上执行版本升级施行etcd备份和还原工作负载和调度理解部署以及如何执行滚动更新和回滚应用ConfigMaps和Secrets配置应用程序理解如何扩大应用程序理解用于创立强壮的、自修复的应用程序部署的原语理解资源限度如何影响Pod调度理解清单治理和通用模板工具服务和网络理解集群节点上的主机网络配置了解Pods之间的连通性理解ClusterIP、NodePort、LoadBalancer服务类型和端点理解如何应用入口控制器和入口资源理解如何配置和应用CoreDNS抉择适当的容器网络接口插件存储理解存储类、长久卷理解卷模式、拜访模式和卷回收策略了解长久容量申明原语理解如何配置具备持久性存储的应用程序故障排除评估集群和节点日志理解如何监督应用程序治理容器规范输入和规范谬误日志解决应用程序故障对群集组件故障进行故障排除排除网络故障最初总体而言,以上内容涵盖了 CKA 考试的次要知识点和技能要求。加入 CKA 考试的候选人须要相熟 K8S 的架构和组件,把握容器生命周期治理、装置与配置、调度、利用与资源管理、监控与故障排除以及平安等方面的技能。 看完本篇,能够全面理解 CKA 考试的内容占比和具体考纲,为你的备考提供无力的领导。最初,祝大家在 CKA 认证考试中获得优异的问题!【K8S(专一于深入研究K8S相干的各种技术和常识分享。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Go&Py(涵盖了Go和Python两种风行的编程语言。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Ops(运维畛域的探讨和交换。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...

June 28, 2023 · 1 min · jiezi

关于kubernetes:15款备受推崇的K8S可视化工具你都玩过哪些

对于那些酷爱摸索新技术、寻找简化操作形式的运维工程师来说,如何更好地治理和操作K8S集群?本篇将分享15款备受推崇的K8S可视化工具,让你轻松治理和操作集群中的各种资源。你可能曾经玩过其中的一些工具,这将是一个与你分享教训的机会哦!备受推崇的15款Kubernetes Dashboard: https://github.com/kubernetes/dashboardKubeSphere: https://kubesphere.io/Rancher: https://rancher.com/Lens: https://k8slens.dev/Octant: https://octant.dev/K9s: https://k9scli.io/Shipyard: https://shipyard-project.io/Kontena Lens: https://www.kontena.io/lens/Kubernetic: https://kubernetic.com/Loodse Kubermatic: https://www.kubermatic.com/Portainer: https://www.portainer.io/Kubevious: https://kubevious.io/Kuboard: https://github.com/eip-work/kuboard-pressGrafana: https://grafana.com/Weave Scope: https://www.weave.works/oss/scope/每款工具的简述K8S Dashboard:作为K8S官网提供的仪表盘工具,它以简洁而直观的界面展现和治理K8S集群中的各类资源。 KubeSphere:作为一款开源的K8S平台,KubeSphere为你提供了可视化的控制台和治理界面,助你轻松管理应用程序的部署、监控和日志查看等性能。 Rancher:作为一个开源的容器治理平台,Rancher反对多个K8S集群的治理,具备弱小的应用程序治理、监控和自动化部署等性能。 Lens:作为一款跨平台的K8S可视化工具,Lens反对Windows、macOS和Linux操作系统,提供直观的界面,帮忙你查看和操作K8S集群中的各种资源。 Octant:作为一款开源的K8S可视化工具,Octant提供了简洁而功能丰富的用户界面,反对自定义插件和扩大,助你更好地查看和治理K8S集群。 K9s:作为一款基于终端的K8S管理工具,K9s提供了交互式的界面,让你能够轻松查看和操作K8S资源,实时监控、日志查看、资源过滤等性能一应俱全。 Shipyard:作为一款开源的容器治理平台,Shipyard提供了可视化界面,帮忙你治理和监控K8S集群,反对应用程序部署、资源管理和事件触发等性能。 Kontena Lens:作为一款跨平台的K8S管理工具,Kontena Lens提供了直观的用户界面,让你能够轻松查看和操作K8S集群中的资源,反对多集群治理、监控和日志查看等性能。 Kubernetic:作为一款面向开发人员和运维人员的K8S可视化工具,Kubernetic提供了弱小的性能和直观的用户界面,帮忙你更好地治理和操作K8S集群,反对实时监控、事件触发、日志查看等性能。 Loodse Kubermatic:作为一款开源的K8S治理平台,Loodse Kubermatic提供了可视化界面,帮忙你治理多个K8S集群,具备应用程序部署、主动扩大、监控和日志查看等性能。 Portainer:作为一款开源的容器管理工具,Portainer提供了可视化界面,反对治理Docker和K8S集群,实现应用程序部署、资源监控和日志查看等性能。 Kubevious:作为一款开源的K8S可视化工具,Kubevious提供了直观的界面,帮忙你查看和治理K8S集群中的资源,反对拓扑图展现、配置审计和资源关系剖析等性能。 Kuboard:作为一款开源的K8S可视化仪表板,Kuboard提供了用户敌对的界面,帮忙你监控和治理K8S集群,反对资源概览、事件查看和日志治理等性能。 Grafana:尽管次要是一款监控和可视化工具,Grafana也能够与K8S集成,提供对集群的可视化展现。通过Grafana的仪表盘性能,你能够创立和定制本人的K8S集群监控视图。 Weave Scope:作为一款开源的容器和微服务可视化工具,Weave Scope提供了直观的界面,帮忙你查看和治理K8S集群中的资源,反对拓扑图展现、性能监控和流量剖析等性能。 最初这些仅仅是15款备受推崇的K8S可视化工具的一部分,它们都领有独特的特点和性能,可能满足不同用户的需要。无论你是正在摸索K8S的小鲜肉,还是曾经纯熟使用K8S的老腊肉,这些可视化工具都将成为你晋升运维乐趣和效率的利器。那么,你曾经尝试过其中的哪些工具呢?评论留言分享你的应用心得,和号主一起独特摸索。【K8S(专一于深入研究K8S相干的各种技术和常识分享。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Go&Py(涵盖了Go和Python两种风行的编程语言。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Ops(运维畛域的探讨和交换。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...

June 28, 2023 · 1 min · jiezi

关于kubernetes:LabelRCHPA

下面简略说了一下 pod 的根本知识点,待到前面会应用到 pod 的一些高阶知识点的时候,还能够再细细推敲底层原理 咱们接着持续学习 Lable , RC,HPA 的相干知识点 Label 是什么? label 就是标签,例如之前咱们手写的 yaml 文件中,每一个键值对都是 label,如 key =value label 个别是在定义资源的时候就确定了,当然咱们也能够在对象创立之后进行动静的增加,编辑,和删除 咱们写的 label 能够附加到 Node,Service,Pod,RC 中,每一类资源都能够定义任意数量的 label, 同一个 label 也是能够被增加到任意数量的资源对象上的 这一点的确是很灵便了有么有 label 为什么要附加到各种资源对象上呢? 因为 label 和 label selector 都是不能独自定义的,他们必须要附丽在某一类资源对象上,这是为了可能去治理这些资源,应用 label selector 对他们分组 例如写一个 openresty ,写一个 RC 应用 openresty ,Service 调用 openresty 的 label selector apiVersion: v1kind: ReplicationController metadata: name: openrestyspec: replicas: 2 selector: app: openresty tmplate: metadata: labels: app: openresty spec: containers: - name: openresty ports: - containerPort: 80----------------------------apiVersion: v1kind: Service metadata: name: openrestyspec: type: NodePort ports: - port: 80 nodePort: 30125 selector: app: openrestyRC 是什么?RC 是什么,后面解释到,就是 ReplicationController 正本控制器 ...

June 27, 2023 · 2 min · jiezi

关于kubernetes:二进制安装Kubernetesk8s-v1273-IPv4IPv6双栈-可脱离互联网

二进制装置Kubernetes(k8s) v1.27.3 IPv4/IPv6双栈 可脱离互联网https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 介绍kubernetes(k8s)二进制高可用装置部署,反对IPv4+IPv6双栈。 我应用IPV6的目标是在公网进行拜访,所以我配置了IPV6动态地址。 若您没有IPV6环境,或者不想应用IPv6,不对主机进行配置IPv6地址即可。 不配置IPV6,不影响后续,不过集群仍旧是反对IPv6的。为前期留有扩大可能性。 若不要IPv6 ,不给网卡配置IPv6即可,不要对IPv6相干配置删除或操作,否则会出问题。 强烈建议在Github上查看文档 !!!Github出问题会更新文档,并且后续尽可能第一工夫更新新版本文档 !!!手动我的项目地址:https://github.com/cby-chen/Kubernetes1.环境主机名称IP地址阐明软件 192.168.1.60外网节点下载各种所需安装包Master01192.168.0.31master节点kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginxMaster02192.168.0.32master节点kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginxMaster03192.168.0.33master节点kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginxNode01192.168.0.34node节点kubelet、kube-proxy、nfs-client、nginxNode02192.168.0.35node节点kubelet、kube-proxy、nfs-client、nginx 192.168.0.36VIP 网段 物理主机:192.168.0.0/24 service:10.96.0.0/12 pod:172.16.0.0/12 安装包曾经整顿好:https://github.com/cby-chen/Kubernetes/releases/download/v1.27.3/kubernetes-v1.27.3.tar 1.1.k8s根底零碎环境配置1.2.配置IP# 留神!# 若虚拟机是进行克隆的那么网卡的UUID会反复# 若UUID反复须要从新生成新的UUID# UUID反复无奈获取到IPV6地址# # 查看以后的网卡列表和 UUID:# nmcli con show# 删除要更改 UUID 的网络连接:# nmcli con delete uuid <原 UUID># 从新生成 UUID:# nmcli con add type ethernet ifname <接口名称> con-name <新名称># 从新启用网络连接:# nmcli con up <新名称># 更改网卡的UUIDssh root@192.168.0.31 "nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0"ssh root@192.168.0.32 "nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0"ssh root@192.168.0.33 "nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0"ssh root@192.168.0.34 "nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0"ssh root@192.168.0.35 "nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0"# 批改动态的IPv4地址ssh root@192.168.0.154 "nmcli con mod eth0 ipv4.addresses 192.168.0.31/24; nmcli con mod eth0 ipv4.gateway 192.168.0.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns "8.8.8.8"; nmcli con up eth0"ssh root@192.168.0.156 "nmcli con mod eth0 ipv4.addresses 192.168.0.32/24; nmcli con mod eth0 ipv4.gateway 192.168.0.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns "8.8.8.8"; nmcli con up eth0"ssh root@192.168.0.164 "nmcli con mod eth0 ipv4.addresses 192.168.0.33/24; nmcli con mod eth0 ipv4.gateway 192.168.0.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns "8.8.8.8"; nmcli con up eth0"ssh root@192.168.0.166 "nmcli con mod eth0 ipv4.addresses 192.168.0.34/24; nmcli con mod eth0 ipv4.gateway 192.168.0.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns "8.8.8.8"; nmcli con up eth0"ssh root@192.168.0.167 "nmcli con mod eth0 ipv4.addresses 192.168.0.35/24; nmcli con mod eth0 ipv4.gateway 192.168.0.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns "8.8.8.8"; nmcli con up eth0"# 没有IPv6抉择不配置即可ssh root@192.168.0.31 "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::10; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns "2400:3200::1"; nmcli con up eth0"ssh root@192.168.0.32 "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::20; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns "2400:3200::1"; nmcli con up eth0"ssh root@192.168.0.33 "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::30; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns "2400:3200::1"; nmcli con up eth0"ssh root@192.168.0.34 "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::40; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns "2400:3200::1"; nmcli con up eth0"ssh root@192.168.0.35 "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::50; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns "2400:3200::1"; nmcli con up eth0"# 查看网卡配置# nmcli device show eth0# nmcli con show eth0[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=noIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noIPV6_ADDR_GEN_MODE=stable-privacyNAME=eth0UUID=424fd260-c480-4899-97e6-6fc9722031e8DEVICE=eth0ONBOOT=yesIPADDR=192.168.0.31PREFIX=24GATEWAY=192.168.8.1DNS1=8.8.8.8IPV6ADDR=fc00:43f4:1eea:1::10/128IPV6_DEFAULTGW=fc00:43f4:1eea:1::1DNS2=2400:3200::1[root@localhost ~]# 1.3.设置主机名hostnamectl set-hostname k8s-master01hostnamectl set-hostname k8s-master02hostnamectl set-hostname k8s-master03hostnamectl set-hostname k8s-node01hostnamectl set-hostname k8s-node021.4.配置yum源# 其余零碎的源地址# https://mirrors.tuna.tsinghua.edu.cn/help/# 对于 Ubuntused -i 's/cn.archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list# 对于 CentOS 7sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \ -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos|g' \ -i.bak \ /etc/yum.repos.d/CentOS-*.repo# 对于 CentOS 8sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \ -e 's|^#baseurl=http://mirror.centos.org/$contentdir|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos|g' \ -i.bak \ /etc/yum.repos.d/CentOS-*.repo# 对于公有仓库sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://mirror.centos.org/\$contentdir|baseurl=http://192.168.1.123/centos|g' -i.bak /etc/yum.repos.d/CentOS-*.repo1.5.装置一些必备工具# 对于 Ubuntuapt update && apt upgrade -y && apt install -y wget psmisc vim net-tools nfs-kernel-server telnet lvm2 git tar curl# 对于 CentOS 7yum update -y && yum -y install wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git tar curl# 对于 CentOS 8yum update -y && yum -y install wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git network-scripts tar curl1.5.1 下载离线所需文件(可选)在互联网服务器上安装一个截然不同的零碎进行下载所需包 ...

June 27, 2023 · 27 min · jiezi

关于kubernetes:tke-1206升级到1225的一点小插曲

背景:线上tke集群1.20.6,就相当于kubernetes1.20版本吧!前几天点了一下降级,降级了master节点。依照我的集体了解集群降级会对集群api兼容性查看的,通过了降级了没有问题。昨天对集群的节点进行了缩容。而后pod进行了从新的调度。问题就来了:晚期有一个搭建的eck集群:TKE1.20.6搭建elasticsearch on kubernetes。elastic-operator-0 and kibana 服务都不能失常运行了,logs pod 日志如下:elastic-operator日志内容根本是: unable to setup and fill the webhook certificates","service.version":"1.6.0+8326ca8a","service.type":"eck","ecs.version":"1.4.0","error":"the server could not find the requested resource","error.stack_trace":"github.com/elastic/cloud-on-k8s/cmd/manager.startOperator\n\t/go/src/github.com/elastic/cloud-on-k8s/cmd/manager/main.go:558\ngithub.com/elastic/cloud-on-k8s/cmd/manager.doRun.func2\n\t/go/src/github.com/elastic/cloud-on-k8s/cmd/manager/main.go:328就截取一下:unable to setup and fill the webhook kibana日志如下: 解决过程:搜索引擎关键词我能想到的:kubernetes 1.20 upgrade 1.22 eck unable to setup and fill the webhook certificates我点的第二个:https://github.com/elastic/cloud-on-k8s/issues/3958疾速扫一眼看到了:can you give us more information about the kind of cluster your are using (self managed, Azure, EKS...) ? admissionregistration.k8s.io/v1beta1 is supposed to be removed in 1.22 only: kubernetes/kubernetes#82021根本确定了是admissionregistration.k8s.io版本问题!看一下: ...

June 27, 2023 · 1 min · jiezi

关于kubernetes:pod-知识点-下

上一篇分享了 pod 的根本知识点,有 K8S 环境的小伙伴还是能够用起来的,还对比较简单,晓得了 pod 的 yaml 文件构造,标识,根本的创立 pod 和删除 pod 的用法等等,咱们持续 pod 的根本分类后面咱们说到了 pod 分为动态 pod 和一般的 pod ,那么这俩有啥区别呢? 动态 pod 由 kubelet 进行治理存在于特定 Node 上的 pod不能通过 Api Server 治理无奈 ReplicationController,Deployment,Daemonset 进行关联kubelet 无奈对该 pod 进行健康检查一般 pod 一旦创立,就会被放到 etcd 存储中会被 k8s 中的 master 调度到某个 Node 下面并绑定,该 Node 上的 kubelet 会实例化成 docker 容器 运行起来k8s 会对 pod 做健康检查,若 pod 中的容器暂停或者异样,k8s 会将他们重启若 pod 所在的 Node 宕机了,那么 k8s 会将 该 Node 的所有 pod 从新调度到别的节点下面pod 的生命周期是啥样的 ...

June 26, 2023 · 2 min · jiezi

关于kubernetes:当K8S发生故障时可以从哪几个方面入手排查问题

当K8S产生故障时,往往须要迅速而准确地定位问题,并及时采取行动。那么,当遇到K8S故障时,应该从哪几个方面动手排查问题呢?本篇就来聊聊这个话题,让咱们一起来探寻要害的排查方向。第一方面:扫视集群状态K8S的集群状态是排查故障的要害终点。应用kubectl get nodes命令来查看节点状态。如果有节点未能就绪或出现异常状态,可能会对应用程序造成故障。确保根本组件,如etcd、kubelet和kube-proxy等,失常运行。 第二方面:追踪事件日志深刻理解集群中产生的事件是解决K8S故障的重要环节。通过kubectl get events命令查看事件日志。事件日志记录了与集群中重要事件和谬误相干的信息。透过事件日志的查看,可能理解K8S组件或应用程序中存在的潜在故障,并精确定位问题。 第三方面:聚焦Pod状态通过运行kubectl get pods --all-namespaces命令,获取集群中所有Pod的状态。若有Pod未处于运行状态(例如挂起、谬误或未就绪等),很可能与容器或应用程序相干的问题无关。借助kubectl describe pod命令,获取特定Pod的详细信息,以便深刻排查。 第四方面:查看网络连通性确保网络连接失常。审查服务、Pod和节点之间的网络通信是否存在问题。运行kubectl get services命令查看服务状态,应用kubectl describe service获取相干服务的详细信息。同时,验证网络策略和防火墙规定的正确配置。 第五方面:扫视存储配置如果你的应用程序应用持久性存储(例如Persistent Volumes和Storage Classes),务必确保存储配置正确。查看存储卷申明、存储类和长久卷的状态。通过kubectl get pv、kubectl get pvc和kubectl get storageclass命令,获取与存储相干的信息。 第六方面:钻研容器日志深刻容器的日志可能提供对于应用程序故障的重要线索。应用kubectl logs命令查看特定Pod中容器的日志输入。如果Pod内含多个容器,你能够应用kubectl logs-c来查看特定容器的日志。 最初以上就是排查K8S故障时的要害方向。当然,具体的排查办法还取决于你的集群配置、应用程序部署形式以及故障的具体景象。依据理论状况,可能须要进一步考察或采取其余排查措施。立足于这些方向,你将更有把握解决K8S故障,并确保应用程序继续稳固运行。点击链接,畅读精彩文章,从中获取洞见,为本人的技术之旅注入新的能源!关注我的微信公众号,不错过更多精彩内容。 【K8S(专一于深入研究K8S相干的各种技术和常识分享。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Go&Py(涵盖了Go和Python两种风行的编程语言。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Ops(运维畛域的探讨和交换。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...

June 25, 2023 · 1 min · jiezi

关于kubernetes:pod-知识点-上

在 K8S 中, pod 是一个十分要害的存在,咱们一起来看看 pod 具体是个什么? pod 是个啥?pod 是个什么呢?pod 是 K8S中的一个外围概念 每一个 pod 都会有一个非凡的根容器,叫做 pause 容器,pause 容器对应的镜像也是属于 K8S 的一部分的 pod 外面可不仅仅只有 pause 容器,还能够有其余多个容器 之前文章咱们略微提到过 pod,每一个 pod ,都是一个具体利用的实例,pod 有本人单独的 IP,主机名,过程等等 pod 与 容器是 1 对多的关系一个 pod 外面能够有多个容器,多个容器彼此共享网络和存储资源 咱们都是通过 pod 中的 pause 容器 来治理其余容器的, 因为 pause 容器会存储所有的容器状态 pod 和节点的关系pod 存在于节点中,不同节点的 pod 互相通信,是通过二层网络通信的 pod 本身还有啥不同的?pod 本身还分成一般的 pod,和动态的 pod 咱们如何定义一个 pod在 K8S 中定义一个 pod 也是比较简单的,就是写一个 yaml 文件,只不过咱们刚开始须要多加尝试和练习 yaml 文件大体是这样的,纯手写 , 上面的配置,我把不太容易了解的或者说是容易误会的名词解释一下,其余的自行看英文即可了解 ...

June 25, 2023 · 2 min · jiezi

关于kubernetes:centos7通过kubeadm安装k8s1273版本解决各种坑可供参考

1. 硬件要求1、Master主机:2核CPU、4G内存、20G硬盘2、Node主机:4+核CPU、8G+内存、40G+硬盘2、集群中的所有机器的网络彼此均能相互连接3、节点之中不能够有反复的主机名、MAC 地址或 product_uuid4、开启机器上的某些端口5、为了保障 kubelet 失常工作,必须禁用替换分区 在每一台节点上 写上集群主机的hosts10.2.xx.215 gz-xx-gw-c7 # master10.2.xx.128 gz-xx-node1-c7 # node10.2.xx.246 gz-xx-node2-c7 # node2. 服务器环境配置2.1 敞开防火墙(所有节点)敞开防火墙并设置开机不启动 systemctl stop firewalldsystemctl disable firewalld2.3 敞开swap分区(所有节点)批改后重启服务器失效 swapoff -avim /etc/fstab #永恒禁用swap,删除或正文掉/etc/fstab里的swap设施的挂载命令即可#/dev/mapper/centos-swap swap swap defaults 0 02.4 Centos7内核降级(所有节点)因为centos7.9的零碎默认内核版本是3.10,3.10的内核有很多BUG,最常见的一个就是group memory leak(四台主机都要执行)1)下载所须要的内核版本,我这里采纳rpm装置,所以间接下载的rpm包 [root@localhost ~]# wget https://cbs.centos.org/kojifiles/packages/kernel/4.9.220/37.el7/x86_64/kernel-4.9.220-37.el7.x86_64.rpm2)执行rpm降级即可 [root@localhost ~]# rpm -ivh kernel-4.9.220-37.el7.x86_64.rpm#查看零碎可用内核,并设置启动项[root@gz-bjrd-devops-gw-c7 dd]# sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg0 : CentOS Linux (4.9.220-37.el7.x86_64) 7 (Core)1 : CentOS Linux (3.10.0-1160.88.1.el7.x86_64) 7 (Core)2 : CentOS Linux (3.10.0-1160.76.1.el7.x86_64) 7 (Core)3 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)4 : CentOS Linux (0-rescue-1caefa67ba0d4c758d6742dfc455d487) 7 (Core)#指定开机启动内核版本grub2-set-default 0 或者 grub2-set-default 'CentOS Linux (6.3.1-1.el7.elrepo.x86_64) 7 (Core)'#生成 grub 配置文件grub2-mkconfig -o /boot/grub2/grub.cfg3)降级完reboot,而后查看内核是否胜利降级################肯定要重启 ...

June 25, 2023 · 5 min · jiezi

关于kubernetes:什么是-Kubernetes-cluster-的-Node-affinity

Node affinity 在概念上相似于nodeSelector,它容许您依据节点标签来限度Pod能够调度到哪些节点上。有两种类型的节点亲和性: requiredDuringSchedulingIgnoredDuringExecution:除非满足规定,否则调度程序无奈将Pod调度到节点上。这相似于nodeSelector,但具备更具表白性的语法。preferredDuringSchedulingIgnoredDuringExecution:调度程序尝试找到合乎规定的节点。如果没有匹配的节点可用,调度程序仍会将Pod调度到节点上。留神:在上述类型中,IgnoredDuringExecution示意如果在Kubernetes调度Pod之后节点标签发生变化,Pod将持续运行。 开发人员能够在Pod标准的.spec.affinity.nodeAffinity字段中指定Node affinity: apiVersion: v1kind: Podmetadata: name: with-node-affinityspec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - antarctica-east1 - antarctica-west1 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value containers: - name: with-node-affinity image: registry.k8s.io/pause:2.0在Kubernetes集群中,Node affinity(节点亲和性)是一种机制,用于管制Pod在调度时所选取的节点。它容许您依据节点的属性和标签,指定Pod在哪些节点上能够调度和运行。 Node affinity能够用于多种场景,包含: 硬件要求:某些应用程序可能对特定类型的硬件有要求,例如须要具备GPU或特定的存储设备。通过应用Node affinity,能够将这些Pod调度到领有相应硬件资源的节点上。数据局部性:某些应用程序须要拜访特定的数据源或存储地位,为了缩小提早和网络开销,能够将Pod调度到与数据源或存储地位相近的节点上。资源隔离:通过应用Node affinity,能够将不同类型的Pod调配到不同的节点上,实现资源的隔离和优化。例如,将CPU密集型的应用程序调度到专门的高性能节点,将内存密集型的应用程序调度到具备大内存容量的节点。Node affinity的配置基于节点标签和Pod标准中的affinity字段。在Pod标准中,您能够应用.spec.affinity.nodeAffinity来指定节点亲和性的规定。Node affinity有两种类型: requiredDuringSchedulingIgnoredDuringExecution:Pod必须满足规定能力被调度到节点上。如果没有满足规定的节点可用,Pod将无奈被调度。这相似于应用nodeSelector,但具备更灵便和表白性更强的语法。preferredDuringSchedulingIgnoredDuringExecution:调度器会尝试寻找满足规定的节点,并将Pod调度到最匹配的节点上。如果没有满足规定的节点可用,调度器依然会抉择一个节点进行调度。须要留神的是,在这两种类型中,IgnoredDuringExecution示意一旦Pod被Kubernetes调度到节点上后,即便节点的标签发生变化,Pod也会持续在该节点上运行。 Node affinity的规定能够依据节点标签的匹配性和非匹配性来定义。例如,您能够应用相似于"matchExpressions"和"matchFields"的字段来指定节点标签的匹配规定,以决定Pod是否应该被调度到节点上。 应用Node affinity时,须要思考以下几点: 标签定义:确保节点上的标签与您定义的节点亲和性规定相匹配。您能够为节点增加适当的标签,以便将其与Pod的节点亲和性规定相匹配。节点选择器:除了应用Node affinity外,您还能够应用nodeSelector来间接指定Pod应该调度到哪些节点上。在一些状况下,应用nodeSelector可能更简略和直观。 节点标签更新:如果您在节点上更新了标签,可能会导致曾经运行的Pod被从新调度。因而,须要审慎更新节点标签,以防止Pod的中断或从新调度。总之,Node affinity是Kubernetes集群中用于管制Pod调度的重要机制之一。它通过应用节点标签和Pod标准中的affinity字段,容许您指定Pod应该调度到哪些节点上。这为您提供了更大的灵活性,以满足不同的调度需要,如硬件要求、数据局部性和资源隔离。

June 21, 2023 · 1 min · jiezi

关于kubernetes:手写K8S的YAML很痛苦看完这篇让你信手拈来

写在开篇对于刚刚接触K8s的老手来说,手动编写K8s的YAML配置文件可能会是一件很麻烦的事件。因为,配置文件蕴含了许多简单的对象和属性。比方Pod对象的各个字段、它们的含意以及可承受的值都有哪些?看完本篇可能会让你功力大增。本篇的内容尽管很根底,但很实用,说不定还真就有不晓得的小白同学。三把利剑:help、dry-run、explain尽管,手写YAML配置文件可能会让刚接触K8S的小白望而生畏。但别放心!K8S提供了一些弱小的工具和技巧,能够帮忙你晋升在K8s中编写YAML文件的功力。本篇文章将带你进行实战,利用Kubectl的help、dry-run、explain,让你在编写K8S的YAML文件时熟能生巧。 help:有时候可能会遗记具体的命令用法或参数选项。这时,"help"命令将会是得力助手。dry-run:在理论执行命令之前,事后验证命令的成果,模仿执行命令不会对集群产生理论影响,再配合 -o 选项 将后果输入为YAML格局,能疾速失去yaml。explain:编写YAML文件的时候,须要理解资源类型的构造和属性,通过它就能够晓得资源的所有字段、默认值和示例的详细信息。开始实战接下来以创立goweb利用的Deployment来作为实战演示。通过"help"命令,理解命令的应用形式、参数选项和示例用法:kubectl helpkubectl create deployment --help通过--dry-run来失去yaml[root@k8s-b-master ~]# kubectl create deployment goweb --image=192.168.11.253/library/goweb:latest --port=80 -r 3 -n goweb-namespace --dry-run=client -o yaml运行上述命令后,Kubectl将模仿执行创立Deployment的操作,但不会理论创立它。而是输入一个YAML格局的资源定义,通过这个形式,帮忙了咱们防止潜在的谬误和不必要的更改,进步工作效率。 执行后输入的yaml: apiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: goweb  name: goweb  namespace: goweb-namespacespec:  replicas: 3  selector:    matchLabels:      app: goweb  strategy: {}  template:    metadata:      creationTimestamp: null      labels:        app: goweb    spec:      containers:      - image: 192.168.11.253/library/goweb:latest        name: goweb        ports:        - containerPort: 80        resources: {}status: {}--dry-run的两个罕用选项: --dry-run=client -o yaml 将在本地模仿执行命令,并将模仿执行后果以YAML格局输入。--dry-run=server -o yaml 将命令申请发送到服务器,并由服务器模仿执行命令,返回通过服务器验证的YAML格局的资源定义。总而言之,--dry-run=client -o yaml实用于本地模仿执行命令并生成YAML配置文件的场景,而--dry-run=server -o yaml实用于获取通过服务器验证的牢靠YAML配置文件的场景。在理论工作中依据需要,抉择适合的选项来验证和生成YAML文件,以确保命令的正确性和一致性。通过explain理解资源的所有字段、默认值和示例的详细信息假如我当初要晓得containers对象中的还有哪些可用的字段。 能够应用以下命令: kubectl explain deployment.spec.template.spec.containers运行上述命令后,将取得对于spec.template.spec.containers字段的具体阐明。这将包含该字段的类型、形容以及可用的子字段和它们的阐明。还能够理解到默认值、束缚以及可能的示例。 最初的总结无论是菜鸟还是有教训的老鸟,把握这三把利剑将大大晋升编写YAML文件时的效率和准确性。老手要多用,老鸟要擅用。点击链接,畅读精彩文章,从中获取洞见,为本人的技术之旅注入新的能源!关注我的微信公众号,不错过更多精彩内容。 【K8S(专一于深入研究K8S相干的各种技术和常识分享。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Go&Py(涵盖了Go和Python两种风行的编程语言。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Ops(运维畛域的探讨和交换。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...

June 21, 2023 · 1 min · jiezi

关于kubernetes:容器引擎选择功能性能与生态系统的综合考量

写在开篇在 K8S 中,容器引擎的角色和性能是十分重要的,容器引擎负责管理和运行容器化利用,它是将利用打包为容器的基础设施。所以,给利用抉择适宜的容器引擎也是至关重要的问题,本篇就来聊一聊。本文波及的相干链接: https://cri-o.io/https://containerd.io/https://kubernetes.io/docs/setup/production-environment/conta...https://kubernetes.io/blog/2016/12/container-runtime-interfac...https://httpd.apache.org/docs/current/programs/ab.htmlhttps://github.com/wg/wrkhttps://www.joedog.org/siege-home/三大支流容器引擎runc:runc是一个轻量级的容器引擎,它提供了合乎OCI(Open Container Initiative)规范的接口,能够用于启动和运行合乎OCI标准的容器。在CRI-O中,runc是默认的容器执行器,用于启动和运行容器。runc的长处是轻量级、符合标准、开源,能够用于构建自定义容器运行时,但毛病是不提供容器镜像的治理和一些高级性能,例如容器网络和存储等。Docker:Docker是一个风行的容器引擎,它提供了残缺的容器生命周期治理和一整套高级性能,例如容器镜像的治理、容器网络、存储、日志和监控等。Docker应用本人的Docker API作为容器运行时接口,能够不便地启动和治理Docker容器。Docker的长处是功能强大、易于应用、社区沉闷,但毛病是绝对较重,有较高的资源占用和平安危险。containerd:containerd是一个用于治理容器生命周期的工具,它是Docker的外围组件之一,也能够作为独立的容器运行时应用。containerd提供了合乎OCI规范的接口,能够用于启动和治理合乎OCI标准的容器。containerd的长处是轻量级、安全性高、可扩展性好,但毛病是不提供容器镜像的治理和一些高级性能,例如容器网络和存储等。总之,runc、Docker和containerd都是容器引擎,它们提供的性能和接口不同,能够依据具体需要抉择应用。runc是一个轻量级的容器引擎,适宜于构建自定义容器运行时;Docker是一个功能强大、易于应用的容器引擎,适宜于疾速构建和治理容器化利用;containerd是一个轻量级、安全性高、可扩展性好的容器引擎,适宜于构建容器运行时。如何抉择适宜K8S的容器引擎Docker 是最罕用的容器引擎之一,也是最早与 K8S 集成的引擎。在默认状况下,K8S 应用 Docker 作为容器运行时。因而,如果你的利用和基础设施曾经依赖于 Docker,没有明确的理由须要更换,那么持续应用 Docker 作为 K8S 的容器引擎是一个不错的抉择。runc + containerd 的轻量级计划: runc 和 containerd 都是由 Docker 我的项目衍生而来,它们提供了更轻量级的容器运行时环境。如果你对于容器引擎的安全性和性能要求较高,且不须要 Docker 的所有性能,能够思考应用 runc + containerd 的组合作为 K8S 的容器引擎。这种组合能够提供更加纯正和精简的容器运行时环境。其余容器引擎的思考: 除了 Docker、runc 和 containerd,K8S 还反对其余容器引擎,如CRI-O、frakti 等。这些引擎都是依据 Kubernetes CRI (Container Runtime Interface) 标准开发的,能够与 K8S 进行无缝集成。如果有特定的需要或对其余容器引擎有更高的偏好,能够思考这些代替计划。依据K8S官网倡议,能够抉择containerd或cri-o作为K8S的容器引擎。这两个我的项目都受到宽泛的社区反对和踊跃的倒退,且与 K8S 的集成严密。抉择时还须要思考的因素性能:不同容器引擎的性能体现会有所差别,包含启动工夫、资源利用率等。依据你的利用需要和性能要求,抉择适宜的引擎。安全性:容器引擎的安全性是重要的思考因素。确保所抉择的引擎具备良好的安全性个性,如隔离性、破绽修复机制等。社区反对和生态系统:思考抉择的容器引擎是否有沉闷的社区反对和成熟的生态系统,这将有助于解决问题和获取反对。倡议关注的性能指标如要对容器引擎进行性能测试,上面给出一些常见的性能指标,供参考: 启动工夫:容器引擎的启动工夫指的是从容器创立到容器内应用程序齐全启动并可用的工夫,较短的启动工夫能够进步应用程序的可伸缩性和弹性。资源利用率:容器引擎应尽量减少资源的占用,包含内存、CPU、存储等,较高的资源利用率意味着更好的性能和更高的容器密度。网络性能:容器引擎应提供高效的网络通信机制,包含容器间通信和容器与内部网络的通信,网络性能的好坏对于分布式应用程序和微服务架构尤为重要。存储性能:容器引擎应提供高性能的存储拜访,包含读取和写入操作,这对于须要频繁拜访存储的应用程序特地重要。提醒:罕用的性能测试工具包含Apache Bench、wrk、Siege等。写在最初最初做个简略总结,抉择适宜的容器引擎须要综合思考: 性能性能可扩展性兼容性社区反对确保抉择的容器引擎和应用程序需要相匹配,这样才能够帮忙咱们在K8S中无效地治理和运行容器化应用程序。 点击链接,畅读精彩文章,从中获取洞见,为本人的技术之旅注入新的能源!关注我的微信公众号,不错过更多精彩内容。 【K8S(专一于深入研究K8S相干的各种技术和常识分享。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Go&Py(涵盖了Go和Python两种风行的编程语言。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Ops(运维畛域的探讨和交换。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...

June 21, 2023 · 1 min · jiezi

关于kubernetes:完事后再聊应用场景K8S调度实战Node-Affinity

写在开篇Node Affinity(节点亲和性)容许在节点级别上指定一些条件来管制Pod被调度到哪些节点上。它还有两种策略,本篇通过实战演示如何应用两种策略来管制Pod的调度。测试环境还是老样子,本次实战持续应用以下K8S集群环境进行: 节点主机名IPMaster节点k8s-b-master192.168.11.100工作节点1k8s-b-node01192.168.11.101工作节点2k8s-b-node02192.168.11.102工作节点3k8s-b-node03192.168.11.103工作节点4k8s-b-node04192.168.11.104工作节点5k8s-b-node05192.168.11.105工作节点6k8s-b-node06192.168.11.106开始实战在本次实战中,应用一个名为goweb的测试应用程序来演示Node Affinity的应用。goweb是我用Golang开发的简略Web应用程序,用于测试和验证K8S的调度策略。当然了,你也能够本人开发一个相似的利用,而后应用本人的利用来进行本篇的实战内容。 策略1在这个实战案例中,我将应用requiredDuringSchedulingIgnoredDuringExecution策略,该策略要求Pod只能调度到特定的节点上。  我将创立一个Node Affinity规定,要求goweb利用只能调度到主机名为k8s-b-node03的节点上。 首先,须要创立一个名为goweb-node-affinity.yaml的文件,并将以下内容复制到文件中: apiVersion: apps/v1kind: Deploymentmetadata:  name: goweb  namespace: goweb-namespacespec:  replicas: 3  selector:    matchLabels:      app: goweb  template:    metadata:      labels:        app: goweb    spec:      containers:      - name: goweb        image: 192.168.11.253/library/goweb:latest        ports:        - containerPort: 80      affinity:        nodeAffinity:          requiredDuringSchedulingIgnoredDuringExecution:            nodeSelectorTerms:            - matchExpressions:              - key: kubernetes.io/hostname                operator: In                values:                - k8s-b-node03保留文件后,应用以下命令利用goweb利用的Node Affinity规定: kubectl apply -f goweb-node-affinity.yaml当初,K8S调度器将只会将goweb利用调度到主机名为k8s-b-node03的节点上。 [root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wideNAME                     READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATESgoweb-5559b4bbf5-5mpd8   1/1     Running   0          64s   10.244.199.138   k8s-b-node03   <none>           <none>goweb-5559b4bbf5-lbq4j   1/1     Running   0          63s   10.244.199.139   k8s-b-node03   <none>           <none>goweb-5559b4bbf5-lqkzh   1/1     Running   0          70s   10.244.199.137   k8s-b-node03   <none>           <none>策略2在这个实战案例中,我将应用preferredDuringSchedulingIgnoredDuringExecution策略,该策略尽量将Pod调度到满足条件的节点上,但不是强制要求。  我将创立一个Node Affinity规定,优先将goweb利用调度到领有标签app=goweb-node的节点上。 首先,我创立一个名为goweb-preferred-node-affinity.yaml的文件,并将以下内容复制到文件中: apiVersion: apps/v1kind: Deploymentmetadata:  name: goweb  namespace: goweb-namespacespec:  replicas: 3  selector:    matchLabels:      app: goweb  template:    metadata:      labels:        app: goweb    spec:      containers:      - name: goweb        image: 192.168.11.253/library/goweb:latest        ports:        - containerPort: 80      affinity:        nodeAffinity:          preferredDuringSchedulingIgnoredDuringExecution:          - weight: 1            preference:              matchExpressions:              - key: app                operator: In                values:                - goweb-node保留文件后,应用以下命令利用goweb利用的Node Affinity规定: kubectl apply -f goweb-preferred-node-affinity.yaml当初,K8S调度器将优先将goweb利用调度到领有标签app=goweb-node的节点上,但如果没有满足条件的节点,它依然能够调度到其余节点上。 查看node标签和调度后果: # 查看label:[root@k8s-b-master ~]# kubectl get node --show-labelsNAME           STATUS   ROLES           AGE   VERSION   LABELSk8s-b-master   Ready    control-plane   49d   v1.25.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-b-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=k8s-b-node01   Ready    <none>          49d   v1.25.4   app=goweb-node,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-b-node01,kubernetes.io/os=linuxk8s-b-node02   Ready    <none>          49d   v1.25.4   app=goweb-node,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-b-node02,kubernetes.io/os=linux...# 调度后果:[root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wideNAME                     READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATESgoweb-58799f9b4c-cd5j4   1/1     Running   0          16s   10.244.51.204    k8s-b-node01   <none>           <none>goweb-58799f9b4c-hpwlt   1/1     Running   0          16s   10.244.232.147   k8s-b-node02   <none>           <none>goweb-58799f9b4c-ksps5   1/1     Running   0          16s   10.244.232.146   k8s-b-node02   <none>           <none>删除app标签后再次查看调度后果: # 删除kubectl label nodes k8s-b-node01 app-kubectl label nodes k8s-b-node02 app-# 调度后果:[root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wideNAME                     READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATESgoweb-58799f9b4c-5hr8h   1/1     Running   0          2s    10.244.25.77     k8s-b-node05   <none>           <none>goweb-58799f9b4c-5vnr9   1/1     Running   0          2s    10.244.232.148   k8s-b-node02   <none>           <none>goweb-58799f9b4c-hwxjc   1/1     Running   0          2s    10.244.151.4     k8s-b-node06   <none>           <none>留神到了吧?删除app标签后,就没有满足条件的节点了,但它依然能够调度到其余节点上。通过实战,曾经证实了这一点。应用场景上面聊聊两种策略在理论工作中可能的应用场景。 1. requiredDuringSchedulingIgnoredDuringExecution 它的特点是:强制要求Pod只能调度到特定节点的策略。可能实用的场景: 硬件个性要求:比方对底层硬件有特殊要求的利用,就能够将Pod调度到领有特定标签货其它属性的节点上。数据本地性要求:比方须要拜访特定数据源的利用,将Pod调度到与数据源最近的节点上,这样能够缩小网络提早和进步性能。资源隔离:将特定类型的工作或工作负载隔离到专用的节点上。举个贴近理论的例子,假如有一组节点,其中几个节点领有牛逼的CPU和内存资源。心愿将一些须要较高计算能力的任务调度到这些节点上。这时候就能够应用此策略来指定这些节点的标签或其余属性,就能够将Pod限度在这些节点上了。 2. preferredDuringSchedulingIgnoredDuringExecution 它的特点是:优先选择满足条件的节点进行调度的策略。可能实用的场景: 资源利用率优化:比方心愿将Pod调度到领有特定资源的节点上,但如果没有满足条件的节点,依然能够将Pod调度到其余节点上。可用性和容错性:为了进步应用程序的可用性和容错性,咱们能够将Pod调度到多个节点上,但依然优先将其调度到特定节点上。如果该节点不可用,调度器将抉择次优节点进行调度。举个例子,假如有一组节点,其中一些节点的网卡连贯的是光交换机,网络更快。心愿将网络密集型的利用优先调度到这些节点上,这时候就能够指定这些节点的网络个性标签或其余属性。 再举个例子,假如在具备不同地理位置的多个数据中心中部署利用。就能够优先将Pod调度到与利用所服务的区域最近的节点上,以此来达到缩小提早、进步用户体验的成果。 我为什么要用“可能实用的场景”来阐明?因为我感觉,看这篇文章的你应该能够想到更好的利用场景,欢送留言探讨。最初总结接下来做个关键性的总结: Node Affinity有两种策略:requiredDuringSchedulingIgnoredDuringExecution:调度器只有在规定被满足的时候能力执行调度(硬策略)preferredDuringSchedulingIgnoredDuringExecution:调度器会尝试寻找满足对应规定的节点。如果找不到匹配的节点,调度器依然会调度该Pod(软策略)匹配形式有两种:matchExpressions:基于标签的匹配,能够蕴含一个或多个条件,每个条件由键、运算符和值组成,实用于更简单的标签匹配逻辑的场景。matchFields:容许基于节点的字段抉择节点,而不是基于标签。比方指定节点上的字段名称和值进行匹配。这对于抉择节点的特定属性十分有用,例如节点的操作系统、内存大小等。operator属性可能的枚举值:"DoesNotExist": 用于查看标签或注解不存在的状况。"Exists": 用于查看标签或注解存在的状况。"Gt": 用于数字类型的匹配,示意大于指定值。"In": 用于匹配给定值列表中的任何一个值。"Lt": 用于数字类型的匹配,示意小于指定值。"NotIn": 用于匹配不在给定值列表中的任何一个值。心愿本篇的实战能对你了解和应用K8S中的Node Affinity个性有所帮忙。你能够依据理论需要和集群环境,灵便利用Node Affinity来优化利用的调度行为。好了,本篇就到此结束,有问题能够评论区留言探讨或者私信探讨。 重视运维实战,咱们比谁都拼!日常分享实用干货,助你成为运维大神!摸索技术的魅力,从这里开始! 点击链接,畅读精彩文章,从中获取洞见,为本人的技术之旅注入新的能源!关注我的微信公众号,不错过更多精彩内容。 【K8S(专一于深入研究K8S相干的各种技术和常识分享。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Go&Py(涵盖了Go和Python两种风行的编程语言。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Ops(运维畛域的探讨和交换。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...

June 21, 2023 · 1 min · jiezi

关于kubernetes:K8S调度实战完nodeSelector后再谈应用场景

Part1写在开篇nodeSelector是什么鬼?这么说吧,假如有一个K8S集群,其中有多个节点,并且想将一个特定的应用程序只部署在具备特定标签的节点上。这时候就能够在Pod的定义中增加nodeSelector字段,指定一个键值对,例如app: my-app。而后,K8S调度器将查找具备app=my-app标签的节点,并将该Pod调度到其中之一上运行。 须要留神的是,nodeSelector是一种根本的、也是最简略的调度机制,还有其余更高级的调度个性可供选择,如Node Affinity、nodeAffinity、podAffinity、Taints and Tolerations(污点和容忍)等。在理论工作中,能够依据理论需要和复杂性来抉择不同的调度机制满足特定的业务需要。对于这些内容的实战,前面都会逐个分享。对于更多详情可参考官网文档: https://kubernetes.io/docs/concepts/scheduling-eviction/assig...https://kubernetes.io/docs/concepts/scheduling-eviction/assig...https://kubernetes.io/docs/tasks/configure-pod-container/assi...Part2试验环境本次实战基于以下K8S集群环境进行: 节点主机名IPMaster节点k8s-b-master192.168.11.100工作节点1k8s-b-node01192.168.11.101工作节点2k8s-b-node02192.168.11.102工作节点3k8s-b-node03192.168.11.103工作节点4k8s-b-node04192.168.11.104工作节点5k8s-b-node05192.168.11.105工作节点6k8s-b-node06192.168.11.106Part3开始实战从这里开始,通过实战演示如何在K8S集群中应用nodeSelector来将Pod调度到指定的节点上。 1步骤 1:创立Node标签首先,咱们须要为指标节点增加标签。在本次实战中,咱们将以goweb利用为例,将Pod调度到具备app=goweb-node标签的节点上。在Master节点上执行以下命令,为节点增加标签: kubectl label node k8s-b-node01 app=goweb-nodekubectl label node k8s-b-node02 app=goweb-node查看标签: kubectl get node k8s-b-node01 --show-labelskubectl get node k8s-b-node02 --show-labels2步骤 2:编写goweb利用的Deployment文件咱们假如有一个goweb利用,用于测试目标。你能够本人开发一个相似的利用,或者应用上面提供的示例。 创立一个名为goweb-deployment.yaml的文件,并应用以下内容编写Deployment的定义: kubectl create deployment goweb --image=192.168.11.253/library/goweb:latest --port=80 -r 3 -n goweb-namespace --dry-run=client -o yaml对应YMAL: apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: goweb  name: goweb  namespace: goweb-namespacespec:  replicas: 3  selector:    matchLabels:      app: goweb  template:    metadata:      labels:        app: goweb    spec:      containers:      - image: 192.168.11.253/library/goweb:latest # 留神替换为你本人的公有仓库地址        name: goweb        ports:        - containerPort: 80保留并利用该文件,执行以下命令: kubectl apply -f goweb-deployment.yaml3步骤 3:配置nodeSelector当初,须要批改Deployment文件,增加nodeSelector字段,以指定Pod应该调度到具备app=goweb-node标签的节点上。 编辑goweb-deployment.yaml文件,批改Deployment的定义如下: ```ymlapiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: goweb  name: goweb  namespace: goweb-namespacespec:  replicas: 3  selector:    matchLabels:      app: goweb  template:    metadata:      labels:        app: goweb    spec:      nodeSelector: # 增加nodeSelector字段        app: goweb-node      containers:      - image: 192.168.11.253/library/goweb:latest # 留神替换为你本人的公有仓库地址        name: goweb        ports:        - containerPort: 80保留并利用该文件,执行以下命令: kubectl apply -f goweb-deployment.yaml4步骤 4:验证调度后果这是增加nodeSelector字段之前的调度状况: NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATESgoweb-77bcc56b49-9q6f4   1/1     Running   0          6m42s   10.244.151.61    k8s-b-node06   <none>           <none>goweb-77bcc56b49-k2j68   1/1     Running   0          6m42s   10.244.232.141   k8s-b-node02   <none>           <none>goweb-77bcc56b49-s9757   1/1     Running   0          6m42s   10.244.25.76     k8s-b-node05   <none>           <none>期待一段时间,让K8S调度器将Pod调度到相应的节点上。能够应用以下命令查看Pod的调度状况: kubectl get pod -n goweb-namespace -o wide你应该会看到相似以下的输入: [root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wideNAME                     READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATESgoweb-79db84d884-646rg   1/1     Running   0          87s   10.244.51.202    k8s-b-node01   <none>           <none>goweb-79db84d884-9f97p   1/1     Running   0          83s   10.244.232.140   k8s-b-node02   <none>           <none>goweb-79db84d884-kd8lm   1/1     Running   0          89s   10.244.232.142   k8s-b-node02   <none>           <none>留神到Pod被胜利调度到了具备app=goweb-node标签的节点上。 Part4应用场景实战案例演示结束,接下来看看nodeSelector的应用场景: 节点个性要求:  这个应用场景针对的就是应用程序有特定的硬件或软件要求,例如goweb这个应用程序可能须要在具备高性能 GPU 的节点上运行,这时候就能够为这些节点增加相应的标签,而后应用nodeSelector将Pod调度到这些节点上。资源分配和负载平衡:  这种状况就很适宜须要精细化调配和负载平衡的场景,比方将Pod调度到资源短缺的节点上。这时候就能够为节点设置不同的标签,依据节点的资源状况来调度到指定的节点。特定环境要求:  例如生产环境或开发环境,相应的节点能够增加环境标签,而后调度到特定的环境,这个场景置信是用的比拟多的了。地理位置和数据局部性:  这个场景怎么说好呢,比如说应用程序须要与特定地理位置相干的数据进行交互,这时候就能够抉择最近的节点来运行应用程序,以缩小数据传输的提早,这种状况就能够按地理位置的维度来设定标签。Part5写在最初心愿本文对你了解和利用nodeSelector调度机制有所帮忙!如有疑难,欢送留言探讨。 重视运维实战,咱们比谁都拼!日常分享实用干货,助你成为运维大神!摸索技术的魅力,从这里开始! 点击链接,畅读精彩文章,从中获取洞见,为本人的技术之旅注入新的能源!关注我的微信公众号,不错过更多精彩内容。 【K8S(专一于深入研究K8S相干的各种技术和常识分享。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Go&Py(涵盖了Go和Python两种风行的编程语言。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz... 【Ops(运维畛域的探讨和交换。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...

June 21, 2023 · 1 min · jiezi

关于kubernetes:Kubernetes构建平台工程的利器

作者|Loft Team翻译|Seal软件链接|https://loft.sh/blog/why-platform-engineering-teams-should-st... 在当今快节奏、一直变动的技术环境中,平台工程团队始终面临着交付新的翻新解决方案以满足一直变动的业务需要的压力。最大挑战之一则是治理反对这些应用程序的底层基础设施。随着容器化和云计算的衰亡,Kubernetes 曾经成为构建平台工程的重要利器之一,帮忙企业应答这些挑战。  在本文中,咱们将探讨 Kubernetes 为平台工程提供了哪些要害劣势。  对立基础设施治理Kubernetes 的次要劣势之一是它可能提供一个对立的平台来管理应用程序和基础架构。通过对 Kubernetes 平台工程团队能够简化其基础设施治理流程并升高复杂性。Kubernetes 提供繁多管制立体来治理主机集群,使团队可能轻松部署、治理和扩大应用程序。这不仅简化了应用程序部署,还使团队可能更无效地治理其基础架构。  借助 Kubernetes,团队能够轻松治理其基础架构资源,例如 CPU、内存和存储。Kubernetes 主动治理跨节点容器的调度,确保每个容器都运行在资源短缺的节点上。这样打消了手动资源分配的须要,并使开发团队可能专一于为客户提供价值。  Kubernetes 还提供了一组功能强大的网络原语,使团队可能轻松治理其基础架构中的网络策略和流量。借助 Kubernetes,团队能够轻松创立和治理负载均衡器、网络策略和入口规定,从而轻松治理简单的网络需要。同时 Kubernetes 领有优良的治理存储资源的能力,通过提供存储原语,容许团队轻松治理其应用程序的长久存储。借助 Kubernetes,团队能够轻松配置和治理存储卷,从而轻松治理其基础架构中的数据。  可扩展性和性能可扩展性和性能是平台工程团队的要害思考因素。随着应用程序工作负载的增长,团队须要可能及时无效地扩大其基础设施。Kubernetes 提供了一个可扩大的平台,能够轻松解决大规模工作负载。它还提供主动缩放和负载平衡等高级性能,使团队可能主动调整资源以满足一直变动的需要。  借助 Kubernetes,平台工程团队能够依据其应用程序工作负载的需要轻松扩大或缩减其基础架构。这意味着他们能够确保他们的应用程序始终安稳运行,无论他们收到多少流量。Kubernetes 容许团队依据其应用程序工作负载的需要主动调整资源。这意味着如果应用程序的流量忽然激增,Kubernetes 能够主动启动额定的资源来解决减少的工作负载。当流量消退时,Kubernetes 能够相应地缩减资源,从而节省成本并确保最佳的资源利用率。  负载平衡是 Kubernetes 提供的另一个要害个性,它有助于在应用程序的多个实例之间平均分配流量。这确保没有单个实例过载,否则会导致性能问题和停机。通过负载平衡,Kubernetes 能够在多个实例之间调配流量,从而确保应用程序放弃高可用性和响应性。此外,Kubernetes 在设计时就思考到了性能,利用容器化技术来确保最佳的资源利用和高效的工作负载执行。这会缩短应用程序启动工夫、缩小资源耗费并进步整体性能。  Kubernetes 可能为平台工程团队提供一个弱小的平台来扩大和治理他们的应用程序工作负载。借助主动缩放和负载平衡等性能,团队能够确保他们的应用程序始终安稳运行,无论他们收到多少流量。借助容器化技术,Kubernetes 可确保最佳资源利用和高效执行工作负载,从而进步整体性能。  进步资源利用率Kubernetes 能够依据工作负载需要主动调度和分配资源,确保只在须要时应用资源。这会进步资源利用率并升高基础设施老本。此外,Kubernetes 提供弱小的指标和监控性能,使团队可能深刻理解其基础架构中的资源利用率。Kubernetes 进步资源利用率的要害办法之一是通过其依据需要扩大和缩减资源的能力。这意味着资源仅在须要时应用,而不是一直调配和闲置。通过依据需要动态分配资源,Kubernetes 确保资源失去无效利用。  同时 Kubernetes 提供对资源分配的细粒度管制,容许团队依据特定的工作负载要求分配资源。例如,团队能够为须要大量解决的工作负载调配更多的 CPU 资源,同时为须要大量数据存储的工作负载调配更多的内存资源。  除了优化资源分配,Kubernetes 还提供了弱小的指标和监控能力。这些性能使团队可能深刻理解其基础架构中的资源利用率,确定资源可能适度或未充分利用的区域。通过辨认这些畛域,团队能够就如何调整资源分配以提高效率和降低成本做出理智的决策。  跨平台和多云灵活性Kubernetes 提供了很高的灵活性,这在当今快节奏的数字世界中变得越来越重要。借助 Kubernetes,团队能够在各种环境中部署应用程序,包含本地、云端或任何次要的公共云提供商。这种灵活性使团队可能轻松地跨不同环境迁徙或部署应用程序,而无需进行大量重组或重写。  Kubernetes 使团队可能更轻松地治理多云环境。通过 Kubernetes 团队能够跨多个云提供商管理工作负载,从而提供更大的灵活性和冗余。这对于心愿防止供应商锁定并在云提供商中断时确保业务连续性的企业来说尤为重要。无论是在本地还是在云端,他们的应用程序无论部署在何处都能顺利运行,Kubernetes 能提供团队可以信赖的统一且牢靠的体验。  Kubernetes 提供宽泛的个性和性能,使其成为古代利用程序开发的现实抉择。例如,Kubernetes 提供主动扩大、负载平衡和自我修复性能,能够帮忙团队确保他们的应用程序始终可用并以最佳状态运行。此外,Kubernetes 提供了一个弱小的容器编排平台,能够帮忙团队更轻松地治理简单的容器环境。借助 Kubernetes,团队能够轻松部署、治理和扩大容器化应用程序,使其成为古代云原生利用程序开发的现实抉择。  进步开发人员生产力Kubernetes 可能进步开发人员的工作效率。它提供了弱小的应用程序部署管理工具,使开发人员更容易部署和治理他们的应用程序。借助 Kubernetes,开发人员能够专一于构建应用程序而不是治理基础架构。  Kubernetes 能够依据须要主动调整应用程序的正本数量,确保应用程序能够在不须要任何人工干预的状况下应答流量顶峰。这意味着开发人员能够专一于构建杰出的应用程序,而不必放心他们的基础架构是否能够解决负载。Kubernetes 进步生产力的另一种形式是通过它对容器化的反对。容器提供了一种轻量级、可移植的形式来打包和部署应用程序,使开发人员能够更轻松地在环境之间挪动应用程序。借助 Kubernetes,开发人员能够轻松部署和治理容器化应用程序,从而缩小治理基础架构所需的工夫和精力。  此外,Kubernetes 使团队可能更轻松地采纳 DevOps 实际,从而实现更快的周期时间和继续交付。团队能够应用 Kubernetes 来自动化他们的公布流程,使他们可能疾速迭代和翻新。Kubernetes 还提供弱小的监控和日志记录工具,使团队更容易辨认和解决应用程序中的问题。  ...

June 20, 2023 · 1 min · jiezi

关于kubernetes:在-K8S-中部署一个应用-上

自身在 K8S 中部署一个利用是须要写 yaml 文件的,咱们这次简略部署,通过拉取网络上的镜像来部署利用,会用图解的形式来分享一下,过程中都产生了什么 简略部署一个程序咱们能够通过 kubectl run 的形式来简略部署一个利用,当初咱们先不关怀外面的 yaml 构造和具体的配置,先运行起来,看看成果 kubectl run mykubia --image=luksa/kubia --port=9999 --generator=run/v1,执行该命令,就能够创立一个容器,并运行起来 $ kubectl get podsNAME READY STATUS RESTARTS AGEmykubia 1/1 Running 0 63s能够看到 咱们的 mykubia 利用曾经运行起来的,咱们能够通过命令 kubectl logs -f mykubia 查看日志 在上命令中,解释一下: --image=luksa/kubia指定一个要运行的容器镜像 --port=9999指的是咱们指定服务运行的端口号是 9999 --generator=run/v1加上这个标记指的是 让 k8s 集群创立一个 ReplicationController ,而不是一个 Deployment pod 是什么在 K8S 中,一个 pod 是一组严密相干的容器,它们总是运行在同一个工作节点下面,他们有着同样的 Linux 命名空间 每一个 pod 就像是一个独立的逻辑机器,他有这些资源: 本人的 IP主机名过程可能运行一个独立的应用程序这外面运行的应用程序能够是单过程的,运行在单个容器中,每一个过程都会在本人的容器运行 如上图,每一个 pod 都会有本人的 IP,一个 pod 会蕴含 1 个或者多个 容器,多个 pod 也会散布在不同的工作节点下面 ...

June 19, 2023 · 2 min · jiezi

关于kubernetes:k8s-中不停容器热替换重启主进程-gdb-exec-法

The first car in my life - Fabia - Skoda 指标k8s 环境下,在不进行或重启 container 的状况下,重启利用过程(pid:1),甚至从新加载运行新版本的利用。本文以 gdb 作为工具,调用利用容器自带的 libc 的 close & exec 函数,去实现这个指标。 背景K8s 显然曾经由衰亡转向成熟。大潮过后,是时候思考一下,当初吹过的牛有哪些是真的,哪些是还未对现的。不可否认,k8s 改革了运维的工作形式,这根本是提高的。但对于开发,特地是阻碍问题定位、程序调试办法,显然难度是减少了。 在利用的阻碍问题定位、程序调试时,咱们时常心愿能在雷同的环境下反复重启利用,去察看咱们对配置的批改,或者程序的更新是否真正解决了问题。要实现这个指标,通常须要: 批改利用代码,跑 CI pipeline 从新打包 docker image,上传。—— 费时费力 想方法重启容器。—— 环境毁坏了,问题可能重现不了 如果容器启动脚本设计时就反对重启,当然没问题,但大部分状况下,均是不间接反对的,很多时候,利用主过程就间接是 container 的主过程 pid:1 了。 我钻研过三个办法去替换主过程: gdb 调用 libc 的 execl 。 这是本文要说的办法。gdb 调用 syscall execve 。 这个办法比较复杂,但也更通用,还在钻研。kill -STOP 挂起主过程的父过程gdb 主过程的父过程,让它收不到 SIGCHLD正告因为本文应用了 gdb attach 和非常规办法敞开文件描述符(close(fd))和替换过程执行文件(exec),潜在比拟大的未知危险,请不要在生产环境中应用。我也未充沛验证这个办法的可靠性,和副作用。包含 close 和 exec 是否能洁净清理后任的问题。所以,应用有危险。 思路gdb attach 过程调用 close fd ,特地是 socket 相干的,特地是 listen tcp port 的。调用 exec 执行雷同的 elf 文件或不同的 elf 文件步骤搭建试验指标环境环境阐明: ...

June 19, 2023 · 7 min · jiezi

关于kubernetes:Helm-安装-Prometheus-详解-以及-问题解决

Helm install prometheuskubectl create ns monitorhelm repo add prometheus-community https://prometheus-community.github.io/helm-chartshelm repo updatehelm search repo prometheus# prometheushelm show values prometheus-community/prometheus > prometheus.yaml -n monitoruninstallhelm uninstall prometheus -n monitorHelm install ingress1. 增加ingress的helm仓库01.# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx02.# helm search repo ingress-nginx#要应用APP VERSION大于0.4.2的版本2. 下载ingress的helm包至本地# helm pull ingress-nginx/ingress-nginx --version 3.6.03. 更改对应的配置tar xvf ingress-nginx-3.6.0.tgzcd ingress-nginxvim values.yaml4. 须要批改的地位a) Controller和admissionWebhook的镜像地址,须要将公网镜像同步至公司内网镜像仓库(和文档不统一的版本,须要自行同步gcr镜像的,能够百度查一下应用阿里云同步gcr的镜像,也能够参考这个链接https://blog.csdn.net/weixin_39961559/article/details/80739352,或者参考这个链接: https://blog.csdn.net/sinat_35543900/article/details/103290782)批改repository为地址registry.cn-beijing.aliyuncs.com/dotbalo/controller,并正文掉哈希值; ////Controller和admissionWebhook的镜像备选的地址image: registry: registry.aliyuncs.com #批改镜像仓库地址 image: google_containers/nginx-ingress-controller #批改镜像仓库和镜像名 //// b) 镜像的hash值正文;c) hostNetwork设置为true;d) dnsPolicy设置为 ClusterFirstWithHostNet;e) nodeSelector增加ingress: "true"部署至指定节点;f) 默认的类型是Deployment,更改为kind: DaemonSet;g) type: 默认是LoadBalancer(云环境应用这个) ,批改为ClusterIP;h) 倡议依据生产理论环境批改requests;i) 倡议依据生产理论环境批改admissionWebhooks;要应用APP VERSION大于0.4.2的版本,大于这个版本,这个enabled不须要批改j) image批改镜像地址为registry.cn-beijing.aliyuncs.com/dotbalo/kube-webhook-certgen //此项的备用地址参考a我的项目的备用地址// 5. 部署ingress给须要部署ingress的节点上打标签 01.//创立命名空间叫ingress-nginx# kubectl create ns ingress-nginx 02.//获取所有namespace;# kubectl get ns //查看到ingress-nginx创立实现;// 03.//取所有工作节点# kubectl get node 04.//比方咱们给部署在master03上ingress的节点上打标签# kubectl label node k8s-master03 ingress=truenode/k8s-master03 labeled 05.//留神开端的 . (点)# helm install ingress-nginx -n ingress-nginx . 06.//镜像拉取快慢取决于镜像地址,国内的阿里云比拟快(屡次刷新看到后果Ready 1/1,STATUS:Running为止)[root@k8s-master01 ingress-nginx]# kubectl get pod -n ingress-nginx 6. 将ingress controller部署至Node节点(ingress controller不能部署在master节点,须要装置视频中的步骤将ingress controller部署至Node节点,生产环境起码三个ingress controller,并且最好是独立的节点)kubectl label node k8s-node01 ingress=truekubectl label node k8s-master03 ingress- ...

June 16, 2023 · 2 min · jiezi

关于kubernetes:K8S资源限制实战优化性能与资源管理

Part1写在开篇K8S已成为容器编排和治理的事实标准,为开发者和运维人员提供了弱小的工具和性能。在K8S集群中,对资源的正当限度和治理是确保利用性能和可靠性的关键因素。本文将介绍如何在K8S集群中应用资源限度来优化利用的性能和实现资源管理。 Part2试验环境本次实战应用的K8S集群环境包含以下节点: 节点主机名IPMasterk8s-b-master192.168.11.100Node 1k8s-b-node01192.168.11.101Node 2k8s-b-node02192.168.11.102Node 3k8s-b-node03192.168.11.103Node 4k8s-b-node04192.168.11.104Node 5k8s-b-node05192.168.11.105Node 6k8s-b-node06192.168.11.106Part3开始实战1步骤 1:部署goweb利用咱们将应用goweb这个测试利用来演示资源限度的实战。goweb是一个用Golang语言开发的简略Web利用,你也能够应用本人的利用进行测试。首先,咱们须要将goweb利用部署到K8S集群中。 创立一个命名空间(Namespace)用于部署利用:kubectl create namespace goweb-demo创立一个Deployment来运行goweb利用:kubectl create deployment goweb --image=192.168.11.254:8081/webdemo/goweb:1.0 --namespace=goweb-demo创立一个Service来公开goweb利用的拜访入口:kubectl expose deployment goweb --port=80 --target-port=8080 --namespace=goweb-demoPart4步骤 2:设置资源限度为了确保利用的稳定性和性能,咱们须要为goweb利用设置适当的资源限度。在K8S中,能够应用资源限度(Resource Limit)来管制利用的CPU和内存应用。 创立一个资源限度的配置文件 goweb-resource-limit.yaml,并增加以下内容:apiVersion: v1kind: LimitRangemetadata:  name: goweb-resource-limit  namespace: goweb-demospec:  limits:    - default:        cpu: "1"        memory: 1Gi      defaultRequest:        cpu: "0.5"        memory: 512Mi      type: Container这个配置文件定义了一个资源限度范畴,每个容器的默认CPU和内存限度为指定的值。 对于LimitRange的更多信息,能够参考官网文档:https://kubernetes.io/zh-cn/docs/concepts/policy/limit-range/ 利用资源限度配置:kubectl apply -f goweb-resource-limit.yaml当初,goweb利用将受到资源限度的束缚,确保在正当的范畴内应用CPU和内存资源。 Part5步骤 3:测试资源限度成果为了验证资源限度的成果,咱们能够进行一些测试,例如模仿高负载状况下利用的行为。 创立一个测试Pod:kubectl run -it --rm load-generator --image=busybox --restart=Never --namespace=goweb-demo -- /bin/sh -c "while true; do wget -q -O- http://goweb; done"这个命令将创立一个有限循环的Pod,每秒钟拜访一次goweb利用。 察看Pod的行为:kubectl top pod --namespace=goweb-demo运行上述命令,你将看到goweb利用在资源限度下的CPU和内存应用状况。 Part6最初总结好了,本篇分享到此结束!通过本次实战,你曾经理解了在K8S集群中设置资源限度的步骤,并通过goweb利用的部署和测试,验证了资源限度的成果。当初你能够尝试在本人的利用中利用这些资源管理技巧,晋升利用的性能和稳定性。记得依据理论状况调整资源限度的数值,以满足利用的需要。重视运维实战,咱们比谁都拼!日常分享实用干货,助你成为运维大神!摸索技术的魅力,从这里开始! 1、浏览我的技术分享,把握最新的行业趋势;2、解密技术背地的机密,拓宽你的思维边界;3、退出我的技术社群,与志同道合者独特成长。 本篇原文链接:[https://mp.weixin.qq.com/s?__biz=MzUzMTkyODc4NQ==&mid=2247486...] 云原生合集:[https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...] 运维开发合集:[https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...] 运维杂谈合集:[https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...] 点击链接,畅读精彩文章,从中获取洞见,为本人的技术之旅注入新的能源!关注我的微信公众号,不错过更多精彩内容。

June 16, 2023 · 1 min · jiezi

关于kubernetes:一文实战K8S中的服务发现和负载均衡

开篇在Kubernetes集群中,服务发现和负载平衡是十分重要的概念和性能。它们能够帮忙咱们管理应用程序的拜访和流量散发,确保应用程序的高可用性和性能。在本文中,咱们将通过一个实战案例,摸索Kubernetes中的服务发现和负载平衡机制,并演示如何在集群中部署和治理具备负载平衡能力的应用程序。Kubernetes中的服务发现和负载平衡概述在Kubernetes中,服务是一种形象的概念,用于将一组具备雷同性能的Pod实例组合在一起,并为它们提供对立的拜访入口。服务发现和负载平衡是Kubernetes提供的外围性能,能够主动将流量分发给后端Pod实例,并确保应用程序的可扩展性和高可用性。 开始实战背景:假如您正在开发一个微服务架构的应用程序,并心愿应用Kubernetes来治理各个服务的拜访和负载平衡。咱们将应用Kubernetes的Service资源对象和Ingress资源对象,部署一个简略的微服务应用程序,并演示服务发现和负载平衡的工作原理。创立微服务应用程序在本案例中,咱们将创立一个蕴含多个微服务的应用程序,并应用Kubernetes来治理它们的拜访和负载平衡。依照以下步骤创立微服务应用程序: a. 创立多个Deployment对象,每个对象代表一个微服务的正本: # 创立微服务1的Deploymentkubectl create deployment microservice1 --image=microservice1:v1# 创立微服务2的Deploymentkubectl create deployment microservice2 --image=microservice2:v1b. 创立多个Service对象,将每个微服务裸露为一个独立的服务: # 创立微服务1的Servicekubectl expose deployment microservice1 --port=80# 创立微服务2的Servicekubectl expose deployment microservice2 --port=80c. 创立一个Ingress对象,定义微服务的拜访规定和负载平衡策略: # 创立Ingresskubectl apply -f ingress.yaml验证服务发现和负载平衡通过上述步骤,咱们曾经创立了多个微服务并将它们裸露为服务对象。当初,让咱们验证服务发现和负载平衡的工作原理: a. 验证Service对象是否胜利创立,并获取它们的Cluster IP地址: # 查看Service状态kubectl get servicesb. 验证Ingress对象是否胜利创立,并获取它的IP地址: # 查看Ingress状态kubectl get ingressc. 应用浏览器或命令行工具拜访Ingress的IP地址,并察看申请被负载平衡散发到不同的微服务实例。 应用程序的扩大和更新Kubernetes提供了灵便的扩大和更新机制,能够依据须要调整应用程序的正本数,并进行版本升级。依照以下步骤进行应用程序的扩大和更新: a. 应用kubectl命令扩大Deployment的正本数,实现应用程序的程度扩大: # 扩大正本数kubectl scale deployment microservice1 --replicas=3b. 更新应用程序的镜像版本,并应用kubectl命令进行滚动降级: # 更新镜像版本kubectl set image deployment/microservice1 microservice1=microservice1:v2c. 监控应用程序的扩大和更新过程,确保零碎的稳定性和可用性。 清理资源对象和集群在实现试验和测试后,为了开释资源和防止不必要的费用,咱们须要清理Kubernetes资源对象和集群。依照以下步骤进行清理: a. 应用kubectl删除所有的Deployment和Service对象: # 删除所有的Deploymentkubectl delete deployment --all# 删除所有的Servicekubectl delete service --allb. 删除Ingress对象: # 删除Ingresskubectl delete ingress microservice-ingressc. 进行并删除Minikube集群: # 进行Minikube集群minikube stop# 删除Minikube集群minikube delete最初通过本文的实战案例,咱们深刻理解了Kubernetes中的服务发现和负载平衡机制,并学习了如何在集群中部署和治理具备负载平衡能力的微服务应用程序。心愿这篇文章可能帮忙您把握Kubernetes的服务发现和负载平衡个性,并为您将来的微服务架构设计和部署提供领导和启发。本文转载于WX公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/cP_EsQZZ4PFpwhMbt5Ld2g

June 14, 2023 · 1 min · jiezi

关于kubernetes:一篇就让小白入门K8S使用Minikube来搭建本地的单节点K8S集群

开篇Kubernetes(通常简称为K8s)是一个开源的容器编排平台,它为应用程序的部署、扩大和治理提供了弱小的工具和性能。在本文中,咱们将通过一个实战案例,疏导您进入Kubernetes的世界,理解其基本概念和架构,并帮忙您装置和配置一个简略的Kubernetes集群。 Kubernetes概述Kubernetes是一个可扩大的开源平台,用于自动化容器化应用程序的部署、扩大和治理。它提供了一个对立的容器编排零碎,能够在多个主机上运行、调度和治理容器化的应用程序。 开始实战背景:假如您正在开发一个Web应用程序,并心愿应用Kubernetes将其容器化并在生产环境中部署和治理。咱们将应用Minikube工具来搭建本地的单节点Kubernetes集群,并部署一个简略的Nginx Web服务器。装置和配置Kubernetes集群在本案例中,咱们将应用Minikube工具来搭建本地的Kubernetes集群,以便在开发环境中进行试验和测试。依照以下步骤进行装置和配置: 装置Docker和kubectl命令行工具:# 装置Dockersudo apt-get updatesudo apt-get install docker.io# 装置kubectlsudo snap install kubectl --classic装置Minikube,并启动一个本地的Kubernetes集群:# 装置Minikubecurl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64chmod +x minikubesudo mv minikube /usr/local/bin/# 启动Minikube集群minikube start验证集群是否胜利启动,并应用kubectl与集群进行交互:# 验证集群状态kubectl cluster-info# 查看节点状态kubectl get nodes构建Docker镜像在将应用程序部署到Kubernetes集群之前,咱们须要将应用程序打包为Docker镜像。依照以下步骤构建镜像: a. 创立一个Dockerfile,定义应用程序的构建过程和运行环境: # DockerfileFROM nginx:latestCOPY index.html /usr/share/nginx/html/index.htmlb. 应用Docker命令构建镜像: # 构建镜像docker build -t my-nginx-app:v1 .c. 验证镜像是否胜利构建,并推送到Docker镜像仓库(可选)。 创立Kubernetes资源对象在Kubernetes中,咱们应用资源对象来定义应用程序的部署、服务和拜访规定。依照以下步骤创立资源对象: a. 创立一个Deployment对象,定义应用程序的正本数、容器镜像和其余配置: # 创立Deploymentkubectl create deployment my-nginx --image=my-nginx-app:v1b. 创立一个Service对象,定义应用程序的拜访形式和负载平衡规定: # 创立Servicekubectl expose deployment my-nginx --type=LoadBalancer --port=80c. 验证资源对象是否胜利创立,并查看应用程序的部署和运行状态: # 查看Deployment状态kubectl get deployments# 查看Service状态kubectl get services应用程序的扩大和更新Kubernetes提供了灵便的扩大和更新机制,能够依据须要调整应用程序的正本数,并进行版本升级。依照以下步骤进行应用程序的扩大和更新: ...

June 14, 2023 · 1 min · jiezi

关于kubernetes:k8s

1、k8s入门1、为什么有了Docker Swarm还须要k8s ?Swarm3k,Swarm可扩展性的极限是在4700个节点,生产环境节点数倡议在1000以下有余 : 节点,容器数量回升,治理成本上升无奈大规模容器调度没有自愈机制没有对立配置核心没有容器生命周期治理

June 12, 2023 · 1 min · jiezi

关于kubernetes:k8s基线扫描工具已发布

k8s基线扫描工具已公布,感兴趣能够瞅瞅。https://github.com/ssxingzhe/k8s-baseline-scanner

June 12, 2023 · 1 min · jiezi

关于kubernetes:K8S-核心原理分析

整体上了解流程和原理;一、背景基于分布式的架构中,须要治理的服务是十分多的,无论是服务的数量还是体系划分; 从服务的能力上看,能够进行分层管控,只是其中有相当一部分服务层,改变更新的频率很低,所以感知也不显著; 就以本人当下参加研发的零碎来说; 通过K8S进行治理的服务近百个,这两头有局部服务采纳集群模式,即使是这个规模的零碎,也简直不可能依赖纯人工运维的模式,自动化流程必不可少; 二、继续集成此前围绕该主题写过一个残缺的实际案例,次要围绕Jenkins、Docker、K8S等组件的应用层面,总结源码编译、打包、镜像构建、部署等自动化治理的流程; Jenkins:是一个扩展性十分强的软件,用于自动化各种工作,包含构建、测试和部署等; Docker:作为开源的利用容器引擎,能够把应用程序和其相干依赖打包生成一个Image镜像文件,是一个规范的运行环境,提供可继续交付的能力; Kubernetes:作为开源的容器编排引擎,用来对容器化利用进行自动化部署、 扩缩和治理; 三、K8S架构1、外围组件 Control-Plane-Components:管制立体组件 对集群做出全局决策,例如:资源调度、检测、事件响应,能够在集群中的任何节点上运行; api:凋谢K8S的API,组件之间通过API交互,相当于管制面的前端;controllermanager:运行控制器过程,逻辑上是一个独自的过程;scheduler:监听新建未指定运行节点的Pods,并为Pod抉择运行节点;etcd:兼具一致性和高可用性的键值数据库,作为保留K8S数据的后盾库;Node:节点组件 该组件会在每个节点上运行,负责保护运行的Pod并提供Kubernetes运行环境; kubelet:在每个节点上运行的代理,保障容器都运行在Pod中;kube-proxy:每个节点上运行的网络代理, 保护节点上的网络规定;Container-Runtime:容器运行时 负责运行容器的软件,反对Docker、containerd、CRI-O等多个容器运行环境,以及任何实现Kubernetes-CRI容器运行环境接口; 2、分层构造从整体的性能上来思考,K8S集群能够分为:用户、管制立体、节点三个模块; 用户侧:不论是CLI命令行还是UI界面,会与控制面板的APIserver进行交互,APIserver再与其余组件交互,最终执行相应的操作命令; 管制立体:以前也称为Master,外围组件包含APIserver、controller、scheduler、etcd,次要用来调度整个集群,以及做出全局决策; 节点:通过将容器放入在节点上运行的Pod中来执行工作负载,简略的了解工作负载就是各种应用程序等,节点上的外围组件包含Pod、kubelet、Container-Runtime、kube-proxy等; 3、外围能力站在研发的视角来看,K8S提供极其弱小的应用服务治理能力; 3.1 发现与负载服务Service能够将运行在一个或一组Pod上的网络应用程序公开为网络服务的办法,通常应用标签对资源对象进行筛选过滤; 3.2 调度调度器通过监测机制来发现集群中新创建且尚未被调度到节点上的Pod,因为Pod中的容器和Pod自身可能有不同的资源要求,调度会将Pod搁置到适合的节点上; 3.3 主动伸缩K8S能够通过指标查看工作负载的资源需要,例如CPU利用率、响应时长、内存利用率、或者其余,从而判断是否须要执行伸缩,垂直维度能够是更多的资源分配,程度维度能够是更多的集群部署; K8S能够主动伸缩,也具备主动修复的能力,当节点故障或者应用服务异样时,会被查看到,可能会进行节点迁徙或者重启; 四、利用案例1、服务部署在此前的实际案例中,用CLI命令行和脚本文件的形式,实现的部署动作,而在整个流程中波及集群的多个组件合作,屡次的通信和调度; kubectl create -f pod.yaml 2、交互流程 【1】CLI命令行和UI界面,都是通过APIserver接口,与集群外部组件交互,比方上述的Pod部署操作; 【2】在APIserver收到申请之后,会将序列化状态的对象写入到etcd中实现存储操作; 【3】Scheduler调度器通过监测(Watch)机制来发现集群中新创建且尚未被调度到节点上的Pod; 【4】在集群中找到一个Pod的所有可调度节点,对这些可调度节点打分,选出其中得分最高的节点来运行Pod,而后调度器将这个调度决定告诉给APIserver; 【5】APIserver实现信息存储后,而后告诉相应节点的Kubelet; 【6】Kubelet是基于PodSpec来工作的,确保这些PodSpec中形容的容器处于运行状态且运行状况良好,每个PodSpec是一个形容Pod的YAML或JSON对象; 【7】Pod是能够在Kubernetes中创立和治理的、最小的可部署的计算单元,包含一个或多个容器; 五、参考源码文档仓库:https://gitee.com/cicadasmile/butte-java-note脚本仓库:https://gitee.com/cicadasmile/butte-auto-parent

June 6, 2023 · 1 min · jiezi

关于kubernetes:GitOps-最佳实践下-基于-Amazon-EKS-构建-CICD-流水线

理解了 GitOps 的概念以及 CI/CD 流水线的架构,实现了构建 GitOps 格调的 CI/CD 流水线的前两局部,祝贺开发者们!咱们一起在 GitOps 最佳实际的路线上曾经实现了大半。接下来,咱们一起看看构建 CI/CD 流水线最佳实际的后两个局部: 通过 IaC 部署云基础架构在 Amazon EKS 集群上部署 Flux CD利用 Flux CD 部署 GitOps 工作流利用 GitOps 工作流实现基于镜像的主动部署亚马逊云科技开发者社区为开发者们提供寰球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、流动与比赛等。帮忙中国开发者对接世界最前沿技术,观点,和我的项目,并将中国优良开发者或技术举荐给寰球云社区。如果你还没有关注/珍藏,看到这里请肯定不要匆匆划过,点这里让它成为你的技术宝库!利用 Flux CD 部署 GitOps 工作流对于 GitOps CI/CD 实际下的 EKS 和运行其上的工作负载来说,EKS 集群和工作负载的配置批改和状态变更是源自于 Git 中代码的变动(通过 git push 或者 pull request 触发并实现最终交付,GitOps 举荐应用 pull request),而不再是传统的 CI/CD 流水线中由 CI 引擎所发动的应用 kubectl create/apply 或 helm install/upgrade 间接操作集群实现最终交付。因而咱们通过 GitOps 的形式,去简化传统的 CI/CD 流水线,构建更为高效和简洁的 GitOps 形式的 CI/CD 流水线。 最佳实际Flux 周期性拉取代码库中的利用配置和部署文件,比拟集群以后的利用负载运行状态是否和代码库中的文件所形容的冀望统一,当发现二者有差别时,Flux 会主动将差别同步至 EKS 集群,确保工作负载始终依照冀望状态运行。咱们通过具体的实际演示,来展现一个具体利用 sock shop 如何在以 GitOps 形式构建的 CI/CD 流水线上实现利用的继续集成和继续交付。 ...

June 5, 2023 · 4 min · jiezi

关于kubernetes:k8s-istio-集成-多版本应用服务-和-网格监测

阐明博客文章地址:https://blog.taoluyuan.com/posts/istio-getting-started/本次要是内容: 应用 istioctl 装置 istio采纳 istio 官网提供 的 利用bookinfo,实现多版本的服务利用部署istio 网关 gateway,vs,dr 的根本应用利用监测工具 prometheus,grafana,jaeger 查看 istio 的监控数据文章提到的yaml,也是istio官网提供的,整顿后独自放到github github k8s-istio-practice 根目录 makefile 集成了相干命令,你们能够间接通过 makefile 装置 service,gateway,vs,dr,监控,以实现跟文章一样的成果 istio官网文档:https://istio.io/latest/zh/docs/ 装置参考官网装置文档:官网demo配置组合装置文档 采纳 demo 配置组合,它蕴含了一组专为测试筹备的性能汇合 curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.2 sh - && \ cd istio-1.17.2 && \ export PATH=$PWD/bin:$PATH && \ istioctl install --set profile=demo给命名空间增加标签,批示 在 default命名空间 部署利用的时候,主动注入 Envoykubectl label namespace default istio-injection=enabled装置的istio相干资源在 istio-system 命名空间下,能够通过以下查看装置的资源 k get all -n istio-systembookinfo 应用程序bookinfo 架构及介绍bookinfo 由四个独自的微服务形成 ,以下是官网对bookinfo的介绍,也能够间接看官网文档 istio-bookinfo ...

June 4, 2023 · 3 min · jiezi

关于kubernetes:聊聊部署在K8S的项目如何获取客户端真实IP

前言最近部门有个需要,须要对一些客户端IP做白名单,在白名单范畴内,能力做一些业务操作。按咱们的部门的一贯做法,咱们会封装一个client包,提供给业务方应用。(注: 咱们的我的项目是运行在K8S上)本认为这是一个不是很难的性能,部门的小伙伴不到一天,就把性能实现了,他通过本地调试,能够获取到正确的客户端IP,然而公布到测试环境,发现获取到的客户端IP始终是节点的IP,前面那个小伙伴排查了很久,始终没脉络,就找到我帮忙始终排查一下。明天文章次要就是来复盘这个过程 排查过程首先先排查了一下他获取客户端IP的实现逻辑public class IpUtils { private static Logger logger = LoggerFactory.getLogger(IpUtils.class); private static final String IP_UTILS_FLAG = ","; private static final String UNKNOWN = "unknown"; private static final String LOCALHOST_IP = "0:0:0:0:0:0:0:1"; private static final String LOCALHOST_IP1 = "127.0.0.1"; /** * 获取IP地址 * */ public static String getIpAddr(HttpServletRequest request) { String ip = null; try { //以下两个获取在k8s中,将实在的客户端IP,放到了x-Original-Forwarded-For。而将WAF的回源地址放到了 x-Forwarded-For了。 ip = request.getHeader("X-Original-Forwarded-For"); System.out.println("X-Original-Forwarded-For:" + ip); if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("X-Forwarded-For"); } //获取nginx等代理的ip if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("x-forwarded-for"); System.out.println("x-forwarded-for:" + ip); } if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (StringUtils.isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } //兼容k8s集群获取ip if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); System.out.println("getRemoteAddr:" + ip); if (LOCALHOST_IP1.equalsIgnoreCase(ip) || LOCALHOST_IP.equalsIgnoreCase(ip)) { //依据网卡取本机配置的IP InetAddress iNet = null; try { iNet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { logger.error("getClientIp error: {}", e); } ip = iNet.getHostAddress(); } } } catch (Exception e) { logger.error("IPUtils ERROR ", e); } //应用代理,则获取第一个IP地址 if (!StringUtils.isEmpty(ip) && ip.indexOf(IP_UTILS_FLAG) > 0) { ip = ip.substring(0, ip.indexOf(IP_UTILS_FLAG)); } return ip; }}这逻辑看着貌似没问题,因为本地调试能够获取到正确的客户端IP,而测试环境获取不到,大概率是环境有问题。于是就把方向转为定位环境的差异性 ...

May 31, 2023 · 3 min · jiezi

关于kubernetes:收尾解读官方示例加深理解K8S群内POD访问API时是如何进行身份验证

写在开篇这几天有点忙,终于抽出工夫更新了,之前曾经通过这篇 《通过源码剖析通知你:当拜访K8S API的代码运行在POD里的容器时,在集群内是如何进行身份验证的》 搞清楚了在集群内如何进行身份验证。那么,官网还提供了一个简略的利用示例,链接:https://github.com/kubernetes/client-go/tree/master/examples/in-cluster-client-configuration 本篇的主题是解读一下这个示例。联合之前的常识储备并等本篇讲完后,就会很清晰的晓得集群内的POD拜访API时是如何进行身份验证的。下次就要回到这篇 《对于ServiceAccount以及在集群内拜访K8S API》 持续解说接下来的实战内容了,有没有发现兜了个圈又兜回来了。 示例代码剖析针对官网提供的示例,我做了点小革新。这段代码是一个应用Kubernetes Go客户端(client-go)的示例程序,用于获取Kubernetes集群中所有Pod的信息,并每隔10秒打印一次Pod的数量和POD名称。 package mainimport ( "context" "fmt" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest")func main() { config, err := rest.InClusterConfig() if err != nil {  panic(err.Error()) } clientset, err := kubernetes.NewForConfig(config) if err != nil {  panic(err.Error()) } for {  pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})  if err != nil {   panic(err.Error())  }  for _, pod := range pods.Items {   fmt.Printf("命名空间:%s POD名称:%s\n", pod.Namespace, pod.Name)  }  fmt.Printf("集群中有 %d 个 pod", len(pods.Items))  time.Sleep(10 * time.Second) }}须要留神的事件,看这段代码的InClusterConfig函数,记得上次对它剖析过: config, err := rest.InClusterConfig()if err != nil {        panic(err.Error())}这段代码应用rest.InClusterConfig()函数获取以后运行环境下的Kubernetes集群的配置。如果获取配置时产生谬误,通过panic抛出异样。 不信的话,编译后运行试试: [root@workhost in-cluster-client-configuration]# ./app panic: unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be definedgoroutine 1 [running]:main.main()        /root/project/gocode/src/in-cluster-client-configuration/main.go:17 +0x314报错了。要解决这个问题,就是要将这个应用程序在POD内运行。 提醒:报错的根本原因是因为这两个自定义变量是由K8S本身治理且定义在了POD里的容器内,只有将这个示例利用运行在POD里的容器能力正确加载自定义变量。编译应用程序[root@workhost src]# cd in-cluster-client-configuration/[root@workhost in-cluster-client-configuration]# go mod initgo: creating new go.mod: module in-cluster-client-configurationgo: to add module requirements and sums:        go mod tidy[root@workhost in-cluster-client-configuration]# go mod tidy[root@workhost in-cluster-client-configuration]# GOOS=linux go build -o ./app .GOOS=linux:这将GOOS环境变量设置为linux,示意专门为Linux构建应用程序。go build:这是Go语言的编译命令,用于编译Go源代码并生成可执行文件。-o ./app:这是一个选项,指定编译输入的可执行文件的名称和门路。在这个命令中,-o示意指定输入文件,./app示意输入文件的门路和名称为当前目录下的app。.:这是命令的最初一个参数,示意当前目录中的Go源代码文件。这通知编译器从当前目录中的所有Go源文件中构建应用程序。编译后: [root@workhost in-cluster-client-configuration]# ls -ltotal 43928-rwxr-xr-x. 1 root root 44919028 May 23 08:59 app # 编译后失去的可执行二进制文件-rw-r--r--. 1 root root       44 May 23 08:56 Dockerfile-rw-r--r--. 1 root root     1909 May 23 08:59 go.mod-rw-r--r--. 1 root root    47303 May 23 08:59 go.sum-rw-r--r--. 1 root root     1750 May 23 08:57 main.go 制作镜像Dockerfile内容: FROM debianCOPY ./app /appENTRYPOINT /app构建镜像和推送到公有仓库: docker build -t 192.168.11.254:8081/library/example-app:v1 .docker push 192.168.11.254:8081/library/example-app:v1在K8S运行[root@k8s-b-master ~]# kubectl run --rm -i example-pod --image=192.168.11.254:8081/library/example-app:v1pod "example-pod" deletederror: timed out waiting for the condition竟然超时了,没有获取到POD。官网示例中提到,如果在K8S集群上启用了RBAC,就须要创立角色绑定。就此看来是因为权限问题导致。那先确定一下k8s集群是否启用了RBAC: [root@k8s-b-master kubernetes]# kubectl api-versions | grep rbacrbac.authorization.k8s.io/v1[root@k8s-b-master kubernetes]# kubectl get roles,rolebindings --all-namespacesNAMESPACE     NAME                                                                            CREATED ATkube-public   role.rbac.authorization.k8s.io/kubeadm:bootstrap-signer-clusterinfo             2023-04-30T03:23:50Zkube-public   role.rbac.authorization.k8s.io/system:controller:bootstrap-signer               2023-04-30T03:23:48Zkube-system   role.rbac.authorization.k8s.io/extension-apiserver-authentication-reader        2023-04-30T03:23:48Z...这些输入提供了与RBAC受权相干的信息,包含可用的API版本以及集群中的角色和角色绑定配置,所以是启用了RBAC的。 留神:如果是应用kubeadm搭建的k8s集群,那么rbac默认都是启用的。如果是二进制搭建的,那就不肯定了,这将取决于您的配置和部署抉择。接下来,创立一个名为"default-view"的ClusterRoleBinding: kubectl create clusterrolebinding default-view --clusterrole=view --serviceaccount=default:defaultdefault-view:ClusterRoleBinding的名称。在这个例子中,ClusterRoleBinding将被命名为"default-view"。--clusterrole=view:选项,指定要绑定的ClusterRole。这里指定了"view" ClusterRole,它具备查看(view)集群资源的权限。ClusterRole是一组权限的汇合,能够授予用户、组或服务账号特定的权限。--serviceaccount=default:default:选项,指定要绑定到ClusterRole的ServiceAccount。这里指定了"default:default",示意将"default"命名空间下的"default" ServiceAccount与ClusterRole进行绑定。总之,这个命令将创立一个名为"default-view"的ClusterRoleBinding,将"default"命名空间下的"default" ServiceAccount与"view" ClusterRole进行绑定。这意味着"default" ServiceAccount将具备查看集群资源的权限。这能够用于授予特定的ServiceAccount对集群资源的只读拜访权限,而无需授予其余更高级的权限。创立完角色绑定后持续运行: [root@k8s-b-master ~]# kubectl run --rm -i example-pod --image=192.168.11.254:8081/library/example-app:v1If you don't see a command prompt, try pressing enter.命名空间:default POD名称:example-pod命名空间:default POD名称:goweb-7db674b88c-d544x命名空间:default POD名称:goweb-7db674b88c-j5hd6命名空间:default POD名称:goweb-7db674b88c-v2z5r命名空间:default POD名称:nginx命名空间:kube-system POD名称:calico-kube-controllers-567c56ff98-pb4dj命名空间:kube-system POD名称:calico-node-7kqhw命名空间:kube-system POD名称:calico-node-hbbs4命名空间:kube-system POD名称:calico-node-pngws命名空间:kube-system POD名称:calico-node-r8vp9命名空间:kube-system POD名称:calico-node-sfws4命名空间:kube-system POD名称:calico-node-skktr命名空间:kube-system POD名称:calico-node-wm2lt命名空间:kube-system POD名称:coredns-c676cc86f-lkw8r命名空间:kube-system POD名称:coredns-c676cc86f-ncnnn命名空间:kube-system POD名称:etcd-k8s-b-master命名空间:kube-system POD名称:kube-apiserver-k8s-b-master命名空间:kube-system POD名称:kube-controller-manager-k8s-b-master命名空间:kube-system POD名称:kube-proxy-8hw4f命名空间:kube-system POD名称:kube-proxy-9qsc8命名空间:kube-system POD名称:kube-proxy-b4vjj命名空间:kube-system POD名称:kube-proxy-d7lh9命名空间:kube-system POD名称:kube-proxy-nmdxd命名空间:kube-system POD名称:kube-proxy-ql2kf命名空间:kube-system POD名称:kube-proxy-stfff命名空间:kube-system POD名称:kube-scheduler-k8s-b-master集群中有 26 个 pod命名空间:default POD名称:example-pod命名空间:default POD名称:goweb-7db674b88c-d544x命名空间:default POD名称:goweb-7db674b88c-j5hd6命名空间:default POD名称:goweb-7db674b88c-v2z5r命名空间:default POD名称:nginx命名空间:kube-system POD名称:calico-kube-controllers-567c56ff98-pb4dj命名空间:kube-system POD名称:calico-node-7kqhw命名空间:kube-system POD名称:calico-node-hbbs4命名空间:kube-system POD名称:calico-node-pngws命名空间:kube-system POD名称:calico-node-r8vp9命名空间:kube-system POD名称:calico-node-sfws4命名空间:kube-system POD名称:calico-node-skktr命名空间:kube-system POD名称:calico-node-wm2lt命名空间:kube-system POD名称:coredns-c676cc86f-lkw8r命名空间:kube-system POD名称:coredns-c676cc86f-ncnnn命名空间:kube-system POD名称:etcd-k8s-b-master命名空间:kube-system POD名称:kube-apiserver-k8s-b-master命名空间:kube-system POD名称:kube-controller-manager-k8s-b-master命名空间:kube-system POD名称:kube-proxy-8hw4f命名空间:kube-system POD名称:kube-proxy-9qsc8命名空间:kube-system POD名称:kube-proxy-b4vjj命名空间:kube-system POD名称:kube-proxy-d7lh9命名空间:kube-system POD名称:kube-proxy-nmdxd命名空间:kube-system POD名称:kube-proxy-ql2kf命名空间:kube-system POD名称:kube-proxy-stfff命名空间:kube-system POD名称:kube-scheduler-k8s-b-master集群中有 26 个 pod命名空间:default POD名称:example-pod命名空间:default POD名称:goweb-7db674b88c-d544x命名空间:default POD名称:goweb-7db674b88c-j5hd6命名空间:default POD名称:goweb-7db674b88c-v2z5r命名空间:default POD名称:nginx命名空间:kube-system POD名称:calico-kube-controllers-567c56ff98-pb4dj命名空间:kube-system POD名称:calico-node-7kqhw命名空间:kube-system POD名称:calico-node-hbbs4命名空间:kube-system POD名称:calico-node-pngws命名空间:kube-system POD名称:calico-node-r8vp9命名空间:kube-system POD名称:calico-node-sfws4命名空间:kube-system POD名称:calico-node-skktr命名空间:kube-system POD名称:calico-node-wm2lt命名空间:kube-system POD名称:coredns-c676cc86f-lkw8r命名空间:kube-system POD名称:coredns-c676cc86f-ncnnn命名空间:kube-system POD名称:etcd-k8s-b-master命名空间:kube-system POD名称:kube-apiserver-k8s-b-master命名空间:kube-system POD名称:kube-controller-manager-k8s-b-master命名空间:kube-system POD名称:kube-proxy-8hw4f命名空间:kube-system POD名称:kube-proxy-9qsc8命名空间:kube-system POD名称:kube-proxy-b4vjj命名空间:kube-system POD名称:kube-proxy-d7lh9命名空间:kube-system POD名称:kube-proxy-nmdxd命名空间:kube-system POD名称:kube-proxy-ql2kf命名空间:kube-system POD名称:kube-proxy-stfff命名空间:kube-system POD名称:kube-scheduler-k8s-b-master集群中有 26 个 pod.........本文转载于WX公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/N3ArZ-T62yUZClf2UN5Qrg

May 31, 2023 · 1 min · jiezi

关于kubernetes:Java微服务云原生想法

当初越来越多人在探讨云原生,也就是应用Kubernetes作为部署架构,齐全抽离IASS。其实Java跟云原生并不是这么搭配的,至多Spring Cloud跟Kubernetes 不合的,有很多性能反复的。 Spring Cloud的服务发现、配置核心、负载平衡、网关这些都能够在Kubernetes找到代替。我在想如果齐全应用Kubernetes构造来解决分布式系统连贯、发现、配置问题,剩下的服务器如同只有一个Spring Boot而已,不须要引入太多组件了。 简略构建两个微服务、让后将服务发现、注册核心这些组件通通摈弃,去应用Kubernetes去实现代替成果。应用pod 探针去检测微服务存过成果,齐全是没有任何问题的。配置核心能够通过ConfigMap的卷挂载达到相似的成果,服务间的Fegin拜访,能够不依赖服务发现进行,通过配置文件设定服务拜访地址,拜访地址再由Service进行保护,就能够达到屏蔽服务之间IP变动。其实很多人都很不屑为了这一点点性能,毁坏整个残缺Spring Cloud体系,然而我想的是,要Java往云原生倒退,必须缓缓进行扭转才行的,至多当初不能齐全转向,质变促成量变。在云原生时代,对每一个服务有更高须要,更小的软件制品、更快的启动速度、更快执行速度,这些都要求在开发时尽量将每一个微服务技术依赖管制在一个可能小的范畴。我的想法能不依赖就不依赖。缩小微服务的技术依赖也有利于开发更容易参加进来,上面就能够口头吧。 我的项目编码我的项目依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.3.RELEASE</version> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> <finalName>${artifactId}</finalName> </build>上面只展现局部代码、feign客户端连贯另一个服务 @FeignClient(name = "author",url = "${app.author.remote}")public interface AuthorFeign { @GetMapping("/author/getOne") AuthorDTO getOne();}controller调用feign接口 @RestController@RequestMapping("book")public class BookController { @Autowired private AuthorFeign authorFeign; @GetMapping("getOne") public Book getOne(){ Book book = new Book(); return book; } @GetMapping("getAuthor") public AuthorDTO getAuthor(){ return authorFeign.getOne(); }}application.yml配置文件 ...

May 28, 2023 · 1 min · jiezi

关于kubernetes:5000-字手把手实战|Kubernetes极狐GitLab-CI获得极致-CICD-体验

本文来自:极狐GitLab 开发者社区作者:KaliArch微服务是一种以业务性能为主的服务设计概念,每一个服务都具备自主运行的业务性能,对外开放不受语言限度的 API,应用程序则是由一个或多个微服务组成。 在微服务架构中,不可变的基础设施和容器的自蕴含环境,使公布变得更加简略快捷,不必再思考如何依据不同我的项目辨别 Runner 环境;能够随时拉起一个 Pod 来运行咱们的 Job,运行实现后立刻销毁,不仅能实现动静运行节俭资源,而且不必放心多我的项目多任务并发构建问题。 本文分享如何利用极狐GitLab CI 将利用公布进 K8s,实用于以下场景和人群: 业务容器微服务化,或半微服务化;有明确流程标准,上线部署标准及明确可循的规范;谋求极致继续集成/继续交付体验的 GitOps 追崇者;具备 K8s 运维能力的运维人员。极狐GitLab CI + K8s 架构解析本文以构建一个 Java 软件我的项目并将其部署到阿里云容器服务 K8s 集群中为例,阐明如何应用极狐GitLab CI 在阿里云 K8s 服务上运行极狐GitLab Runner、配置 K8s 类型的 Executor,并执行 Pipeline。 极狐GitLab CI 流程图 流程详解如上图为一个简略的极狐GitLab CI 部署进 K8s 流程图,同之前咱们讲到的 CI 集成统一,只须要我的项目中存在 .gitlab-ci.yml 文件即可。 与之前的差别是,在集成 Kubernetes 时,gitlab-runner 运行在 K8s 内,其为一个 Pod 模式运行,管制着后续的 Pipeline 中各 Stage 执行。 能够看到,当一个 Pipeline 有多个 Stage,每个 Stage 都有一个独自的 Pod 去执行,这个 Pod 应用的镜像在 CI 的.gitlab-ci.yml 的每个 Stage 的 Image 中定义,如下所示为部署 Java 我的项目的流程: ...

May 26, 2023 · 3 min · jiezi

关于kubernetes:关于ServiceAccount以及在集群内访问K8S-API

写在开篇在之前的两篇文章中提到,有4种形式应用 ConfigMap 配置 Pod 中的容器,对于之前的两篇可参考: 《一文理解K8S的ConfigMap》《下篇1:将 ConfigMap 中的键值对作为容器的环境变量》本篇的实战场景就以拜访API的形式读取 ConfigMap,也就是编写代码在 Pod 中运行,而后应用 K8S API 来读取 ConfigMap的内容。然而,这个场景波及到服务账号、K8S集群内身份验证的相干知识点。为了管制篇幅(次要是文章太长,放心没人看到最初),打算再拆分两篇。本篇尽力先把波及到的知识点搞清楚,下一篇再真正进入实战环节,例如写代码,制作镜像等等。 其实,这个实战场景,也刚好补救了在之前分享过的 下篇(开始写代码):运维开发人员不得不看的K8S API实战》 中短少的 “集群内进行身份验证” 的内容。在持续之前,如果对K8S API的应用套路还无所不知,可联合参考: 《上篇:运维人员不得不看的K8S API入门实战,醉生梦死整顿得又臭又长,有人看吗?》《下篇(开始写代码):运维开发人员不得不看的K8S API实战》K8S的账号类型在K8S中,次要有两种账号类型: User Accounts(用户账号):用户账号用于标识和验证 Kubernetes 集群的用户。用户账号通常由集群管理员创立,并与相应的身份验证凭据(如用户名和明码、令牌等)关联。用户账号用于进行集群治理操作,如创立、删除和更新资源,以及拜访集群中的敏感信息。Service Accounts(服务账号):服务账号是用于身份验证和受权 Pod 内的应用程序的一种机制。每个 Pod 都能够与一个 Service Account 相关联,并应用该 Service Account 进行与 Kubernetes API Server 的通信。服务账号通常用于在 Pod 内的应用程序与集群中的其余资源进行交互,如读取 ConfigMap、拜访 Secrets 等。更多信息可参考官网文档:authentication对于ServiceAccount和在K8S集群内身份验证上次的实战场景 《下篇(开始写代码):运维开发人员不得不看的K8S API实战》 次要是在K8S集群外进行身份验证,因为调用K8S API的代码是运行在集群内部。而这次的场景是:调用K8S API的代码运行在POD容器里,也就是要在K8S集群外部进行身份验证。 当调用K8S API的代码(利用程序代码)运行在POD里的容器时,Pod中的应用程序能够应用其关联的 ServiceAccount 去拜访 API Server 中的 Kubernetes 资源(比方拜访ConfigMap资源)。在拜访资源时,ServiceAccount 会应用其所调配的 RBAC 角色来确定它有哪些权限。为了不便了解,我简略画了个图,如下: 身份认证:应用程序能够应用与之关联的 ServiceAccount 进行身份认证,以证实其对 Kubernetes 集群中的资源的非法拜访权限。拜访受权:通过与拜访控制策略(如 Role、ClusterRole)联合应用,能够为 ServiceAccount 调配特定的角色和权限,从而限度应用程序对资源的拜访范畴和操作权限。对于ServiceAccount的更多信息可参考官网文档:service-accounts对于每个命名空间下默认的服务账号:default官网文档提到:默认服务账户是Kubernetes在创立集群时主动为每个命名空间创立的一个ServiceAccount对象。每个命名空间中的服务账户默认状况下没有任何权限,除非启用了基于角色的访问控制(RBAC),此时Kubernetes会授予所有通过身份验证的主体默认的API发现权限。如果在一个命名空间中删除了ServiceAccount对象,管制立体会主动替换为一个新的ServiceAccount对象。如果在一个命名空间中部署一个Pod,并且没有手动为Pod调配一个ServiceAccount,Kubernetes会将该命名空间的默认ServiceAccount调配给该Pod。接下来,查看一下默认命名空间(default)下的serviceaccount: ...

May 26, 2023 · 1 min · jiezi

关于kubernetes:下篇1将-ConfigMap-中的键值对作为容器的环境变量

写在开篇持续接上篇,《一文理解K8S的ConfigMap》。上篇聊过,官网文档中提到的能够应用上面4种形式来应用 ConfigMap 配置 Pod 中的容器: 容器的环境变量:能够将 ConfigMap 中的键值对作为容器的环境变量。在只读卷外面增加一个文件,让利用来读取:能够将 ConfigMap 中的内容作为一个只读卷挂载到 Pod 中的容器外部,而后在容器内读取挂载的文件。编写代码在 Pod 中运行,应用 Kubernetes API 来读取 ConfigMap:能够在 Pod 中运行自定义代码,应用 Kubernetes API 来读取 ConfigMap 中的内容。在容器命令和参数内:能够在容器的启动命令中通过援用环境变量的形式来应用 ConfigMap。为了管制篇幅,打算分4篇进行分享,本篇分享以应用“容器的环境变量”的形式进行实战。 对于应用ConfigMap的更多详情,可参考官网文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/confi...开发示例利用goweb我的项目目录构造<!----> [root@workhost goweb]# tree.├── Dockerfile├── go.mod├── main.go├── README.md└── static    └── login.htmlmain.go<!----> package mainimport (        "fmt"        "log"        "net/http"        "os"        "text/template")type Message struct {        Msg string}func home(w http.ResponseWriter, r *http.Request) {        if r.Method == "GET" {                w.Header().Set("Location", "/login")                w.WriteHeader(http.StatusFound)        }}func login(w http.ResponseWriter, r *http.Request) {        t, _ := template.ParseFiles("./static/login.html")        if r.Method == "GET" {                t.Execute(w, nil)        }}func main() {        http.HandleFunc("/", home)        http.HandleFunc("/login", login)        args := os.Args        if args[1] == "-p" {                port := args[2]                listenAddr := fmt.Sprintf(":%v", port)                log.Println("ListenAndserve", listenAddr)                err := http.ListenAndServe(listenAddr, nil)                if err != nil {                        log.Println(err)                }        }}本次代码在上次的根底上做了点小革新:接受命令行参数,应用 os.Args 获取程序运行时的参数。如果传入的参数中蕴含 -p,则阐明须要指定监听的端口,将端口值读取进去并应用 http.ListenAndServe 启动 HTTP 服务。login.html<!----> <!DOCTYPE html><html>  <head>    <meta charset="UTF-8">    <title>Login K8S</title>    <style>      body {        background-color: #f2f2f2;        font-family: Arial, sans-serif;      }      #login-box {        background-color: #fff;        border-radius: 5px;        box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);        margin: 100px auto;        max-width: 400px;        padding: 20px;      }      h1 {        font-size: 24px;        margin: 0 0 20px;        text-align: center;      }      label {        display: block;        font-size: 14px;        font-weight: bold;        margin-bottom: 5px;      }      input[type="text"],      input[type="password"] {        border-radius: 3px;        border: 1px solid #ccc;        box-sizing: border-box;        font-size: 14px;        padding: 10px;        width: 100%;      }      input[type="submit"] {        background-color: #007bff;        border: none;        border-radius: 3px;        color: #fff;        cursor: pointer;        font-size: 14px;        padding: 10px;        width: 100%;      }      input[type="submit"]:hover {        background-color: #0069d9;      }      .error-message {        color: #dc3545;        font-size: 14px;        margin: 10px 0;        text-align: center;      }    </style>  </head>  <body>    <div id="login-box">      <h1>容器云治理平台</h1>      <form>        <label for="username">账号:</label>        <input type="text" id="username" name="username">        <label for="password">明码:</label>        <input type="password" id="password" name="password">        <input type="submit" value="登录">      </form>      <div class="error-message"></div>    </div>    <script>      const form = document.querySelector('form');      const errorMessage = document.querySelector('.error-message');      form.addEventListener('submit', function(event) {        event.preventDefault();        const username = document.getElementById('username').value;        const password = document.getElementById('password').value;        if (username === '' || password === '') {          errorMessage.textContent = 'Please enter a username and password.';        } else if (username !== 'admin' || password !== 'password') {          errorMessage.textContent = 'Incorrect username or password.';        } else {          alert('Login successful!');        }      });    </script>  </body></html>实战:以应用“容器的环境变量”的形式制作镜像编写Dockerfile: FROM alpine:latestWORKDIR /appCOPY static /app/staticCOPY main /appENV PORT 80 # 设置默认端口号为80,这个值将在容器启动时被笼罩CMD ["/bin/sh", "-c", "./main -p $PORT"]构建镜像和推送到公有harbor: docker build -t 192.168.11.254:8081/webdemo/goweb:20230515v2 .docker push 192.168.11.254:8081/webdemo/goweb:20230515v2测试<!----> [root@workhost goweb]# docker run --rm -it -p 80:9090 -e PORT=9090 192.168.11.254:8081/webdemo/goweb:20230515v22023/05/15 02:08:43 ListenAndserve :9090应用 -p 参数将本地主机的 80 端口映射到容器外部的 9090 端口,应用 -e 参数设置环境变量 PORT 的值为 9090,能够失常启动,阐明在启动时曾经笼罩掉了默认端口80,且能失常拜访: 创立configmap<!----> kubectl create configmap goweb --from-literal=port=9091执行命令后将会创立一个名为 goweb 的 ConfigMap,其中蕴含一个名为 port 的键,值为 9091。这样,在 Pod 中应用 &dollar;PORT 环境变量时,就能够将其设置为 9091。 阐明:--from-literal=port=9091 示意要将 port 这个键的值设置为 9091,这里应用 --from-literal 标记示意将文本作为字面量值创立 ConfigMap。创立pod<!----> ...

May 26, 2023 · 1 min · jiezi

关于kubernetes:Kubernetesk8s最大启动时长研究

一、前言利用部署在 Kubernetes(k8s)上,有些利用启动慢一些,没启动好 就又被 k8s 重启了 二、处理过程1. 看日志[2023-05-23 14:38:52.249]|-INFO |-[background-preinit]|-o.h.v.i.u.Version[0]|-[TID: N/A]|-HV000001: Hibernate Validator 6.1.7.Final[2023-05-23 14:40:11.817]|-INFO |-...2023-05-23 14:40:22 登录主机: aaaa失败!起因:Failed to upgrade to websocket: Unexpected HTTP Response Status Code: 500 Internal Server Error2. 看探针配置 livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 60001 timeoutSeconds: 13. 剖析刚开始认为 80秒左右(14:38:52.249 到 14:40:11.817),利用被重启了发现和 探针配置的不一样,initialDelaySeconds + periodSeconds * failureThreshold = 60秒而后发现最终完结工夫应该是 14:40:22 登录主机: aaaa失败,就是 90秒左右最初发现还有个 terminationGracePeriodSeconds: 30,加上探针 60秒,刚好 90秒左右。至此终于 上不着天;下不着地倡议运维把 initialDelaySeconds 改为 60 当前,胜利启动三、总结最长重启工夫:initialDelaySeconds + (periodSeconds + timeoutSeconds) * failureThreshold + terminationGracePeriodSeconds(默认30秒)倡议 适当调大 initialDelaySeconds(如 60)、failureThreshold(如 6)、periodSeconds(如 20),总之依据下面的公式计算的时长 要大于 理论启动时长(如 本地测试)配置存活、就绪和启动探针 | Kubernetes本文首先公布于 https://www.890808.xyz/ ,其余平台须要审核更新慢一些。 ...

May 23, 2023 · 1 min · jiezi

关于kubernetes:KubeVela-为-CNCF-孵化器带来软件交付控制平面能力

CNCF TOC(Technical Oversight Committee,技术监督委员会)曾经投票承受 KubeVela 作为 CNCF 的孵化我的项目。KubeVela[1]是一个利用交付引擎,也是基于 Kubernetes 的扩大插件,它能够让你的利用交付在当今风行的混合、多云环境中变得更加简略、高效、牢靠。KubeVela 能够通过基于工作流的利用交付模型来编排、部署和操作工作负载和云资源。KubeVela 的利用交付形象由 OAM[2](Open Application Model,凋谢利用模型)提供反对。 残缺内容请点击下方链接查看: https://developer.aliyun.com/article/1174540?utm_content=g_10... 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

May 23, 2023 · 1 min · jiezi

关于kubernetes:基于-Kubernetes-的企业级大数据平台EMR-on-ACK-技术初探

云上大数据的 Kubernetes 技术路线以后,大数据与机器学习畛域颇为关注存储与计算拆散架构,逐步向云原生演进。以Spark 为例,云下或自有服务器能够抉择 Hadoop 调度反对 Spark,云上的 Spark 则会思考如何充沛享有公共云的弹性资源、运维管控和存储服务等,并且业界也涌现了不少 Spark on Kubernetes 的优良实际。 残缺内容请点击下方链接查看: https://developer.aliyun.com/article/1154919?utm_content=g_10... 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

May 19, 2023 · 1 min · jiezi

关于kubernetes:为什么Kubernetes已经成为程序员必备技能

本文首发自「慕课网」(imooc.com),想理解更多IT干货内容,程序员圈内热闻,欢送关注"慕课网"及“慕课网公众号”! 作者:一凡|慕课网讲师 为什么Kubernetes曾经成为程序员必备技能 DevOps这个词语置信小伙伴们并不生疏,Dev即软件开发人员,Ops即IT运维人员,随着自动化技术的倒退,Dev与Ops的界线将越来与含糊,这也意味着开发与运维的扯皮的时代曾经成为过来式,豪不夸大的说,开发人员兼职做运维人员的工作,曾经在悄悄进行。 于此同时,自动化技术+K8S,能够将开发、运维、编排、监控等对立集成,所以能够必定的说,如果你是开发人员,不论是Java、Python、Golang或其余语言,能够不精通K8S,然而至多须要把握K8S的编排、基本概念。如果能更加深刻的理解K8S工作原理,实打实的用K8S为企业解决所面临服务部署问题,我置信肯定会让你在企业傲视群雄。 为什么K8S这么牛,我将从如下7个方面来具体论述: 自动化部署和扩大跨平台反对高可用性:简化开发流程容器编排资源利用率社区反对自动化部署和扩大 K8S 的自动化部署和扩大是其最重要的个性之一,它能够帮忙开发人员更快地将应用程序推向市场。上面是 K8S 自动化部署和扩大的具体介绍: 自动化部署:K8S 能够自动化地部署应用程序,无需手动染指。开发人员只须要将应用程序的镜像上传到 K8S 集群中,K8S 就会主动将镜像部署到容器中,并启动容器。这大大减少了开发人员的累赘,使得开发流程更加高效。自动化扩大:K8S 能够自动化地扩大应用程序,无需手动染指。当应用程序的负载减少时,K8S 能够主动地创立新的容器实例,并将负载平衡到这些实例上。当负载缩小时,K8S 也能够主动地缩减容器实例,以节俭资源。这样,开发人员就不须要手动进行容器的扩大和缩减,K8S 能够依据理论负载主动进行调整,进步了应用程序的可用性和性能。自动化治理:K8S 能够自动化地管理应用程序,包含容器的配置、监控、日志收集和故障排除等。开发人员只须要定义应用程序的配置文件,K8S 就能够主动地将配置文件利用到容器中,并进行监控和日志收集。当容器呈现故障时,K8S 也能够主动地进行故障排除,以确保应用程序的可用性和稳定性。 总之,K8S 的自动化部署和扩大能够帮忙开发人员更快地将应用程序推向市场,同时也能够进步应用程序的可用性和性能。跨平台反对 Kubernetes(K8S)是一个跨平台的容器编排工具,它能够在不同的云平台、物理服务器和虚拟机上运行。上面是 K8S 跨平台反对的具体介绍: 云平台反对:K8S 能够在各种云平台上运行,包含 AWS、Azure、Google Cloud Platform、IBM Cloud、阿里云、腾讯云等等。这些云平台都提供了 K8S 的托管服务,开发人员能够通过这些服务疾速地部署和管理应用程序。物理服务器反对:K8S 能够在物理服务器上运行,无论是在本地数据中心还是在近程数据中心。开发人员能够应用 K8S 将应用程序部署到物理服务器上,并进行自动化治理和扩大。虚拟机反对:K8S 能够在各种虚拟机上运行,包含 VMware、VirtualBox、KVM、Hyper-V 等等。开发人员能够应用 K8S 将应用程序部署到虚拟机上,并进行自动化治理和扩大。跨平台兼容性:K8S 能够与各种容器技术兼容,包含 Docker、rkt、CRI-O 等等。开发人员能够应用任何一种容器技术来构建应用程序镜像,而后应用 K8S 将镜像部署到容器中,并进行自动化治理和扩大。 总之,K8S 的跨平台反对使得应用程序能够更加灵便地部署和治理,开发人员能够抉择任何一种云平台、物理服务器、虚拟机和容器技术来构建和部署应用程序。同时,K8S 的跨平台兼容性也使得开发人员能够更加自在地抉择容器技术,以满足不同的业务需要。高可用性: Kubernetes(K8s)是一个开源的容器编排平台,它能够自动化地部署、扩大和治理容器化应用程序。为了确保K8s自身的高可用性,K8s提供了以下几种机制: Master节点高可用:K8s的Master节点是管制整个集群的核心节点,如果Master节点呈现故障,整个集群将无奈失常工作。为了确保Master节点的高可用性,K8s提供了多Master节点的部署形式,能够通过etcd等分布式存储来实现Master节点之间的数据同步和故障转移。Node节点高可用:K8s的Node节点是运行容器的工作节点,如果Node节点呈现故障,容器将无奈失常运行。为了确保Node节点的高可用性,K8s提供了多Node节点的部署形式,能够通过Pod的调度机制来实现容器的主动迁徙和故障转移。滚动降级和回滚:K8s能够自动化地进行滚动降级和回滚操作。当须要降级应用程序或K8s自身时,K8s会主动将新版本的应用程序或K8s组件部署到集群中,并逐渐替换旧版本。如果呈现问题,K8s能够主动回滚到旧版本。自动化监控和故障检测:K8s能够自动化地监控集群中各个节点和容器的运行状态,并进行故障检测。如果发现节点或容器呈现故障,K8s会主动进行故障转移或重启操作,保障应用程序的高可用性。 综上所述,K8s提供了多种机制来确保本身的高可用性,包含Master节点高可用、Node节点高可用、滚动降级和回滚、自动化监控和故障检测等。这些机制能够保障K8s自身的稳定性和可靠性,从而进步应用程序的高可用性。简化开发流程 K8S能够自动化地解决应用程序的部署、配置和治理,缩小了开发人员的累赘,使得开发流程更加高效。Kubernetes(K8s)是一个开源的容器编排平台,它能够自动化地部署、扩大和治理容器化应用程序。K8s能够简化开发流程,次要体现在以下几个方面: 自动化部署:K8s能够自动化地部署容器化应用程序,开发人员只须要将应用程序打包成容器镜像,而后通过K8s的API进行部署即可。K8s能够依据应用程序的需要主动抉择最合适的节点进行部署,还能够实现滚动降级和回滚等性能。 2. 资源调度:K8s能够依据应用程序的资源需要主动调度容器,确保每个容器都可能取得足够的资源。开发人员不须要手动治理容器的资源,K8s会主动为容器分配资源,并确保应用程序的稳定性和可靠性。服务发现和负载平衡:K8s能够自动化地管理应用程序的服务发现和负载平衡。开发人员只须要定义服务,K8s就会主动创立负载均衡器,并将申请路由到正确的容器上。这样能够大大简化开发人员的工作,并进步应用程序的可靠性和性能。自动化监控和日志治理:K8s能够自动化地监控容器的运行状态,并将日志集中管理。开发人员只须要通过K8s的API查问容器的状态和日志即可,无需手动登录到每个容器进行查看。 综上所述,K8s能够简化开发流程,进步开发人员的效率和应用程序的可靠性。开发人员只须要关注应用程序的开发和测试,K8s会自动化地解决部署、调度、服务发现、负载平衡、监控和日志治理等工作。容器编排 K8S能够对容器进行编排,使得容器能够更加不便地治理和部署,同时也能够更加容易地进行故障排除。Kubernetes(K8s)是一个开源的容器编排平台,它能够自动化地部署、扩大和治理容器化应用程序。K8s的容器编排性能次要包含以下几个方面: 自动化部署:K8s能够自动化地部署容器化应用程序。开发人员只须要将应用程序打包成容器镜像,而后通过K8s的API进行部署即可。K8s能够依据应用程序的需要主动抉择最合适的节点进行部署,还能够实现滚动降级和回滚等性能。 2. 资源调度:K8s能够依据应用程序的资源需要主动调度容器,确保每个容器都可能取得足够的资源。K8s能够依据容器的CPU、内存、存储等资源需要进行调度,还能够进行负载平衡和故障转移等操作。服务发现和负载平衡:K8s能够自动化地管理应用程序的服务发现和负载平衡。开发人员只须要定义服务,K8s就会主动创立负载均衡器,并将申请路由到正确的容器上。这样能够大大简化开发人员的工作,并进步应用程序的可靠性和性能。自动化监控和日志治理:K8s能够自动化地监控容器的运行状态,并将日志集中管理。开发人员只须要通过K8s的API查问容器的状态和日志即可,无需手动登录到每个容器进行查看。自动化扩大:K8s能够依据应用程序的负载主动扩大容器。开发人员只须要定义扩大策略,K8s就会依据负载状况主动扩大或缩减容器的数量,保障应用程序的性能和可靠性。 综上所述,K8s的容器编排性能能够大大简化容器化应用程序的部署、调度、服务发现、负载平衡、监控和日志治理等工作,进步应用程序的可靠性和性能。资源利用率 K8S能够更好地治理资源,包含CPU、内存和存储等,能够无效地进步资源的利用率。 Kubernetes Dashboard:Kubernetes官网提供的Web UI,可用于查看集群中各个节点、Pod、容器等资源的应用状况,包含CPU、内存、网络等指标。 2. Prometheus:一款开源的监控零碎,可用于监控Kubernetes集群中各个节点、Pod、容器等资源的应用状况,并提供丰盛的数据可视化和告警性能。Heapster:Kubernetes官网提供的资源监控工具,可用于监控集群中各个节点、Pod、容器等资源的应用状况,并提供数据可视化和告警性能。Grafana:一款开源的数据可视化工具,可与Prometheus集成,用于展现Kubernetes集群中各个节点、Pod、容器等资源的应用状况。cAdvisor:一款开源的容器资源监控工具,可用于监控容器的CPU、内存、磁盘、网络等指标,并提供数据可视化和告警性能。 总之,K8S资源监控是保障Kubernetes集群稳固运行的重要伎俩,通过以上工具能够及时发现和解决问题,进步集群的可用性和性能。社区反对 ...

May 16, 2023 · 1 min · jiezi

关于kubernetes:KubeCon-EU-2023-落幕哪些技术趋势值得关注

KubeCon+CloudNativeCon 是云原生畛域的技术盛会,上个月月末,在荷兰阿姆斯特丹举办的欧洲 KubeCon+CloudNativeCon 刚刚落下帷幕,此次大会吸引了10000多名参会者以及200多家企业,其中58%的参会者是首次参会。这不仅反映了云原生畛域在蓬勃发展,也体现出 Kubernetes 社区仍在急速扩充。  本文将整顿来自出名厂商、技术媒体的观点,带你一探以后云原生畛域的技术发展趋势。  平台工程势头迅猛,再度成为大会热门话题考察显示,Kubernetes 的复杂性、安全性和技术缺口是企业在采纳 Kubernetes 时面临的首要挑战。KubeCon EU 2023的主题演讲中指出了须要器重的三个“复杂性”: 在寰球平台范畴内治理配置的复杂性苦楚的Kubernetes降级多集群治理 以后呈现了各种技术和工具来简化 Kubernetes 治理。从 DevOps 团队的肩上卸下解决 Kubernetes 复杂性成为急切的需要,这使得平台工程成为业界热门趋势。  自从2022年11月在北美 KubeCon 大会上作为热门话题呈现以来,平台工程的发展势头继续减速。始终关注这一趋势的 Intellix 分析师 Jason Bloomberg 在承受 The Cube 采访时指出,平台工程是2023年 KubeCon 欧洲大会的要害主题之一。  Deepak Goel,D2iQ CTO,在采访中分享了他对平台工程的认识:“当不是 Kubernetes 专家的 DevOps 团队负责部署和保护 Kubernetes 环境时,会呈现效率低下的状况。” 而平台工程的呈现不仅打消了部署和治理 Kubernetes 的复杂性,还缓解了许多组织中云和集群无序扩张的问题。  理解更多:https://www.cncf.io/blog/2023/05/08/kubecon-europe-2023-highl... 在一场对于平台工程的圆桌探讨中,Stu Miniman,红帽混合平台市场总监,认为“开发人员之所以须要承受平台工程,它可能缩小软件开发过程中的认知过载”。加入这场圆桌探讨的还有来自 HaschiCorp 的EMEA地区 CTO、GitLab的CPO等业界大咖,他们统一认为平台工程是一种实际,而因为市场因素的变动,为了放弃企业竞争力过来的办法曾经行不通,此刻企业须要拥抱平台工程。  理解更多:https://thenewstack.io/kubecon-panel-how-platform-engineering...  开源应答气候变化本届大会为可继续倒退和气象相干的开源我的项目提供了短缺的展现空间,遏制碳排放、节约能源成为本届大会的重要话题。开源模式依赖于合作和团队奉献,这与应答气候变化的办法有殊途同归之处:没有一个人能独自对气象危机负责,只有个体共同努力能力有所作为。  应用 GreenCourier 的可继续无服务器计算慕尼黑工业大学的副研究员 Mohak Chadha 在他的演讲 《GreenCourier:实现可继续的无服务器计算》中探讨了如何在提供无服务器性能的同时缩小碳节约。   Chadha 在演讲中解释说,因为必要的高层级形象,无服务器计算会耗费大量的能源。他说,与传统的HTTP服务器相比,仅虚拟化开销就能够减少15倍以上的能源消耗。   GreenCourier 是一个 Kubernetes 调度框架插件,它为散布在各地的集群调度无服务器性能,以尽量减少运行性能时的碳排放。为了做到这一点,它依据碳效率为集群调度无服务器性能。Chadha 的钻研发现,与默认策略相比,GreenCourier 将 Kubernetes 每次函数调用的碳排放量缩小了8.7%。  ...

May 15, 2023 · 1 min · jiezi

关于kubernetes:对运维这份职业的一些反思

1. 逼本人看官网文档肯定要逼本人看官网文档,只有官网文档才是一手材料,只有吃透官网文档,能力不被各种搜索引擎、各种博客文章而乱了你的阵脚。因为,你的环境未必和他们一样,你所短少的依赖也未必和他们一样。或者,好好看看官网文档里的某些先决条件,你就能大彻大悟,只有吃透官网文档,能力不被牵着鼻子走,这就跟买通了任督二脉没什么区别。 有没有想过,培训机构里搞培训的、某些利用闲暇工夫录制视频挣外快的,人家又是怎么学习的?人家就怎么晓得某个组件、某个模块的最新个性、先决条件、某个参数能够设定哪些值的?其实,人家也是从透官网文档里消化完,再输入呀,再挣你这个小白的钱呀。或者,程度低一点的,也有可能是各种搜索引擎、各种博客文章收集过去,整合一下,再从新包装成全套教程上市。当然了,这种是坑最多的,说不定你跟着做试验连环境都搞不起来。 不必去管人家的形式,总而言之,言而总之,你就是要逼本人硬吃官网文档、把握一手材料,只有这样晋升才是最快的、最长久的。也说不定,能够消化完再输入成文章、视频,挣点小钱也是大有可能。 2. 带着业务思维干运维建设的任何IT架构和利用,包含本人所需把握的技能,这所有的所有,都是为了撑持业务而存在。不懂和不了解业务,技术再好都有可能惹上背锅的危险。什么?技术好还会有背锅的危险?必定啊!技术好的人都自信、胆子大,走的快,进去的也快。 对于人家公司来说,技术素来就不感觉是问题,能够买好的产品,能够挖技术好的人。技术是外围吗?不是,或者以前是,但当初不是。还真别说,可能技术好的那个人也在就业的路上了。所以,最外围的就是实实在在能挣钱盈利来养活人的业务,运维人员肯定要理解业务的运作形式、要害业务指标、外围业务流程等等,带着业务思维去把运维工作做好,这样能力为业务提供更好的反对和保障。单纯的技术思维,是不够用的了。 3. 管好本人的一亩三分地在小公司也好,大公司也罢,特地是在大公司,运维工作中肯定要管好本人的一亩三分地,别当那个出头鸟,别乱秀那技术,不然人家还认为你要抢人饭碗,他人就会厌恶你,甚至排斥你。运维其实能够说是高危职业了,证实本人牛逼的进去了大有人在、误操作赔了不少钱的也大有人在,善意帮忙共事最初成了替罪羔羊的也大有人在。 所以,间接倡议,运维操作不可能轻易帮忙别人做操作,因为你的帮忙很可能会惹上背锅的危险,善意办好事,掉陷阱里,没人违心捞你。疫情刚过去,当初大家都那么卷,没人违心捞人,更没人违心捞一个和他利益有抵触的人。所以,奉公守法,管好本人的一亩三分地,路能力走得久远。 4. 放弃学习的心态有的时候,确实很难静下心来好好的学习某一项技能,比方前段时间买了一本书、买了一套视频、报了套线上课程、珍藏了一大堆材料链接,最初的后果就是,迷路了、让它们躺在那吃灰了。这或者是本人的问题,没有急躁和恒心。但又或者不是本人的问题,因为自身就活在一个塌实的社会,所以心很塌实也失常。比方刷抖音短视频到中午,各种影视剧、游戏、股票基金带来的心理上和精力上甚至是肉体上的满足、还有家里琐碎之事等等。影响和引诱那么大,又岂能让人放弃住学习的心态? 前段时间尝试把抖音给卸载了,没过多久,就感觉一口气能爬6楼了。的确,放弃掉这种精力绑架、贩卖焦虑的APP也没什么不好,这可能是在打消塌实的路上迈出了一大步。有时候在想,有没有方法能让人放弃住学习的心态,哪怕不是每天,每周都好。失去的答案是:没有。还想过要不要求教专家,专家可能就是让你制订学习打算,跟你啰嗦一大堆情理,都是成年人了,还是离专家远点吧!疫情尽管曾经如同是过来了,但大环境差的事实仍然摆在那,当初挣钱很难,工作稳固很难。可能本人都快被他人卷死了,却还在那没心没肺的得过且过。或者,能让人放弃住一直学习上进、晋升技能的惟一理由就剩下这一点了吧。 本文转载于WX公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/e_vFzfKPrGBBP1rx44kz5w

May 10, 2023 · 1 min · jiezi

关于kubernetes:下篇使用jenkins发布go项目到k8s接上篇的手工体验改造为自动化发布

写在开篇对于上篇本篇在 《上篇:带你手工体验从写代码、编译、打包镜像、部署到K8S的全过程》 的根底上,将手动的过程通过jenkins工具将其革新成自动化。 环境筹备 我的环境阐明: 组件装置形式拜访IP拜访端口jenkinsdocker192.168.11.2548086gitlabdocker192.168.11.2548088harbordocker192.168.11.2548081下面的3个组件均以docker的形式装置在同一台宿主机上,且是在k8s集群内部。即便Jenkins、GitLab、Harbor都部署在K8S集群内部,也是能够将Go web我的项目公布到K8S集群中的。那么,对于如何装置下面的组件,可参考我之前公布过的文章 《云原生下的CICD-3件套疾速搭建合集:jenkins+harbor+gitlab》。 当然也能够将CICD的相干组件部署在K8S集群外部,这些内容前面有工夫的时候再作分享。 制作jenkins镜像因jenkinsci/blueocean镜像中没有装置go和kubectl,因而基于它来从新制作一个新的镜像,把go和kubectl装置好。从jenkinsci/blueocean镜像启动jenkins容器[root@workhost jenkins]# docker run -d -u root --name jenkins-ser01 --restart=always -p 8086:8080 -p 50000:50000 -v /data/jenkins/data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean将筹备好的kubectl工具拷贝到容器外面# 我的宿主机曾经有kubectl二进制包[root@workhost jenkins]# docker cp /usr/local/bin/kubectl jenkins-ser01:/bin/kubectl# 拷贝后进入容器查看是否失常执行bash-5.1# kubectl versionWARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.4", GitCommit:"872a965c6c6526caa949f0c6ac028ef7aff3fb78", GitTreeState:"clean", BuildDate:"2022-11-09T13:36:36Z", GoVersion:"go1.19.3", Compiler:"gc", Platform:"linux/amd64"}Kustomize Version: v4.5.7进入容器编译装置golang因为jenkins镜像是基于Alpine Linux的,须要从源代码编译装置go,不然其它发行版的二进制包是不能间接应用的# 进入容器[root@workhost jenkins]# docker exec -it jenkins-ser01 bash# 编译装置golangbash-5.1# export GOARCH=amd64bash-5.1# export GOOS=linuxbash-5.1# wget https://go.dev/dl/go1.20.4.src.tar.gzbash-5.1# tar -zxf go1.20.4.src.tar.gzbash-5.1# apk add --no-cache --virtual .build-deps bash gcc go musl-devbash-5.1# export GOROOT_BOOTSTRAP="$(go env GOROOT)" GOHOSTOS="$GOOS" GOHOSTARCH="$GOARCH"bash-5.1# cd ./go/srcbash-5.1# ./make.bashbash-5.1# go install std# 查看版本bash-5.1# which go/usr/bin/gobash-5.1# bash-5.1# go versiongo version go1.18.7 linux/amd64# 清理现场和退出容器bash-5.1# cd /bash-5.1# rm -rf go go1.20.4.src.tar.gz bash-5.1# exitexit从容器提交镜像并推送到harbor[root@workhost jenkins]# docker commit jenkins-ser01 192.168.11.254:8081/jenkins/jenkins:20230505v1sha256:34685da4c262a14229d4aee5de9a294a877f4974c68f2bcff5e57d3f1420f101[root@workhost jenkins]# docker push 192.168.11.254:8081/jenkins/jenkins:20230505v1The push refers to repository [192.168.11.254:8081/jenkins/jenkins]334b6fe88500: Pushing [====>                                              ]  78.86MB/838.3MB18df88a5f0e3: Pushed 704921b7ee47: Pushing [====================>                              ]  94.57MB/235MB......最初就能够删掉这个容器[root@workhost jenkins]# docker stop jenkins-ser01jenkins-ser01[root@workhost jenkins]# docker rm jenkins-ser01jenkins-ser01从制作好的镜像启动jenkins容器[root@workhost jenkins]# docker run -d -u root --name jenkins-ser01 --restart=always -p 8086:8080 -p 50000:50000 -v /data/jenkins/data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock 192.168.11.254:8081/jenkins/jenkins:20230505v1a052d6f503d6ef9a90d8cc99bf606daa92b5c890a8bff885d2b189fa1174492a[root@workhost jenkins]# [root@workhost jenkins]# docker ps -a | grep jenka052d6f503d6   192.168.11.254:8081/jenkins/jenkins:20230505v1   "/sbin/tini -- /usr/…"   7 seconds ago   Up 6 seconds              0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:8086->8080/tcp, :::8086->8080/tcp                              jenkins-ser01[root@workhost jenkins]# [root@workhost jenkins]# docker exec -it jenkins-ser01 bashbash-5.1# go versiongo version go1.18.7 linux/amd64bash-5.1# kubectl versionWARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.4", GitCommit:"872a965c6c6526caa949f0c6ac028ef7aff3fb78", GitTreeState:"clean", BuildDate:"2022-11-09T13:36:36Z", GoVersion:"go1.19.3", Compiler:"gc", Platform:"linux/amd64"}Kustomize Version: v4.5.7构建形式的抉择在 Jenkins 中,Freestyle Project 和 Pipeline 都是罕用的构建作业类型,它们都能够用来实现自动化构建和继续集成,但它们的利用场景略有不同,还是得提前理解一下: 如果我的项目比较简单,例如只须要执行一些 Shell 命令、构建 Maven 我的项目、执行 Ant 构建等简略操作,那么应用 Freestyle Project 就能够满足需要,因为 Freestyle Project 的配置界面非常简单,能够疾速地实现配置和构建。如果我的项目比较复杂,例如须要解决多个 Git 仓库、执行多个步骤、分支流程等,那么应用 Pipeline 可能更加适宜,因为 Pipeline 具备灵便的流程控制能力,能够反对简单的我的项目构建过程。同时,Pipeline 也反对以代码的模式进行定义,具备更好的可维护性和可重用性。倡议依据我的项目的具体需要,抉择应用适宜的构建形式。通过对这两种构建形式的理解,置信你曾经晓得了哪种适合本人了。当然,还有其它的构建形式,比方“多分支流水线”等等,这些当前用到了再去理解吧。波及到的插件上面的插件是我当前要用到的,先提前装置好。本次打算先用“自由软件格调我的项目”来公布goweb利用,有些插件在本篇还未用到,比方Pipeline,不过装上也不妨。因篇幅无限,本篇不讲如何装置插件,请自行装置好即可。Kubernetes:提供了在 Jenkins 中治理和部署应用程序到 Kubernetes 集群的能力。Kubernetes CLI:提供了在 Jenkins 中应用 kubectl 命令行工具与 Kubernetes 集群交互的能力。Git:用于在 Jenkins 中集成 Git 版本控制系统。Docker:用于在 Jenkins 中构建和推送 Docker 镜像。Credentials:用于在 Jenkins 中配置和治理 GitLab 和 Harbor 的认证凭据。Config File ProviderPipeline:用于在 Jenkins 中创立和治理流水线(Pipeline)作业。Go:是一个官网反对的Jenkins插件,它提供了构建和部署Go应用程序的能力。提醒:如果只须要应用 kubectl 命令行工具与 Kubernetes 集群交互,那么只须要装置 Kubernetes CLI 插件即可。如果须要在 Jenkins 构建管道中应用 Kubernetes 插件提供的更丰盛的性能和 Jenkins 语法来治理 Kubernetes 资源,那么须要装置 Kubernetes 插件。在这里,我先把两个都装置上。goweb我的项目构造[root@workhost goweb]# tree.├── Dockerfile├── go.mod├── main.go├── README.md└── static    └── login.html[root@workhost goweb]# Dockerfile代码: ...

May 10, 2023 · 1 min · jiezi

关于kubernetes:PostgreSQLHA-高可用集群在-Rainbond-上的部署方案

PostgreSQL 是一种风行的开源关系型数据库管理系统。它提供了规范的SQL语言接口用于操作数据库。 repmgr 是一个用于 PostgreSQL 数据库复制治理的开源工具。它提供了自动化的复制治理,包含: 故障检测和主动故障切换:repmgr 能够检测到主服务器故障并主动切换到备用服务器。主动故障复原:repmgr 能够检测到从服务器故障并主动将其重新加入到复制拓扑中。多个备用服务器:repmgr 反对多个备用服务器,能够在主服务器故障时主动切换到最合适的备用服务器。灵便的复制拓扑:repmgr 反对各种复制拓扑,包含单主服务器和多主服务器。治理和监控:repmgr 提供了用于治理和监控PostgreSQL复制的各种工具和命令。能够说 repmgr 是一个扩大模块,简化了 PostgreSQL 复制的治理和保护,进步零碎的可靠性和可用性。它是一个十分有用的工具,特地是对于须要高可用性的生产环境。同时 repmgr 也是由 Postgresql 社区开发以及保护的。 Pgpool 是一个高性能的连接池和负载均衡器,用于 PostgreSQL 数据库。Pgpool 能够作为中间层,位于客户端和 PostgreSQL 服务器之间,来治理连贯申请并调配给不同的 PostgreSQL 服务器进行解决,以进步整体的零碎性能和可用性。Pgpool 的一些次要性能包含: 连接池:Pgpool在应用程序和数据库之间建设一个连接池,使得多个应用程序能够共享一组数据库连贯,防止了反复的连贯和断开。负载平衡:Pgpool能够将客户端申请平衡地调配到多个PostgreSQL服务器上,以实现负载平衡和更好的性能。高可用性:Pgpool能够检测到PostgreSQL服务器的故障,并主动将客户端申请从新路由到其余可用服务器,从而进步零碎的可用性和稳定性。并行查问:Pgpool能够将大型查问分成几个子查问,而后将这些子查问并行发送到多个PostgreSQL服务器上执行,以进步查问性能。本文将介绍在 Rainbond 上应用 Postgresql-repmgr + Pgpool 实现 Postgresql 高可用集群的部署和治理。 架构 当应用 Postgresql HA 集群时,利用只需连贯 pgpool 即可。 通过 pgpool 实现读写拆散,写入操作由 Master 执行,读取操作由 Slave 执行。由 repmgr 实现流复制,Master 数据主动复制到 Slave。当 Master 遇故障下线时,由 repmgr 自定抉择 Slave 为 Master,并继续执行写入操作。当某个节点遇故障下线时,由 pgpool 主动断开故障节点的连贯,并切换到可用的节点上。部署 Rainbond装置 Rainbond,可通过一条命令疾速装置 Rainbond,或抉择 基于主机装置 和 基于 Kubernetes 装置 Rainbond。 ...

May 9, 2023 · 2 min · jiezi

关于kubernetes:Kubernetes-v127-新特性一览

大家好,我是张晋涛。 Kubernetes v1.27 是 2023 年的第一个大版本更新,蕴含了近 60 项次要的更新。 而 1.26 只有 37 项,所以这个版本能够说是一个变动十分显著的版本了。 其中 18 个加强性能正在进入 Alpha 阶段,29 个将降级到 Beta 阶段,而另外 13 个则将降级到稳定版。 只管这个版本中蕴含了这么多的个性变更,但值得一提的是,这个版本应该算是第一个齐全依照即定流程,遵守每个 deadline 的版本。之前的版本中,每次都或多或少会有一些变数,不过这也从侧面能够看到 release team 做了很多幕后的工作。 我每期的 「k8s生态周报」都有一个叫上游停顿的局部,所以很多值得关注的内容在之前的文章中曾经发过了。这篇中我会再额定介绍一些之前未涵盖的,和之前介绍过的值得关注的内容。 咱们一起来具体看看吧! SeccompDefault 达到 Stable如果想要默认应用 seccomp profile,则必须在每个想要应用它的节点上为 kubelet 启用 --seccomp-default 选项。如果启用了该选项,则 kubelet 将默认应用由容器运行时定义的 RuntimeDefault seccomp profile,而不是应用 Unconfined(禁用seccomp)模式。“ 默认配置文件旨在提供弱小的安全性设置,并保留工作负载性能。容器运行时的不同公布版本之间可能存在不同的默认配置文件。 印象里很早之前 Docker 的配置文件就因为修补安全漏洞而调整过。 Pod 调度就绪机制达到 Beta这个性能实际上是从 Kubernetes v1.26 开始减少的。是 KEP 3521 的第一局部。 首先咱们来简略的回顾一下 Pod 的创立过程。 当 client 通过 kube-apiserver 创立胜利 Pod 资源后,kube-scheduler 会去查看尚未被调度的 Pod,而后为其进行调度,调配 Node。之后 Node 获取到调度到该 Node 上的 Pod 而后进行创立。这里省略了很多细节,但其余的局部与咱们此处要介绍的内容关系不太大,就不开展了。 ...

May 9, 2023 · 3 min · jiezi

关于kubernetes:基于容器平台-ACK-快速搭建-Stable-Diffusion

CPU 版本前提条件已创立 Kubernetes 托管版集群。具体操作,请参见创立 Kubernetes 托管版集群[1]。无需 GPU,节点须要 8c16g 以上已通过 kubectl 连贯 kubernetes 集群。具体操作,请参见通过 Kubectl 连贯 Kubernetes 集群[2]。 应用控制台创立登录容器服务治理控制台[3],在左侧导航栏抉择集群。在集群列表页面中,单击指标集群名称或者指标集群右侧操作列下的详情。在集群治理页左侧导航栏中,抉择工作负载 > 无状态。在无状态页面中,单击应用镜像创立。在利用根本信息配置向导页面中,设置利用的根本信息。残缺内容请点击下方链接查看: https://developer.aliyun.com/article/1194352?utm_content=g_10... 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

May 8, 2023 · 1 min · jiezi

关于kubernetes:K8S分享一次乌龙问题人为导致的无法正常删除命名空间

问题背景背景是这样的,我有一套测试用的K8S集群,发现无奈失常删除命名空间了,始终处于Terminating状态,强制删除也不行。于是,再次手动创立了一个名为“test-b”的命名空间,同样也是不能失常删除。于是,开展了排查。不过,查到最初,发现是个毫无技术含量的“乌龙问题”。后果不重要,重要的是我想把这个过程分享一下。排查过程失常删除命名空间时,始终处于阻塞状态,只能Ctrl+C掉[root@k8s-b-master ~]# kubectl delete ns test-bnamespace "test-b" deleted查看状态始终处于Terminating状态[root@k8s-b-master ~]# kubectl get nstest-b            Terminating   18h尝试强制删除,也是始终处于阻塞状态,也只能Ctrl+C掉[root@k8s-b-master ~]# kubectl delete namespace test-b --grace-period=0 --force查看详细信息发现[root@k8s-b-master ~]# kubectl describe ns test-bName:         test-bLabels:       kubernetes.io/metadata.name=test-bAnnotations:  <none>Status:       TerminatingConditions:  Type                                         Status  LastTransitionTime               Reason                  Message  ----                                         ------  ------------------               ------                  -------  NamespaceDeletionDiscoveryFailure            True    Fri, 05 May 2023 14:06:52 +0800  DiscoveryFailed         Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request  NamespaceDeletionGroupVersionParsingFailure  False   Fri, 05 May 2023 14:06:52 +0800  ParsedGroupVersions     All legacy kube types successfully parsed  NamespaceDeletionContentFailure              False   Fri, 05 May 2023 14:06:52 +0800  ContentDeleted          All content successfully deleted, may be waiting on finalization  NamespaceContentRemaining                    False   Fri, 05 May 2023 14:06:52 +0800  ContentRemoved          All content successfully removed  NamespaceFinalizersRemaining                 False   Fri, 05 May 2023 14:06:52 +0800  ContentHasNoFinalizers  All content-preserving finalizers finishedNo resource quota.No LimitRange resource.问题出在这里:DiscoveryFailed:Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request 难道API Server出问题了?于是持续排查。 查看API Server是否失常运行[root@k8s-b-master ~]# kubectl get componentstatusWarning: v1 ComponentStatus is deprecated in v1.19+NAME                 STATUS    MESSAGE                         ERRORcontroller-manager   Healthy   ok                              etcd-0               Healthy   {"health":"true","reason":""}   scheduler            Healthy   ok                              从输入来看,controller-manager、scheduler和etcd集群都处于失常状态(Healthy)。 持续查看API Server的日志看看是否有谬误或异样# 获取API Server Pod的名称:[root@k8s-b-master ~]# kubectl get pods -n kube-system -l component=kube-apiserver -o namepod/kube-apiserver-k8s-b-master# 查看API Server的日志:[root@k8s-b-master ~]# kubectl get pods -n kube-system -l component=kube-apiserver -o namepod/kube-apiserver-k8s-b-master[root@k8s-b-master ~]# kubectl logs -n kube-system kube-apiserver-k8s-b-master......W0506 01:00:12.965627       1 handler_proxy.go:105] no RequestInfo found in the contextE0506 01:00:12.965711       1 controller.go:116] loading OpenAPI spec for "v1beta1.metrics.k8s.io" failed with: failed to retrieve openAPI spec, http error: ResponseCode: 503, Body: service unavailable, Header: map[Content-Type:[text/plain; charset=utf-8] X-Content-Type-Options:[nosniff]]I0506 01:00:12.965722       1 controller.go:129] OpenAPI AggregationController: action for item v1beta1.metrics.k8s.io: Rate Limited Requeue.W0506 01:00:12.968678       1 handler_proxy.go:105] no RequestInfo found in the contextE0506 01:00:12.968709       1 controller.go:113] loading OpenAPI spec for "v1beta1.metrics.k8s.io" failed with: Error, could not get list of group versions for APIServiceI0506 01:00:12.968719       1 controller.go:126] OpenAPI AggregationController: action for item v1beta1.metrics.k8s.io: Rate Limited Requeue.I0506 01:00:43.794546       1 controller.go:616] quota admission added evaluator for: endpointslices.discovery.k8s.ioI0506 01:00:44.023629       1 controller.go:616] quota admission added evaluator for: endpointsW0506 01:01:12.965985       1 handler_proxy.go:105] no RequestInfo found in the contextE0506 01:01:12.966062       1 controller.go:116] loading OpenAPI spec for "v1beta1.metrics.k8s.io" failed with: failed to retrieve openAPI spec, http error: ResponseCode: 503, Body: service unavailable, Header: map[Content-Type:[text/plain; charset=utf-8] X-Content-Type-Options:[nosniff]]I0506 01:01:12.966069       1 controller.go:129] OpenAPI AggregationController: action for item v1beta1.metrics.k8s.io: Rate Limited Requeue.W0506 01:01:12.969496       1 handler_proxy.go:105] no RequestInfo found in the contextE0506 01:01:12.969527       1 controller.go:113] loading OpenAPI spec for "v1beta1.metrics.k8s.io" failed with: Error, could not get list of group versions for APIService......# 前面都是这样的Log......从输入日志来看,问题仿佛与metrics.k8s.io/v1beta1无关,这个API被用于收集Kubernetes集群的度量数据。可能是因为度量服务器(metrics-server)呈现故障,无奈满足API Server的申请,导致API Server无奈解决申请。 k8s默认是没有metrics-server组件的呀,还是看看:[root@k8s-b-master ~]# kubectl get pods -n kube-system -l k8s-app=metrics-serverNo resources found in kube-system namespace.kube-system命名空间中没有找到标签为k8s-app=metrics-server的Pod,这很失常呀,K8S原本就是默认没有装置Metrics Server 组件的,为什么当初又依赖了? 查到这里,我忽然想起了前段时间部署过kube-prometheus,过后kube-state-metrics拉取镜像失败没有失常运行,因为是长期测试环境,起初就没管了,工夫一长竟然把这事给忘了。于是看了一下,发现还真是: [root@k8s-b-master ~]# kubectl get pod -n monitoringNAME                                   READY   STATUS             RESTARTS       AGEalertmanager-main-0                    2/2     Running            14 (30m ago)   5d19halertmanager-main-1                    2/2     Running            14 (29m ago)   5d19halertmanager-main-2                    2/2     Running            14 (29m ago)   5d19hblackbox-exporter-69f4d86566-wn6q7     3/3     Running            21 (30m ago)   5d19hgrafana-56c4977497-2rjmt               1/1     Running            7 (29m ago)    5d19hkube-state-metrics-56f8746666-lsps6    2/3     ImagePullBackOff   14 (29m ago)   5d19h # 拉取镜像失败导致没有失常运行node-exporter-d8c5k                    2/2     Running            14 (30m ago)   5d19hnode-exporter-gvfx2                    2/2     Running            14 (30m ago)   5d19hnode-exporter-gxccx                    2/2     Running            14 (29m ago)   5d19hnode-exporter-h292z                    2/2     Running            14 (30m ago)   5d19hnode-exporter-mztj6                    2/2     Running            14 (29m ago)   5d19hnode-exporter-rvfz6                    2/2     Running            14 (29m ago)   5d19hnode-exporter-twg9q                    2/2     Running            13 (29m ago)   5d19hprometheus-adapter-77f56b865b-76nzk    0/1     ImagePullBackOff   0              5d19hprometheus-adapter-77f56b865b-wbcwl    0/1     ImagePullBackOff   0              5d19hprometheus-k8s-0                       2/2     Running            14 (30m ago)   5d19hprometheus-k8s-1                       2/2     Running            14 (29m ago)   5d19hprometheus-operator-788dd7cb76-85zwj   2/2     Running            14 (29m ago)   5d19h反正也不必这套环境了,干它: [root@k8s-b-master ~]# kubectl delete -f kube-prometheus-main/manifests/[root@k8s-b-master ~]# kubectl delete -f kube-prometheus-main/manifests/setup/再次查看命名空间,test-b这个命名空间也随之能失常删除掉了,问题解决: [root@k8s-b-master ~]# kubectl get nsNAME              STATUS   AGEdefault           Active   5d22hkube-node-lease   Active   5d22hkube-public       Active   5d22hkube-system       Active   5d22h[root@k8s-b-master ~]# 最初的觉醒联合官网文档相干材料和本人平时的教训反思了一下这个事件,kube-state-metrics 组件是负责监控 K8S 集群的状态,并且它会定期获取集群内各个资源的指标数据,这些指标数据会被 Metrics Server 组件应用。当 kube-state-metrics 组件无奈失常工作时,Metrics Server 组件就无奈获取到指标数据,从而导致 Metrics Server 组件无奈失常运行。在 K8S 集群中,很多组件都会应用 Metrics Server 组件提供的指标数据,例如 HPA、kubelet 等。如果 Metrics Server 组件无奈失常运行,可能会导致其余组件呈现问题,包含删除命名空间时提醒谬误。也就是说 Metrics Server 组件无奈失常运行,导致了API Server组件在解决其它一些申请时可能会失败,从而产生了无奈失常删除命名空间的状况。本文转载于WX公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/JLeL4j-mX2x2BBZxWu414g

May 7, 2023 · 1 min · jiezi

关于kubernetes:Kubernetes系统精讲-Go语言实战K8S集群可视化莫使金樽空对月

download:Kubernetes零碎精讲 Go语言实战K8S集群可视化毫无疑问,以后中国整体经济状态正在从传统经济向数字经济转型,千行百业也在减速数字化转型,特地是随着企业数据的积淀越来越宏大,对数据平台以及智能决策等新技术的需要也越来越旺盛。 国家公布的《“十四五”数字经济发展布局》中就强调:“有条件的大型企业要形成数据驱动的智能决策能力”;而科技部公布的《对于反对建设新一代人工智能示范利用场景的告诉》中,也明确使用优化决策等技术,实现生产过程等领域的智能决策。 可能看到,过来几年受疫情的冲击,企业抗危险能力、生产供应柔性、精密化经营等话题被晋升到前所未有的高度,这让企业的数字化转型更加迫切,因此要疾速的适应市场变动,就需要善用数据,让决策智能等新技术在企业的商业模式中创造出更大的价值,更好地升高未来挑战对企业造成的“不必定”的影响,由此才能在激烈的竞争中立于“不败之地”。 而作为寰球最大的企业级软件公司,以及将“数据”融入到公司“基因”和“血脉”中的甲骨文,在此过程中也通过继续的技术创新,打造了“双引擎”——即数据库和云,并且将二者实现了“融会贯通”,由此不只能够驱动更多的企业更好的拥抱决策智能,同时也能够减速泛滥企业的数字化转型步调。 正如甲骨文公司副总裁及中国区技术平台总经理吴承杨所言:“当明天数据越来越重要,在AI和ML变成寰球最热门话题的大背景下,甲骨文公司具备‘算力、数据、模型和生态’等劣势,这也让甲骨文可能帮助泛滥中国的企业在使用数据库,包含基于数据做决策的时候能够足够简略,开箱即用,未来咱们也心愿通过‘双引擎’技术的继续翻新,让千行百业能够更便当地通过数据创造出更多的新价值。 数据驱动决策大势所趋 家喻户晓,企业的数字化转型从来不是一个简略的技术问题,其目标或者本质是要将数字化的思维和方法贯穿到企业的要害场景之中,包含生产、销售、营销、服务等方面,而背地的要害就在于企业要构建数据驱动的模式,由此才能推动企业实现全面的数字化转型。 特地是随着大数据、人工智能、决策智能等技术融合日益加深,通过数据驱动打造企业智能化和精密化的经营模式已成为要害力量。从甲骨文近期公布的《寰球决策困境研究报告》中,咱们就能充分感受到这种变动,该报告对包含中国在内的17个国家/地区的14000多名员工和企业负责人开展调研,得出的论断是——做出正确决策至关重要,但非易事。 一是,数据的爆发式增长,正在阻碍企业的取得胜利。报告浮现,81%的中国受访者认为,他们正受到来自更多渠道的数据“轰炸”,这比以往任何时候都要多;超过86%的中国受访者示意,宏大的数据量使得集体和工作决策变得更加简单;更有高达90%的中国受访者示意,与日俱增的数据起源,正在有碍企业或者组织获得胜利,原因在于需要其余资源来收集所有数据,并确保在此过程中不能丢失任何数据;极大的减少了收集数据的工夫,并造成战略决策迟缓,且减少出错的机会。 二是,越来越多的企业受到了基于数据决策带来的干扰。报告指出,有76%的中国受访者示意,他们每天所做的决策数量在过来三年的工夫里减少了10倍,也有同时超过78%的中国受访者示意,因数据量过于宏大而放弃做出决策,有82%的中国企业指导者更是承认,他们对数据不足信赖,由此导致残缺无奈做出任何决策;超过92%的中国企业指导者正在蒙受决策干扰,不少指导者对过来一年所做的决策也曾感到后悔、内疚或已经质疑过自己做出的决策。 三是,利用技术创新实现数据驱动型决策的公司将是未来的趋势所在。报告中提到,有96%的中国企业指导者认为,具备合适的决策智能可能决定组织的胜利与否,背地的关键在于越来越多的指导者意识到,正确的数据和洞察可能帮助企业改恶人力资源、供应链、财务和客户体验方面的决策,同时还能在其余方面获得胜利,包含超过81%的中国受访者认为,数据驱动决策可能更好地排汇人才;78%的受访者认为,可能更好地获得投资者的青睐;而更有超过90%的中国企业指导者示意,在未来偏向于让机器人做出决策。 对此,甲骨文公司高级副总裁及亚洲区董事总经理李翰璋强调:“随着数字经济的飞速发展,企业需要更多的相干数据来获得全局视图。同时,对于负责制订决策的企业指导者而言,如果忽视这些数据背地的价值,就需自担风险。因此,企业指导者是时候重新考虑对待数据和决策的方法了。” 由此可见,在数据大爆炸的明天,对于企业而言要基于数据做出正确的决策绝不是一件容易的事件,日益减少的数据对企业而言诚然是一笔“宝藏”资源,但要真正要让数据产生价值,驱动企业做出高质量的决策,要害的“落脚点”还在于企业需要将信息、数据、洞察及口头串联起来,由此才能开释数据带来的全新价值。 减速企业拥抱决策智能 在此背景下,甲骨文基于自身在数据领域四十多年的积累和积淀,并以全新的“双引擎”技术创新形式,为企业提供收集、分析和利用数据所需的决策智能,助力企业做出现实的决策。 甲骨文公司中国区技术咨询部高级总监李珈示意:“产生决策智能的要害因素,不能仅仅只靠一种技术能够实现的。这是一门实践,需要通过技术来撑持零碎不断地练习,去理解数据,收集数据,并对这些数据进行分析,进行挖掘,而后不断根据后果去反馈,去调优,去锤炼模型,再去修改这个模型。这是一个改善决策智能的要害因素的过程,也是甲骨文心愿通过数据驱动企业决策背地所保持的逻辑。”基于此,甲骨文也正通过“双引擎”的技术创新形式,驱动和减速更多企业拥抱决策智能。 首先,甲骨文能够通过“融合数据库”的形式,让企业的数据平台能够反对所有数据类型、工作负载,以及不同的开发风格。 例如,在工作负载方面,甲骨文可能提供HTAP混合事务和分析处理能力,而这个功能 十年前甲骨文就已经推出了,发展到明天功能已经十分弱小,最为典型的如 Oracle Database In-Memory就能撑持不同的利用;此外,甲骨文也能够对不同数据类型提供反对,如关系、文档、图和空间多模数据处理。 更为要害的是,甲骨文往年刚刚公布的Oracle Database 23c 开发者版本,新减少了“JSON Relational Duality”功能,该功能不只能够让开发人员可能根据不同的使用场景抉择合适的拜访格局,而无需担心数据结构、数据映射、数据一致性或性能优化方面的问题,同时还可能基于关系数据和JSON 数据运行图形分析。也正因此,第三方分析机构IDC给与了这项功能极高的评估,指出:“Oracle JSON Relational Duality 是一个真正的革命性解决打算,可能是信息科学领域近20 年来非常重要的翻新之一。” 其次,借助甲骨文弱小的云基础设施(OCI)能力,明天企业无论是在云端还是本地的数据中心,同样也能获得雷同的“自治数据库”能力。 简略来说,过来甲骨文的自治数据库只能运行在Oracle私有云环境之中,对于很多想尝试自治数据库的企业来说是有一些难度的,但现在甲骨文买通了云端和本地的数据中心,由此让“自治数据库”的能力变得“无处不在”。 这其中翻新的“代表”就是Oracle Exadata专有云数据库一体机(Oracle Exadata Cloud@Customer,ExaCC),它既能为企业提供原有的利用数据库撑持;同时另一方面它也能以低成本、便当自助的形式帮助企业轻松部署甲骨文自治数据库。换句话说,基于ExaCC运行的多虚拟机自治数据库能够更好地利用Oracle Exadata基础设施“底座”的性能、可扩展性和可用性劣势,这样就可能让企业更加轻松部署云原生和要害工作数据库。不只如此,过来几年甲骨文还推出了很多的翻新打算,如Oracle专有云本地化解决打算(Oracle Dedicated Region Cloud@Customer),该打算可能将私有云的能力全副“搬到”客户的本地数据中心等等。 最初,甲骨文还提供Oracle 分析平台(Oracle Analytics platform),借助其内置的机器学习技术,也可能帮助企业更快实现数据分析。“Oracle Analytics的技术门槛非常低,企业可能开箱即用,而根本不需要知道它是用什么方法,什么原理帮助企业实现数据分析过程的。”李珈说。 不难看出,通过甲骨文在弱小的“融合数据库”、无处不在的“自治数据库”,以及数据库中内嵌的机器学习和人工智能,企业可能更好的在基础数据管理、增强和利用分析方面“大展身手”,更快地拥抱决策智能,让决策智能的获得变得更加简略和便利。 “双引擎”赋能千行百业 事实上,甲骨文“双引擎”的技术创新形式在决策智能领域的利用仅仅是一个“缩影”,在更大范畴,更多利用场景中,甲骨文的“双引擎”也在赋能千行百业的数字化转型。 吴承杨说:“如果说明天甲骨文和过来五年或者十年有什么不一样,最大的变动就在于咱们新增了云的引擎,这不只推动了甲骨文的业务的高速增长,更重要的是也让甲骨文成为了一家云转型胜利的公司。” 的确如此,甲骨文2023财年第三季度财报浮现,其寰球总营收为124亿美圆,若按固定汇率计算,同比增长21%;其中云服务营收到达41亿美圆,若按固定汇率计算,同比增长48%;此外,甲骨文云基础设施中的laaS业务营收为12亿美圆,若按固定汇率计算,同比增长57%。截止目前,甲骨文OCI在寰球范畴内已经部署了超过41个云区域。 因此,这也让扎根中国市场34年的甲骨文,在全新的期间能够以“双引擎”的技术创新能力,将更多先进的科技带给中国企业;同时也在保证数据安全合规的同时,能够以更低成本,更疾速部署的劣势助力千行百业减速数字化转型。 第一,从数据翻新维度看,甲骨文是寰球多数具备“算力、数据、模型和生态”等劣势的公司,因此无论是数据的治理,还是基于数据做决策智能,都是甲骨文可能施展价值的领域。 例如,在算力方面,甲骨文 OCI 在寰球具备超过41个云区域,同时具备弱小的GPU算力劣势;在数据方面,甲骨文已经做了45年的工夫,可能说甲骨文是最懂在行业中如何做数据的;在模型方面,甲骨文深耕企业级市场,做的是数据相干的大模型,自治数据库就是其中的‘集大成者’;而在生态方面,甲骨文不只是数据库公司,也是寰球最大的企业级软件公司,更是唯一一家提供完整企业级IaaS、PaaS和SaaS产品与服务的云厂商,特地是在ERP还是HCM乃至垂直行业软件方面,甲骨文都有深入布局,因此可能将企业在不同利用中的数据发掘出来,通过融合数据库弱小的能力,更好地开释数据价值进去。 第二,从企业赋能维度看,国家此前提出了“双循环”的策略,越来越多各赛道的中国企业也正在将中国的业务和翻新模式输入到海内市场,心愿寻找到更多新的商业机会,而在此过程中甲骨文也可能提供更好的私有云服务,助力企业更好的“入华出海”。 “明天越来越多的中国企业在出海的时候抉择甲骨文,这一点也印证了甲骨文在私有云上的翻新能力赢得了客户的认可,因此这也让咱们在中国私有云市场的发展速度远超寰球市场,同时也甲骨文在未来更加有自信心地服务好好中国的本地客户,同时帮助海内的客户进入到中国,比如HSBC(汇丰银行)进入中国市场时,甲骨文就是残缺满足安全合规的申请情况帮助他们实现了落地。”吴承杨说。 第三,从心态凋谢的维度看,可能看到过来几年中国市场出现了越来越多的数据库公司,对此甲骨文也是始终保持凋谢和互相学习的态度,并心愿通过自身的技术的翻新,让更多的企业意识到数据的后劲,开释好数据的价值。 对此,吴承杨示意:“咱们非常欢迎数据库这个行业有更多的厂商进入,不管在寰球还是在中国,这是非常明确的,因为甲骨文认为数据库其实是一个绝对冷门的领域,需要更多人关注,因为关注数据库就是关注数据。因此甲骨文鼓励更多的厂商投入这个领域,咱们也违心保持着凋谢的心态和同行互相学习,同时也违心把选择权交给客户做决定。” “回头来看,甲骨文在数据库领域已经做了超过45年的工夫,咱们每年研发投入在营收的15%左右,每年有超过60亿美圆用来研发,同时寰球也具备很多的客户,每年也会做大量的迭代和优化,最终的目标和愿景也很清晰——就是让数据库‘化繁为简’,简略到让企业感觉不到它的存在,简略到人人都可能使用。”吴承杨最初说。 全文总结,“数字中国”的顶层布局、中国式现代化的整体规划为整个科技产业创造了巨大的历史时机,愈减速了千行百业数字化转型的步调,而扎根中国市场34年的甲骨文,也正通过全新的“双引擎”技术创新和赋能的形式,减速中国企业数字化转型,推动中国数字经济的高质量发展,这不只是甲骨文“以行践言”推动中国企业更快拥抱决策智能,最大化开释数据价值的体现,同时也是其过来三十多年来能够深度融入中国市场,并服务好中国行业客户的核心和关键所在。

May 7, 2023 · 1 min · jiezi

关于kubernetes:Kubernetes-Gateway-API-深入解读和落地指南

背景Kubernetes Gateway API 是 Kubernetes 1.18 版本引入的一种新的 API 标准,是 Kubernetes 官网正在开发的新的 API,Ingress 是 Kubernetes 已有的 API。Gateway API 会成为 Ingress 的下一代代替计划。Gateway API 提供更丰盛的性能,反对 TCP、UDP、TLS 等,不仅仅是 HTTP。Ingress 次要面向 HTTP 流量。 Gateway API 具备更强的扩展性,通过 CRD 能够轻易新增特定的 Gateway 类型,比方 AWS Gateway 等。Ingress 的扩大绝对较难。Gateway API 反对更细粒度的流量路由规定,能够准确到服务级别。Ingress 的最小路由单元是门路。 Gateway API 的意义和价值: 作为 Kubernetes 官网我的项目,Gateway API 可能更好地与 Kubernetes 自身集成,有更强的可靠性和稳定性。反对更丰盛的流量协定,实用于服务网格等更简单的场景,不仅限于 HTTP。能够作为 Kubernetes 的流量入口 API 进行对立。具备更好的扩展性,通过 CRD 能够轻松地反对各种 Gateway 的自定义类型,更灵便。能够实现细粒度的流量管制,准确到服务级别的路由,提供更弱小的流量治理能力。综上,Gateway API 作为新一代的 Kubernetes 入口 API,有更宽泛的利用场景、更弱小的性能、以及更好的可靠性和扩展性。对于生产级的 Kubernetes 环境,Gateway API 是一个更好的抉择。本篇文章将深刻解读 Kubernetes Gateway API 的概念、个性和用法,帮忙读者深刻了解并理论利用 Kubernetes Gateway API,施展其在 Kubernetes 网络流量治理中的劣势。 ...

May 6, 2023 · 4 min · jiezi

关于kubernetes:K8S4种鉴权模块不知道怎么选看看这篇你就懂了

鉴权模块在K8S中,鉴权模块有4种,别离是:Node、ABAC、RBAC、Webhook。 性能别离如下: Node:验证节点的身份以确保其具备所需的权限来退出集群。ABAC:基于用户的属性(如用户名或组名)来管制其对集群资源的拜访权限。RBAC:基于角色的权限来管制用户对集群资源的拜访权限。Webhook:容许管理员将鉴权决策交给内部服务进行解决,以灵便地定制和扩大集群的鉴权策略。更多详情可参考官网文档:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz... Node:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz...ABAC:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz...RBAC:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz...Webhook:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz...利用场景理解不同鉴权模块的利用场景是抉择正确鉴权模块的要害。当理解了不同鉴权模块的性能和利用场景后,就能够依据理论状况来抉择适合的鉴权模块。那么,在学习鉴权模块的时候,思路才会更加清晰,能力更有目的性的去学习某个鉴权模块。RBAC当在比拟大型的组织或者开发和运维团队中,通常须要更精密的访问控制和治理。在这种状况下,应用RBAC鉴权模块能够基于角色和权限来管制对K8S资源的拜访权限。例如,在一家大型的公司中,应用RBAC鉴权模块能够管制不同部门的开发、运维团队对不同环境中的K8S资源的拜访权限。 ABAC在一些较小的组织或开发团队中,可能没有简单的角色受权需要,而只是须要基于用户属性(如用户名或组名)来管制对Kubernetes资源的拜访权限。在这种状况下,能够应用ABAC鉴权模块。例如,在一个小型的开发团队或者运维团队中,能够应用ABAC鉴权模块来管制不同用户对不同环境中的Kubernetes资源的拜访权限。 Node当节点退出Kubernetes集群时,须要进行身份验证和受权。在理论生产环境中,应用Node鉴权模块能够确保只有具备所需权限的节点才可能退出集群。例如,在一家公司中,应用Node鉴权模块能够保障只有通过身份验证并具备所需权限的机器才可能连贯到Kubernetes集群。 Webhook如果须要更加灵便的、可扩大的鉴权模块来解决非常规的访问控制需要。在这种状况下,能够应用Webhook鉴权模块。例如,在一个跨云平台的应用程序中,能够应用Webhook鉴权模块来将集中式的拜访控制策略与多个云平台的Kubernetes集群进行集成。 本文转载于WX公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/t1ma-g6BgaOzGSR_0x3wPA

May 5, 2023 · 1 min · jiezi

关于kubernetes:上篇一文了解K8S的ConfigMap

写在开篇什么是 ConfigMap?在 Kubernetes 中,ConfigMap 是一种 API 资源对象,用于存储非密钥/值数据,例如配置文件、环境变量和命令行参数等。 ConfigMap 容许将这些数据与应用程序的容器进行解耦,从而使应用程序更加可移植和可配置。通过将配置数据存储在 ConfigMap 中,能够在不批改应用程序容器镜像的状况下,灵便地管理应用程序的配置。 ConfigMap 能够通过 kubectl 命令或 YAML 文件进行创立、更新和删除。应用程序容器能够通过挂载 ConfigMap,从而拜访其中存储的配置数据,也能够将 ConfigMap 中的数据作为环境变量或命令行参数注入到容器中。 官网文档可参考:https://kubernetes.io/zh-cn/docs/concepts/configuration/confi... ❝ 总之,ConfigMap 是 Kubernetes 中一种重要的配置管理形式,它能够帮忙咱们更好地管理应用程序的配置和数据。 ❞ ConfigMap 的作用是什么?ConfigMap 的次要作用是存储应用程序的配置和数据。在 Kubernetes 中,应用程序的配置和数据通常是存储在容器镜像中的文件或环境变量中。然而,将配置和数据硬编码到容器镜像中会导致以下问题: 不足灵活性:在不从新构建和部署容器镜像的状况下,无奈更改应用程序的配置和数据。平安问题:在容器镜像中存储敏感信息,如明码和密钥,可能会导致信息泄露的危险。环境差别:因为在不同的环境中应用不同的配置和数据,因而在部署到不同的环境时,容器镜像中的配置和数据可能不适用于该环境。ConfigMap 解决了上述问题。通过应用 ConfigMap,能够将应用程序的配置和数据与容器镜像拆散,并将其存储在 Kubernetes 集群中。这使得在不批改容器镜像的状况下,能够轻松更改应用程序的配置和数据,进步了灵活性和可移植性。此外,通过将敏感信息存储在 ConfigMap 中,而不是在容器镜像中,能够进步应用程序的安全性。最初,通过应用不同的 ConfigMap 来适应不同的环境,能够确保应用程序在不同的环境中具备统一的行为。 创立 ConfigMap应用 kubectl 命令创立 ConfigMap应用kubectl命令行工具创立一个名为“testcm”的ConfigMap资源[root@k8s-b-master configmap-test]# kubectl create configmap testcm --from-literal=ip=10.1.1.16 --from-literal=hostname=web01configmap/testcm created蕴含两个键值对: “ip”键的值为“10.1.1.16”“hostname”键的值为“web01”从文件中创立 ConfigMap:# config-files目录下有如下两个配置文件:[root@k8s-b-master configmap-test]# ls -l config-files/total 8-rw-r--r-- 1 root root 45 May  1 22:48 config.yaml-rw-r--r-- 1 root root 42 May  1 22:47 default.yaml# 创立名为 my-config 的 ConfigMap,并将 config-files/ 目录中的所有文件增加到其中:[root@k8s-b-master configmap-test]# kubectl create configmap my-config --from-file=config-files/configmap/my-config created从环境变量文件中创立 ConfigMap:# 筹备env-vars.env环境变量文件:[root@k8s-b-master configmap-test]# cat env-vars.env MY_K8S_MASTER_IP=192.168.11.100MY_K8S_MASTER_HOSTNAME=k8s-b-master# 从名为 env-vars.env 的环境变量文件中创立名为 my-cf 的 ConfigMap。[root@k8s-b-master configmap-test]# kubectl create cm my-cf --from-env-file=env-vars.env configmap/my-cf created应用 YAML 文件创建 ConfigMap上面的 ConfigMap 资源有两个数据项,别离是 "db.yaml" 和 "default.yaml":apiVersion: v1kind: ConfigMapmetadata:  name: my-cm01data:  db.yaml: |    db:      dbname: cmdb      dbhost: 10.1.1.19  default.yaml: |    web:      domain: test.noblameops.local      ip: 10.1.1.10kubectl create -f my-cm01.yaml ❝ 这些数据项实质上是键值对,其中键是文件名,值是一个 YAML 格局的字符串,其中蕴含了应用程序所需的配置信息。 ❞ 上面的文件指定了两个键值对,别离是 MY_K8S_MASTER_HOSTNAME 和 MY_K8S_MASTER_IP:apiVersion: v1kind: ConfigMapmetadata:  name: my-cm02data:  MY_K8S_MASTER_HOSTNAME: k8s-b-master  MY_K8S_MASTER_IP: 192.168.11.100kubectl create -f my-cm02.yaml 查看 ConfigMap应用 kubectl 命令查看 ConfigMap[root@k8s-b-master configmap-test]# kubectl get configmapNAME               DATA   AGEkube-root-ca.crt   1      47hmy-cm01            2      96smy-cm02            2      9m47s字段解释: ...

May 5, 2023 · 1 min · jiezi

关于kubernetes:IDP中的黄金路径究竟是什么

在云原生时代,开发人员面临着越来越多的工具、技术、思维形式的抉择,给他们带来了极大的认知累赘和工作量。为了进步开发人员的开发效率与开发体验,一些头部科技公司开始建设本人的外部开发者平台(IDP)。在之前的文章咱们有简略理解过 IDP 相干的根底概念。IDP 是一套由平台工程团队保护的工具和技术,让开发者可能更快更便捷地构建和部署软件。IDP 通过抽象化基础设施的细节和提供统一、标准化的工作形式来帮忙缩小软件开发的复杂性和经营老本。  当然,IDP 并不是一个实用于所有状况的万能解决方案,不同业务对应的要求、技术和架构也会有所不同。因而,IDP 须要为开发人员提供一些具备灵活性和可定制的选项,以便为他们的业务用例抉择最佳计划。这就是黄金门路发挥作用的时候了。  在这篇文章中,咱们将聊聊黄金门路到底是什么,它的劣势和特点有哪些,以及企业为 IDP 建设黄金门路时须要留神什么。  什么是黄金门路?黄金门路(Golden Paths)是一种事后设置的架构和反对办法,用于在 IDP 上构建和部署特定类型的软件,是领导开发人员如何应用 IDP 的最佳实际。它能够涵盖从代码编写、测试、审查、集成、部署、监控等各个阶段的规范流程和工具。通过遵循黄金门路,开发人员不再须要学习用于创立该路线的技术的所有细节,由此开发人员的体验和生产力得以晋升,应用程序的品质和可靠性也失去了保障。  黄金门路的劣势企业建设 IDP 后,开发人员终于领有齐全属于他们的自助服务平台,黄金门路则可能为开发者们提供一个领有良好反对的开发门路。  黄金门路能够减速典型的利用开发用例。黄金门路可能提供资源库模板、流水线、部署清单以及可观测性配置,能够作为任何新我的项目的终点。而开发者们也因为不须要从头开始构建所有,也不必学习如何应用不同的工具和服务,大大节俭了工夫和精力。  与此同时,开发人员还可能参考并受害于黄金门路中的最佳实际和规范,从而进步代码的品质和配置的一致性。黄金门路体现了平台工程团队心愿在整个企业组织内推广的规范和治理,例如代码品质、平安、测试、性能等到你。这些最佳实际可能帮忙开发人员防止常见的陷阱和谬误,确保他们开发的应用程序可能满足企业和客户的冀望和要求。  在助力开发人员的同时,黄金门路也帮忙平台工程团队更好地进行保护和反对。因为黄金门路能够确保所有的应用程序遵循雷同的构造和格局,为应用程序的相干操作提供了更高的统一性,使得应用程序甚至是开发者平台变得更容易保护、排除故障和监控。这样还可能缩小应用环境的复杂性和可变性,进步整个零碎的稳定性与可靠性。同时,更好的统一性也能促成共享组件和接口的团队和我的项目之间的合作。  传统 DevOps 团队往往被繁琐的基础设施相干工作所牵绊。黄金门路则通过形象繁琐的基础设施决策来缩小操作累赘,开发者们不用放心底层基础设施的复杂性和可变性,也不必思考如何供给、配置、拓展活更新基础设施资源,专一于外围业务逻辑和策略,因为这些工作会由平台工程团队或工具自动化解决。这样一来,开发过程可能失去无效精简,同时人为谬误及谬误配置等危险得以升高。黄金门路还可能帮忙企业更好地治理和管制平台上的资源和工具,缩小冗余和节约。  黄金门路的特点黄金门路有一些独特的特点,使其无效和不便用户,依据 Raffaele Spazzoli 的观点,黄金门路的特点能够总结为以下: 灵便可选。黄金门路确实为开发者及其他相干团队带来许多劣势,但它不是 IDP 的惟一强制采纳形式,而是须要留有余地,容许和促成翻新。开发者们能够依据他们的须要和工作偏好,来抉择是否应用黄金门路。高度通明。黄金门路将业务从底层简单逻辑中形象进去,开发人员也因而节俭了学习底层技术和工具的工夫。当然这种形象并不是将底层基础设施覆盖起来,相同,在开发人员须要进行检查和细节批改时,这些底层技术是齐全通明可见的。例如,如果黄金门路应用 K8s 作为部署平台,开发人员该当依据本身业务需要,无障碍浏览和编辑 K8s 清单。与时俱进。黄金门路会依据用户的反馈和技术环境的变动而逐渐倒退,同时生成并随时更新相应的文档、反对技术和治理机制。比方,如果公布了新版本的框架和库,黄金门路该当相应更新,并将变动传播给用户。 企业如何为 IDP 构建黄金门路构建黄金门路须要平台团队和开发团队之间的单干。平台团队应提供实现黄金门路的基础设施和工具,而开发团队应提供塑造黄金门路的反馈和需要。  黄金门路的组成部分依据 RedHat 的文章,黄金门路通常由四个要害局部组成:仓库模板、流水线、部署清单、可观测性配置。当然依据各企业的应用程序不同,黄金门路的组成部分也会有所区别,但通常遵循都雷同的准则。  1. 仓库模板仓库模板是开发者写代码的终点。它蕴含了让开发者疾速开始所需的资源和配置。仓库模板应该是容易应用和了解的,同时合乎企业要求。现实状况下,仓库模板被放在一个地方仓库服务上,让开发者能够轻松复制或批改。  2. 流水线流水线是一系列的步骤,能够将代码构建并推送到生产环境。流水线应该蕴含所有企业认为必要的步骤,来确保代码是可信的。流水线应该是自动化且牢靠的,同时具备可配置性和灵活性。现实状况下,流水线与仓库服务或地方流水线服务集成,开发者就能够轻松地触发或监控流水线。  3. 部署清单部署清单是一组指令,形容了如何将应用程序部署到指标环境。它定义了利用程序运行所需的资源和配置。部署清单应该是申明式和幂等的。它也应该与指标环境保持一致和兼容。现实状况下,它应该应用一种规范格局或模板语言编写,让开发者能够轻松地自定义或参数化它。  4. 可观测性配置可观测性配置是一组能够从应用程序收集和剖析数据的设置。它定义了监控和排查应用程序所需的指标、日志、追踪和警报。可观测性配置具备全面性,同时与企业应用的可观测性工具和平台保持一致和兼容。现实状况下,可观测性配置嵌入在应用程序的代码或镜像中,或者提供为一个独自的配置文件。  构建黄金门路时须要思考什么?企业在为 IDP 构建黄金门路时,企业能够思考这几个方面: 理解开发人员的需要和痛点:在设计和构建黄金门路之前,须要与开发人员进行沟通和调研,充沛理解他们在开发过程中遇到的问题和挑战,以及他们冀望从 IDP 中取得的价值和反对。这样能够确保黄金门路可能满足开发人员的理论需要,而不是强加给他们不适宜或不必要的工具和流程。制订清晰和简洁的领导准则:在制订黄金门路时,须要遵循一些领导准则,以便为开发人员提供清晰和简洁的指引。例如: 优先思考自助服务:应该尽可能地提供自助服务的能力,让开发人员能够自主地获取和治理他们须要的资源,而不须要依赖运维或 DevOps 团队。这样能够进步开发人员的效率和灵活性,同时加重运维或 DevOps 团队的累赘。提供正当的束缚和抉择:在提供自助服务的同时,也提供正当的束缚和抉择,以避免出现适度简单或不统一的状况。例如,在 IDP 中预置一些模板或配置选项,让开发人员能够依据本人的需要进行抉择或批改,而不须要从零开始编写代码或脚本。同时,黄金门路也能够设定一些平安和合规的规定和限度,避免开发人员应用不适合或不平安的资源或工具。提供清晰和实用的文档、领导:在开发人员应用平台的过程中,黄金门路该当为开发者提供具体和易懂的阐明,比方,如何应用平台上提供的资源和服务,如何遵循最佳实际,以及如何解决可能遇到的问题。继续改良和更新:黄金门路应该依据开发人员的反馈和需要,继续改良和更新。例如,定期收集开发人员的意见和倡议,剖析他们的应用状况和满意度,找出平台的劣势和有余。同时,也能够依据市场的变动和技术的倒退,引入新的资源或工具,或者降级现有的资源或工具,以放弃平台的先进性和竞争力。 总结黄金门路是一个新兴概念,旨在通过 IDP 提供定制和反对的形式来构建和部署特定类型的软件,而开发团队在平台工程团队的反对下能够减速开发过程,并升高复杂性。黄金门路对于企业及其开发团队的价值不言而喻,但想要构建完满的黄金门路,企业仍须要一直在外部进行测试、部署、调整和迭代,以建设最佳实际和统一性。

May 5, 2023 · 1 min · jiezi

关于kubernetes:K8S部署WGCLOUD运维监控系统

1.WGCLOUD介绍 WGCLOUD属于极简及高效的主机监控零碎,反对主机各种指标监测,并且反对故障告警信息推送,开源零碎足以满足咱们对测试环境机器的监控,所以用起来。2.WGCLOUD基于K8S部署2.1.官网下载v3.4.6版本tar.gz安装包 wgcloud-v3.4.6.tar.gz2.2.新建数据库,导入数据 (1)解压wgcloud-v3.4.6.tar.gz安装包(2)在解压目录下会发现wgcloud-MySQL.sql、wgcloud-Oracle.sql和wgcloud-PostgreSQL.sql三份sql文件(3)依据本人的须要抉择对应的sql文件导入,笔者这里以mysql为主(4)批改server/config/application.yml文件的数据库连贯信息,更新为本人的数据库连贯信息及对应的驱动即可2.3.编写server端Dockerfile #根底镜像FROM java:8#作者MAINTAINER xxx <xxx@xxx.com>#切换镜像目录,进入usr目录WORKDIR /wgcloudRUN mkdir wgcloudADD . /wgcloud/RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo 'Asia/Shanghai' >/etc/timezoneCMD ["/wgcloud/wgcloud/server/start.sh"]2.4.制作镜像 docker buld -t harbor.xxx.xxx/qa-dev/wgcloud/wgcloud:v1 .2.5.将镜像推送至harbor仓库 docker push harbor.xxx.xxx/qa-dev/wgcloud/wgcloud:v12.6.编写k8s yaml文件 kind: Deploymentmetadata: name: wgcloud-deployment labels: app: wgcloud namespace: k8s-jenkins #这里依据本人的namespace做调整spec: replicas: 1 #管制治理运行的pod个数 selector: matchLabels: #标签 app: wgcloud template: metadata: labels: app: wgcloud spec: containers: - name: wgcloud image: harbor.xxx.xxx/qa-dev/wgcloud/wgcloud:v1 imagePullPolicy: Always ports: - containerPort: 9997 #容器裸露的端口号-1 - containerPort: 9998 #容器裸露的端口号-2 - containerPort: 9999 #容器裸露的端口号-3 imagePullSecrets: - name: docker-harbor-slave---apiVersion: v1kind: Servicemetadata: name: wgcloud-servicespec: selector: app: wgcloud ports: - name: http-test1 port: 9997 protocol: TCP nodePort: xxx-1 #依据本人的nodePort做调整 - name: http-test2 port: 9998 protocol: TCP nodePort: xxx-2 - name: http-test3 port: 9999 protocol: TCP nodePort: xxx-3 #指定节点凋谢的端口 type: NodePort selector: app: wgcloud2.7.接入jenkins,pipeline ...

May 4, 2023 · 2 min · jiezi

关于kubernetes:基于-Rainbond-的混合云管理解决方案

内容概要:文章探讨了混合云场景中的难点、要点,以及Rainbond平台在跨云平台的混合云治理方面的解决方案。包含通过通过对立控制台对多集群中的容器进行编排和治理,实现了对混合云中利用的一致性治理。文章还介绍了Rainbond平台在混合云环境下的利用模板交付、跨云团队治理等性能,帮忙用户简化跨云平台的利用交付和运维操作。 混合云的利用场景随着云原生技术的逐步成熟,混合云成为了企业在云原生畛域中的热门话题之一。混合云的场景特点是企业应用和数据在多个云环境中进行部署和运行,包含公有云和私有云,以及不同的云服务提供商。这样的场景带来了许多挑战和时机。 混合云的价值点次要在于: 灵活性和可扩展性:混合云可能让企业在不同云环境中抉择最适宜的部署计划,使得利用和服务的部署更加灵便和可扩大。高可用性和容灾能力:混合云可能通过在多个云环境中部署利用和数据,进步零碎的可用性和容灾能力,从而缩小零碎停机工夫和数据损失。降低成本:混合云可能让企业依据利用和数据的需要,在不同的云环境中抉择最优惠的价格和性能比例,从而升高总体老本。混合云治理要点混合云场景相较于繁多的公有云或专用云场景而言简单很多,建设混合云的难点往往来自于不同供应商提供的云平台之间有很多差别,很难做到对立的治理体验。而且,多个供应商提供的云平台之间不互通,跨云进行数据同步时,须要思考一致性与安全性。 跨云平台标准化:不同的云平台之间存在着各种差别,使得跨云平台的操作和治理变得复杂。标准化可能让不同平台之间的操作和治理更加统一,缩小治理难度。数据一致性:不同云平台之间的数据交换和同步须要确保数据一致性,以防止数据抵触和失落。安全性:在混合云场景下,不同云平台之间的数据和利用须要失去适当的平安爱护,以保障数据的机密性和完整性。用户治理:在混合云场景下,不同的云平台之间的用户体系并不相通。对立的混合云治理平台可能利用一套用户体系纳管多个集群中的计算资源,极大的升高了治理老本。混合云场景性能需要在混合云场景中,以下跨云性能通常具备很强的需要: 一致性操作体验:以一致性的治理体验,抹平用户应用不同云资源的操作差别。使得用户能够通过一套操作,实现利用从公布到上线到多个云环境的外围过程。一致性操作体验能够极大的弱化用户在面对多个不同云环境的不适感,使底层计算资源对用户通明。用户治理:通过在对立控制台层面形象用户体系,实现一套用户治理所有集群的成果。能够极大的升高企业治理老本。跨云迁徙和部署:随着企业在多个云平台上部署应用程序,跨云迁徙和部署变得十分重要。可能将应用程序从一个云平台迁徙到另一个云平台,无缝部署并在多云环境中进行治理,将大大提高企业的灵活性和敏捷性。多云容灾:因为云服务提供商可能会遇到可用性问题,因而在混合云场景中,多云容灾变得十分重要。通过在多个云平台上部署应用程序,企业能够在一个云平台遇到问题时,疾速切换到另一个云平台上运行,以放弃业务的连续性。跨云数据管理:在混合云场景中,跨云数据管理也是一个重要的需要。可能在多个云平台上进行数据备份和复原,以及在不同云平台之间共享数据,将为企业提供更强的灵活性和可扩展性。基于Rainbond 的混合云建设Rainbond云原生利用治理平台在设计之初就思考了如何适应混合云治理场景。在产品设计中,Rainbond能够从逻辑上划分为控制台和集群端组件两大部分,其中控制台的多云治理模块能够使其对接并治理多个集群。而集群端组件能够部署在各类 Kubernetes 集群之中,通过与 Kube-apiserver 的通信来治理 Kubernetes 集群之中的各类资源。Rainbond 集群端组件能够部署到各类 Kubernetes 集群之中,包含规范 Kubernetes 集群、 K3s 集群,也能够部署到阿里云ACK托管服务、腾讯云 TKE 服务等托管集群之中。并可能适配私有云服务商所提供的多种云服务,比方通过CSI为业务Pod调配阿里云硬盘存储。 Rainbond控制台则提供了多集群治理的惟一入口,用户不须要过多学习,就能够把握面向不同云环境公布利用的操作步骤。而这些操作步骤是对立且易用的,不受低层不同云环境的掣肘。 团队工作空间隔离Rainbond云原生利用治理平台在控制台层建设用户体系,这意味着用户体系与低层云环境无关,Rainbond 通过本身RBAC权限体系来决定用户能够拜访哪些云环境所对应的工作空间中的资源。Rainbond 通过团队这一抽象概念来划分用户的工作空间。团队与低层云环境的对应关系能够是共享的,也能够是独享的。用户一旦退出指定的团队,即可应用团队所开明的集群。 共享模式:即一个团队在多个不同的集群中开明,团队一旦在多个集群中开明,就会在其中同时创立同名的命名空间。在这个团队中的用户,天然能够在不同的集群中部署本人的业务零碎。不同集群的操作入口由控制台提供,非常容易了解。独享模式:独享模式更好了解,即在指定的集群中开明命名空间与之对应,用户仅能够应用这个集群中的计算资源。基于团队这一工作空间的形象,用户能够在其中实现利用的公布与治理操作。Rainbond 提供更多能力丰盛其治理能力,包含操作审计、资源限额、权限治理等能力。 多云容灾混合云多云容灾是在混合云场景中,为了确保利用的高可用性和容灾能力而采取的一种策略。在混合云环境中,因为利用可能部署在不同的云平台上,因而须要确保即便某一云平台呈现故障或不可用,利用仍可能在其余云平台上持续运行。这就须要实现混合云多云容灾,使得利用能够在不同云平台之间实现无缝切换,确保利用的高可用性和容灾能力。 Rainbond 的多云管理机制为多云容灾打造了松软的低层框架,纵使 Rainbond 在本身高可用能力上投入甚多,但咱们仍然不能假设集群级别的宕机解体不会产生。生产环境中常借助云服务商提供的其余能力一起建设强壮的多云容灾场景。额定要援用的能力包含: 智能化的网络入口切换能力:Rainbond 依附 CDN 和智能 DNS 的合作,实现网络入口智能切换的能力。在平时,内部流量能够依据地区主动切换到就近的网关进行拜访。在集群级别的宕机产生时,则将有故障的集群入口下线。数据同步能力:无论用户拜访到哪一个集群中的服务,都会失去同样的反馈,保障这个成果的前提是多个集群中的业务数据实时同步。Rainbond 不提供数据同步能力,这一部分咱们须要依附私有云供应商提供的数据同步服务来保障。阿里云提供的 DTS 服务是其中的代表。专线网络能力:多个集群之间的数据同步往往不会轻易从公共网络中穿梭。从安全性和可靠性的角度登程,咱们更偏向于应用专线网络进行多个集群之间的通信,尤其是在数据跨云同步场景里。从整体架构上思考多云容灾是咱们的首要任务。但面对数据劫难,咱们能做的不仅仅是防患未然,如何进行劫难后的复原也是十分重要的一环。Rainbond云原生治理平台提供两个档次的备份恢复能力,首先是为Rainbond平台自身进行备份,确保平台本身能够复原;其次是针对利用的备份能力,可能将包含长久化数据在内的利用进行整体备份。机房能够被和平、火灾或者天然灾害捣毁,但只有运维人员手里领有备份数据,整个Rainbond混合云平台及运行其上的利用就能够被重建。 跨云利用部署在混合云场景中,业务利用是一等公民,利用如何可能在不同的云环境中自在部署实际上是对混合云治理场景最根底的要求。在这个方面,Rainbond云原生利用治理平台以利用模板的交付流程来买通利用跨云部署的屏障。 利用交付始终是 Rainbond 致力解决的痛点问题。古代微服务动辄会将业务零碎拆分成为几十个互相关联的微服务,利用传统形式将其部署到 Kubernetes 容器云环境中,未免要为数十份简单的 Yaml 文件和容器镜像头痛不已。加之不同的云供应商所提供的云环境也不雷同,更加劫难化了利用交付的体验。 前文中曾经说到,Rainbond云原生利用治理平台曾经在混合云场景下抹平了不同云环境的应用体验。在利用跨云交付场景中也是如此,简单的微服务零碎在 Rainbond 中被形象成为了一个能够对立治理、对立交付的利用。通过将利用公布成为利用模板,即可在不同的集群之间实现一键装置和降级。极大的升高了软件交付老本。 写在最初混合云治理场景是眼下云计算畛域最煊赫一时的话题,利用 Rainbond 云原生利用治理平台打造的混合云能够解决大多数难点与痛点。面向未来瞻望,Rainbond 会在混合云治理畛域持续发力,围绕更简单的场景,纳管更多种不同的云资源。比方通过与 Kubedge 的集成,将混合云解决方案扩大到边缘计算场景。

May 4, 2023 · 1 min · jiezi

关于kubernetes:值得收藏K8S的kubectl常用命令已经按场景分好类请您查阅

kubectl知多少kubectl 是 K8S 中的一个命令行工具,次要用于治理和操作 K8S 集群。kubectl 通过向 K8S API 发送 REST 申请,容许用户与 K8S 集群中的各种资源进行交互,例如 Pod、Service、Deployment 等。kubectl 提供了一种简略而灵便的形式来治理和操作 K8S 集群,它反对交互式和批处理操作,能够轻松地进行自动化解决。 上面是一个简略的逻辑结构图,阐明 kubectl 命令如何与 K8S API Server 交互,以治理 K8S 集群中的资源。 kubectl 通过向 API Server 发送 REST API 申请来治理 K8S 集群中的资源,它接管来自 kubectl、kubelet、kube-proxy 和其余 K8S 组件的申请,并响应这些申请。 在 K8S 运维中,会常常应用kubectl,本篇梳理了kubectl罕用的保护命令和选项,并按场景进行了分类。对于更多详情,可参考官网文档:https://kubernetes.io/docs/reference/generated/kubectl/kubect...获取信息kubectl get:获取 Kubernetes 资源的信息,例如节点、服务、Pod、配置等。kubectl describe:显示特定资源的详细信息。kubectl logs:获取 Pod 的日志。kubectl top:查看节点和 Pod 的 CPU 和内存应用状况。调试和诊断kubectl exec:在容器中执行命令。kubectl port-forward:将本地端口转发到 Pod 端口。例如:kubectl --namespace monitoring port-forward --address 0.0.0.0 svc/prometheus-k8s 9090kubectl run:在集群中创立一个新的 Pod,并在其中运行一个容器。kubectl attach:连贯到正在运行的容器。kubectl debug:启动一个调试容器并将其连贯到指定的 Pod 上。状态治理kubectl create:创立 Kubernetes 资源。kubectl apply:对已存在的 Kubernetes 资源进行更新操作。kubectl delete:删除 Kubernetes 资源。kubectl edit:在编辑器中编辑资源配置文件。kubectl label:为资源增加或批改标签。kubectl annotate:为资源增加或批改正文。扩缩容kubectl scale:扩大或放大 Deployment、StatefulSet等的正本数。kubectl autoscale:创立 Horizontal Pod Autoscaler 对象,依据 CPU 或自定义指标来主动扩缩容 Pod。部署治理kubectl rollout:对 Deployment、DaemonSet、StatefulSet 等进行滚动降级。kubectl rollout history:查看部署历史记录。kubectl rollout undo:回滚部署操作。kubectl patch:通过局部更改来更新 Kubernetes 资源。平安和身份验证kubectl auth:治理身份验证和受权。kubectl create secret:创立用于身份验证和受权的 Kubernetes 密钥。kubectl certificate:治理 TLS 证书和私钥。最初以上就是 kubectl 罕用的一些保护命令和选项,须要的敌人请珍藏。对于更多详情,可间接参考官网文档:https://kubernetes.io/docs/reference/generated/kubectl/kubect...本文转载于WX公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/pW0vxt8k1pDk0OEz5asWGQ ...

May 2, 2023 · 1 min · jiezi

关于kubernetes:K8s-CSI-ceph-构架图解和一些闲话

图源:Mr. Bean's Holiday (2007) - Bean 经验万难,最终发现他的假期目的地 云存储的学习艰难,难于 K8s CSI 框架复杂性,再加上如 ceph 分布式存储的复杂性。本文试图用互动式图例,让读者串联起两个畛域本身与畛域间的知识点,从而对整个流程有一个总体的感知;防止自觉深刻一个一个零散的知识点孤岛而迷路。 注:因为是在 2023 年五一假期写的,本文的口味会轻松点。也可能会跑题和闲话,毕竟这只是个集体博客,不是个“极客工夫”上的免费文章,不能要求太高了 :)引最近因为生存须要,学习了之前始终写在学习清单,而总想回避的 k8s 存储架构。为备忘,写下这个笔记。如果能帮忙到更多的人去学习这个技术难点,当然更好了。 K8s 几大难点 学习过 k8s 的人,我想都感觉有点记忆过载,设计简单,材料多而散,说形象的太多说实现的少。用麦兜的一句经典表白是: 教大家一味很別緻的小菜----包雞紙包雞紙包雞,首先將紙包雞小心臟撩開,大家就會有一張包雞紙及一塊雞,拿著雞包紙像我這樣子包住那塊雞,然後再像這種子用包雞紙包包住它,那一味包雞紙包雞包紙包雞就实现了!是不是很簡單單啊?還真有一塊雞吃呢! 我感觉有几个难点,同时也是重点: 对象(冀望状态)、事实状态、监听、事件、和谐网络:之前写过的 calico 文章:《一个IP包的旅行 —— K8s 网络之 Calico 浅度解构》CSI:本文CRI:未深刻多年信息技术学习,积攒的学习办法不多,但有一点我坚信不移: “Bad programmers worry about the code. Good programmers worry about data structures and their relationships.” ― Linus Torvalds 在所谓的微服务架构下,情理也是相似的: 学习外围数据模型与分割,我称之类动态模型学习服务之间的状态变动与数据流转的关系,我称之为动静行为如何开始如何学习形象学习形象的常识(如 k8s CSI)时,最好的办法是不要间接学习形象的常识。如何了解?形象是设计者在常识畛域充沛积攒和提炼后的输入,形象自身是精简且易于流传的。但和过分提炼的食物一样,也通常是难于消化的。 人脑天然上是比拟适宜学习具体事物,而后提炼出形象。且不是间接学习形象。如果你学习 k8s CSI,那么找个实例来捉弄,是最快的学习过程。 上面,咱们用自底向上+用实例代替形象的办法,学习一下 k8s CSI 与 Ceph。 本文的浏览办法互动图片 本文提供的技术相干图片,均可点击 “用 Draw.io 关上” 后,进入互动图片状态。图中很多元素(带下划线)提供链接到相干材料文档。能够做穿插参考,是进一步深刻的入口,也是图的可信性取证。本文的大部分内容是放在图中了。看图比文字更重要。 ...

April 30, 2023 · 1 min · jiezi

关于kubernetes:上篇带你手工体验从写代码编译打包镜像部署到K8S的全过程

本篇应用的goweb demo,页面很简略,性能也是很简略,写代码不是本篇的重点,重点是先体验一下整个流程:开发环境筹备、写代码、提交到仓库、拉取代码构建并打包镜像、推送到镜像仓库,部署到K8S。 本篇的分享分为上篇和下篇,上篇是手动,打算在下篇再讲主动。只有手动体验过,能力更能深刻的了解外面的流程、细节,前面再把这个流程革新为全程自动化就是信手拈来的事件。如果连手工部署都跑不通,还想谈自动化呢?如果是在企业里,谈自动化之前还得先把标准化流程给落实了,再来谈自动化。 golang开发环境筹备下载golang二进制包wget https://golang.google.cn/dl/go1.19.3.linux-amd64.tar.gztar -zxf go1.19.3.linux-amd64.tar.gz mv go /usr/local/在/etc/profile配置环境变量export GOROOT="/usr/local/go"export GOPATH="/data/project/gocode"export GOPROXY="https://goproxy.cn,direct"export GO111MODULE="on"export PATH=$PATH:$GOROOT/bin:$GOPATH# 使其失效source /etc/profileGOPROXY示意的是go的代理设置,当主动下载第三方代码的库地址时,go默认是国外下载,所以配置代理,加快速度,国内个别应用七牛云的goproxy.cn进入$GOPATH创立src、pkg、bin目录[root@workhost ~]# cd $GOPATH[root@workhost gocode]# mkdir bin pkg src写代码一个简略的我的项目构造[root@workhost goweb]# tree.├── go.mod├── main.go├── README.md└── static    └── login.html写一个简略的前端页面static/login.html <!DOCTYPE html><html lang="zh-CN">    <head>        <title>不背锅运维</title>        <meta charset="utf-8">        <meta name="viewport" content="width=device-width, initial-scale=1">        <link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">        <script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>      </head><body class="bg-dark bg-opacity-76"><div class="container vh-100">    <div class="row vh-100">        <div class="col-4 m-auto p-5 justify-content-center bg-white rounded">            <form action="/login" method="post">                <div class="mb-3">                    <label class="form-label mb-1 text-black-50">用户名:</label>                    <input type="text" class="form-control" name="account">                </div>                <div class="mb-4">                    <label class="form-label mb-1 text-black-50">明码:</label>                    <input type="password" class="form-control" name="password">                </div>                <div class="mb-1">                    <button type="submit" class="form-control btn-primary">登录</button>                </div>            </form>            <div class="container mt-3 justify-content-center">                <div class="container">                    <p class="text-danger">{{.Msg}}</p>                </div>            </div>        </div>    </div></div></body></html>后端代码main.go package mainimport ( "log" "net/http" "text/template")type Message struct { Msg string}func home(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" {  w.Header().Set("Location", "/login")  w.WriteHeader(http.StatusFound) }}func login(w http.ResponseWriter, r *http.Request) { t, _ := template.ParseFiles("./static/login.html") if r.Method == "GET" {  t.Execute(w, nil) } else {  r.ParseForm()  account := r.Form["account"][0]  userPwd := r.Form["password"][0]  if account == "tantianran" {   if userPwd == "1qaz#EDC" {    msg := Message{Msg: "祝贺!验证通过O(∩_∩)O"}    t.Execute(w, msg)   } else {    msg := Message{Msg: "明码谬误..."}    t.Execute(w, msg)   }  } else {   msg := Message{Msg: "用户名谬误..."}   t.Execute(w, msg)  } }}func main() { http.HandleFunc("/", home) http.HandleFunc("/login", login) listenAddr := ":80" log.Println("ListenAndserve", listenAddr) err := http.ListenAndServe(listenAddr, nil) if err != nil {  log.Println(err) }}看看页面成果 提交到gitabgit add .git commit -m "add code"git push编译和打包镜像编译[root@workhost src]# git clone http://192.168.11.254:8088/tantianran/goweb.git^C[root@workhost src]# cd goweb/[root@workhost goweb]# go build main.go 编写Dockerfile这个 Dockerfile 的作用是将一个 Golang Web 应用程序打包为一个 Docker 镜像,使其能够在 Docker 容器中运行并通过 80 端口对外提供服务。 FROM golang:latestWORKDIR /appCOPY static /app/staticCOPY main /appEXPOSE 80CMD ["./main"]指令解释: 开始构建镜像依据 Dockerfile 构建一个 Docker 镜像并给镜像打上标签。 docker build -t 192.168.11.254:8081/webdemo/goweb:20230427v1 .                  启动容器docker run -d -it --name goweb -p 8090:80 192.168.11.254:8081/webdemo/goweb:20230427v1拜访 推送到公有仓库确保镜像没问题之后,推送到Harbor docker push 192.168.11.254:8081/webdemo/goweb:20230427v1装置ingress-nginx这里我打算应用ingress的形式来裸露利用,应用比拟支流的ingress-nginx。部署ingress-nginx因为是内网的K8S测试集群,为了可能疾速测试,以下deploy.yaml中裸露Controller的形式是应用NodePort,这种形式实用于简直所有的集群,但通常会应用30000-32767范畴内的端口。 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/baremetal/deploy.yaml部署完后查看:tantianran@k8s-b-master:~/nginx-ingress$ kubectl get pod,svc -n ingress-nginxNAME                                            READY   STATUS      RESTARTS   AGEpod/ingress-nginx-admission-create-6fp24        0/1     Completed   0          9m54spod/ingress-nginx-admission-patch-nvtjv         0/1     Completed   0          9m54spod/ingress-nginx-controller-6b87568f97-kpms9   1/1     Running     0          9m54sNAME                                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGEservice/ingress-nginx-controller             NodePort    10.96.106.100    <none>        80:31179/TCP,443:30701/TCP   9m55sservice/ingress-nginx-controller-admission   ClusterIP   10.106.222.181   <none>        443/TCP                      9m55stantianran@k8s-b-master:~/nginx-ingress$ 手工部署到K8S部署Deployment、Service以及创立Ingress规定apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: goweb  name: gowebspec:  replicas: 1  selector:    matchLabels:      app: goweb  template:    metadata:      labels:        app: goweb    spec:      containers:      - image: 192.168.11.254:8081/webdemo/goweb:20230427v1        name: goweb---apiVersion: v1kind: Servicemetadata:  labels:    app: goweb  name: gowebspec:  ports:  - name: http-port    port: 5678    protocol: TCP    targetPort: 80  selector:    app: goweb  type: ClusterIP---apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: gowebspec:  ingressClassName: nginx  rules:  - host: "test.goweb.com"    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: goweb            port:              number: 5678部署实现后查看tantianran@k8s-b-master:~/goweb$ kubectl get svc,pod,ingressNAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGEservice/goweb        ClusterIP   10.111.92.32   <none>        5678/TCP   2m4sservice/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP    23hNAME                                         READY   STATUS    RESTARTS      AGEpod/goweb-57c44c897d-frxf6                   1/1     Running   0             2m4spod/nfs-client-provisioner-6685d955d-p9w57   1/1     Running   1 (12m ago)   12hNAME                              CLASS   HOSTS            ADDRESS          PORTS   AGEingress.networking.k8s.io/goweb   nginx   test.goweb.com   192.168.11.101   80      2m4stantianran@k8s-b-master:~/goweb$ 增加域名映射举荐大家应用SwitchHosts工具来治理hosts,不便日常测试。 测试拜访 本文转载于WX公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/YGhndR5zR-Ebf8IaKbFZiQ

April 28, 2023 · 1 min · jiezi

关于kubernetes:6个优化策略助你降低K8S成本

Kubernetes 早已成为容器编排引擎的事实标准,而随着 Kubernetes 环境的复杂性持续增长,老本也在一直攀升。CNCF 公布的调查报告《Kubernetes 的 FinOps》显示,68%的受访者示意 Kubernetes 开销正在上涨,并且一半的人所在的组织经验了每年超过20%的开销增长。  因而,Kubernetes 老本治理和优化亟需失去系统管理员的器重。本文咱们将理解6个优化 Kubernetes 老本的策略和办法。  1、正当调整 Pod 和节点降低成本最简略的形式之一是治理 Pod 和节点应用的资源。只管通常的倡议是留有足够的机动空间,但适度配置或容许应用程序无限度地应用资源会带来灾难性的结果。例如,假如一个Pod因为应用程序的谬误而耗费了节点的所有可用内存,不必要地利用了资源,这会导致其余 Pod 齐全没有资源可用。  为防止这一状况的产生,用户能够在命名空间级别用 Kubernetes 资源配额和限度区间来限度资源利用率。此外,还能够在容器层面上指定资源申请和限度,强制执行容器能够申请多少资源以及资源的最大限度。  节点的大小取决于 Pod 所应用的资源。如果你的工作负载只利用了节点中50%的资源,并且短期内资源使用量不会激增,那么用户能够适当放大节点的规模以降低成本。  另一个思考因素是调整在单个节点上能够运行的 Pod 数量。即使在没有硬性限度的状况下,在单个节点上运行大量的 Pod 也会导致资源利用效率低下。鉴于这类状况,一部分K8S的托管服务提供商曾经限度了单个节点上能够运行 Pod 的数量。  2、监控集群和基础设施正当监控集群环境,包含底层或依赖项资源,有助于治理老本。无论你是应用托管的 Kubernetes 集群还是自建的集群,监控资源利用率和总体老本都是降低成本的第一步,这可能让用户高深莫测地理解计算、存储、网络利用率等状况,以及老本在它们之间的散布状况。  云厂商通常可能提供内置工具和根本的监控性能。而利用 Prometheus、Kubecost 等工具能够让用户取得更为全面的洞察。近日公布的利用对立部署与治理平台 Seal AppManager 中也内置了老本治理视图,提供 Kubernetes 的资源开销、共享费用(如闲暇费用、管理费用)的老本汇算和摊派,并内置多维度老本剖析视图为用户提供老本洞察。另外,用户也能够根据集群、我的项目、利用等维度自定义老本视图。   3、配置弹性伸缩Kubernetes 反对3类弹性伸缩: HPA:主动程度伸缩VPA:垂直主动伸缩集群主动伸缩 主动充分利用 Kubernetes 弹性伸缩的个性能够帮忙用户以一种简略、高效的形式升高整体 Kubernetes 老本。  HPA 能够监控 Pod 的应用状况,主动调整大小,以放弃预期的应用程度。VPA 则能够调整集群中的资源申请和容器限度。主动伸缩会依据需要主动从 Kubernetes 集群中增加或删除节点,它有助于确保工作负载总是有足够的基础设施资源来实现它们的工作,但又不至于让用户最终为闲置的基础设施付费。  现阶段而言,并非所有的 Kubernetes 服务或发行版都反对主动伸缩。然而,如果你所采纳的服务反对,那么它能够帮忙你大幅升高 Kubernetes 老本。  4、为 K8s 工作负载抉择不同的购买策略对于 AWS 或者 GCP 来说,按需实例是最低廉的选项。因而,咱们应该充分利用预留的实例甚至是 Spot instances(竞价型实例)。  ...

April 27, 2023 · 1 min · jiezi

关于kubernetes:关于K8S-Operator的那点破事

Kubernetes Operator是什么K8S Operator这个货色不好解释,这么说吧,比方有一个应用程序,并且想要将其部署到 k8s 上,并且心愿可能实现自动化运维和可扩展性,那么就能够思考应用 K8S Operator 的框架,将应用程序的治理逻辑形象为 k8s 资源,并编写自定义 Operator 来治理和运维该应用程序。 还是有点懵?我举个例子:有一个基于 Kafka 的音讯队列应用程序,想将其部署到 k8s 并实现自动化运维和可扩展性,就能够应用 Kubernetes Operator 的框架来治理和运维该应用程序了。 如果还是有疑难,更多详情可参考官网文档:https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/o... 剖析之前部署过的Prometheus Operator官网文档:https://prometheus-operator.dev/ 查看Api Resources,发现prometheus被定义为了 Kubernetes API 中的一个自定义资源:[root@k8s-a-master prometheus-operator]# kubectl api-resources | grep prometheusprometheusagents                  promagent    monitoring.coreos.com/v1alpha1         true         PrometheusAgentprometheuses                      prom         monitoring.coreos.com/v1               true         Prometheusprometheusrules                   promrule     monitoring.coreos.com/v1               true         PrometheusRule[root@k8s-a-master prometheus-operator]# 查看用于定义 Prometheus 实例的自定义资源类型:[root@k8s-a-master prometheus-operator]# kubectl get prometheusNAME         VERSION   DESIRED   READY   RECONCILED   AVAILABLE   AGEprometheus             3         3       True         True        54s上面的yaml文件是我之前用来创立prometheus实例的,通过它能够主动创立、更新和删除 Prometheus 实例: apiVersion: monitoring.coreos.com/v1kind: Prometheusmetadata:  name: prometheusspec:  serviceAccountName: prometheus  replicas: 3  alerting:    alertmanagers:    - namespace: default      name: alertmanager-example      port: web  serviceMonitorSelector:    matchLabels:      team: frontend  podMonitorSelector:    matchLabels:      team: frontend  resources:    requests:      memory: 400Mi  enableAdminAPI: false  ruleSelector:    matchLabels:      role: alert-rules      prometheus: example  ruleNamespaceSelector: {}下面yaml中 “kind: Prometheus” 是 Prometheus Operator 用于创立 Prometheus 实例的 Kubernetes 自定义资源类型之一。 接下来看看带3个正本的prometheus pod:[root@k8s-a-master prometheus-operator]# kubectl get podNAME                                   READY   STATUS    RESTARTS   AGEprometheus-prometheus-0                2/2     Running   0          22sprometheus-prometheus-1                2/2     Running   0          22sprometheus-prometheus-2                2/2     Running   0          22s小总结通过简略剖析曾经很分明了,Prometheus Operator 是一个 Kubernetes 控制器,它负责监督 Kubernetes API 中的 Prometheus 资源(包含 kind: Prometheus)的变动,并依据资源定义来治理 Prometheus 实例。Prometheus Operator 能够依据 Prometheus 自定义资源中定义的规定来创立、更新和删除 Prometheus 实例,并且反对主动发现和配置 Prometheus 监控对象,如 Kubernetes Service、Pod 等。 ...

April 26, 2023 · 1 min · jiezi

关于kubernetes:是不是都把SELinux给忘了

SELinux是什么鬼SELinux(Security-Enhanced Linux)是一个平安模块,内置于 Linux 内核中,为 Linux 零碎提供了一个额定的平安层。它通过施行强制访问控制(MAC)来限度过程的拜访权限,能够帮忙避免恶意软件和攻击者对系统的攻打。与传统的基于用户/组的访问控制(DAC)不同,SELinux 应用安全策略(如标签和规定)来治理过程、文件、网络端口等资源的拜访权限。这些策略能够依据特定的应用程序或零碎环境进行自定义配置,使系统管理员可能更精密地控制系统的安全性和爱护零碎免受潜在的平安威逼。 大部分都敞开了selinux据我所理解,尽管SELinux提供了额定的平安保障,但在生产环境中,大部分工程师都是抉择敞开SELinux,包含我也是。这是因为在默认状况下,SELinux所提供的安全策略可能会对某些应用程序或零碎服务的失常运行产生限度或问题,这可能须要进行一些配置调整。因为SELinux自身的复杂性和学习老本,这些调整可能会须要破费较长的工夫来实现,从而影响生产环境的部署和保护效率。 尽管敞开SElinux后使在运维工作中更加不便,但始终都是要在“不便”和“麻烦”之间做出抉择,平安了就天然会变得麻烦,但不便了也不肯定是不平安,但也不肯定是平安。如果是处于DMZ区域对外提供服务的linux操作系统敞开SELinux是有肯定危险的,如果零碎中存在潜在的安全漏洞或攻打,敞开 SELinux 可能会升高零碎的安全性。实战场景大部分人抉择敞开SElinux,从而导致很多人对SElinux的配置办法都曾经忘记了吧?本篇对SElinux的配置做个分享。间接通过一个可能在理论运维工作中用得上的小场景案例来阐明整个配置过程,勾起一下你那惨痛的背锅经验。场景:假如有一台Web服务器,须要运行Nginx和PHP-FPM来提供Web服务,同时须要拜访MySQL数据库。为了增强服务器的安全性,须要启用SELinux,并依据须要进行相应的配置。 查看SELinux状态和模式[root@workhost ~]# sestatus SELinux status:                 disabled# 或[root@workhost ~]# getenforce Disabled永恒开启SELinuxcat > /etc/selinux/config << EOFSELINUX=enforcingSELINUXTYPE=targetedEOF重启零碎,使更改失效。 留神:SELinux将在系统启动时主动启用并应用指定的模式。如果之前禁用了SELinux,当初启用它可能会影响零碎的行为。重启后再次查看状态: [root@workhost ~]# sestatus SELinux status:                 enabledCurrent mode:                   enforcing配置SELinux以容许Nginx和PHP-FPM服务提供Web服务。因为Nginx和PHP-FPM须要绑定到网络端口,须要批改SELinux策略以容许它们执行此操作,为Nginx和PHP-FPM配置SELinux:[root@workhost ~]# semanage port -a -t http_port_t -p tcp 80[root@workhost ~]# semanage port -a -t http_port_t -p tcp 443将端口80和443增加到SELinux的http_port_t类型中,以容许Nginx和PHP-FPM服务绑定到这些端口。 配置SELinux以容许MySQL服务拜访。因为MySQL服务须要读取和写入数据文件,因而须要批改SELinux策略以容许它执行此操作。能够应用以下命令为MySQL配置SELinux:[root@workhost ~]# semanage port -a -t mysqld_port_t -p tcp 3306将端口3306增加到SELinux的mysqld_port_t类型中,以容许MySQL服务拜访该端口。 配置SELinux以容许Nginx和PHP-FPM服务拜访MySQL数据库,批改SELinux策略以容许它们执行此操作:[root@workhost ~]# setsebool -P httpd_can_network_connect_db 1将SELinux的httpd_can_network_connect_db选项设置为1,以容许Nginx和PHP-FPM服务连贯到MySQL数据库。 测试SELinux配置,确保所有服务都能够失常拜访并运行[root@workhost ~]# systemctl restart nginx php-fpm将重新启动Nginx和PHP-FPM服务,并查看是否呈现任何谬误。 还能够应用以下命令测试MySQL的配置: [root@workhost ~]# mysql -h 192.168.11.10 -u cmdbuser -p此命令将连贯到MySQL数据库并验证是否能够失常读取和写入数据。 对于php-fpm端口留神了,默认状况下,PHP-FPM并不应用网络端口来提供服务,而是通过UNIX套接字(Unix socket)来与Nginx进行通信。我的Nginx和PHP-FPM都在同一台服务器上,则不须要为PHP-FPM配置SELinux端口。如果PHP-FPM须要与其余服务器进行通信,例如通过网络连接到一个近程的数据库服务器,那么就须要为PHP-FPM配置SELinux端口以容许它连贯到其余服务器的网络端口。在这种状况下,能够应用semanage命令为PHP-FPM配置SELinux端口,就像方才为MySQL服务做的那样。 最初的总结SELinux的工作机制基于标签(Label)和策略(Policy)。每个过程、文件、目录、套接字等系统资源都被赋予一个惟一的标签,这些标签被用来批示该资源的安全级别。策略则定义了哪些过程或用户能够拜访或操作哪些资源,并规定了对这些资源的拜访权限。 SELinux有三种模式:Enforcing、Permissive和Disabled。 Enforcing模式:是默认模式,也是最平安的模式,它强制执行SELinux策略,只容许拜访和操作通过受权的资源,对未受权的拜访进行回绝和记录。如果一个过程或用户尝试拜访或操作未受权的资源,它将被回绝并记录日志。Permissive模式:与Enforcing模式相似,然而它不会回绝未受权的拜访和操作,而是记录日志。这个模式能够用来测试策略,找到须要批改的中央。Disabled模式:禁用SELinux,零碎将不会利用SELinux的策略,所有的拜访和操作将以传统的Linux权限管制形式进行。总之,SELinux的工作机制是通过标签和策略来实现强制访问控制的。它的Enforcing模式能够帮忙零碎爱护资源,缩小潜在的安全漏洞和攻打。本文转载于WX公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/ceHqfTdJ1NbAAFQjJkiyEQ

April 24, 2023 · 1 min · jiezi

关于kubernetes:下篇开始写代码运维开发人员不得不看的K8S-API实战

反对的客户端库可参考:https://kubernetes.io/zh-cn/docs/reference/using-api/client-l... 身份验证插件在 K8S API 客户端库golang client-go 中,Auth plugins(身份验证插件)是用于解决 Kubernetes 集群中用户身份验证的组件。一般来说,客户端的配置信息通常从 kubeconfig 文件中加载,包含服务器和凭证的配置信息。有一些插件可用于从内部起源获取凭证,但默认状况下不会加载这些插件。如果要在程序中启用这些插件,须要在主包中导入它们。 能够加载所有身份验证插件: import _ "k8s.io/client-go/plugin/pkg/client/auth"或者您能够加载特定的身份验证插件: import _ "k8s.io/client-go/plugin/pkg/client/auth/azure"import _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"import _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"❝ 我这里只需让客户端的配置信息从 kubeconfig 文件中加载即可,所以下一步是去master将kubeconfig导出来,发送到我的开发机。 ❞ 对于身份验证形式身份验证形式有两种: 在群集中进行身份验证:配置客户端在 Kubernetes 集群内运行时。在群集外进行身份验证:配置客户端以从内部拜访 Kubernetes 集群。具体得看你的客户端库运行在k8s集群之外还是k8s集群之内。我的开发机是在k8s集群之外(也就是我在下面写好代码并测试,代码是从内部连贯到k8s集群),所以我只须要在群集外进行身份验证即可。对于客户端库来说,这两种身份验证形式的配置是稍有区别的,具体可参考官网文档:https://github.com/kubernetes/client-go/tree/master/examples 在群集外进行身份验证查看普通用户tantianran的证书是否过期(如果证书没有过期,可跳过这个步骤)❝ 在上篇中,提交CSR获取签名后的证书过期的工夫是24小时,曾经过期了,难怪我把config搬到开发机器下来连贯k8s提醒登录失败呢。明天我曾经更新了证书让它100天后再过期。操作方法很简略,提交之前,将过期工夫(字段时 expirationSeconds)加大一点,比方我加到8640000秒(100天),改好后从新提交给K8S集群中的证书签名机构从新签名即可。接着再从新审批、再导出证书(也就是重新得到tantianran.crt)。而后更新kubeconfig(从新执行之前的命令),再更新上下文(从新执行之前的命令)。 ❞ 更新前的: [root@k8s-a-master api-user]# kubectl get csrNAME         AGE   SIGNERNAME                            REQUESTOR          REQUESTEDDURATION   CONDITIONtantianran   58s   kubernetes.io/kube-apiserver-client   kubernetes-admin   24h                 Pending以下是我更新后的csr: [root@k8s-a-master api-user]# kubectl get csrNAME         AGE   SIGNERNAME                            REQUESTOR          REQUESTEDDURATION   CONDITIONtantianran   30m   kubernetes.io/kube-apiserver-client   kubernetes-admin   100d                Approved,Issued导出kubeconfigkubectl config view --raw > kubeconfig-tantianran删除kubernetes-admin的配置我打算在开发机仅仅应用普通用户tantianran来连贯k8s,所以删除掉和kubernetes-admin相干的敏感信息,生产环境中为了平安也是要这么做。以下是删除后的: apiVersion: v1clusters:- cluster:    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1ETXpNVEUwTXpFMU1Gb1hEVE16TURNeU9ERTBNekUxTUZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS3hCCnZSQnI2dWY2c3prZ2RrY0E2V1lpR1dWczJBcmZDOWowS2x5Q2hqaVVrZTc5NnJpYnBJQTdTSEUyejNZMXRvVUQKYXEwZjFzbFA1Z1o1bldBWTBuYjhQUVF2UDB3aWpHN0ZOMVF3Ym1XeFVKT2k0cVFJSnlLajZKQmttNkhVOTdRMAorYjByN2FnelJCclRBTzRneWJ2R0l0eWM2OFNMNVhaYVlQVG8xK2hBREN1Vm1SbXFUZTR6ZzFTSjNxeFdsQjUvCitSUVFxeTk0ZVZvR2ZiMzN4T0xJcldVVkF4R2ZxVHlNRTZWQ3ltcitVYzJxMTdRNS9SVkdxN3U4UzBKMCs5SG4KN0Rvb1FVRXhQYXM1YmVrZ2tlMlVsRE96UFNaL2xYbnUzcEYzNklKOVhyQzdMRG9sbUV6eTJTRmV6VysrSWJIYwpQT1FWZGZyL1VFVkhSTTFlUEVFQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNd3pnK2pZaWN1b2VVVFdRbW8zU2ZNaFNCY09NQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRkN5cThUdWRGRytXTjU0Sm5LTworcW1JZ29VbCtzNGlwUVE0Z21DSUF6QzcyRkMzZStZNlhtd2dXanhZOVhlUlIyZ0RjQkswUmNaaDAwZzdGd09VCkc2VkFQNnBRTnd3cTFONEt5dmFkVFdxSlNEZkNCc0dvK0hTMU1tbVdjSUtCUW13UXMwSEhrbm8zWnFCYURGcmsKY2VuY2N0V2UrZ25uNkptSHdqdTVOdDBOdzNKWS9OVndLTnBnNXhoNm1QVFFpQ2ZjOWk1emhiZzRDVFROVURESApOMlhWZkVnZ2l2STZ0ZitMeURjaXRqc1A4Q0JNYWhIUE9lcEZtUmRsUmNQSWg3MXlESmJpREtHYnhPTXAzN0N5CnpMak5SbEsrcnozMktVdXJaRmNkMk12aEpNd09laTVwa2IvVHVreTdDM0lBT0JsUk05QzhxSjVOVGwrVTVJSlMKYnkwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==    server: https://192.168.11.10:6443  name: kubernetescontexts:- context:    cluster: kubernetes    namespace: rook-ceph    user: tantianran  name: tantianrancurrent-context: tantianran # 以后上下文kind: Configpreferences: {}users:- name: tantianran  user:    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUREekNDQWZlZ0F3SUJBZ0lRZCttazJoeVAxODBHNFVZMkRrcHFwVEFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwcmRXSmxjbTVsZEdWek1CNFhEVEl6TURReU1EQTRNRFF5TWxvWERUSXpNRGN5T1RBNApNRFF5TWxvd0tqRVRNQkVHQTFVRUNoTUtibTlpYkdGdFpXOXdjekVUTUJFR0ExVUVBeE1LZEdGdWRHbGhibkpoCmJqQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU1Jc0M0R2JSQ0NJYTUvZEt6elgKc3VtUXVxay9qclZRemJuSmpiVkY5ZVV6bU1OR3drTi9aanRrVU5ZTUNRMkRpY1JIRUJzTFVMTTJIWFN2Rm1XWQpUUGN6OEJWOHgvR214YXlWcVNmQTU4aDNtdjJERjhZdFB2aFlVc3hmUVZpUUxFRGFwRXpoV29TcFU3cHBGMnhhCnZjeG9GbDd3emRQWE9YMnhDQXNSQ3pINjB6cG9zSEJiNHBaSGJjYjNyQ1hjdHBnVlFDeklubWRGMWs0cmdweDkKSGsrek4rNzQ1R04vS1dMMWdLcFNhN2YxemdHdXVaT2FrZEhKaldGdCtWYzNFSG90SFQ3V3g1VTFrNXhmem5mSQo2VlkvN0NTbzR1K2hhSTg2RHBRaXZmdk1OM3ZGeURwOVR2UWVsOFJpZlFiMkxaMnlUYzdEL3hHQUJZRmFDbk5SCjl3a0NBd0VBQWFOR01FUXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUhBd0l3REFZRFZSMFRBUUgvQkFJd0FEQWYKQmdOVkhTTUVHREFXZ0JUTU00UG8ySW5McUhsRTFrSnFOMG56SVVnWERqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQwpBUUVBZk5Qakc1M29UWUYrMU9mYkJDQzFHekNST092aDIzNFhvalhnK2hBbDRzdktDdmhodVllNW1kdlUxSm8wCklqZUp2WG9RQmhndWtGNFFxNnpHWU95d1lOWjVMK3AzTWRQU1lYY0ZPbS9iOWluY0l6TVhLTjI2WmVBNXpwaWgKdTUxNWJEVzJ3bzR2UDdEL01kUW5wTWM3em1YQVhhem5BVkRFZEg4WGdpeFlGZ0JDQUw3UTFrT25QMkxtR1RjRwpJMUhqRTFrZFMwQ0ZrMjFrTXYyN0JBVzV1ai9pMzA1eFMrQVRITWtoSUw1MjZFYVFmb3FiV3lnVDBjRS92UUxVCitMMG54R3MxWktIMlFRN3JyMTEwYkNZcnYyaW13UDljdTJWY2ZEcXlzQnZrZEpHd25idHFydjArT21aQzV3emcKOTFyMGpaQXBNck9ZUnZUMVNkYmJPeFhIK0E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBd2l3TGdadEVJSWhybjkwclBOZXk2WkM2cVQrT3RWRE51Y21OdFVYMTVUT1l3MGJDClEzOW1PMlJRMWd3SkRZT0p4RWNRR3d0UXN6WWRkSzhXWlpoTTl6UHdGWHpIOGFiRnJKV3BKOERueUhlYS9ZTVgKeGkwKytGaFN6RjlCV0pBc1FOcWtUT0ZhaEtsVHVta1hiRnE5ekdnV1h2RE4wOWM1ZmJFSUN4RUxNZnJUT21pdwpjRnZpbGtkdHh2ZXNKZHkybUJWQUxNaWVaMFhXVGl1Q25IMGVUN00zN3Zqa1kzOHBZdldBcWxKcnQvWE9BYTY1Cms1cVIwY21OWVczNVZ6Y1FlaTBkUHRiSGxUV1RuRi9PZDhqcFZqL3NKS2ppNzZGb2p6b09sQ0s5Kzh3M2U4WEkKT24xTzlCNlh4R0o5QnZZdG5iSk56c1AvRVlBRmdWb0tjMUgzQ1FJREFRQUJBb0lCQUd6cU9kWU1XczJJMkIzRworSTdiU3Y4YWNLbW8vZ3FVZGFGRi9sZjFFelhxbUVESSt3VFRmR3ZLSEZIRVZIdWhFZkRvRDQrcjdDdHFLbUdlCktJajZRZ25UdDFMR09IMURGOVJ6Nm50akNHQjVQcFgvSjZIQkZYWkdUTU5ZbHhYdllQTkw4U2N5clF5RzBuRlkKcTR2YTVtVzI2UDErUTJZVmJxa2pXU2lqK2N5aE10MDNYTk00S3RnTEZ6QklHaXEvTy9XSzQvaTkxL0x0dFJMdgpXTExyZVd0TENGSnJvOXpwblRkVnMyQU5vQ1FTVUlZNktMcXRCTE1ZNTVVcjI0bDhkSjQwMm1sMFhxYVgrdTlJCjZxWVBjYkhqeTd1K0pNVFovazJ5a2VEcGN3OXJwOEVxQmhoY1U5U2VWYnZCTk45d3FOTk1mSWl1SE91eng1N2QKaEFvc2pJRUNnWUVBOXJTci8zR3FPK3diVGE0aElpVTJwSXk5ZXpnNEpFeWkrbytvNHpYOGc0dGsrNGZxM2NDQgo2ZmhEWXI5UUQ3Sm1ZaEhDbDRsWGI4d1VxcTI3OHlybVhmK3hnZVk3aTl5NlJOaU1MMXZTYTlON1FScGJXelZlCkgvU2VEQ0ZJeXVoTEJaT2ZXUW5nSG1xdU9vODR0N0R4N2hPbDBWSDRuS2tUVEFIeEhJN1JMRmtDZ1lFQXlYeTMKblVvN1FCWENGWjBmVHdpRDMzQnVrTXFTeFM3M1dDdXppRjV4cE12a28xVTA0ZTBVODdMWmJodnFySU02UnQxVQp1eWdUa3VSMDZ0bGpVQ3RNYlhZcGROSFY0N1lLTjVubDVTL29KWGJBaU1EU0U5a3B6djdYZS9jaXB5RDN4bW5PClBCWUxOZ0VBUWJvOG5pVkhqVzVJRWhJb29IcDc4OURkbmZoVkNqRUNnWUFXRWcyOUdZY1lPMFFxQytUczhCVlcKWFR6cVZCbzVyUjE3ZXZTcDl2OXpLVHBNZ2xsUm8xSThBempNRWI5dzJBM3V3aFg5aG96cTlILzQwUGdhaGdENwo4YzhJaHZkV3lOVmxLVlpKT2xhMXpNS2ZEV09VNGs1Y1gzN3dLTjRoUU96TlArcW1oWXFtVGZidVNEZlR2eUcxCm9jNVl6cE9HT0Y0QWs3L2xSU1dUYVFLQmdBaFU1ZXJWSlBvVGJFRWtqQ1RpZjBHQURySmlEZ3VsVTRrTDFaS3cKQlJjQmIyVHBveFFzajQ4OE9BMTdqZ3F3S25xL3NEOUUrdm82QkRPcDVaZHRFdTM3MHQ4SHhrWnlRcDNsK1VHdQo1M1NWSW9VRkpDcTU4aWFqRnhvRE1DV2xFVm5kQ2pBbDRUVE1lY3c5L1QrMDN1NlVQdHF3Y1ltaFJ2cmdDaW44CkdOZ2hBb0dBVzNub3NmOENPWUJFM0x0WXkwa0t0OTkyWmdIY2lPMWEvZzNMZkN4VnovenByWHdVVkJpRFRzZFkKK3BXZVV0aTJEb3d0cnZpVENpSHFCdE5DcDVpK3krYTM1ODR5c0xJYm9vKzh5eWFJenVVaERiNE4zaVpUU3J1SQpib0h3LzhtWTlCZmFzT0hLVnhlSnl5RzQzV3NoN2NUK2VFcGRBbkxsSndQSnhCTmdvYmc9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==scp到我的开发机scp kubeconfig-tantianran 192.168.11.254:~/.kube/config❝ 留神:如果想在开发机操作k8s集群,能够去官网或者在master节点上把kubectl二进制工具也scp到开发机器上即可,如果只是通过客户端库来操作k8s,kubectl能够不必。还有,记得在家目录创立.kube目录,文件名改为config,这样kubectl才会主动读取到。 ❞ 如果把config名字改为别的,比方改为aaa,看看成果: [root@workhost .kube]# mv config aaa[root@workhost .kube]# kubectl get pod # 读取不到config,因为kubectl默认就是读取configThe connection to the server localhost:8080 was refused - did you specify the right host or port?# 当然能够应用--kubeconfig选项指定kubeconfig[root@workhost .kube]# kubectl --kubeconfig=./aaa get podNAME                                                     READY   STATUS      RESTARTS         AGEcsi-cephfsplugin-2pv6l                                   2/2     Running     30 (7h51m ago)   17dcsi-cephfsplugin-7c9rp                                   2/2     Running     31 (7h51m ago)   17dcsi-cephfsplugin-7rvl4                                   2/2     Running     31 (7h51m ago)   17dcsi-cephfsplugin-8slqr                                   2/2     Running     30 (7h51m ago)   17d来验证一下普通用户的权限[root@workhost .kube]# kubectl get podNAME                                                     READY   STATUS      RESTARTS         AGEcsi-cephfsplugin-2pv6l                                   2/2     Running     30 (7h52m ago)   17dcsi-cephfsplugin-7c9rp                                   2/2     Running     31 (7h52m ago)   17d...[root@workhost .kube]# kubectl get nsError from server (Forbidden): namespaces is forbidden: User "tantianran" cannot list resource "namespaces" in API group "" at the cluster scope[root@workhost .kube]# kubectl get pod -n defaultError from server (Forbidden): pods is forbidden: User "tantianran" cannot list resource "pods" in API group "" in the namespace "default"[root@workhost .kube]# kubectl get pod -n rook-cephNAME                                                     READY   STATUS      RESTARTS         AGEcsi-cephfsplugin-2pv6l                                   2/2     Running     30 (7h53m ago)   17dcsi-cephfsplugin-7c9rp                                   2/2     Running     31 (7h53m ago)   17d...[root@workhost .kube]# kubectl get deploymentError from server (Forbidden): deployments.apps is forbidden: User "tantianran" cannot list resource "deployments" in API group "apps" in the namespace "rook-ceph"[root@workhost .kube]# kubectl get svcError from server (Forbidden): services is forbidden: User "tantianran" cannot list resource "services" in API group "" in the namespace "rook-ceph"❝ 通过验证,tantianran这个一般账户的权限的确很低,具体我也不再解释了,置信大家都懂的。 ❞ 并且,我要问大家几个简略的问题: 为啥没有指定命名空间也能查看到pod?为啥指定default命名空间提醒error?为啥查看deployment和svc提醒error?请把您的答案在评论区通知我,谢谢大家。 开始写代码golang更多示例请参考:https://github.com/kubernetes/client-go/tree/master/examples 装置客户端库# 首次先装这个go get k8s.io/client-go@latest# 前面装这几个go get k8s.io/apimachinery/pkg/apis/meta/v1go get k8s.io/client-go/kubernetesgo get k8s.io/client-go/tools/clientcmd写代码package mainimport ( "context" "fmt" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd")func main() { // 在 kubeconfig 中应用以后上下文 // path-to-kubeconfig -- 例如 /root/.kube/config config, _ := clientcmd.BuildConfigFromFlags("", "/root/.kube/config") // 创立 clientset clientset, _ := kubernetes.NewForConfig(config) // 拜访 API 以列出 Pod pods, _ := clientset.CoreV1().Pods("rook-ceph").List(context.TODO(), v1.ListOptions{}) for _, pod := range pods.Items {  fmt.Printf("命名空间名称:%s POD名称:%s\n", pod.Namespace, pod.Name) } fmt.Printf("这个命名空间下有 %d 个POD\n", len(pods.Items))}输入: [root@workhost k8s]# go run main.go 命名空间名称:rook-ceph POD名称:csi-cephfsplugin-2pv6l命名空间名称:rook-ceph POD名称:csi-cephfsplugin-7c9rp命名空间名称:rook-ceph POD名称:csi-cephfsplugin-7rvl4命名空间名称:rook-ceph POD名称:csi-cephfsplugin-8slqr命名空间名称:rook-ceph POD名称:csi-cephfsplugin-9mkkx...这个命名空间下有 61 个POD❝ 这个例子是k8s官网文档里的一个例子,链接:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/acc...。更多例子可参考:https://github.com/kubernetes/client-go/tree/master/examples。 ❞ ❝ 当然,在我看来,例子它只是例子,最重要的是要把握它的套路。那么前提是你得有肯定开发能力,懂golang或者python或java等等。当然了,运维工程师我倡议是要懂golang或者python。 ❞ Python请参考:https://github.com/kubernetes-client/python/tree/master/examples 装置相干库pip install pickpip install kubernetes写代码from pick import pickfrom kubernetes import client, configfrom kubernetes.client import configurationdef main():    config.load_kube_config(config_file="/root/.kube/config", context="tantianran")    v1 = client.CoreV1Api()    ret = v1.list_namespaced_pod(namespace="rook-ceph")    for item in ret.items:        print(            "%s\t%s\t%s" %            (item.status.pod_ip,             item.metadata.namespace,             item.metadata.name))if __name__ == '__main__':    main()输入: [root@workhost k8s]# python main.py 192.168.11.17   rook-ceph       csi-cephfsplugin-2pv6l192.168.11.18   rook-ceph       csi-cephfsplugin-7c9rp192.168.11.11   rook-ceph       csi-cephfsplugin-7rvl4192.168.11.19   rook-ceph       csi-cephfsplugin-8slqr192.168.11.15   rook-ceph       csi-cephfsplugin-9mkkx192.168.11.20   rook-ceph       csi-cephfsplugin-css2r192.168.11.12   rook-ceph       csi-cephfsplugin-dblnm192.168.11.16   rook-ceph       csi-cephfsplugin-nsbsp192.168.11.14   rook-ceph       csi-cephfsplugin-p79zj192.168.11.13   rook-ceph       csi-cephfsplugin-phw2t

April 24, 2023 · 1 min · jiezi

关于kubernetes:上篇运维人员不得不看的K8S-API入门实战呕心沥血整理得又臭又长有人看吗

K8S API概述可参考:https://kubernetes.io/zh-cn/docs/concepts/overview/kubernetes... Kubernetes API是Kubernetes管制立体的外围。它是一组REST API,用于与Kubernetes中的各种对象进行交互,如Pods、Namespaces、ConfigMaps和Events等。通过这些API,能够查问和操作Kubernetes中API对象的状态。 API server是Kubernetes集群中的一个组件,它公开了这些REST API。Kubernetes中的各种组件,包含kubectl命令行工具、kubeadm等工具,都通过调用这些API来执行操作。 除了应用kubectl等工具之外,也能够间接应用REST调用来拜访API。如果正在编写应用Kubernetes API的应用程序,请思考应用其中一个客户端库。 残缺的API详细信息都应用OpenAPI进行文档化,这使得运维开发人员能够很容易地理解API的性能和应用形式。 OpenAPI 标准Kubernetes OpenAPI 标准实际上只有一种,它是基于 OpenAPI 3.0 标准的。之前版本的 Kubernetes API 应用的是 Swagger 2.0 标准,但当初曾经降级到了 OpenAPI 3.0 标准。 须要留神的是,尽管 OpenAPI 3.0 标准是 Swagger 2.0 标准的继承者,但它们之间有一些重要的区别,如参数、响应、申请体和平安等方面的定义形式都有所不同。因而,在应用 OpenAPI 标准时须要留神版本兼容性。接下来,别离理解一下V2和V3。 OpenAPI V2Kubernetes API服务器提供了一个聚合的 OpenAPI v2 标准,通过拜访 /openapi/v2 端点获取。这个标准包含了所有的API组的定义,以及每个API组的所有API的定义,使得运维开发人员能够分明地理解Kubernetes API的构造和性能。 通过在HTTP申请头中指定不同的响应格局,运维开发人员能够取得不同格局的OpenAPI标准文档。下表列出了可用的申请头和响应格局: 头部可选值阐明Accept-Encodinggzip不指定此头部也是能够的Acceptapplication/com.github.proto-openapi.spec.v2@v1.0+protobuf次要用于集群外部 application/json默认值 *提供application/json通过应用这些申请头,开发人员能够获取他们所需的格式化的OpenAPI标准文档,以便在应用程序中进行解决和解析。 Kubernetes的API应用Protobuf作为序列化格局进行外部通信。这种序列化格局有助于缩小网络传输的数据量和进步通信的效率。在Kubernetes中,每个API对象都有一个对应的Protobuf定义文件。这些文件形容了对象的构造和字段。Kubernetes还提供了应用这些Protobuf定义文件生成客户端和服务器代码的工具,以便开发人员能够轻松地应用Kubernetes API。除了Protobuf之外,Kubernetes还反对应用其余序列化格局进行通信,例如JSON和YAML。这些格局更易于浏览和编写,并且通常用于与内部零碎的集成。不过,在集群外部通信时,Protobuf依然是最罕用的序列化格局。 想进一步理解 Kubernetes Protobuf 序列化可参考:https://github.com/kubernetes/design-proposals-archive/blob/main/api-machinery/protobuf.md OpenAPI V3OpenAPI V3是Kubernetes反对的一种API形容格局。从Kubernetes v1.27版本开始,这个性能曾经被稳固反对。 Kubernetes提供了一个名为 /discovery/v3 的端点来展现所有可用的API组和版本列表。这个端点只返回JSON格局的数据。这些API组和版本会以特定的格局出现: {    "paths": {        ...,        "api/v1": {            "serverRelativeURL": "/openapi/v3/api/v1?hash=CC0E9BFD992D8C59AEC98A1E2336F899E8318D3CF4C68944C3DEC640AF5AB52D864AC50DAA8D145B3494F75FA3CFF939FCBDDA431DAD3CA79738B297795818CF"        },        "apis/admissionregistration.k8s.io/v1": {            "serverRelativeURL": "/openapi/v3/apis/admissionregistration.k8s.io/v1?hash=E19CC93A116982CE5422FC42B590A8AFAD92CDE9AE4D59B5CAAD568F083AD07946E6CB5817531680BCE6E215C16973CD39003B0425F3477CFD854E89A9DB6597"        },        ....    }}为了进步客户端缓存效率,这些绝对URL指向不可变的OpenAPI形容信息。为此,API服务器还设置了适当的HTTP缓存标头(将Expires设置到将来的1年,将Cache-Control设置为不可变)。当应用过期的URL时,API服务器会将其重定向到最新的URL。 Kubernetes API服务器在 /openapi/v3/apis/<group>/<version>?hash=<hash> 端点为每个Kubernetes组版本公布一个OpenAPI v3标准。 ...

April 24, 2023 · 2 min · jiezi

关于kubernetes:kubernetes的Admission-Webhook探析

Admission Webhook是kubernetes中的准入控制器,用于在apiserver中,对API Request进行拦挡,而后对API Request进行特定的解决,解决操作包含: Mutating: 批改API Request中的对象;Validating: 校验API Request中的对象,若校验非法,则间接返回client,不再持续;apiserver提供了Admission Webhook的扩大机制,容许用户自定义webhook,而后注册到apiserver上就能够发挥作用了。 一.Admission Webhook的架构API Request在apiserver中的处理过程: 认证:通常是client端提供证书;鉴权:校验client是否有操作相应资源的权限,应用rbac实现;MutatingAdmission: 对传入的资源对象进行批改;用户能够注册自定义的webhook;Schema Validation: 对传入对象的schema进行校验;ValiatingAdmission: 对传入的资源对象进行校验,若校验失败,则间接返回client;用户能够注册自定义的webhook;最初,将对象存入etcd; 用户自定义的webhook通常应用deploy部署,同时部署对应的service,在将webhook注册到apiserver时,提供service的名称以及拜访的url path,这样apiserver就能够应用自定义webhook的性能逻辑了。 apiserver与webhook之间的通信接口为/api/admission/v1/AdmissionReview构造。 二.AdmissionReview的构造apiserver与自定义webhook之间通过http通信,其Request和Response均是/api/admission/v1/AdmissionReview构造,也就是说: 自定义webhook在解决http申请时,须要将requestBody反序列化为AdmissionReview构造;自定义webhook在发送http响应后,须要结构AdmissionReview构造,将其序列化后发送进来;AdmissionReview构造既蕴含Request,也蕴含Response: // AdmissionReview describes an admission review request/response.type AdmissionReview struct { metav1.TypeMeta `json:",inline"` // Request describes the attributes for the admission request. // +optional Request *AdmissionRequest `json:"request,omitempty" protobuf:"bytes,1,opt,name=request"` // Response describes the attributes for the admission response. // +optional Response *AdmissionResponse `json:"response,omitempty" protobuf:"bytes,2,opt,name=response"`}1. 申请:AdmissionRequestAdmissionRequest中封装了发送给apiserver的申请信息,蕴含咱们创立、更新、删除的Deploy/Service/Pod等信息,比方: { "apiVersion": "admission.k8s.io/v1", "kind": "AdmissionReview", "request": { # Random uid uniquely identifying this admission call "uid": <random uid>, ... "object": {"apiVersion":"v1","kind":"Pod",...}, ... }}2. 响应:AdmissionResponseAdmissionResponse封装了准入管制的后果: ...

April 22, 2023 · 2 min · jiezi

关于kubernetes:kubescheduler深度剖析与开发三

为了深刻学习 kube-scheduler,本系从源码和实战角度深度学 习kube-scheduler,该系列一共分6篇文章,如下: kube-scheduler 整体架构初始化一个 scheduler一个 Pod 是如何调度的如何开发一个属于本人的scheduler插件开发一个 prefilter 扩大点的插件开发一个 socre 扩大点的插件上一篇文章咱们讲了一个 kube-scheduler 是怎么初始化进去的,有了 调度器之后就得开始让他干活了 这一篇文章咱们来讲讲一个 Pod 是怎么被调度到某个 Node 的。 我把调度一个 Pod 分为3个阶段 获取须要被调度的 Pod运行每个扩大点的所有插件,给 Pod 抉择一个最合适的 Node将 Pod 绑定到选出来的 Node感知 Pod要可能获取到 Pod 的前提是:kube-scheduler 能感知到有 Pod 须要被调度,得悉有 Pod 须要被调度后还须要有中央寄存被调度的 Pod 的信息。为了感知有 Pod 须要被调度,kube-scheduler 启动时通过 Informer watch Pod 的变动,它把待调度的 Pod 分了两种状况,代码如下 // pkg/scheduler/eventhandlers.gofunc addAllEventHandlers(...) { //曾经调度过的 Pod 则加到本地缓存,并判断是退出到调度队列还是退出到backoff队列 informerFactory.Core().V1().Pods().Informer().AddEventHandler( cache.FilteringResourceEventHandler{ FilterFunc: func(obj interface{}) bool { switch t := obj.(type) { case *v1.Pod: return assignedPod(t) case cache.DeletedFinalStateUnknown: if _, ok := t.Obj.(*v1.Pod); ok { // The carried object may be stale, so we don't use it to check if // it's assigned or not. Attempting to cleanup anyways. return true } utilruntime.HandleError(fmt.Errorf("unable to convert object %T to *v1.Pod in %T", obj, sched)) return false default: utilruntime.HandleError(fmt.Errorf("unable to handle object in %T: %T", sched, obj)) return false } }, Handler: cache.ResourceEventHandlerFuncs{ AddFunc: sched.addPodToCache, UpdateFunc: sched.updatePodInCache, DeleteFunc: sched.deletePodFromCache, }, }, ) // 没有调度过的Pod,放到调度队列 informerFactory.Core().V1().Pods().Informer().AddEventHandler( cache.FilteringResourceEventHandler{ FilterFunc: func(obj interface{}) bool { switch t := obj.(type) { case *v1.Pod: return !assignedPod(t) && responsibleForPod(t, sched.Profiles) case cache.DeletedFinalStateUnknown: if pod, ok := t.Obj.(*v1.Pod); ok { // The carried object may be stale, so we don't use it to check if // it's assigned or not. return responsibleForPod(pod, sched.Profiles) } utilruntime.HandleError(fmt.Errorf("unable to convert object %T to *v1.Pod in %T", obj, sched)) return false default: utilruntime.HandleError(fmt.Errorf("unable to handle object in %T: %T", sched, obj)) return false } }, Handler: cache.ResourceEventHandlerFuncs{ AddFunc: sched.addPodToSchedulingQueue, UpdateFunc: sched.updatePodInSchedulingQueue, DeleteFunc: sched.deletePodFromSchedulingQueue, }, }, )......}曾经调度过的 Pod辨别是不是调度过的 Pod 是通过:len(pod.Spec.NodeName) != 0 来判断的,因为调度过的 Pod 这个字段总是会被赋予被选中的 Node 名字。然而,既然是调度过的 Pod 上面的代码中为什么还要辨别:sched.addPodToCache 和 sched.updatePodInCache 呢?起因在于咱们能够在创立 Pod 的时候人为给它调配一个 Node(即给 pod.Spec.NodeName 赋值),这样 kube-scheduler 在监听到该 Pod 后,判断这个 Pod 的该字段不为空就会认为这个 Pod 曾经调度过了,然而这个字段不为空并不是 kube-scheduler 调度的后果,而是人为赋值的,那么 kube-scheduler 的 cache(能够参考上一篇 cache 相干的内容)中没有这个 Pod 的信息,所以就须要将 Pod 信息退出到 cache 中。至于在监听到 Pod 后 sched.addPodToCache 和 sched.updatePodInCache 哪个会被调用,这是 Informer 决定的,它会依据监听到变动的 Pod 和 Informer 的本地缓存做比照,要是缓存中没有这个 Pod,那么就调用 add 函数,否则就调用 update 函数。退出或更新缓存后,还须要做一件事:去 unschedulablePods(调度失败的Pod) 中获取 Pod,这些 Pod 的亲和性和刚刚退出的这个 Pod 匹配,而后依据上面的规定判断是把 Pod 放入 backoffQ 还是放入 activeQ ...

April 22, 2023 · 8 min · jiezi

关于kubernetes:kubernetes-Pod的DNS策略

一. Pod的DNS策略Default: 继承节点的DNS配置;ClusterFirst: 应用coredns作为DNS配置;ClusterFirstWithHostNet: 当Pod.spec.hostNetwork=true时,Pod的DNS策略被强制转换为Default,即继承节点的DNS配置;若Pod要应用coredns作为DNS配置,则需配置pod.spec.dnsPolicy=ClusterFirstWithHostNet;None: 没有DNS配置;若未指定dnsPolicy,则默认=ClusterFirst。 二. pod.spec.dnsPolicy=Nonepod.spec.dnsPolicy=None时,pod中没有任何的dns配置;此时必须在spec中配置dnsConfig配置,给pod提供自定义的dns配置: apiVersion: v1kind: Podmetadata: name: testspec: containers: - name: busybox image: busybox command: ["/bin/sh", "-c", "uname -r && tail -f /dev/null"] dnsPolicy: None dnsConfig: nameservers: - 192.168.0.1容器中能够看到,自定义的dns配置: # kubectl exec -it test -c busybox -- sh/ # cat /etc/resolv.confnameserver 192.168.0.1/ # exit三. pod.spec.dnsPolicy=Default该模式下,pod会继承节点的dns配置。 apiVersion: v1kind: Podmetadata: name: testspec: containers: - name: busybox image: busybox command: ["/bin/sh", "-c", "uname -r && tail -f /dev/null"] dnsPolicy: Default查看节点的dns配置: ...

April 22, 2023 · 2 min · jiezi

关于kubernetes:使用controllerruntime进行kubernetes的leader选举

Kubernetes能够应用一个lock对象,进行多实例的选举: 抢到lock对象更新权的实例即为leader;lock对象能够是: LeaseConfigMapEndpointscontroller-runtime罕用于operator的开发,其封装了client-go中leader选举的细节,leader选举的场景为: 某一时刻只有一个实例能够reconcile,其它实例处于standby状态;一旦leader实例挂掉,standby实例能够顶上,继续执行reconcile;一.operatorOperator开发中,应用controller-runtime实现leader选举非常简单,调用时传入election参数即可: func main() { flag.BoolVar(&enableLeaderElection, "enableLeaderElection", false, "default false, if enabled the cronHPA would be in primary and standby mode.") flag.Parse() mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ LeaderElection: enableLeaderElection, LeaderElectionID: "kubernetes-cronhpa-controller", MetricsBindAddress: metricsAddr, }) ...}多实例抢锁时,应用的资源对象为configmap: # kubectl get cm -n kube-system kubernetes-cronhpa-controller -oyamlapiVersion: v1kind: ConfigMapmetadata: annotations: control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"kubernetes-cronhpa-controller-6bcbdf9844-d2z4q_c36ac963-3e9c-4e32-ac14-ab48b6f2633b","leaseDurationSeconds":15,"acquireTime":"2023-04-08T16:14:30Z","renewTime":"2023-04-10T07:55:15Z","leaderTransitions":126}' creationTimestamp: "2022-10-13T06:20:42Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 ... manager: kubernetes-cronhpa-controller operation: Update time: "2022-10-13T06:20:42Z" name: kubernetes-cronhpa-controller namespace: kube-system resourceVersion: "76431408" uid: 5099216c-2fd6-452a-afeb-bd39047c2cbb二.controller-runtime若应用底层的client-go进行实例选举,通常有以下步骤: ...

April 22, 2023 · 2 min · jiezi