Kubernetes入门实践(环境搭建)

容器技术只是解决了运维部署工作中的一个很小的问题,在现实生产环境中,除了最基本的安装,还会各式各样的需求,比如服务发现、负载均衡、状态监控、健康检查、扩容缩容、应用迁移、高可用等等。这些容器之上的管理、调度工作就是容器编排

img

Kubernetes 从0到0.1

是一个生产级别的容器编排平台和集群管理系统,能够创建和调度容器,还能监控,还能够监控和管理服务器,可谓i是云时代下的操作系统

安装minikube

对于个人来讲,使用minikube即可,这是一个迷你版Kubernetes,在Linux安装:

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

安装完成后使用minikube -version即可查看版本号,输入minikube kubectl安装kubectl,这个工具的作用是与Kubernetes后台进行通信

启动minikube

如下启动minikube,后面指定了版本号1.23.3

$ minikube start --kubernetes-version=v1.23.3
😄  minikube v1.26.0 on Ubuntu 20.04
✨  Automatically selected the virtualbox driver. Other choices: ssh, none
......

使用minikube status查看运行状态:

$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

使用minikube node list查看节点列表

$ minikube node list
minikube	192.168.59.100

目前Kubernetes集群只有1个节点,名字就叫minikube,IP是192.168.59.100

可以使用命令登录到这个节点上:

$ minikube ssh
                         _             _            
            _         _ ( )           ( )           
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __  
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

$ uname -a
Linux minikube 5.10.57 #1 SMP Thu Jun 16 23:36:20 UTC 2022 x86_64 GNU/Linux
$ exit
logout

实例: 运行Nginx

kubctl使用run命令运行,使用--image指定镜像:

$ minikube kubectl -- run ngx --image=nginx:alpine
    > kubectl.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
    > kubectl: 44.43 MiB / 44.43 MiB [-------------] 100.00% 10.17 MiB p/s 4.6s
pod/ngx created

把Kubenetes里的容器称作Pod,使用get pod查看正在运行的容器:

$ minikube kubectl -- get pod
NAME   READY   STATUS    RESTARTS   AGE
ngx    1/1     Running   0          2m40s

Kubernetes基本架构

Kubernetes的管理目标是大规模的集群和应用,必须能够将系统抽象到足够高的层次,分解出一些松耦合的对象才能简化系统模型,如下是架构图:

img

Kubernetes 采用了控制面 / 数据面(Control Plane / Data Plane)架构,集群里的计算机被称为节点(Node),可以是实机也可以是虚机,少量的节点用作控制面来执行集群的管理维护工作,其他的大部分节点都被划归数据面,用来跑业务应用

控制面的节点在Kubernetes里叫做Master Node,一般简称为Master,它是整个集群里最重要的部分,可以说是Kubernetes的大脑和心脏,数据面的节点叫做Worker Node,一般简称为WorkerNode

数据面的节点叫做Worker Node,一般简称为Worker或者Node,在Master控制下完成任务。Node的数量非常多,构成了一个资源池,Kubernetes在这个池中分配资源,调度应用

节点内部结构

Kubernetes的节点内部具有复杂的结构,是由许多的模块构成的,这些模块分为组件(Component)和插件(Addon)两类,组件实现了Kubernetes的核心功能特性,插件为其扩展功能

Master组件

4个组件: apiserver、etcd、scheduler、controller-manager

apiserver是Master节点的唯一入口,也是整个Kubernetes系统的唯一入口,对外公开了一系列的RESTful API,并且加上了验证、授权等功能,所有其他组件都只能和它直接通信

etcd是一个高可用的分布式Key-Value数据库,用来持久化存储系统里的各种资源对象和状态,相当于Kubernetes里的配置管理员

scheduler负责容器的编排工作,检查节点的资源状态,把Pod调度到最适合的节点上运行,相当于部署人员,因为节点状态和Pod信息都存储在etcd里,所以scheduler必须通过apiserver才能获得

controller-manager负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸缩等功能,起到监控运维的作用

这4个组件都被容器化了,运行在集群的Pod里,使用命令可以查看:

$ minikube kubectl -- get pod -n kube-system
NAME                               READY   STATUS    RESTARTS      AGE
coredns-64897985d-bg4kx            1/1     Running   1 (12m ago)   13h
etcd-minikube                      1/1     Running   1 (12m ago)   13h
kube-apiserver-minikube            1/1     Running   1 (12m ago)   13h
kube-controller-manager-minikube   1/1     Running   1 (12m ago)   13h
kube-proxy-xqx2n                   1/1     Running   1 (12m ago)   13h
kube-scheduler-minikube            1/1     Running   1 (12m ago)   13h
storage-provisioner                1/1     Running   2 (11m ago)   13h

Node组件

3个组件: kubelet、kube-proxy、container-runtime

kubelet是Node代理,负责管理Node相关的绝大部分操作,Node上只有它能够与apiserver进行通信,实现状态报告,命令下发,启停容器等功能

kube-proxy是Node的网络代理,只负责管理容器的网络通信,为Pod转发TCP/UDP数据包

container-runtime是容器和镜像的实际使用者,在kubelet的指挥下创建容器,管理Pod的生命周期

这3个组件只有kube-proxy被容器化

使用minikube ssh登录节点,输入如下命令查看这个容器:

$ docker ps | grep kube-proxy
345928bf22b1   9b7cc9982109           "/usr/local/bin/kube…"   20 minutes ago   Up 20 minutes             k8s_kube-proxy_kube-proxy-xqx2n_kube-system_97832cdd-8a91-41f0-a557-c0be9af17966_1

kubelet没有被容器化,所有用进程查看命令来查看

$ ps -ef | grep kubelet
root        1306       1  2 03:22 ?        00:00:39 /var/lib/minikube/binaries/v1.23.3/kubelet

综上所述:

  1. 每个Node上的kubelet会定期向apiserver上报节点状态,apiserver再存到etcd中

  2. 每个Node上的kube-proxy实现了TCP/UDP反向代理,让容器对外提供稳定的服务

  3. scheduler通过apiserver得到当前的节点状态,调度Pod,然后apiserver下发命令给某个Node的kubelet,kubelet调用container-runtime的启动容器

  4. controller-manager也通过apiserver得到实时的节点状态,监控可能的异常情况

节点插件

输入如下命令显示插件列表:

$ minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador                  | minikube | disabled     | 3rd party (Ambassador)         |
| auto-pause                  | minikube | disabled     | Google                         |
| csi-hostpath-driver         | minikube | disabled     | Kubernetes                     |
| dashboard                   | minikube | disabled     | Kubernetes                     |
| default-storageclass        | minikube | enabled ✅   | Kubernetes                     |
| efk                         | minikube | disabled     | 3rd party (Elastic)            |
| freshpod                    | minikube | disabled     | Google                         |
| gcp-auth                    | minikube | disabled     | Google                         |
| gvisor                      | minikube | disabled     | Google                         |
| headlamp                    | minikube | disabled     | kinvolk.io                     |
| helm-tiller                 | minikube | disabled     | 3rd party (Helm)               |
....

有两个比较重要的插件:DNS和Dashboard

DNS在集群中实现了域名解析服务,允许用域名解析而非IP地址的方式来进行通信,是服务发现和负载均衡的基础

Dashboard是仪表盘,为Kubernetes提供了一个图形化的操作界面,执行minikube dashboard就能自动打开:

posted @ 2022-07-23 13:54  N3ptune  阅读(124)  评论(0编辑  收藏  举报