当前位置: 首页 > news >正文

网站怎么做sem优化减肥网站源码

网站怎么做sem优化,减肥网站源码,杨和网站开发,宁波余姚网站建设作者 | AddoZhang来源 | 云原生指北为什么要做容器启动顺序控制#xff1f;我们都知道 Pod 中除了 init-container 之外#xff0c;是允许添加多个容器的。类似 TektonCD 中 task 和 step 的概念就分别与 pod 和 container 对应#xff0c;而 step 是按照顺序执行的。此外还… 作者 | AddoZhang来源 | 云原生指北为什么要做容器启动顺序控制我们都知道 Pod 中除了 init-container 之外是允许添加多个容器的。类似 TektonCD 中 task 和 step 的概念就分别与 pod 和 container 对应而 step 是按照顺序执行的。此外还有服务网格的场景sidecar 容器需要在服务容器启动之前完成配置的加载也需要对容器的启动顺序加以控制。否则服务容器先启动而 sidecar 还无法提供网络上的支持。现实期望‍到了这里肯定有同学会问spec.containers[] 是一个数组数组是有顺序的。Kubernetes 也确实是按照顺序来创建和启动容器但是 容器启动成功并不表示容器可以对外提供服务。在 Kubernetes 1.18 非正式版中曾在 Lifecycle 层面提供了对 sidecar 类型容器的 支持但是最终该功能并没有落地[2]。那到底该怎么做TL;DR笔者准备了一个简单的 go 项目[3]用于模拟 sidecar 的启动及配置加载。克隆代码后可以通过 make build 构建出镜像假如你是用的 minikube 进行的实验可以通过命令 make load-2-minikube 将镜像加载到 minikube 节点中。使用 Deployment 的方式进行部署直接用 Pod 也可以。apiVersion: apps/v1kind:Deploymentmetadata: creationTimestamp:null labels: app: sample name: samplespec: replicas:1 selector: matchLabels: app: sample strategy:{}template: metadata: creationTimestamp:null labels: app: sample spec: containers:- image: addozhang/k8s-container-sequence-sidecar:latest name: sidecar imagePullPolicy:IfNotPresent lifecycle: postStart:exec: command:-/entrypoint- wait- image: busybox:latest name: app imagePullPolicy:IfNotPresent command:[/bin/sh,-c] args:[date; echo app container started; tail -f /dev/null]下面的截图中演示了在 sample 命名空间中pod 内两个容器的执行顺序。Kubernetes 源码在 kubelet 的源码 pkg/kubelet/kuberuntime/kuberuntime_manager.go 中#SyncPod 方法用于创建 Pod步骤比较繁琐直接看第 7 步创建普通容器。// SyncPod syncs the running pod into the desired pod by executing following steps: 1. Compute sandbox and container changes.// 2. Kill pod sandbox if necessary.// 3. Kill any containers that should not be running.// 4. Create sandbox if necessary.// 5. Create ephemeral containers.// 6. Create init containers.// 7. Create normal containers.func (m *kubeGenericRuntimeManager)SyncPod(pod *v1.Pod, podStatus *kubecontainer.PodStatus, pullSecrets []v1.Secret, backOff *flowcontrol.Backoff)(result kubecontainer.PodSyncResult){...// Step 7: start containers in podContainerChanges.ContainersToStart.for _, idx : range podContainerChanges.ContainersToStart{ start(container, containerStartSpec(pod.Spec.Containers[idx]))}return}在 #start 方法中调用了 #startContainer 方法该方法会启动容器并返回容器启动的结果。注意这里的结果还 包含了容器的 Lifecycle hooks 调用。也就是说假如容器的 PostStart hook 没有正确的返回kubelet 便不会去创建下一个容器。// startContainer starts a container and returns a message indicates why it is failed on error.// It starts the container through the following steps:// * pull the image// * create the container// * start the container// * run the post start lifecycle hooks (if applicable)func (m *kubeGenericRuntimeManager) startContainer(podSandboxID string, podSandboxConfig *runtimeapi.PodSandboxConfig, spec *startSpec, pod *v1.Pod, podStatus *kubecontainer.PodStatus, pullSecrets []v1.Secret, podIP string, podIPs []string)(string, error){...// Step 4: execute the post start hook.if container.Lifecycle!nil container.Lifecycle.PostStart!nil{ kubeContainerID : kubecontainer.ContainerID{Type: m.runtimeName, ID: containerID,} msg, handlerErr : m.runner.Run(kubeContainerID, pod, container, container.Lifecycle.PostStart)if handlerErr !nil{ m.recordContainerEvent(pod, container, kubeContainerID.ID, v1.EventTypeWarning, events.FailedPostStartHook, msg)if err : m.killContainer(pod, kubeContainerID, container.Name,FailedPostStartHook, reasonFailedPostStartHook,nil); err !nil{ klog.ErrorS(fmt.Errorf(%s: %v,ErrPostStartHook, handlerErr),Failed to kill container,pod, klog.KObj(pod),podUID, pod.UID,containerName, container.Name,containerID, kubeContainerID.String())}return msg, fmt.Errorf(%s: %v,ErrPostStartHook, handlerErr)}}return,nil}实现方案cmd/entrypoint/wait.go#L26[4] 这里参考了 Istio 的 pilot-agent 实现 在 PostStart 中持续的去检查 /ready 断点可以 hold 住当前容器的创建流程。保证 /ready 返回 200 后kubelet 才会去创建下一个容器。这样就达到了前面截图中演示的效果。for time.Now().Before(timeoutAt){ err checkIfReady(client, url)if err nil{ log.Println(sidecar is ready)returnnil} log.Println(sidecar is not ready) time.Sleep(time.Duration(periodMillis)* time.Millisecond)}return fmt.Errorf(sidecar is not ready in %d second(s), timeoutSeconds)参考•Sidecar container lifecycle changes in Kubernetes 1.18[5]•Delaying application start until sidecar is ready[6]引用链接[1] TektonCD: https://github.com/tektoncd[2] 没有落地: https://github.com/kubernetes/enhancements/issues/753#issuecomment-713471597[3] go 项目: https://github.com/addozhang/k8s-container-sequence-sample[4] cmd/entrypoint/wait.go#L26: https://github.com/addozhang/k8s-container-sequence-sample/blob/main/cmd/entrypoint/wait.go#L26[5] Sidecar container lifecycle changes in Kubernetes 1.18: https://banzaicloud.com/blog/k8s-sidecars/[6] Delaying application start until sidecar is ready: https://medium.com/marko.luksa/delaying-application-start-until-sidecar-is-ready-2ec2d21a7b74往期推荐Cluster 集群能支撑的数据有多大一次限制进程的 CPU 用量的实操过程Redis 内存满了怎么办这样置才正确手工模拟实现 Docker 容器网络点分享点收藏点点赞点在看
http://www.pierceye.com/news/148218/

相关文章:

  • 网站建设评估报告惠民建设局网站
  • 网站后台上传模板aspnet网站开发实例论文
  • 顺德公司做网站网站美工和网页设计的区别
  • 江苏建设造价信息网站山东丽天建设集团网站
  • 兰州网站建设程序wordpress自动超链接
  • zencart网站模板下载怎么自己建立网站及建立网站方法
  • 孝感市门户网站各大网站怎么把世界杯做头条
  • 手机端网站开发视频教程怎么制作爆米花教程
  • 温岭做网站公司开发一个企业官网多少钱
  • 宿迁明远建设有限公司网站赣州58同城网招聘找工作
  • 网站未续费到期后打开会怎样wordpress 顶部栏 悬浮
  • 内部优惠券网站怎么做大连网站制作建设
  • 经营虚拟网站策划书福建设备公司网站
  • 网站建设费用明细报价wordpress暗箱
  • 南宁网站建公司电话福州建站服务
  • 有没有什么推荐的网站用 php网站建设打出一首古诗
  • 品牌网站建设浩森宇特wordpress 首页 缩略图
  • 一个主机可以做几个网站域名织梦cms网站更新
  • 知名网站有哪些网站开发是什么环境
  • 哪些网站是用wordpress开发一款视频app多少钱
  • 济南网站定制制作建设项目 环评申报网站
  • 无锡响应式网站设计wordpress站群管理系统
  • 主题网站策划设计书网络营销是什么的一项活动
  • python+网站开发实例教程免费做视频网站
  • 免费建站自己的网址美化网站公司
  • 做购物网站哪个cms好用网络规划与设计就业前景
  • wordpress仿站工具网站建设jw100
  • 网站推广过程叙述关键词歌词
  • vip影视网站如何做appwordpress centos查看目录
  • 网站怎么套模板山西seo博客