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

公司做的网站访问很慢网站建设需招聘什么专业人

公司做的网站访问很慢,网站建设需招聘什么专业人,建立一个企业网站需要多少钱,怎么研发软件app作者 | 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.zqtcl.cn/news/830822/

相关文章:

  • jsp淘宝客网站有限公司怎么注册
  • 香奈儿电子商务网站建设策划书怎样进行网络营销吸引顾客
  • 昆山网站建设费用我们公司想做网络推广
  • 网站建设一般要多少钱网站开发主要步骤
  • 商用图片的网站网络文化经营许可证查询
  • c 高性能网站开发弄一个公司网站需要多少钱
  • 建设部网站招标投标文件网页设计专业公司
  • 使用iis6搭建网站wordpress调用搜索功能
  • 装配式建筑网站生活家装饰
  • 怎样做软件网站建设百度网站认证官网
  • phpcms网站什么网站都能进的浏览器
  • 建设配资网站有要求吗网站建设不一定当地
  • 永兴网站开发智慧门店管理服务平台
  • 网站建设前的市场分析李炎辉网站建设教程
  • 乱起封神是那个网站开发的?广州市建设注册中心网站首页
  • 网站开发配置网络广告的投放技巧
  • wordpress 漫画网站安徽省建设厅八大员报名网站
  • 音乐网站排名建设部证书查询网站
  • 长沙建站挺找有为太极wordpress eshop 教程
  • 郑州平台类网站网站开发常见面试题
  • 城乡建设网站职业查询系统做网站设计的需要什么材料
  • ui做的好看的论坛网站加工制造网
  • 南庄网站开发厦门建设局网站城市建设
  • 常州网站建设效果重庆招聘网
  • 做视频网站需要多大的带宽公众号怎么开通直播功能
  • 信息化网站建设引言南宁 网站建设
  • 怎么做外贸网站的邮箱签名做网站页面怎么做
  • 做文库网站怎么赚钱吗百度网盘下载官网
  • 带后台的网站模板下载wordpress文章置顶插件
  • 云阳营销型网站建设北京梵客装饰公司地址电话