企业网站设计师,软件项目管理期末考试,网站建设的七大主要目的,网页设计模板图片中文1 云计算时代的操作系统
Kubernetes 是一个生产级别的 容器编排平台 和 集群管理系统 #xff0c;能够 创建、调度容器#xff0c;监控、管理服务器。
容器是什么#xff1f;容器是软件#xff0c;是应用#xff0c;是进程。服务器是什么#xff1f;服务器是硬件#…1 云计算时代的操作系统
Kubernetes 是一个生产级别的 容器编排平台 和 集群管理系统 能够 创建、调度容器监控、管理服务器。
容器是什么容器是软件是应用是进程。服务器是什么服务器是硬件是 CPU、内存、硬盘、网卡等。
那么既可以管理软件也可以管理硬件就是一个操作系统Operating System。
从某种角度来看Kubernetes 可以说是一个集群级别的操作系统。主要功能就是资源管理和作业调度。Kubernetes 不是运行在单机上管理单台计算资源和进程而是运行在多台服务器上管理几百几千台的计算资源以及在这些资源上运行的上万上百万的进程规模要大得多。 由于云原生的兴起开发人员从一开始就必须考虑后续的部署运维工作而运维人员也需要在早期介入开发才能做好应用的运维监控工作。 2 搭建小巧完备的Kubernetes环境
快速搭建 Kubernetes 环境的工具
kindminikube https://kubernetes.io/zh/docs/tasks/tools/ 我们选择minikube来学习Kubernetes。 实验环境2c4g https://minikube.sigs.k8s.io/docs/ 2.1 安装docker
sudo apt install -y docker.io #安装Docker Enginesudo service docker start #启动docker服务
sudo usermod -aG docker ${USER} #当前用户加入docker组需要重新登录生效docker info2.2 安装minikube
# Intel x86_64
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64# Apple arm64
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64sudo install minikube /usr/local/bin/安装完成后查看minikube版本
lianhaifenglianhaifeng-virtual-machine:~$ minikube version
minikube version: v1.30.1
commit: 08896fd1dc362c097c925146c4a0d0dac715ace02.3 安装kubectl
要操作 Kubernetes还需要另一个专门的客户端工具“kubectl”
minikube kubectl~/.bashrc追加命令如果没有的话简化kubectl命令
...
alias kubectlminikube kubectl --source (kubectl completion bash)
2.4 部署Kubernetes
minikube start --kubernetes-versionv1.23.3如果对自己的网速不自信的话可以更换镜像地址
minikube stopminikube delete --all
minikube start --kubernetes-versionv1.23.9 --image-mirror-countrycn --registry-mirrorhttps://twm4fpgj.mirror.aliyuncs.com查看Kubernetes集群状态
lianhaifenglianhaifeng-virtual-machine:~$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
查看节点
lianhaifenglianhaifeng-virtual-machine:~$ minikube node list
minikube 192.168.58.2运行一个Nginx应用
kubectl run ngx --imagenginx:alpinelianhaifenglianhaifeng-virtual-machine:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ngx 1/1 Running 0 47h至此我们已经安装了一个小而美的Kubernetes环境接下来让我们探索下Kubernets工作机制的奥秘。 3 Kubernetes 的基本架构
操作系统的一个重要功能就是抽象从繁琐的底层事务中抽象出一些简洁的概念然后基于这些概念去管理系统资源。
Kubernetes 的管理目标是大规模的集群和应用必须要能够把系统抽象到足够高的层次分解出一些松耦合的对象才能简化系统模型减轻用户的心智负担。
k8s架构图 采用了现今流行的“控制面 / 数据面”Control Plane / Data Plane架构。集群里的计算机被称为“节点”Node可以是实机也可以是虚机。少量的节点用作控制面来执行集群的管理维护工作。 控制面的节点叫做 Master Node一般简称为 Master。是整个集群里最重要的部分可以说是 Kubernetes 的大脑和心脏。 其它的大部分节点都被划归数据面用来跑业务应用。 数据面的节点叫做 Worker Node一般就简称为 Worker 或者 Node。相当于 Kubernetes 的手和脚在 Master 的指挥下干活。Node 的数量非常多构成了一个资源池Kubernetes 就在这个池里分配资源调度应用。因为资源被“池化”了所以管理也就变得比较简单可以在集群中任意添加或者删除节点。 kubectl是 Kubernetes 的客户端工具用来操作 Kubernetes但它位于集群之外理论上不属于集群。
查看 Kubernetes 的节点状态
lianhaifenglianhaifeng-virtual-machine:~$ kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 7d4h v1.23.3
可以看到当前的 minikube 集群里只有一个 Master那 Node 呢
是因为 Master 和 Node 的划分不是绝对的。当集群的规模较小工作负载较少的时候Master 也可以承担 Node 的工作就像我们搭建的 minikube 环境它就只有一个节点这个节点既是 Master 又是 Node。
3.1 节点内部的结构
Kubernetes 的节点内部也具有复杂的结构是由很多的模块构成的这些模块又可以分成组件Component和插件Addon两类
组件 实现了 Kubernetes 的核心功能特性没有这些组件 Kubernetes 就无法启动。插件 则是 Kubernetes 的一些附加功能不安装也不会影响 Kubernetes 的正常运行。
3.2 Master 里的组件
3.2 Master 里的组件 apiserver 是 Master 节点同时也是整个 Kubernetes 系统的唯一入口。对外公开了一系列的 RESTful API并且加上了验证、授权等功能。所有其它组件都只能和它直接通信可以说是 Kubernetes 里的联络员。 etcd 是一个高可用的分布式 Key-Value 数据库用来持久化存储系统里的各种资源对象和状态。相当于 Kubernetes 里的配置管理员。它只与 apiserver 有直接联系也就是说任何其它组件想要读写 etcd 里的数据都必须经过 apiserver。 scheduler 负责容器的编排工作检查节点的资源状态。把 Pod 调度到最适合的节点上运行相当于部署人员。因为节点状态和 Pod 信息都存储在 etcd 里所以 scheduler 必须通过 apiserver 才能获得。 controller-manager 负责维护容器和节点等资源的状态。实现故障检测、服务迁移、应用伸缩等功能相当于监控运维人员。它也必须通过 apiserver 获得存储在 etcd 里的信息才能够实现对资源的各种操作。
这 4 个组件也都被容器化了运行在集群的 Pod 里我们可以用 kubectl 来查看它们的状态
lianhaifenglianhaifeng-virtual-machine:~$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-64897985d-d5zbd 1/1 Running 1 (45h ago) 7d4h
etcd-minikube 1/1 Running 1 (45h ago) 7d4h
kube-apiserver-minikube 1/1 Running 3 7d4h
kube-controller-manager-minikube 1/1 Running 4 (45h ago) 7d4h
kube-proxy-zlztd 1/1 Running 1 (45h ago) 7d4h
kube-scheduler-minikube 1/1 Running 1 (45h ago) 7d4h
storage-provisioner 0/1 ImagePullBackOff 0 7d4h-n kube-system 参数表示检查“kube-system”名字空间里的 Pod。
3.3 Node 里的组件 kubelet(非容器化) 是 Node 的代理负责管理 Node 相关的绝大部分操作。Node 上只有它能够与 apiserver 通信。实现状态报告、命令下发、启停容器等功能相当于是 Node 上的一个“小管家”。 kube-proxy 是 Node 的网络代理只负责管理容器的网络通信简单来说就是为 Pod 转发 TCP/UDP 数据包相当于是专职的“小邮差”。 container-runtime 是容器和镜像的实际使用者。在 kubelet 的指挥下创建容器管理 Pod 的生命周期是真正干活的“苦力”。
Kubernetes 的定位是容器编排平台所以它没有限定 container-runtime 必须是 Docker完全可以替换成任何符合标准的其他容器运行时例如 containerd、CRI-O 等等只不过在这里我们使用的是Docker。
这 3 个组件中只有 kube-proxy 被容器化了而 kubelet 因为必须要管理整个节点容器化会限制它的能力所以它必须在 container-runtime 之外运行。
使用 minikube ssh 命令登录到节点后可以用 docker ps 看到 kube-proxy
lianhaifenglianhaifeng-virtual-machine:~$ minikube ssh
Last login: Sun May 21 11:53:08 2023 from 192.168.58.1
dockerminikube:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cafb3f8e014e nginx /docker-entrypoint.… 46 hours ago Up 46 hours k8s_ngx_ngx_default_066a844b-d429-4057-aca1-536c04d38f70_0
6f488ea5ca69 k8s.gcr.io/pause:3.6 /pause 46 hours ago Up 46 hours k8s_POD_ngx_default_066a844b-d429-4057-aca1-536c04d38f70_0
5b77694e7e89 a4ca41631cc7 /coredns -conf /etc… 46 hours ago Up 46 hours k8s_coredns_coredns-64897985d-d5zbd_kube-system_99c6f163-5738-41d8-ab8f-9a42dc3c6331_1
74d32f36a523 k8s.gcr.io/pause:3.6 /pause 46 hours ago Up 46 hours k8s_POD_storage-provisioner_kube-system_7fa7c71e-cc6a-4408-8b70-8b15534a10c8_1
0a2443c55984 k8s.gcr.io/pause:3.6 /pause 46 hours ago Up 46 hours k8s_POD_coredns-64897985d-d5zbd_kube-system_99c6f163-5738-41d8-ab8f-9a42dc3c6331_1
048758be7002 9b7cc9982109 /usr/local/bin/kube… 46 hours ago Up 46 hours k8s_kube-proxy_kube-proxy-zlztd_kube-system_b294b472-367b-44ca-8781-fab810428037_1
1148430b4e0f k8s.gcr.io/pause:3.6 /pause 46 hours ago Up 46 hours k8s_POD_kube-proxy-zlztd_kube-system_b294b472-367b-44ca-8781-fab810428037_1
5d164c717143 25f8c7f3da61 etcd --advertise-cl… 46 hours ago Up 46 hours k8s_etcd_etcd-minikube_kube-system_482305b50d4b0d3dbab5b9f1be9b0b18_1
78b7581b6659 b07520cd7ab7 kube-controller-man… 46 hours ago Up 46 hours k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_b965983ec05322d0973594a01d5e8245_4
3b81da17d618 f40be0088a83 kube-apiserver --ad… 46 hours ago Up 46 hours k8s_kube-apiserver_kube-apiserver-minikube_kube-system_b7b1a80caec341a470c95988d72c0626_3
431f68d5dec6 99a3486be4f2 kube-scheduler --au… 46 hours ago Up 46 hours k8s_kube-scheduler_kube-scheduler-minikube_kube-system_be132fe5c6572cb34d93f5e05ce2a540_1
315d15480c7d k8s.gcr.io/pause:3.6 /pause 46 hours ago Up 46 hours k8s_POD_kube-controller-manager-minikube_kube-system_b965983ec05322d0973594a01d5e8245_1
799bfc75e1af k8s.gcr.io/pause:3.6 /pause 46 hours ago Up 46 hours k8s_POD_kube-apiserver-minikube_kube-system_b7b1a80caec341a470c95988d72c0626_1
3a67d5e7cebb k8s.gcr.io/pause:3.6 /pause 46 hours ago Up 46 hours k8s_POD_etcd-minikube_kube-system_482305b50d4b0d3dbab5b9f1be9b0b18_1
729db09d17a6 k8s.gcr.io/pause:3.6 /pause 46 hours ago Up 46 hours k8s_POD_kube-scheduler-minikube_kube-system_be132fe5c6572cb34d93f5e05ce2a540_1
dockerminikube:~$ docker ps |grep kube-proxy
048758be7002 9b7cc9982109 /usr/local/bin/kube… 46 hours ago Up 46 hours k8s_kube-proxy_kube-proxy-zlztd_kube-system_b294b472-367b-44ca-8781-fab810428037_1
1148430b4e0f k8s.gcr.io/pause:3.6 /pause 46 hours ago Up 46 hours k8s_POD_kube-proxy-zlztd_kube-system_b294b472-367b-44ca-8781-fab810428037_1
退出(exit)查看 kubelet
lianhaifenglianhaifeng-virtual-machine:~$ ps -ef|grep kubelet
root 4547 3077 6 04:21 ? 01:03:42 /var/lib/minikube/binaries/v1.23.3/kubelet --bootstrap-kubeconfig/etc/kubernetes/bootstrap-kubelet.conf --config/var/lib/kubelet/config.yaml --container-runtimedocker --hostname-overrideminikube --kubeconfig/etc/kubernetes/kubele .conf --node-ip192.168.58.2
root 5147 5060 8 04:21 ? 01:20:09 kube-apiserver --advertise-address192.168.58.2 --allow-privilegedtrue --authorization-modeNode,RBAC --client-ca-file/var/lib/minikube/certs/ca.crt --enable-admission-pluginsNamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota --enable-bootstrap-token-authtrue --etcd-cafile/var/lib/minikube/certs/etcd/ca.crt --etcd-certfile/var/lib/minikube/certs/apiserver-etcd-client.crt --etcd-keyfile/var/lib/minikube/certs/apiserver-etcd-client.key --etcd-servershttps://127.0.0.1:2379 --kubelet-client-certificate/var/lib/minikube/certs/apiserver-kubelet-client.crt --kubelet-client-key/var/lib/minikube/certs/apiserver-kubelet-client.key --kubelet-preferred-address-typesInternalIP,ExternalIP,Hostname --proxy-client-cert-file/var/lib/minikube/certs/front-proxy-client.crt --proxy-client-key-file/var/lib/minikube/certs/front-proxy-client.key --requestheader-allowed-namesfront-proxy-client --requestheader-client-ca-file/var/lib/minikube/certs/front-proxy-ca.crt --requestheader-extra-headers-prefixX-Remote-Extra- --requestheader-group-headersX-Remote-Group --requestheader-username-headersX-Remote-User --secure-port8443 --service-account-issuerhttps://kubernetes.default.svc.cluster.local --service-account-key-file/var/lib/minikube/certs/sa.pub --service-account-signing-key-file/var/lib/minikube/certs/sa.key --service-cluster-ip-range10.96.0.0/12 --tls-cert-file/var/lib/minikube/certs/apiserver.crt --tls-private-key-file/var/lib/minikube/certs/apiserver.key3.4 组件总结 Kubernetes的大致工作流程
每个 Node 上的 kubelet 会定期向 apiserver 上报节点状态apiserver 再存到 etcd 里。每个 Node 上的 kube-proxy 实现了 TCP/UDP 反向代理让容器对外提供稳定的服务。scheduler 通过 apiserver 得到当前的节点状态调度 Pod然后 apiserver 下发命令给某个 Node 的 kubeletkubelet 调用 container-runtime 启动容器。controller-manager 也通过 apiserver 得到实时的节点状态监控可能的异常情况再使用相应的手段去调节恢复。
3.4 插件
minikube 也支持很多的插件使用命令minikube addons list就可以查看插件列表
lianhaifenglianhaifeng-virtual-machine:~$ minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
| ADDON NAME | PROFILE | STATUS | MAINTAINER |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador | minikube | disabled | 3rd party (Ambassador) |
| auto-pause | minikube | disabled | Google |
| cloud-spanner | 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 | 3rd party (kinvolk.io) |
| helm-tiller | minikube | disabled | 3rd party (Helm) |
| inaccel | minikube | disabled | 3rd party (InAccel |
| | | | [infoinaccel.com]) |
| ingress | minikube | disabled | Kubernetes |
| ingress-dns | minikube | disabled | Google |
| istio | minikube | disabled | 3rd party (Istio) |
| istio-provisioner | minikube | disabled | 3rd party (Istio) |
| kong | minikube | disabled | 3rd party (Kong HQ) |
| kubevirt | minikube | disabled | 3rd party (KubeVirt) |
| logviewer | minikube | disabled | 3rd party (unknown) |
| metallb | minikube | disabled | 3rd party (MetalLB) |
| metrics-server | minikube | disabled | Kubernetes |
| nvidia-driver-installer | minikube | disabled | Google |
| nvidia-gpu-device-plugin | minikube | disabled | 3rd party (Nvidia) |
| olm | minikube | disabled | 3rd party (Operator Framework) |
| pod-security-policy | minikube | disabled | 3rd party (unknown) |
| portainer | minikube | disabled | 3rd party (Portainer.io) |
| registry | minikube | disabled | Google |
| registry-aliases | minikube | disabled | 3rd party (unknown) |
| registry-creds | minikube | disabled | 3rd party (UPMC Enterprises) |
| storage-provisioner | minikube | enabled ✅ | Google |
| storage-provisioner-gluster | minikube | disabled | 3rd party (Gluster) |
| volumesnapshots | minikube | disabled | Kubernetes |
|-----------------------------|----------|--------------|--------------------------------|
比较重要的有两个DNS 和 Dashboard。
DNS 在 Kubernetes 集群里实现了域名解析服务能够让我们以域名而不是 IP 地址的方式来互相通信。是服务发现和负载均衡的基础。由于它对微服务、服务网格等架构至关重要所以基本上是 Kubernetes 的必备插件。 Dashboard 仪表盘为 Kubernetes 提供了一个图形化的操作界面非常直观友好。虽然大多数 Kubernetes 工作都是使用命令行 kubectl但有的时候在 Dashboard 上查看信息也是挺方便的。
只要在 minikube 环境里执行一条简单的命令就可以自动用浏览器打开 Dashboard 页面而且还支持中文
lianhaifenglianhaifeng-virtual-machine:~/桌面$ minikube dashboard 正在验证 dashboard 运行情况 ...Launching proxy ...正在验证 proxy 运行状况 ...Opening http://127.0.0.1:36667/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
Gtk-Message: 20:12:44.459: Not loading module atk-bridge: The functionality is provided by GTK natively. Please try to not load it.
宿主机本地访问 4 总结
Kubernetes功能非常完善实现了大部分常见的运维管理工作而且是全自动化的能够节约大量的人力成本。
Kubernetes 能够在集群级别管理应用和服务器可以认为是一种集群操作系统。它使用“控制面 / 数据面”的基本架构Master 节点实现管理控制功能Worker 节点运行具体业务。Kubernetes 由很多模块组成可分为核心的组件和选配的插件两类。Master 里有 4 个组件分别是 apiserver、etcd、scheduler、controller-manager。Node 里有 3 个组件分别是 kubelet、kube-proxy、container-runtime。通常必备的插件有 DNS 和 Dashboard。