当前位置:   article > 正文

云原生第3课:Kubernetes 系统快速入门

华为云云原生技术体系

本篇文章来自《华为云云原生王者之路训练营》黄金系列课程第3课,由华为云容器批量计算首席架构师马达主讲,介绍云原生技术体系中Kubernetes的相关概念和技术架构。

01

 Kubernetes介绍 

云计算的发展历程

7d5d2e4e77d254ce58ae997a18ee69af.png

“云”中的资源在使用者看来是可以无限扩展的,并且可以随时获取,按需使用,随时扩展,按使用付费。这种特性经常被称为像水电一样使用IT基础设施。

Kubernetes架构分层

该图为Kubernetes社区描绘的整个Kubernetes生态里所涉及的几个主要层次:

8774fbd0dd472b591c8020cfa210d885.png

K8S社区架构中对各层的详细定义

e3c5836fcc4267a5b3281f8af30827dc.png

上图从上往下依次为:

1)生态层:不属于K8S范围

2)接口层(工具、SDK库、UI等)

  • K8S官方的项目会提供库、工具、UI等外围工具

  • 外部可提供自有的实现

3)治理层:策略执行和自动化编排

  • 对应用运行的可选层,没有这层功能不影响应用的执行

  • 自动化API:

    水平弹性伸缩、租户管理、集群管理、动态LB等

  • 策略API:

    限速、资源配额、pod可靠性策略、network policy等

4)应用层:部署(无状态/有状态应用、批处理、集群应用等)和路由(服务发现、DNS解析等)

  • K8S发行版必备功能和API,K8S会提供默认的实现,如Scheduler

  • Controller和scheduler可以被替换为各自的实现,但必须通过一致性测试

  • 业务管理类Controller:

    daemonset/replicaset/replication/statefulset/cronjob/service/endpoint

5)内核层:Kubernetes最核心功能,对外提供API构建高层的应用,对内提供插件式应用执行环境

  • 由主流K8S codebase实现(主项目),属于K8S的内核、最小特性集。

    等同于Linux Kernel

  • 提供必不可少Controller、Scheduler的默认实现

  • 集群管理类Controller:

    Node/gc/podgc/volume/namespace/resourcequota/serviceaccount

总的来说:

内核层:提供最核心的特性最小集以及API,为必选模块

内核层之上:以各种Controller插件方式实现内核层API,支持可替换的实现

内核层之下:是各种适配存储、网络、容器、Cloud Provider等

02

 Kubernetes基本概念 

Kubernets概览

bfe266f71b989050b690318cdd5b36d6.png

Kubernetes关键概念-Pod

  • 在Kubernetes中,pods是能够创建、调度、和管理的最小部署单元,是一组容器的集合,而不是单独的应用容器

  • 同一个Pod里的容器共享同一个网络命名空间,IP地址及端口空间。

  • 从生命周期来说,Pod是短暂的而不是长久的应用。

    Pods被调度到节点,保持在这个节点上直到被销毁。

POD实例:

  1. {
  2. "kind": "Pod",
  3. "apiVersion": "v1",
  4. "metadata": {
  5. "name": "redis-django",
  6. "labels": {
  7. "app": "webapp"
  8. }
  9. },
  10. "spec": {
  11. "containers": [
  12. {
  13. "name": "key-value-store",
  14. "image": "redis"
  15. },
  16. {
  17. "name": "frontend",
  18. "image": "django"
  19. }
  20. ]
  21. }
  22. }

Pod详解-容器(Containers)

1)Infrastructure Container:基础容器

  • 用户不可见,无需感知

  • 维护整个Pod网络空间

2)InitContainers:初始化容器,一般用于服务等待处理以及注册Pod信息等

  • 先于业务容器开始执行

  • 顺序执行,执行成功退出(exit 0),全部执行成功后开始启动业务容器

3)Containers:业务容器

  • 并行启动,启动成功后一直Running

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: myapp-pod
  5. labels:
  6. app: myapp
  7. spec:
  8. containers:
  9. - name: myapp-container
  10. image: busybox
  11. command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  12. initContainers:
  13. - name: init-myservice
  14. image: busybox
  15. command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  16. - name: init-mydb
  17. image: busybox
  18. command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

容器基本组成

1)镜像部分:

  • 镜像地址和拉取策略

  • 拉取镜像的认证凭据

2)启动命令:

  • command:替换docker容器的entrypoint

  • args:作为docker容器entrypoint的入参

3)计算资源:

  • 请求值:调度依据

  • 限制值:容器最大能使用的规格

spec:

  1. imagePullSecrets:
  2. - name: default-secret
  3. containers:
  4. - image: kube-dns:1.0.0
  5. imagePullPolicy: IfNotPresent
  6. command:
  7. - /bin/sh
  8. - -c
  9. - /kube-dns 1>>/var/log/skydns.log 2>&1 --domain=cluster.local. --dns-port=10053
  10. --config-dir=/kube-dns-config --v=2
  11. resources:
  12. limits:
  13. cpu: 100m
  14. memory: 512Mi
  15. requests:
  16. cpu: 100m
  17. memory: 100Mi

Pod详解-外部输入

Pod可以接收的外部输入方式:环境变量、配置文件以及密钥。

环境变量:使用简单,但一旦变更后必须重启容器。

  • Key-value自定义

  • From 配置文件(configmap)

  • From 密钥(Secret)

以卷形式挂载到容器内使用,权限可控。

  • 配置文件(configmap)

  • 密钥(secret)

spec:

  1. containers:
  2. - env:
  3. - name: APP_NAME
  4. value: test
  5. - name: USER_NAME
  6. valueFrom:
  7. secretKeyRef:
  8. key: username
  9. name: secret
  10. envFrom:
  11. - configMapRef:
  12. name: config
  13. volumeMounts:
  14. - mountPath: /usr/local/config
  15. name: cfg
  16. - mountPath: /usr/local/secret
  17. name: sct
  18. volumes:
  19. - configMap:
  20. defaultMode: 420
  21. items:
  22. - key: age
  23. path: age
  24. name: config
  25. name: cfg
  26. - name: sct
  27. secret:
  28. defaultMode: 420
  29. secretName: secret

Pod与工作负载的关系

  • 通过label-selector  和 owerReference 相关联

  • Pod通过工作负载实现应用的运维,如伸缩、升级等

fdf23fbec03394b5b691ed983aa882d3.png

关键工作负载-ReplicaSet

f603e682caa9f28f13a0a33ea03374fa.png

  • ReplicaSet—副本控制器

  • 确保Pod的一定数量的份数(replica)在运行。如果超过这个数量,控制器会杀死一些,如果少了,控制器会启动一些。

  • ReplicaSet用于解决pod的扩容和缩容问题。

  • 通常用于无状态应用

  1. apiVersion: extensions/v1beta1
  2. kind: ReplicaSet
  3. metadata:
  4. name: frontend
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. tier: frontend
  10. matchExpressions:
  11. - {key: tier, operator: In, values: [frontend]}
  12. template:
  13. metadata:
  14. labels:
  15. app: guestbook
  16. tier: frontend
  17. spec:
  18. containers:
  19. - name: php-redis
  20. image: gcr.io/google_samples/gb-frontend:v3
  21. resources:
  22. requests:
  23. cpu: 100m
  24. memory: 100Mi
  25. env:
  26. - name: GET_HOSTS_FROM
  27. value: dns
  28. ports:
  29. - containerPort: 80

关键工作负载-Deployment

5dc5c618a0d29abb2fe20004e2b20f18.png

1)Kubernetes Deployment提供了官方的用于更新Pod和Replica Set(下一代的Replication Controller)的方法,您可以在Deployment对象中只描述您所期望的理想状态(预期的运行状态),Deployment控制器为您将现在的实际状态转换成您期望的状态;

2)Deployment集成了上线部署、滚动升级、创建副本、暂停上线任务,恢复上线任务,回滚到以前某一版本(成功/稳定)的Deployment等功能,在某种程度上,Deployment可以帮我们实现无人值守的上线,大大降低我们的上线过程的复杂沟通、操作风险。

3)Deployment的典型用例:

  • 使用Deployment来启动(上线/部署)一个Pod或者ReplicaSet

  • 检查一个Deployment是否成功执行

  • 更新Deployment来重新创建相应的Pods(例如,需要使用一个新的Image)

  • 如果现有的Deployment不稳定,那么回滚到一个早期的稳定的Deployment版本

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. spec:
  6. replicas: 3
  7. template:
  8. metadata:
  9. labels:
  10. app: nginx
  11. spec:
  12. containers:
  13. - name: nginx
  14. image: nginx:1.7.9
  15. ports:
  16. - containerPort: 80

Kubernetes系统组件

2fb821f9c90477e8cf3e2f9c1126cb1f.png

03

 Kubernetes总体架构 

d72eae70c07bfedfbfba3a2656052f82.png

Kubernetes基于list-watch机制的控制器架构

048d940d0754898789c2174295d13804.png

Kubernetes Controllers

67b157ed93517919e93c7023994361e9.png

Scheduler:为Pod找到一个合适的Node

c2d3ff508798f370ecd64e564ca9dbb7.png

Kubernetes 的 Default scheduler

279d4277ffb9ed885d0592f0112243d2.png

  • 基于队列的调度器

  • 一次调度一个Pod

  • 调度时刻全局最优

04

 Demo 简介 

Weather Forecast是一款查询城市的天气信息的应用示例,一共包含4个微服务:frontend、advertisement、forecast和recommendation

  • frontend:前台服务,会调用advertisement和forecast这两个服务,展示整个应用的页面,使用React.js开发而成;

    frontend服务有两个版本: v1版本的界面按钮为绿色; v2版本的界面按钮为蓝色。

  • advertisement:广告服务,返回静态的广告图片,使用Golang开发而成。

  • forecast:天气预报服务,返回相应城市的天气数据,使用Node.js开发而成;

    forecast 服务有两个版本:  v1版本直接返回天气信息, v2版本会请求recommendation服务,获取推荐信息,并结合天气信息一起返回数据。

  • recommendation:推荐服务,根据天气情况向用户推荐穿衣和运动等信息,使用Java开发而成。

dd140b0ff5e650fe382ca012863efe0c.png


感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!

e9bc8882aeef2e38029d2848800dbcf6.gif

4d310e45d173e8dd4ec89bc08008c95e.gif

喜欢就点个"在看"呗,留言、转发朋友圈

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/803082
推荐阅读
相关标签
  

闽ICP备14008679号