KCNA考试 第五章:kubernetes学习实践(1)

简介: KCNA考试 第五章:kubernetes学习实践(1)

文章目录

1. 简介

2. 学习目标

3. Kubernetes对象

4. 与Kubernetes交互

4.1 Demo: kubectl

5. Pod 概念

5.1 Demo: Pods

6. 负载均衡

6.2 demo: pod、replicats、deployments

7. 网络

7.1 demo

8. Volume & Storage

9. 配置对象

10. Autoscaling

11. Additional Resources

1. 简介

在本章中,我们将学习不同的Kubernetes对象,它们的用途以及如何与它们交互。

在设置集群或使用现有集群之后,我们可以开始部署一些工作负载。Kubernetes中最小的计算单元不是一个容器,而是一个Pod对象。也就是说,Pod不是我们用于工作负载的唯一抽象。Kubernetes有各种各样的工作负载对象来控制如何部署、扩展和管理pod。

部署工作负载并不是开发人员或管理员必须执行的唯一任务。Kubernetes为容器和编配的一些固有问题提供了解决方案,比如配置管理、跨节点网络、外部流量路由、负载平衡或pod的扩展。

2. 学习目标

在本章结束时,你应该能够:

  • 解释什么是Kubernetes对象以及如何描述它。
  • 讨论Pod的概念及其解决的问题。
  • 了解如何使用工作负载资源来扩展和安排pod。
  • 了解如何用服务抽象Pods,以及如何公开它们。

3. Kubernetes对象

Kubernetes的核心概念之一是提供大量抽象资源(也称为对象),您可以使用这些资源来描述应该如何处理工作负载。其中一些用于处理容器编排的问题,如调度和自愈,另一些用于解决容器的一些固有问题。

Kubernetes对象可以区分为面向工作负载的对象(用于处理容器工作负载)和面向基础设施的对象(例如处理配置、网络和安全)。其中一些对象可以放在一个名称空间中,而其他对象可以跨整个集群使用。

作为用户,我们可以用流行的数据序列化语言YAML描述这些对象,并将它们发送到api服务器,在创建它们之前要对它们进行验证。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec: 
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19
        ports:
        - containerPort: 80

红色突出显示的字段是必填字段。它们包括:


apiVersion:每个对象都可以进行版本控制。这意味着对象的数据结构可以在不同的版本之间变化。

kind:应该创建的对象类型。

metadata:可以用来识别它的数据。每个对象都需要一个名称,并且必须是唯一的。如果需要多个具有相同名称的对象,可以使用名称空间。

spec:对象的说明。在这里你可以描述你想要的状态。要小心,因为对象的结构可能会随着它的版本而改变!

创建,修改或删除一个对象只是一个意图记录,在那里你描述你的对象应该处于的状态,你不像你在本地机器上做的那样主动启动pods或甚至容器,并获得直接反馈,如果它工作与否。

4. 与Kubernetes交互

要访问API,用户可以使用名为kubectl的官方命令行接口客户端。让我们看看Kubernetes日常使用的一些基本命令。

注意:您可以在官方文档中了解如何安装kubectl。

你可以用下面的命令列出集群中可用的对象:

$ kubectl api-resources
NAME                    SHORTNAMES  APIVERSION  NAMESPACED  KIND
...
configmaps              cm          v1          true        ConfigMap
...
namespaces              ns          v1          false       Namespace
nodes                   no          v1          false       Node
persistentvolumeclaims  pvc         v1          true        PersistentVolumeClaim
...
pods                    po          v1          true        Pod
...
services                svc         v1          true        Service

注意对象是如何使用短名称的。这对于名称较长的对象(如configmaps或persistentvolumeclaims)非常有用。该表还显示了哪些对象具有名称空间以及它们的可用版本。

如果你想了解更多关于对象的信息,kubectl有一个内置的explain函数!

让我们进一步了解pod:

$ kubectl explain pod
KIND:     Pod
VERSION:  v1
DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is     
     created by clients and scheduled onto hosts. 
FIELDS: 
   apiVersion <string>     
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal         
     value, and may reject unrecognized values.
...
   kind <string>
...
   metadata <Object>
...
   spec <Object>

要了解更多关于pod规范的信息,您可以深入了解对象定义。使用如下格式:<type>.<fieldName>[.<fieldName>]

$ kubectl explain pod.spec
KIND:     Pod
VERSION:  v1 
RESOURCE: spec <Object>  
DESCRIPTION:
     Specification of the desired behavior of the pod. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status      
     PodSpec is a description of a pod. 
FIELDS:
   activeDeadlineSeconds <integer>     
     Optional duration in seconds the pod may be active on the node relative to       
     StartTime before the system will actively try to mark it failed and kill         
     associated containers. Value must be a positive integer. 
   affinity <object>     
     If specified, the pod's scheduling constraints 
   automountServiceAccountToken <boolean>     
     AutomountServiceAccountToken indicates whether a service account token           
     should be automatically mounted. 
   containers <[]Object> -required-
...

让我们看看基本的kubectl命令。你可以使用——help标志来查看它们:

$ kubectl --help
kubectl controls the Kubernetes cluster manager. 
 Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/ 
Basic Commands (Beginner):
  create Create a resource from a file or from stdin
  expose Take a replication controller, service, deployment or pod and expose it as a new Kubernetes service
  run Run a particular image on the cluster
  set Set specific features on objects 
Basic Commands (Intermediate):
  explain Get documentation for a resource
  get Display one or many resources
  edit Edit a resource on the server
  delete Delete resources by file names, stdin, resources and names, or by resources and label selector

要在Kubernetes中从YAML文件创建一个对象,你可以使用以下命令:

kubectl create -f <your-file>.yaml

Kubernetes有许多图形用户界面和仪表板,它们允许与集群进行可视化交互。

1035234-20181020215539574-213176954.png

Kubernetes官方仪表盘的截图

与Kubernetes交互的其他工具:


kubernetes/dashboard

derailed/k9s

Lens

VMware Tanzu Octant

尽管有许多CLI工具和gui,但还有一些高级工具允许创建模板和打包Kubernetes对象。也许今天Kubernetes最常用的工具是Helm。

Helm是一个Kubernetes的包管理器,它允许更简单的更新和与对象的交互。Helm将Kubernetes对象封装在所谓的Charts中,可以通过注册表与他人共享。要开始使用Kubernetes,您可以搜索ArtifactHub,找到您最喜欢的软件包,准备部署。

4.1 Demo: kubectl

5. Pod 概念

Kubernetes中最重要的对象是Pod。pod描述一个或多个容器的单元,这些容器共享一个名称空间和cgroups隔离层。它是Kubernetes中最小的可部署单元,这也意味着Kubernetes不会直接与容器交互。pod概念的引入是为了允许运行相互依赖的多个进程的组合。pod中的所有容器共享一个IP地址,并且可以通过文件系统共享。

1035234-20181020215539574-213176954.png

多个容器共享名称空间形成一个pod

下面是一个带有两个容器的简单Pod对象的例子:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-with-sidecar
spec:
  containers:
  - name: nginx
    image: nginx:1.19
    ports:
    - containerPort: 80
  - name: count
    image: busybox:1.34
    args: [/bin/sh, -c,
            'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']

您可以向主应用程序添加任意数量的容器。但是要小心,因为您失去了单独缩放它们的能力!使用支持主应用程序的第二个容器称为sidecar容器。

所有定义的容器都是在同一时间启动的,没有顺序,但是您也可以使用initContainers在主应用程序启动之前启动容器。在这个例子中,init容器init-myservice试图到达另一个服务。一旦完成,主容器就会启动。

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']

请务必浏览有关pod的文档,因为还有更多设置有待发现。对于Pod中的每个容器,可以设置的一些重要设置示例如下:


resources: 设置一个资源请求和CPU和内存的最大限制

livenessProbe: 配置定期检查应用程序是否仍处于活动状态的运行状况检查。如果检查失败,可以重新启动容器。

securityContext: 设置用户和组设置,以及内核功能。

5.1 Demo: Pods

docker run -d nginx:1.19
kubectl run nginx  --image=nginx:1.19
kubectl get pods
kubectl describe pod nginx
#获取IP
curl http://IP

6. 负载均衡

在容器编排平台中,仅仅使用Pods是不够灵活的。例如,如果一个Pod因为一个节点失败而丢失,那么它就永远消失了。为了确保始终运行已定义数量的Pod副本,我们可以使用控制器对象来为我们管理Pod。


ReplicaSet

确保在任何给定时间运行所需数量的pod的控制器对象。replicaset可以用于向外扩展应用程序并提高其可用性。它们通过启动一个pod定义的多个副本来实现这一点。

Deployment

Kubernetes中功能最丰富的对象。部署可以用来描述完整的应用程序生命周期,它们通过管理多个replicaset来实现这一点,当应用程序被更改时,这些replicaset会被更新,例如,提供一个新的容器映像。部署非常适合在Kubernetes中运行无状态应用程序。

StatefulSet

StatefulSets可以用于在Kubernetes上运行像数据库这样的有状态应用程序,这在很长一段时间内都被认为是一个不好的实践。有状态应用程序有特殊的需求,这些需求不适合pod和容器的短暂性。与部署不同,StatefulSets尝试保留pod的IP地址,并给它们一个稳定的名称、持久的存储和更优雅的伸缩和更新处理。

DaemonSet

确保Pod的副本在集群的所有(或部分)节点上运行。守护进程集非常适合运行与基础设施相关的工作负载,例如监视或日志工具。

Job

创建一个或多个执行任务的Pods,然后终止该任务。作业对象非常适合运行数据库迁移或管理任务等一次性脚本。

CronJob

CronJobs为作业添加基于时间的配置。这允许定期运行Jobs,例如每天晚上4点执行备份作业。

交互式教程-部署一个应用程序并探索它

在Kubernetes文档提供的交互式教程的第2部分中,您可以了解如何在Minikube集群中部署应用程序。

应用您从“与Kubernetes交互”中学到的知识,在交互式教程的第三部分探索您的应用程序。

6.1 demo: pod、replicats、deployments

apiVersion: v1
kind: Pod
metadata:
  name: simple-nginx-pod
  labels:
    role: myrole
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
kubectl apply -f simple-nginx-pod.yaml

replicas部署

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      apps: nginx
  template:
    metadata:
      labels: 
        apps: nginx
    spec: 
      containers:
      - name: web
        image: nginx
        ports:
        - containerPort: 80
$ kubectl apply -f replicas.yaml
$ k get pods
NAME                                     READY   STATUS    RESTARTS   AGE
nginx-5psrm                              1/1     Running   0          2m12s
nginx-68x8p                              1/1     Running   0          2m12s
nginx-q9zlq                              1/1     Running   0          2m12s
$ kubectl scale --replicas=4 rs/nginx

deployment部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
$ k apply -f deployment.yaml
$ k get pods
NAME                                     READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-55jrb        1/1     Running   0          2m35s
nginx-deployment-66b6c48dd5-6x9cj        1/1     Running   0          2m35s
nginx-deployment-66b6c48dd5-pj7qr        1/1     Running   0          2m35s
$ k scale --replicas=4 deployment/nginx-deployment
$ k get pods
NAME                                     READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-55jrb        1/1     Running   0          4m15s
nginx-deployment-66b6c48dd5-6x9cj        1/1     Running   0          4m15s
nginx-deployment-66b6c48dd5-cxv8g        1/1     Running   0          3s
nginx-deployment-66b6c48dd5-pj7qr        1/1     Running   0          4m15s
$ k set image deployment/nginx-deployment nginx=nginx:1.20
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
Web App开发 Kubernetes 数据可视化
Kubernetes Dashboard 可视化插件部署 博主亲自实践可用
Kubernetes Dashboard 可视化插件部署 博主亲自实践可用
29 0
|
1月前
|
canal Kubernetes Docker
Kubernetes_v1.18.2环境搭建 博主亲自实践可用
Kubernetes_v1.18.2环境搭建 博主亲自实践可用
48 0
|
1月前
|
Prometheus 监控 Kubernetes
干货|EasyMR 基于 Kubernetes 应用的监控实践
在云原生时代,Promtheus+Grafana 的组合已经成为了可观测性工具中不可或缺的一部分。在本文中,我们将详细探讨在大数据计算引擎 EasyMR 中如何动态采集 Kubernetes 应用监控数据。
41 0
|
2月前
|
存储 Kubernetes Cloud Native
云原生|kubernetes|持久化存储pv,pvc和StorageClass的学习
云原生|kubernetes|持久化存储pv,pvc和StorageClass的学习
74 0
|
2月前
|
存储 Kubernetes 关系型数据库
kubernetes学习之持久化存储StorageClass(4---nfs存储服务)
kubernetes学习之持久化存储StorageClass(4---nfs存储服务)
33 0
|
2月前
|
Kubernetes Cloud Native 应用服务中间件
云原生|kubernetes|关于configMap的一些学习
云原生|kubernetes|关于configMap的一些学习
37 1
|
2月前
|
Kubernetes Cloud Native 安全
猿创征文|云原生|kubernetes学习之多账户管理--权限精细化分配方案(两种方式-sa和用户)
猿创征文|云原生|kubernetes学习之多账户管理--权限精细化分配方案(两种方式-sa和用户)
76 0
|
2月前
|
Kubernetes Cloud Native API
猿创征文|云原生|kubernetes学习之RBAC(六)
猿创征文|云原生|kubernetes学习之RBAC(六)
22 0
|
2月前
|
Kubernetes Cloud Native 应用服务中间件
【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战(五)
【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战(五)
18 0
|
2月前
|
Kubernetes 供应链 安全
k8s学习-CKS考试必过宝典
k8s学习-CKS考试必过宝典
67 0