Kubernetes 入门到进阶实战

download:Kubernetes 入门到进阶实战

K8s,容器编排的事实标准,云原生时代的企业技术战略重点,也是未来后端开发、运维必备技能。但 K8s 包含技术点繁多复杂,学起来并不容易。本课程将提供一条更容易系统掌握 K8s 的学习路线,让大家学得轻松,学得透彻。

技术要求
具备一定服务端基础知识及基本 linux 命令
对容器领域感兴趣的开发者和运维工程师

环境参数
Virtualbox 6
Centos 7
Docker 1.19
Kubernetes 1.19.3

第1章 课程導學 試看
本章作爲课程内容引入,主要引見课程實戰項目,课程的學習辦法以及课程内容詳細佈置,希望大家都能經過這門课程,學有所成,學有所歸。

共 2 節 (10分鍾) 收起列表

1-1 课前必讀
1-2 课程引見與學習指南 (09:12) 試看
第2章 课前準備之項目準備 試看
本章先帶大家理解课程學問脈络,理清Kubernetes學問體係,實戰贯串课程的博客項目的打包、容器化運轉過程,爲後續學習打好根底。

共 8 節 (52分鍾) 收起列表

2-1 Kubernetes學問體係 (06:02)
2-2 實戰博客項目引見 (05:05)
2-3 博客項目架構及中心代码 (06:21)
2-4 博客應用運轉環境搭建 (03:08)
2-5 Virtualbox虛擬機配置雙網卡完成固定IP (13:09) 試看
2-6 裝置Docker&環境配置 (09:46)
2-7 Docker運轉Mysql Server (05:31)
2-8 博客項目編译打包運轉 (02:44)
第3章 Kubernetes之Docker必知必會
學好Kubernetes,容器是前提,本章帶大家從命令和原理快速入門Docker容器根底,實戰把博客應用運轉在容器上,爲课程後續Kubernetes镜像拉取做铺墊。

共 7 節 (73分鍾) 收起列表

3-1 爲什麼需求Docker (12:35)
3-2 Docker namespace隔離 (09:50)
3-3 CGroups完成資源配額 (12:31)
3-4 Docker镜像特性&原理 (12:46)
3-5 爲博客項目編寫Dockerfile (07:17)
3-6 爲博客項目構建Docker镜像 (07:30)
3-7 Docker run -link運轉博客項目 (09:47)
第4章 Kubernetes根底及集群搭建 試看
本章帶大家剖析Kubernetes產生缘由,逐層分析Kubernetes架構,從零開端運用 kubeadm搭建Artifactory集群。

共 10 節 (90分鍾) 收起列表

4-1 Kuberentes的來源和開展 (06:18)
4-2 爲什麼需求Kubernetes (06:27) 試看
4-3 Kubernetes的架構和中心概念 (07:03)
4-4 Kubernetes部署計劃 (04:06)
4-5 裝置根底软件 (13:42)
4-6 Master節點裝置kubeadm (03:46)
4-7 初始化Kubernetes Master (08:11)
4-8 裝置配置worker node節點 (11:07)
4-9 分析Kubeadm裝置過程及錯誤排查 (18:55)
4-10 裝置Dashboard (09:30)
第5章 Kubernetes的調度單元Pod
本章先從Pod組成原理、生命周期、事情處置等方面帶大家控製盤绕Kubernetes的中心組件Pod,實戰如何將應用以Pod方式運轉在Kubernetes上。

共 14 節 (106分鍾) 收起列表

5-1 創立Nginx Pod (04:50)
5-2 Pod完成原理 (07:26)
5-3 容器和Pod的生命周期 (06:39)
5-4 爲容器生命周期提供事情處置 (06:17)
5-5 創立包含Init容器的Pod (08:05)
5-6 用探針檢查Pod的安康性 (06:31)
5-7 爲容器設置啟動時要執行的命令和參數 (07:55)
5-8 爲容器定義互相依賴的環境變量 (08:19)
5-9 爲容器停止配額管理 (06:03)
5-10 裝置第二個worker node (09:57)
5-11 運用親和性調度節點 (07:55)
5-12 將configmap數據注入容器 (06:28)
5-13 root vs特權用戶 (06:51)
5-14 非root用戶運轉Pod (12:09)
第6章 Kubernetes的網络完成
運轉好Pod之後,本章帶大家控製如何讓外部用戶訪問Pod運轉的資源,實戰Service和 Ingress的運用方式。

共 7 節 (62分鍾) 收起列表

6-1 Service對象&理論 (06:57)
6-2 用Service暴露Pod效勞地址 (11:30)
6-3 集群内Pod通訊機製 (06:14)
6-4 理論Service創立DNS記载 (10:34)
6-5 從集群外部訪問Service (08:09)
6-6 ingress理論 (10:05)
6-7 實戰Ingress控製器 (08:20)
第7章 Kubernetes控製器
本章將帶大家控製Kubernetes的多種控製器管理 Pod 的生命周期,理解Daemon Pods是如何被調度的,最後實戰Job 任務。

共 6 節 (55分鍾) 收起列表

7-1 ReplicaSet管理副本 (09:15)
7-2 深化了解deployment (09:47)
7-3 有狀態的應用StatefulSets (11:05)
7-4 DeamonSet後台任務 (10:16)
7-5 Daemoset如何調度 (06:24)
7-6 Job任務實戰 (07:47)
第8章 Kubernetes耐久化存儲業務數據
本章帶大家控製如何管理一個有狀態的應用,以及如何耐久化有狀態數據,並實戰 PV、PVC掛载NFS。

第9章 Kubernetes之應用與配置別離
本章將實戰Configmap和Secret秘鑰管理,還會帶大家控製Kubernetes配置管理的最佳理論。

第10章 Kubernetes之容器镜像中心
本章將帶大家深化了解私有容器镜像中心,配置私有镜像中心,完成博客應用的镜像打包和上傳。

第11章 Kubernetes之部署博客項目
本章將大家將一個完好的博客應用部署到Kubernetes,配置stateful set的Mysql數據庫,完成空距離離和镜像升級。

第12章 運用Helm部署應用
本章將大家理解Helm,完成Helm的裝置,部署Helm Chart,創立私有Helm並爲博客項目創立Helm chart,最終完成應用和數據庫的結合部署。

第13章 運用Prometheus和Grafana完成Kubernetes監控
在上一章部署好應用之後,本章給大家帶來了雲原華誕誌監控平台Prometheus,運用Prometheus監控Kubernetes集群,並完成部署配置Grafana。

第14章 Kubernetes的擴展
本章將助力大家進階Kubernetes,擴展Kubernetes平台,完成自定義的功用。

第15章 课程總結
本章作爲课程的最後一章,我們將帶妳整體梳理课程所學的内容,並提供一些後續的學習倡議,在课程問答區教師等著與妳進一步交流。

本课程持續更新中
import java.io.OutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.SortedSet; import java.util.Set; import java.util.NavigableSet; import java.io.IOException; import java.io.InputStreamReader; import java.util.TreeSet; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import java.io.BufferedReader; import java.util.Comparator; import java.util.Collections; import java.io.InputStream; /* Built using CHelper plug-in Actual solution is at the top / public class Main { public static void main(String[] args) { InputStream inputStream = System.in; OutputStream outputStream = System.out; InputReader in = new InputReader(inputStream); PrintWriter out = new PrintWriter(outputStream); TaskH solver = new TaskH(); solver.solve(1, in, out); out.close(); } static class TaskH { public void solve(int testNumber, InputReader in, PrintWriter out) { int n = in.nextInt(); int len = in.nextInt(); int[] x = new int[n]; int[] y = new int[n]; double[] s = new double[n]; for (int i = 0; i < n; ++i) { x[i] = in.nextInt(); y[i] = in.nextInt(); s[i] = in.nextDouble(); } List<TaskH.Segment> segments = new ArrayList<>(); int pos = 0; for (int i = 0; i < n; ++i) { if (x[i] > pos) { segments.add(new TaskH.Segment(pos, x[i], 0.0)); } segments.add(new TaskH.Segment(x[i], y[i], s[i])); pos = y[i]; } if (pos < len) { segments.add(new TaskH.Segment(pos, len, 0.0)); } out.println(solveOne(segments)); } private double solveOne(List<TaskH.Segment> segments) { int n = segments.size(); for (int i = 0; i < n; ++i) { TaskH.Segment s = segments.get(i); s.ptr = i; s.curEnergy = 0.0; s.maxEnergy = (s.right - s.left) / s.s; s.minEnergy = -(s.right - s.left) / (s.s + 2); } List<TaskH.Segment> segmentsByS = new ArrayList<>(segments); Collections.sort(segmentsByS, new Comparator<TaskH.Segment>() { public int compare(TaskH.Segment o1, TaskH.Segment o2) { int z = Double.compare(o2.s, o1.s); if (z == 0) { z = Integer.compare(o2.left, o1.left); } return z; } }); TreeSet<TaskH.Segment> available = new TreeSet<>(new Comparator<TaskH.Segment>() { public int compare(TaskH.Segment o1, TaskH.Segment o2) { return o1.ptr - o2.ptr; } }); available.addAll(segments); for (TaskH.Segment s : segmentsByS) { if (s.s == 0.0) break; s.alive = false; available.remove(s); NavigableSet<TaskH.Segment> after = available.tailSet(s, false); double capacity = s.maxEnergy - s.curEnergy; double spent = 0.0; while (!after.isEmpty()) { TaskH.Segment t = after.first(); if (t.alive) { double t1 = t.curEnergy - t.minEnergy; double t2 = capacity - spent; double transfer = Math.min(t1, t2); spent += transfer; t.curEnergy -= transfer; if (t1 <= t2) { available.remove(t); } else { break; } } } s.curEnergy += spent; } double res = 0.0; for (TaskH.Segment s : segments) { double v = (s.right - s.left - s.curEnergy * s.s) / (s.right - s.left + s.curEnergy); res += (s.right - s.left) / (s.s + v); } return res; } static class Segment { int left; int right; int ptr; double s; boolean alive = true; double minEnergy; double curEnergy; double maxEnergy; public Segment(int left, int right, double s) { this.left = left; this.right = right; this.s = s; } } } static class InputReader { public BufferedReader reader; public StringTokenizer tokenizer; public InputReader(InputStream stream) { reader = new BufferedReader(new InputStreamReader(stream), 32768); tokenizer = null; } public String next() { while (tokenizer == null || !tokenizer.hasMoreTokens()) { try { tokenizer = new StringTokenizer(reader.readLine()); } catch (IOException e) { throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } public double nextDouble() { return Double.parseDouble(next()); } } }

猜你喜欢

转载自blog.51cto.com/15101024/2621031